<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Coyote Tracks &#187; best practices</title>
	<atom:link href="http://kagan.mactane.org/blog/tag/best-practices/feed/" rel="self" type="application/rss+xml" />
	<link>http://kagan.mactane.org/blog</link>
	<description>The prints of an Internet-enabled coyote.</description>
	<lastBuildDate>Tue, 31 Jan 2012 03:26:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>When Your Computer Catches Fire</title>
		<link>http://kagan.mactane.org/blog/2011/11/13/when-your-computer-catches-fire/</link>
		<comments>http://kagan.mactane.org/blog/2011/11/13/when-your-computer-catches-fire/#comments</comments>
		<pubDate>Sun, 13 Nov 2011 21:12:19 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[announcements]]></category>
		<category><![CDATA[bad ideas]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[don't be ridiculous]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[teaching]]></category>
		<category><![CDATA[tech support]]></category>

		<guid isPermaLink="false">http://kagan.mactane.org/blog/?p=411</guid>
		<description><![CDATA[Occasionally, I amuse myself by reading Not Always Right. I really shouldn&#8217;t, as it&#8217;s always bad for my opinion of humanity, but sometimes I just can&#8217;t look away. And occasionally, it clues me in to a teachable moment. Like this one, which recently appeared&#160;there: Caller: &#8220;My computer is a fire&#160;risk.&#8221; Me: &#8220;What makes you say&#160;that?&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>Occasionally, I amuse myself by reading <a href="http://www.notalwaysright.com/">Not Always Right</a>. I really shouldn&#8217;t, as it&#8217;s always bad for my opinion of humanity, but sometimes I just can&#8217;t look away. And occasionally, it clues me in to a teachable moment. Like <a href="http://notalwaysright.com/100-chance-of-disaster/14402">this one, which recently appeared</a>&nbsp;there:</p>
<blockquote><p><strong>Caller:</strong> &#8220;My computer is a fire&nbsp;risk.&#8221;</p>
<p><strong>Me:</strong> &#8220;What makes you say&nbsp;that?&#8221;</p>
<p><strong>Caller:</strong> &#8220;It gets hot. There are papers near&nbsp;it.&#8221;</p>
<p><strong>Me:</strong> &#8220;If you&#8217;re worried about it, you can move the papers&nbsp;away.&#8221;</p>
<p><strong>Caller:</strong> &#8220;I am moving the papers, but you must send someone to look at&nbsp;it.&#8221;</p>
<p>[More back-and-forth, in which caller reiterates that her computer is "a fire risk" and says the situation is urgent. A technician is dispatched, who eventually reports&nbsp;back:]</p>
<p><strong>Technician:</strong> &#8220;You know that computer that was a fire&nbsp;risk?&#8221;</p>
<p><strong>Me:</strong> &#8220;Yes?&#8221;</p>
<p><strong>Technician:</strong> &#8220;She meant it was on&nbsp;fire.&#8221;</p></blockquote>
<p>This isn&#8217;t the first time I&#8217;ve heard about such mistakes, either. Rinkworks&#8217; &#8220;Computer Stupidities&#8221; sub-site has an entire page devoted to <a href="http://www.rinkworks.com/stupid/cs_smoke.shtml">instances of computers smoking or catching fire</a> (or people being worried that they might). One in particular involves a tech telling a college student over the phone, &#8220;Unplug the computer right now. Your paper is lost. Your floppy drive is lost. If you&#8217;re lucky the Mac will be OK. Unplug it now.&#8221; The student doggedly insists, &#8220;But I don&#8217;t want to lose my paper!&#8221; Then the tech hears someone in the background (presumably the student&#8217;s roommate) scream. Then the dorm fire alarm goes&nbsp;off.</p>
<p>For those who need to be told, I am willing to state, as a computer professional with 15 years of experience in hardware, software, system administration, troubleshooting, and&nbsp;repair:</p>
<p class="notice large">If your computer or computing device ever emits <em>smoke, sparks, or flame</em>: <strong>Unplug it immediately.</strong> Do not bother with &#8220;proper shutdown procedure&#8221;; simply assume all data on it is completely hosed and start emergency fire-prevention procedures. <strong>Unplug its power.</strong> If it&#8217;s a laptop, also yank out its battery. If signs of combustion continue, <strong>use a fire extinguisher or water</strong>, as appropriate.</p>
<p>Unplugging it means there&#8217;s no more electrical power going to it. Many times, that&#8217;s enough to kill the combustion right there&nbsp;&mdash; if you were quick about it, the fire may go out on its own at this point. If it doesn&#8217;t, it is at least <em>no longer an electrical fire</em>. That means if you haven&#8217;t got an ABC fire extinguisher handy, you can still just throw water on the thing, without risking electrocution.</p>
<p>Once it&#8217;s been smoking or sparking, the device is ruined anyway. Understand that <strong>all your data is gone</strong>. (This is why it&#8217;s important to have complete, current backups.) The important thing to do is to make sure the fire doesn&#8217;t spread. Don&#8217;t panic, and don&#8217;t waste any time trying to shut down carefully or in the usual manner&nbsp;&mdash; that will just prolong the&nbsp;fire.</p>
<p>Remember, where computing devices are concerned, <strong>if it smokes, it is toast</strong>. Or it is fried; pick whichever image works better for you. If you let it keep running once it&#8217;s on fire, all you&#8217;re doing is <strong>putting yourself at risk</strong>. Don&#8217;t do&nbsp;it.</p>
]]></content:encoded>
			<wfw:commentRss>http://kagan.mactane.org/blog/2011/11/13/when-your-computer-catches-fire/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Developers Are Not QA Testers</title>
		<link>http://kagan.mactane.org/blog/2011/04/08/developers-are-not-qa-testers/</link>
		<comments>http://kagan.mactane.org/blog/2011/04/08/developers-are-not-qa-testers/#comments</comments>
		<pubDate>Fri, 08 Apr 2011 15:18:18 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[bad ideas]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[complaining]]></category>
		<category><![CDATA[don't be ridiculous]]></category>
		<category><![CDATA[you fail]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=303</guid>
		<description><![CDATA[When a company says &#8220;we can&#8217;t afford a QA department&#8221;, what they&#8217;re really saying is, &#8220;we accept that our software will be infested with bugs, and quality is not important to us.&#8221; When they compound this basic error by saying, &#8220;the developers will just have to do their own QA&#8221;, they prove that they have [...]]]></description>
			<content:encoded><![CDATA[<p>When a company says &#8220;we can&#8217;t afford a QA department&#8221;, what they&#8217;re really saying is, &#8220;we accept that our software will be infested with bugs, and quality is not important to us.&#8221; When they compound this basic error by saying, &#8220;the developers will just have to do their own QA&#8221;, they prove that <strong>they have no respect for developers <em>or</em> QA people</strong>, and you shouldn&#8217;t work for such a company in either&nbsp;capacity.</p>
<p>(Of course, a company like that isn&#8217;t about to hire any QA testers, so you folks haven&#8217;t got the option of working for them. And I&#8217;m not a QA tester, I&#8217;m a developer. So the rest of my advice is pretty much aimed at fellow devs&nbsp;&mdash; but that doesn&#8217;t mean I don&#8217;t respect you QA folks. Seriously, y&#8217;all deserve a lot more respect than you get, and I love it when you make my life easier by finding my bugs for me.)</p>
<p>The skills, talents, and basic mindset that make a good developer are entirely different from the ones that make a good QA person. Asking one to do the other&#8217;s job is a mistake as fundamental as expecting graphic designers and accountants to swap&nbsp;places. Let me explain:</p>
<p>Developers hate repetition. We hate having to repeat anything more than once or twice; that&#8217;s <a href="http://kai.mactane.org/essays/geek.php">why some of us become developers in the first place</a>: because we can write programs that automate repetitive drudgery, and hence banish it from our&nbsp;lives. <span id="more-303"></span></p>
<p>It&#8217;s not just repetitive <em>tasks</em>, either. A good developer will also have a strong aversion to repetitive code and data. If two procedures differ by only one or two minor details, a good developer will combine them into one, and parameterize it, or otherwise figure out a way for the machine to make the decision. (A poor coder, by contrast, will produce &#8220;copy-and-paste code&#8221; that&#8217;s scorned by more advanced devs, because <strong>it&#8217;s more brittle</strong> as well as being less elegant.) If data must be stored somewhere, the prevailing wisdom is to keep it in just one place&nbsp;&mdash; &#8220;Don&#8217;t Repeat Yourself&#8221; is the&nbsp;maxim.</p>
<p>But <strong>a good QA checker has to deal with repetition</strong> all the time. It&#8217;s a fundamental part of their job. Run this test plan&nbsp;&mdash; this particular series of actions&nbsp;&mdash; over and over again, on each of the platforms we need to test on. Log every step of it, so that if something does go wrong, we can reproduce&nbsp;it.</p>
<p>Then, once the coder has checked in the changes that (hopefully) will fix the bugs you found&#8230; <em>do it all over again</em>. Just the exact same way. On every&nbsp;platform.</p>
<p>This is a coder&#8217;s nightmare. A developer&#8217;s natural response to this situation is to write some kind of automated QA-testing software. Of course, that software itself will then have to be checked for bugs before you could possibly rely on it&#8230; and you can&#8217;t trust your software to find its own&nbsp;bugs.</p>
<p>In the absence of such software, asking a developer to do bug-checking means asking them to do something that goes against their very nature. You can force them to do it, but they&#8217;ll never be really good at&nbsp;it.</p>
<p>Of course, all of that is totally leaving aside the obvious point that asking someone to find the flaws in their own work means asking them to see past their own mental blind spots&nbsp;&mdash; a developer&#8217;s test plan will be based on the same assumptions as their code, without the coder even realizing it. And that&#8217;s to say nothing of the obvious implications once you put the human ego into the picture. Human beings are flawed, and too many see &#8220;find the bugs in your own code&#8221; as equivalent to &#8220;show me all the ways you&nbsp;suck&#8221;.</p>
<p>Don&#8217;t ask a developer to do QA. <strong>Development and QA testing are fundamentally different disciplines</strong>, with completely different skill-sets and personality requirements. A developer can no more cover for a QA tester than a QA tester could fill in for a developer.</p>
<p>And if you&#8217;re a developer at a company that wants you to do your own bug-checking? Your employer thinks what you do is so similar to bug-checking that you&#8217;ll be good at it. They think they can cut corners on quality, <em>and</em> pay you one salary to do two jobs at once (including one job that <em>it is in your nature to hate</em>). If you can&#8217;t make them see reason, it&#8217;s time to brush up your&nbsp;r&eacute;sum&eacute;.</p>
]]></content:encoded>
			<wfw:commentRss>http://kagan.mactane.org/blog/2011/04/08/developers-are-not-qa-testers/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Easy Restarts Are a Security Feature</title>
		<link>http://kagan.mactane.org/blog/2011/03/15/easy-restarts-are-a-security-feature/</link>
		<comments>http://kagan.mactane.org/blog/2011/03/15/easy-restarts-are-a-security-feature/#comments</comments>
		<pubDate>Wed, 16 Mar 2011 02:09:29 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[opinion]]></category>
		<category><![CDATA[sci-fi]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=294</guid>
		<description><![CDATA[The more stuff you have open (or habitually leave open) in an application, the more it becomes part of your consciousness, an extension of your mind. For many of us, the question &#8220;What are you doing right now?&#8221; could best be answered by, &#8220;Here&#8217;s a list of the tabs I have open in my web&#160;browser.&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>The more stuff you have open (or habitually leave open) in an application, the more it becomes part of your consciousness, an extension of your mind. For many of us, the question &#8220;What are you doing right now?&#8221; could best be answered by, &#8220;Here&#8217;s a list of the tabs I have open in my web&nbsp;browser.&#8221;</p>
<p>Hackers* use the word &#8220;<a href="http://catb.org/~esr/jargon/html/S/state.html">state</a>&#8221; to describe &#8220;information being maintained in non-permanent memory&#8221;, whether that memory is in a human skull or a computer&#8217;s RAM chips. In fact, that ambiguity over exactly where the state is being maintained is one of the word&#8217;s strengths&nbsp;&mdash; as the browser-tabs example shows, there&#8217;s getting to be less of a distinction between the two. The stuff in my browser&#8217;s tabs is <em>a reflection of</em> what&#8217;s in my own brain, and a <strong>nearly-seamless extension of&nbsp;it</strong>.</p>
<p>Like every other web developer, I recently got a message from Firefox saying it needed to upgrade. (Because security researchers found <em>yet another</em> hole in Adobe Reader.) Despite the fact that I had over a dozen tabs open, <strong>I knew I wouldn&#8217;t have to worry about performing the upgrade</strong>, because Firefox would remember all my tabs and reopen them after restart. It&#8217;s basically a momentary hiccup in my workflow; I can start the upgrade and then use that 30-second break to refill my teacup or go to the bathroom. Come back, sit down, close the spare &#8220;You&#8217;ve just successfully upgraded Firefox&#8221; tab, and just keep&nbsp;working.</p>
<p>Compare that with Windows&nbsp;Update.<br />
<span id="more-294"></span><br />
For one thing, I can no longer in good conscience advise people to allow Windows Update to automatically install things. Not after Microsoft used it to push &#8220;Windows Genuine Advantage&#8221;. With Firefox, a security update <em>really is</em> just a security update, not an excuse to push crapware on one&#8217;s customers. With Windows Update, I need to scroll through the list of updates and make sure they&#8217;re not sending me something I don&#8217;t want (but which I can never uninstall if I accept it&nbsp;once).</p>
<p>More importantly, though: You never know when a Microsoft security update will include some component that forces a reboot. Sometimes, you&#8217;ll just get a message that your update isn&#8217;t complete until you restart, and would you like to do that now? Other times, you get the annoyingly insistent dialog box that pops up every five minutes, nagging at you to restart your machine. And <strong>it won&#8217;t go away</strong> until you restart. Trying to get anything useful accomplished between that thing&#8217;s interruptions is like trying to concentrate with a <a href="http://www.nationalreview.com/nroriginals/?q=MDllNmVmNGU1NDVjY2IzODBlMjYzNDljZTMzNzFlZjc=">Harrison Bergeron</a>-style mental handicapper on. Which means that before you even <em>start</em> the process, you&#8217;d better be ready to save and close all your work in every single application.</p>
<p>Is it any wonder people hate installing Windows security&nbsp;patches?</p>
<p>The problem is that if you make security updates annoying, people will try to avoid them. And one of the biggest annoyances these days is breaking people&#8217;s train of thought. Now that half of my train of thought is in the computer&nbsp;&mdash; in &#8220;state&#8221; that the software is maintaining for me&nbsp;&mdash; making the software continue to maintain it <strong>across sessions</strong> turns out to be a big&nbsp;win.</p>
<p>The <a href="http://www.e-texteditor.com/">E Text Editor</a> is another example of an application that makes it really easy to leave state in the computer&#8217;s memory instead of cluttering up your own wetware with it. E&#8217;s philosophy is to <em>never discard data</em> unless the user explicitly requests it. It takes the concept of an Undo history far beyond what most people are used&nbsp;to.</p>
<p>Back in &#8217;90s, people got used to having an &#8220;Undo button&#8221;: you could reverse one action. Then we got the &#8220;Undo history&#8221;: you could work backward through multiple steps of undo. Finally, we got the &#8220;Undo/Redo history&#8221;, which allowed one to step <em>forward as well as back</em> in that timeline&#8230; but it was still just a line. If you went back 50 steps, then did something new&nbsp;&mdash; something different from stepping forward&nbsp;&mdash; those 50 steps were all immediately discarded.</p>
<p>E doesn&#8217;t discard information so casually. If you do something new, you now have <strong>a new branch</strong> in the history of your document. It has an &#8220;Undo/Redo <em>tree</em>&rdquo;. (This results in a lot of data being maintained on your hard drive. So what? Hard drive space is cheap. Way cheaper than human attention, which means trading off a bunch of disk space in order to maintain some human attention is a very good&nbsp;deal.)</p>
<p>And, of course, it maintains this state across sessions. If I&#8217;ve been working on a complicated image in Photoshop for a few hours&nbsp;&mdash; or for a week or two, without closing the program (and hence not applying any Windows security updates, because they might force a reboot!)&nbsp;&mdash; one of the <em>last things I want to do</em> is close that file unless I&#8217;m positive that I won&#8217;t ever feel like going back to a previous version of it. (This is why graphic artists get so used to hitting &#8220;Save a Copy&#8221; a whole lot.) The moment I close the file, even if I leave Photoshop itself open, I&#8217;ve lost that&nbsp;history.</p>
<p>Not so in E. I can close the program, apply my Windows patches, then reopen E&#8230; and it will reopen the files I had open when I exited it, <strong>with all that Undo/Redo tree-history still&nbsp;there</strong>.</p>
<p>And this also means that shutting down and restarting E is an easy action. It has no ill effects. I can do it any time, and not have to worry about what I&#8217;m losing. Which means that if E ever comes out with any security patches, I won&#8217;t be at all worried about applying&nbsp;them.</p>
<p>Having nothing to lose by a shutdown makes your program a lot more likely to be&nbsp;upgraded.</p>
<div class="separator"></div>
<p>* In case it isn&#8217;t already obvious, I&#8217;m using the word &#8220;hacker&#8221; to mean &#8220;a computer programmer who loves programming for its own sake, not someone who&#8217;s just punching a clock to pay the bills&#8221;. This is similar to <a href="http://en.wikipedia.org/wiki/Hacker_%28programmer_subculture%29">the programmer-enthusiast culture&#8217;s classical definitions</a> that include &#8220;A person who enjoys exploring the details of programmable systems and stretching their capabilities&#8221; and &#8220;A person who delights in having an intimate understanding of the internal workings of a system, computers and computer networks in particular.&#8221; It should be very obvious that I <strong>don&#8217;t</strong> mean someone who breaks into computer&nbsp;systems.</p>
]]></content:encoded>
			<wfw:commentRss>http://kagan.mactane.org/blog/2011/03/15/easy-restarts-are-a-security-feature/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Are You Sure You Want to Read This Blog Post? (y/n)</title>
		<link>http://kagan.mactane.org/blog/2011/02/09/are-you-sure-you-want-to-read-this-blog-post-yn/</link>
		<comments>http://kagan.mactane.org/blog/2011/02/09/are-you-sure-you-want-to-read-this-blog-post-yn/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 02:22:08 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=284</guid>
		<description><![CDATA[When should you ask a user &#8220;Are you sure you want to do that?&#8221; Bear in mind that asking this question when you don&#8217;t have to has more than one bad effect: Obviously, it wastes the user&#8217;s time and may even annoy&#160;them. It also contributes to the general problem of &#8220;too damned many dialog boxes [...]]]></description>
			<content:encoded><![CDATA[<p>When should you ask a user &#8220;Are you sure you want to do that?&#8221; Bear in mind that asking this question when you don&#8217;t have to has more than one bad effect:</p>
<ol>
<li>Obviously, it wastes the user&#8217;s time and may even annoy&nbsp;them.</li>
<li>It also contributes to the general problem of &#8220;too damned many dialog boxes in computing&#8221;. This is subtly but importantly different from the previous point: It trains the user to unthinkingly click the default option in any dialog box, just to keep it from wasting their&nbsp;time.</li>
<li>Finally, it may actually hinder the user&#8217;s ability to leave your program. Look at <a href="http://www.joelonsoftware.com/uibook/chapters/fog0000000062.html">this page by Joel Spolsky</a>, and search for &#8220;exit Juno&#8221;. A user thought the &#8220;Are you sure you want to exit?&#8221; dialog meant that the computer was advising her that there were ill effects from doing&nbsp;so.</li>
</ol>
<p>Okay, that last one seems like sort of an edge case, right? But even the first two items are enough reason to pay attention to when you should&nbsp;&mdash; and shouldn&#8217;t&nbsp;&mdash; ask the user to confirm something.</p>
<p>My proposal: Only ask a user for confirmation when the action was initiated by a <em>single click or keystroke</em>, <strong>and</strong> it has some kind of <em>bad effects</em>. Yes, this means that any time you ask someone to confirm whether they want to exit your program, and they have already saved all their work, you just wasted their time. This one&#8217;s particularly prevalent in the gaming world, I&#8217;ve noticed: Even if you&#8217;re in between games, and your scores are all saved&nbsp;&mdash; meaning the <em>worst</em> possible consequence of exiting the game is that you&#8217;ll have to start the application again&nbsp;&mdash; most games will show you a &#8220;Do you really want to exit Game Name?&#8221; dialog anyway.</p>
<p>MS Word gets this exactly right. If your document hasn&#8217;t been changed since the last time you saved it, then exiting the program <strong>has no ill effects</strong>. If you click the little X, or press Alt+F4, MS Word won&#8217;t even bother to ask you &#8220;Are you sure?&#8221;; it&#8217;ll just exit with no muss and no fuss. It&#8217;s only if you have some unsaved work that you&#8217;ll see the &#8220;Do you want to save your changes?&#8221; dialog. And if your document already has a filename, Word doesn&#8217;t bother to prompt you for a new one; you only get the &#8220;Save As&#8230;&#8221; dialog if the document doesn&#8217;t yet have a filename.</p>
<p>The program only bothers the user if it <em>has to</em>; if it can figure things out on its own, it does. Just the way it should&nbsp;be.</p>
<p>If you&#8217;re writing another application&nbsp;&mdash; I don&#8217;t care whether it&#8217;s whether it&#8217;s a web application, Rich Internet Application, desktop application, or smartphone application&nbsp;&mdash; please take a hint from the way MS&nbsp;Word handles confirmation questions. Don&#8217;t make your app be the software equivalent of &#8220;that&nbsp;guy&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://kagan.mactane.org/blog/2011/02/09/are-you-sure-you-want-to-read-this-blog-post-yn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Is Your Domain Name Spellable and Pronounceable?</title>
		<link>http://kagan.mactane.org/blog/2010/11/07/is-your-domain-name-spellable-and-pronounceable/</link>
		<comments>http://kagan.mactane.org/blog/2010/11/07/is-your-domain-name-spellable-and-pronounceable/#comments</comments>
		<pubDate>Sun, 07 Nov 2010 19:41:06 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[opinion]]></category>
		<category><![CDATA[the world-wide conversation]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=260</guid>
		<description><![CDATA[A good domain name should have the following features: When someone says it to you, you know how to spell it. This means that if my friend wants to tell me about your site at a party or a club or out on the street somewhere, she doesn&#8217;t have to spell it out for me. [...]]]></description>
			<content:encoded><![CDATA[<p>A good domain name should have the following features:</p>
<ol>
<li><strong>When someone says it to you, you know how to spell it.</strong> This means that if my friend wants to tell me about your site at a party or a club or out on the street somewhere, she doesn&#8217;t have to spell it out for me. She can just say your site&#8217;s name, and I immediately know how to type it into my browser.</li>
<li><strong>When you see it written, you immediately know how to pronounce it.</strong> This is the other side of the coin, and it matters when I read about your site in print and then want to tell a friend about it. In fact, if your site&#8217;s name is sufficiently opaque, I could read about it, visit it, sign up, and use your service for months&#8230; and <em>still</em> not know how to tell a friend about it without having to say awkward things like, &#8220;Ummm&#8230; Zip-tick? something like that? I don&#8217;t really know how to pronounce it, I just know it&#8217;s spelled X-Y-P-T-I-Q.&#8221;</li>
</ol>
<p>Marc Hedlund writes about <a href="http://blog.precipice.org/why-wesabe-lost-to-mint?c=1">Why Wesabe Lost to Mint</a>, and manages to miss part of this point:<br />
<blockquote><strong>Mint was a better name and had a better design</strong> &#8211; both of these things are true, but I don&#8217;t believe they were primary causes for our company to fail and for Mint to be acquired. Mint&#8217;s CEO likes to talk about how ridiculous our name was relative to theirs, but I think the examples of Amazon, Yahoo, eBay, Google, and plenty of others make it plain that even ludicrous names (as all of those were thought to be when the companies launched) can go on to be great brands. (emphasis in original)</p></blockquote>
<p>He cites &#8220;Amazon, Yahoo, eBay, Google&#8221; as examples of &#8220;ludicrous&#8221; names, but he misses the fact that all of them meet both of the requirements above&nbsp;&mdash; and Wesabe doesn&#8217;t. I&#8217;m assuming it&#8217;s pronounced &#8220;wee-SOB-ay&#8221;, but it could just as easily be read as &#8220;wee-SAYB&#8221; (rhymes with &#8220;babe&#8221;)&nbsp;&mdash; and I&#8217;m guessing it&#8217;s a mash-up between wasabi and &#8220;we <i>sabe</i>&#8220;, where <i>sabe</i> is the Spanish word for &#8220;to&nbsp;know&#8221;, and the basis for the English verb &#8220;to&nbsp;savvy&#8221;.</p>
<p>But that&#8217;s just a guess.</p>
<p>Of course, you already know how to spell it, but imagine someone told you about &#8220;a new site called /wee-SOB-ay/&#8221;&#8230; how would you guess it might be spelled? Ideas that come to my mind are: wiisabe, weesabay, weesobbe (possibly with accent on the E in the site&#8217;s logo); and &#8220;Just tell me how it&#8217;s spelled, already!&#8221;</p>
<p>Note that Google got its name from the mathematical concept of a <strong>googol</strong>: 10<sup>100</sup>, a very large number. But they deliberately changed the spelling, so people would be more able to tell each other about it, and more able to correctly type in what they&#8217;d heard.</p>
]]></content:encoded>
			<wfw:commentRss>http://kagan.mactane.org/blog/2010/11/07/is-your-domain-name-spellable-and-pronounceable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Can You Learn From a Prediction That Was Wrong?</title>
		<link>http://kagan.mactane.org/blog/2010/04/07/can-you-learm-from-a-prediction/</link>
		<comments>http://kagan.mactane.org/blog/2010/04/07/can-you-learm-from-a-prediction/#comments</comments>
		<pubDate>Thu, 08 Apr 2010 04:07:38 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[opinion]]></category>
		<category><![CDATA[should have known better]]></category>
		<category><![CDATA[the world-wide conversation]]></category>
		<category><![CDATA[where are we going?]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=204</guid>
		<description><![CDATA[Recently, a bunch of the blogs and journals I read (including my friends, not just big, famous sources) have had some bones to pick with Clifford Stoll&#8217;s 1995 Newsweek opinion piece, &#8220;Why Web Won&#8217;t Be Nirvana&#8221;. Stoll said: &#8220;no online database will replace your daily newspaper, no CD-ROM can take the place of a competent [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, a bunch of the blogs and journals I read (including my friends, not just big, famous sources) have had some bones to pick with <a href="http://www.newsweek.com/id/106554/">Clifford Stoll&#8217;s 1995 <cite>Newsweek</cite> opinion piece, &#8220;Why Web Won&#8217;t Be Nirvana&#8221;</a>. Stoll said: &#8220;no online database will replace your daily newspaper, no CD-ROM can take the place of a competent teacher and no computer network will change the way government works.&#8221;</p>
<p>A lot of people have been, effectively, pointing and laughing at Stoll&#8217;s failed prediction. I&#8217;d rather consider it a cautionary tale: The man who was so totally wrong wasn&#8217;t just a random pundit who didn&#8217;t know what he was talking about. He was Clifford Stoll&nbsp;&mdash; author of <cite>The Cuckoo&#8217;s Egg</cite>, a man who had been online for 20 years at a time when most people were just beginning to hear that there was a such thing as the World-Wide Web, and the man who traced German <a href="http://catb.org/~esr/jargon/html/C/cracker.html">cracker</a> Markus Hess through umpteen layers of insecure computer systems and networks.</p>
<p>In short, the man <em>knew what he was talking about</em>. He wasn&#8217;t a <a href="http://www.boingboing.net/2006/07/02/sen_stevens_hilariou.html">Senator Ted Stevens</a>. If he could be so wrong, <strong>how much faith can I place in my own predictions</strong> about where the Internet&#8217;s headed?</p>
<p>But wait, there&#8217;s more&nbsp;&mdash; <em>how wrong was he?</em> <span id="more-204"></span>Sure, Stoll claims that &#8220;no online database will replace your daily newspaper&#8221;, which has turned out to be completely false. But how about &#8220;no CD-ROM can take the place of a competent teacher&#8221;? No matter how interactive the CD, it can&#8217;t substitute for a <em>good</em> human teacher&#8217;s ability to guide and nurture a student&#8217;s intellect. (Not without AI, which is still at least 20 years away&nbsp;&mdash; just like it&#8217;s been for the past 50 years.)</p>
<p>And maybe you think it&#8217;s obvious that CD-ROMs can&#8217;t replace real teachers. But there have been, and <em>there still are</em>, people who claim their CDs are just as effective as face-to-face teaching methods&nbsp;&mdash; <a href="http://www.rosettastone.com/personal/how-it-works/faq#qa3">or even more effective</a>.</p>
<p>Stoll gripes about the problems of Usenet. Okay, the main bulk of Internet conversation has moved to blogs and comment threads, but his words still apply: &#8220;Every voice can be heard cheaply and instantly. The result? Every voice is heard. The cacophony more closely resembles citizens band radio, complete with handles, harassment, and anonymous threats.&#8221;* There&#8217;s a reason why many of my friends say, &#8220;Never waste your time reading the comments.&#8221;</p>
<p>I&#8217;ve <a href="http://kai.mactane.org/blog/2009/02/25/death-threats-against-bloggers/">written before about the effects of &#8220;harassment and anonymous threats&#8221;</a>. That was just last year, and I doubt that all the anonymous threateners have suddenly left the Internet.</p>
<p>It&#8217;s very easy to look at Stoll&#8217;s rant and get distracted by the petty details: &#8220;Usenet? Hah! How archaic!&#8221; But that&#8217;s just a way of trying to remain comfortable, and ignoring the ways in which things haven&#8217;t changed one bit. Because <a href="http://www.penny-arcade.com/comic/2004/3/19/" title="also known as the &quot;Greater Internet Fuckwad Theory&quot;">the problems of anonymity</a> aren&#8217;t technological problems; they&#8217;re problems of human nature.</p>
<p>But even in the places where Stoll was wrong&nbsp;&mdash; demonstrably, ridiculously wrong&nbsp;&mdash; it does me no good to simply point and laugh. Instead, I&#8217;d rather ask myself, &#8220;Could I have done any better?&#8221; Stoll claimed that online shopping would never take off:</p>
<blockquote><p>[Internet hucksters promise that] We&#8217;ll order airline tickets over the network, make restaurant reservations and negotiate sales contracts. Stores will become obsolete. So how come my local mall does more business in an afternoon than the entire Internet handles in a month? Even if there were a trustworthy way to send money over the Internet&nbsp;&mdash; which there isn&#8217;t&nbsp;&mdash; the network is missing a most essential ingredient of capitalism: salespeople.</p></blockquote>
<p>He&#8217;s wrong on almost every particular; the only one that might possibly be an exception is &#8220;negotiat[ing] sales contracts&#8221;. Aside from that? I&#8217;ve lost track of how many restaurant reservations I&#8217;ve made online and how many airplane tickets I&#8217;ve bought online; over the past ten years, I&#8217;m quite positive that I&#8217;ve done those things far more often online than by &#8220;traditional&#8221; methods. Even if you don&#8217;t consider PayPal to be quite trustworthy, online credit-card transactions are now safe and secure.</p>
<p>And salespeople? Most of the time, I can do without them. I can&#8217;t help but remember the last time my girlfriend and I visited a Victoria&#8217;s Secret; after being approached by 5 different salespeople in as many minutes, we left the store in frustration at being interrupted and distracted so much&nbsp;&mdash; to the point that we couldn&#8217;t even browse the merchandise in peace!</p>
<p>Great, so Stoll was totally wrong about online shopping. If you&#8217;d asked me about it in 1995, <em>what would <strong>I</strong> have said?</em> Would my predictions have been any better?</p>
<p>And more to the point: What am I predicting right now? And how wrong am I? And how can I learn from Stoll&#8217;s mistakes&nbsp;&mdash; or my own&nbsp;&mdash; and make better predictions?</p>
<p>That&#8217;s the real take-away from Stoll&#8217;s article. And those are question I don&#8217;t have the answers for yet. (If you&#8217;ve got answers, leave a comment and tell me!)</p>
<p>* All quotes from <cite>Newsweek</cite> edited to fix simple spelling mistakes.</p>
]]></content:encoded>
			<wfw:commentRss>http://kagan.mactane.org/blog/2010/04/07/can-you-learm-from-a-prediction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How Many Ways Is Your Imitation Scrollbar Broken?</title>
		<link>http://kagan.mactane.org/blog/2009/12/13/why-your-imitation-scrollbar-is-broken/</link>
		<comments>http://kagan.mactane.org/blog/2009/12/13/why-your-imitation-scrollbar-is-broken/#comments</comments>
		<pubDate>Sun, 13 Dec 2009 20:25:39 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[bad ideas]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[opinion]]></category>
		<category><![CDATA[snark]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=155</guid>
		<description><![CDATA[If you&#8217;re going to reinvent the wheel, you should at least make sure your new version is somehow better than the previous kind. Reimplementing standard UI and OS widgets is one of the most common ways developers reinvent the wheel these days&#160;&#8212; it started with Flash developers building their own controls, and has now spread [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re going to reinvent the wheel, you should at least make sure your new version is somehow better than the previous kind. Reimplementing standard UI and OS widgets is one of the most common ways developers reinvent the wheel these days&nbsp;&mdash; it started with Flash developers building their own controls, and has now spread to Adobe&nbsp;AIR and Silverlight.</p>
<p>It might be a welcome trend, if the replacement widgets people were building had more functionality than the OS-native ones that are available for free in any other context. But usually, the widgets I see in these frameworks have less than half the functionality of the things they try to replace. I&#8217;m going to pick on scroll bars for now, because I&#8217;ve seen them horribly mangled too many times.</p>
<p>To start with one aspect of scroll bars that we often take for granted: Can you guess which of these text boxes contains more text?</p>
<p><textarea style="float: left; width: 40%; height: 10em; margin: 0 1em;">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Quisque est est, luctus quis suscipit et, lacinia ac odio.</textarea></p>
<p><textarea style="float: left; width: 40%; height: 10em; margin: 0 1em;">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco.</textarea><br />
<br clear="left"><br />
<span id="more-155"></span><br />
Of course you can; you don&#8217;t even need to guess. The one on the left has more, and you can tell immediately because the movable slider on its scrollbar <em>is smaller</em>. This is a feature you get for free from the native OS widget, and one I have never seen implemented in a Flash, AIR, or similar interface.</p>
<p>Here are all the things a native scrollbar does. I absolutely guarantee you, if you&#8217;ve reinvented a scrollbar, your implementation is missing at least two of these features:</p>
<ol>
<li>As mentioned above, the slider object changes size automatically, to give a general impression of how much content the scrollable area contains.</li>
<li>The arrows at the top and bottom of the scrollbar are clickable, and clicking them once will move the content up and down by a small amount (typically 1 or 2 lines).</li>
<li>Clicking and holding the top and bottom arrows will cause the content to scroll more rapidly.</li>
<li>Clicking and dragging on the slider will scroll the content smoothly to any position the user chooses. (Yes, I have seen scrollbar implementations in which the slider <em>was not</em> a draggable item!)</li>
<li><strong>Scroll wheel support:</strong> If the user&#8217;s hardware includes a scroll wheel, scrolling it will move the content up and down. This is many users&#8217; preferred method of scrolling content these days, and yet it&#8217;s totally ignored by over half the Flash interfaces I&#8217;ve encountered in the past year. I&#8217;ve bolded it because it&#8217;s the one that gets so egregiously ignored.</li>
<li>The &#8220;gutter&#8221; <em>in between</em> the arrows and slider is also clickable. Clicking on it once will scroll the content up or down by, roughly, the size of the visible area (a &#8220;page&#8221;, as it were).</li>
<li>Of course, clicking and holding in the &#8220;gutter&#8221; area will repeatedly and rapidly scroll the content. (This is rarely apparent unless you&#8217;re dealing with a tall scrollable area <em>and</em> a fairly long document. Try loading a 25-page or longer document into a word processing program, and set the program to full-screen.)</li>
<li>When the content is scrolled (by whatever method), the slider will move up or down to indicate how far from the beginning or end you are. (Essentially the converse of item #4: Moving the slider scrolls the content, and scrolling through the content moves the slider.)</li>
<li>The arrow buttons and the gutter area give a visual indication when they&#8217;ve been clicked, so the user has better feedback. (This is one of those little things that makes the user experience so much better. It&#8217;d be so easy to do, and yet I&#8217;ve seen about 2 Flash scrollbars in my life that have bothered with that feature.)</li>
<li>If you set your cursor focus on the scrollable area, using the up and down arrow keys will scroll the content. Either the Home and End or Ctrl+Home and Ctrl+End keystrokes will move directly to the beginning and end of the content. The PgUp and PgDown keys may also move the content by an amount similar to clicking in the gutter.</li>
<li>The scrollbar&nbsp;&mdash; including its arrows, gutter and slider&nbsp;&mdash; looks just like every other scrollbar on the user&#8217;s computer. The user can immediately identify the items and finds them familiar.</li>
</ol>
<p>Even if you have done a smashing job of replicating the first 10 points on this list, you simply can&#8217;t get the final one in an AIR, Silverlight, or Flash interface. If your whiz-bang interface platform provides some other benefit, then dropping that last feature might be worth it.</p>
<p>But it&#8217;s no excuse for dropping all the other stuff. Most non-native scroll bars I&#8217;ve seen support only 3 or 4 of these features, which means anyone who normally uses any other ways of interacting with scrollbars winds up cursing and deciding that this broken implementation is cheap and chintzy.</p>
<p>Which it is. If you&#8217;re going to reimplement the wheel, at least make it something that will roll smoothly.</p>
]]></content:encoded>
			<wfw:commentRss>http://kagan.mactane.org/blog/2009/12/13/why-your-imitation-scrollbar-is-broken/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Testing Backward-Incompatible Changes</title>
		<link>http://kagan.mactane.org/blog/2009/10/12/testing-backward-incompatible-changes/</link>
		<comments>http://kagan.mactane.org/blog/2009/10/12/testing-backward-incompatible-changes/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 18:06:20 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=135</guid>
		<description><![CDATA[Let&#8217;s say one day you decide to add a feature to your software or service. For example, you need a new flag on user accounts, so that different types of users get different features. (These don&#8217;t even have to be tiered account levels; maybe accounts of type &#8220;music lover&#8221; get a widget in the sidebar [...]]]></description>
			<content:encoded><![CDATA[<p>Let&#8217;s say one day you decide to add a feature to your software or service. For example, you need a new flag on user accounts, so that different types of users get different features. (These don&#8217;t even have to be tiered account levels; maybe accounts of type &#8220;music lover&#8221; get a widget in the sidebar with suggestions for bands they might like while &#8220;sports fan&#8221; accounts get a sports scores widget instead.)</p>
<p>So, following good software development processes, you first write a couple of tests:</p>
<p><span id="more-135"></span>UserTypeOne gets features A, B, and C<br />
UserTypeOne does not get features D, E, or F<br />
UserTypeTwo does not get features A, B, or C<br />
UserTypeTwo gets features D, E, and F</p>
<p>Then you write some code that meets these tests, including creating a pair of mock users with the new flag set in both possible ways. You run the tests, and they all pass. Yay! Your new feature is ready!</p>
<p>Except that, of course, the moment you check this code in, you find that suddenly, <em>nobody can log in any more</em>. After all, the new flag is supposed to be mandatory, and that requirement is reflected in one of the changes you made to the login code. But the only users that have the NewFlag at all are the ones you just created in your fixture.</p>
<p>Sure, this will probably get caught before it goes live. Even if your entire QA department is asleep at the switch, if just one person in your organization tries to run even the most rudimentary tests, they&#8217;ll get back an error message. But &#8220;it didn&#8217;t get pushed to production&#8221; is only the most minimal level of success; I&#8217;d like to look at how <em>you</em>, the coder, could have prevented this problem. How could you keep this error from even getting checked in (and thus breaking the build and flat-lining your co-workers&#8217; productivity for a few hours)?</p>
<p>The way a real QA department would spot this problem is regression testing. But it&#8217;s not reasonable to ask every coder to do a full suite of regression tests before every commit.</p>
<p>The real failure, of course, is that you made a change that you didn&#8217;t test. But saying &#8220;force programmers to write better tests&#8221; is not a viable answer; people are imperfect. You might as well mandate &#8220;developers may not check in any code that contains bugs&#8221; as one of your organization&#8217;s rules.</p>
<p>I don&#8217;t have a good answer to this problem. Asking developers to also be QA people is completely impractical. The current solution seems to be &#8220;developers sometimes check in code which breaks the build, and blocks people&#8217;s productivity for a while&#8221;. (Distributed SCM can help mitigate this.)</p>
<p>Is there something QA people know that developers don&#8217;t, that would make an easy solution that we could adopt?</p>
]]></content:encoded>
			<wfw:commentRss>http://kagan.mactane.org/blog/2009/10/12/testing-backward-incompatible-changes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notes on LJ Content Sieve</title>
		<link>http://kagan.mactane.org/blog/2009/07/04/notes-on-lj-content-sieve/</link>
		<comments>http://kagan.mactane.org/blog/2009/07/04/notes-on-lj-content-sieve/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 21:07:42 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[my projects]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=78</guid>
		<description><![CDATA[My latest project is something I call &#8220;LJ Content Sieve&#8221;: a Greasemonkey script to filter out content on one&#8217;s Livejournal views based on nearly any attribute of a post or comment. However, Livejournal is very customizable. It has 31 different &#8220;layouts&#8221;, each of which can then be further &#8220;themed&#8221; by application of CSS. This means [...]]]></description>
			<content:encoded><![CDATA[<p>My latest project is something I call &#8220;LJ Content Sieve&#8221;: a Greasemonkey script to filter out content on one&#8217;s Livejournal views based on nearly any attribute of a post or comment.</p>
<p>However, Livejournal is very customizable. It has 31 different &#8220;layouts&#8221;, each of which can then be further &#8220;themed&#8221; by application of CSS. This means that a user viewing a given journal, community, or single post, at a given time, may receive an HTML document containing any of 31 different DOM structures.</p>
<p>This means that finding a post&#8217;s author, or title, or even just a single post or comment, is not a straightforward process. I&#8217;ve set myself up a Ruby script that downloaded my &#8220;friends&#8221; view, a representative entry with lots of comments, and my own journal view, thus giving me a set of 93 fixtures that I can test against. The Ruby script also tweaked each fixture in the process of spooling it to my hard drive, by adding the proper calls to JSUnit files.</p>
<p>At the end of each document&#8217;s &lt;head&gt; element, there&#8217;s a call to <code>jsUnitCore.js</code>. Then, at the end of each &lt;body&gt;, I add a call to the <code>lj-content-sieve.user.js</code> script itself, as well as a set of test files that depends on which fixture this is. Every fixture gets an <code>ljcs-global-tests.js</code> call added to it&nbsp;&mdash; that file contains tests that should work anywhere, regardless of what sort of page you&#8217;re on.</p>
<p>Then all the &#8220;friends&#8221; page fixtures get an <code>ljcs-friends-tests.js</code> file, which tests operations that should happen on every friends page. For example, determining which entries need to be deleted. (In contrast, single-entry pages get <code>ljcs-entry-tests.js</code>, and the page from my own journal&nbsp;&mdash; which stands in for a view of a community&nbsp;&mdash; gets <code>ljcs-self-tests.js</code>.)</p>
<p>Finally, each fixture page gets a test file based on its layout: the &#8220;3 Column&#8221; layout gets <code>ljcs-3&nbsp;Column-tests.js</code>, while &#8220;Cuteness Attack&#8221; gets <code>ljcs-Cuteness&nbsp;Attack-tests.js</code>. (Hey, I didn&#8217;t write or name the layouts; I just have to make sure LJCS works with all of &#8216;em.) These files will test that the actual DOM manipulations work properly.</p>
<p>Without test-driven development and automated testing to ensure that each layout and page-type is being handled properly, I don&#8217;t think this project would be manageable at all.</p>
]]></content:encoded>
			<wfw:commentRss>http://kagan.mactane.org/blog/2009/07/04/notes-on-lj-content-sieve/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Would Shlemiel the Painter Optimize Prematurely?</title>
		<link>http://kagan.mactane.org/blog/2009/06/18/would-shlemiel-the-painter-optimize-prematurely/</link>
		<comments>http://kagan.mactane.org/blog/2009/06/18/would-shlemiel-the-painter-optimize-prematurely/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 21:34:51 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[Big O notation]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[diary]]></category>
		<category><![CDATA[my projects]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=73</guid>
		<description><![CDATA[I don&#8217;t want to optimize this code prematurely. And &#8220;while you&#8217;re still writing it&#8221; is probably premature. On the other hand, totally ignoring algorithmic complexity is a sure route to a Shlemiel the Painter&#8217;s algorithm. Do I really want to just write the whole thing, and then start profiling it to see where the hot [...]]]></description>
			<content:encoded><![CDATA[<p>I don&#8217;t want to <a href="http://shreevatsa.wordpress.com/2008/05/16/premature-optimization-is-the-root-of-all-evil/">optimize this code prematurely</a>. And &#8220;while you&#8217;re still writing it&#8221; is probably premature. On the other hand, totally ignoring algorithmic complexity is a sure route to a <a href="http://www.joelonsoftware.com/articles/fog0000000319.html">Shlemiel the Painter&#8217;s algorithm</a>.</p>
<p>Do I really want to just write the whole thing, and then start profiling it to see where the hot spots are, and then possibly have to re-design the whole thing? That seems like the complete opposite of &#8220;work smarter, not harder&#8221;. Then again, it doesn&#8217;t matter if you write an <span class="mathVar">O(<i>n</i><sup>2</sup>)</span> or even <span class="mathVar">O(<i>n</i>!)</span> algorithm if <i>n</i> is always going to be small&#8230; and in this application, I expect low-to-middling <i>n</i> values.</p>
<p>Of course, even if <i>n</i> will always be small, and increasing CPU power is my friend&#8230; even if it performs fast enough to make users happy, I&#8217;ll still know there&#8217;s a problem down there in the details. That may be the deciding factor.</p>
]]></content:encoded>
			<wfw:commentRss>http://kagan.mactane.org/blog/2009/06/18/would-shlemiel-the-painter-optimize-prematurely/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

