<?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"
	>

<channel>
	<title>Neil Mix</title>
	<atom:link href="http://www.neilmix.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.neilmix.com</link>
	<description></description>
	<pubDate>Tue, 20 May 2008 05:06:35 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Programming Language in a Web Page: The Conundrum</title>
		<link>http://www.neilmix.com/2008/05/20/programming-language-in-a-web-page-the-conundrum/</link>
		<comments>http://www.neilmix.com/2008/05/20/programming-language-in-a-web-page-the-conundrum/#comments</comments>
		<pubDate>Tue, 20 May 2008 05:01:59 +0000</pubDate>
		<dc:creator>Neil</dc:creator>
		
		<category><![CDATA[Engineering]]></category>

		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.neilmix.com/?p=41</guid>
		<description><![CDATA[When is it appropriate to implement a programming language to run in a web page?
I&#8217;ve been contemplating this lately as the number of programming-language-in-web-page projects (henceforth referred to as PLIAWPs) has multiplied.  I really enjoy language implementations, especially in a language like JavaScript where doing so can be exceedingly concise.  So I certainly [...]]]></description>
			<content:encoded><![CDATA[<p>When is it appropriate to implement a programming language to run in a web page?</p>
<p>I&#8217;ve been contemplating this lately as the number of programming-language-in-web-page projects (henceforth referred to as PLIAWPs) has multiplied.  I really enjoy language implementations, especially in a language like JavaScript where doing so can be exceedingly concise.  So I certainly understand the motivation for writing your own PLIAWP.  But is it <i>useful</i>?</p>
<p>On the down side, PLIAWP implementations carry heavy baggage with them:</p>
<ul>
<li>They don&#8217;t integrate into native JavaScript debugging facilities.  You have to create your own facilities instead.  This is the most often overlooked aspect of creating your own language.  Writing a parser and interpreter are only the beginning.  In order to use your PLIAWP, developers will need error messages with meaningful line numbers, stack traces, syntax-aware editing, graphical debuggers, etc.  These are <i>must have</i> features if you want your PLIAWP to achieve anything better that esoteric status.</li>
<li>Performance is going to take a hit.  If you write an interpreter, you&#8217;re looking at an order-of-magnitude slowdown, minimum.  If you compile to JavaScript, you&#8217;ll do a bit better.  But JavaScript&#8217;s string-handling facilities vis-a-vis parsing aren&#8217;t speedy.  Plus, for any language meaningfully different from JavaScript, there&#8217;ll be a performance tax trying to fit your language&#8217;s runtime into the JavaScript runtime.</li>
<li>JavaScript is already a powerful language.  What does your language do that JavaScript can&#8217;t?  Is it really worth forcing developers to learn a new syntax or runtime while giving up the comfort of their existing developer tools?</li>
</ul>
<p>But it&#8217;s not all bad.  There are definitely some plusses to building a PLIAWP:</p>
<ul>
<li>It&#8217;s fun.</li>
<li>It expands the shared knowledge of what&#8217;s possible on the web, pushing the limits of what we know how to do.</li>
<li>It&#8217;s incredibly educational.</li>
<li>Did I mention that it&#8217;s fun?</li>
</ul>
<p>But I didn&#8217;t mention <i>useful</i>, now did I.</p>
<p>So when does a PLIAWP emerge graduate from <i>interesting</i> to <i>useful</i>?  There&#8217;s no easy formula, but here&#8217;s a few standards I&#8217;m sticking to these days:</p>
<ol>
<li>The PLIAWP must be significantly different from JavaScript.  (Think Java versus Haskell different.)  While nice syntax has its appeal, that&#8217;s not enough to justify the overhead of a full language implementation.</li>
<li>A program written in the PLIAWP must not be trivially convertible into a JavaScript program. (A different way of stating the above point.)</li>
<li>The PLIAWP must solve a specific problem that JavaScript doesn&#8217;t solve easily. (If the term &#8220;Domain-Specific Language&#8221; is coming to mind right now, that&#8217;s no coincidence.)</li>
<li>The PLIAWP must be developer-friendly, or at least clearly on the path to developer friendliness.</li>
</ol>
<p>A while back I built <a href="http://neilmix.com/narrativejs/">my very own PLIAWP</a>, plus a few <a href="http://www.neilmix.com/projects/">similar experiments</a> since.  With a couple years reflection since that time, I find it interesting to consider which PLIAWPs meet my standard of usefulness and which fail.  GWT passes, generic Ruby/Python/LISP/whatever retreads fail.  John Resig&#8217;s fabulous <a href="http://ejohn.org/blog/processingjs/">processing.js</a> <i>almost</i> passes (more on that in a second), Narrative JavaScript fails.</p>
<p>That&#8217;s right, my own pet project fails my own standard.  I started Narrative JavaScript with the intent to build something useful.  In the end, it turned out esoteric.  It addressed in part each of the above benchmarks, but not strongly enough to warrant the effort required for adopting my little PLIAWP.  I&#8217;ve since learned new programming techniques to mitigate the problem I set out to solve, such that the burden of the developer-unfriendly PLIAWP world makes Narrative JavaScript untenable for real-world projects.</p>
<p>Does that mean I regret building it?  Absolute not!  I learned a *ton* about programming, computers, and computation from my failed experiment.  And I had fun in the process.  It was absolutely worth it, and I hope to try again someday when the demands of fatherhood and a successful startup subside enough to give me a little breathing room.  Language implementation is a thrill.</p>
<p>So it was with great joy that I watched John launch his processing.js project.  He is a budding (if not already great) master at work, unleashing creativity meshed with engineering know-how.  It&#8217;s truly great stuff, a pleasure to watch.  As stated above, I&#8217;m not sure the PLIAWP meets my usefulness standard, but I don&#8217;t think that matters.  I don&#8217;t want to rain on this parade.  In time, he and others may realize that processing.js would be better off as a highly-tuned JavaScript API than an in-page DSL.  But why hurry to that point.  Let&#8217;s explore this world a bit longer, push the limits a bit further.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neilmix.com/2008/05/20/programming-language-in-a-web-page-the-conundrum/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Chess and Politics</title>
		<link>http://www.neilmix.com/2008/03/09/chess-and-politics/</link>
		<comments>http://www.neilmix.com/2008/03/09/chess-and-politics/#comments</comments>
		<pubDate>Sun, 09 Mar 2008 20:46:51 +0000</pubDate>
		<dc:creator>Neil</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://www.neilmix.com/2008/03/09/chess-and-politics/</guid>
		<description><![CDATA[If you ever take the time to read through grandmaster chess games, you&#8217;ll find that once a player obtains a substantial material advantage (takes a rook, bishop, or knight, for example) the other player resigns immediately.  While most inexperienced players in this position choose to fight it out, grandmasters know that once there&#8217;s a [...]]]></description>
			<content:encoded><![CDATA[<p>If you ever take the time to read through grandmaster chess games, you&#8217;ll find that once a player obtains a substantial material advantage (takes a rook, bishop, or knight, for example) the other player resigns immediately.  While most inexperienced players in this position choose to fight it out, grandmasters know that once there&#8217;s a disparity in power, the game is over.  Why is this?</p>
<p>To find out, look forward to the endgame.  At the start of a game, the loss of a bishop doesn&#8217;t represent an overwhelming power differential between players.  In the endgame, a bishop advantage is overwhelming.  </p>
<p>Let&#8217;s give each piece a value representing the destructive power it wields on the board:  pawn: 1, knight: 3, bishop: 4, rook: 6, queen: 10, king: 2.  Starting a game by removing one player&#8217;s bishop yields difference of 4 in power, with a power ratio of 42/46, a difference of about 9.5%.  Now let&#8217;s say we continue the game exchanging pieces equally between players, down to a king and a pawn for each side, plus the bishop advantage one player started with.  The difference in power is still 4, but the ratio is now 3/7, or 230%.</p>
<p>So as the number of pieces on the board decreases, the disparity in power between players grows.  Thus if you obtain a power advantage early in a game, your best strategy for the rest of the game is not to play to win, but <i>to tie</i>.  In other words, make sure that every piece you lose is matched by an equal loss by your opponent.  Taking this to its logical conclusion, you can <i>seek out</i> equal exchanges.  Put your pieces on suicide missions, trading pawn for pawn, rook for rook, etc.  Such exchanges are pointless tactically, but strategically valuable.  Each exchange brings you closer to the endgame where your power differential is overwhelming.</p>
<p>When you employ this &#8220;equal exchange&#8221; strategy, your opponent&#8217;s job is immensely more difficult.  Not only must your opponent find a way to win a piece from you (just to break even) while defending against attacks enhanced by your power advantage, but your opponent must also dodge any attempts at self-sacrificing equal exchanges.  It&#8217;s too much to defend against.</p>
<p>The equal exchange strategy isn&#8217;t sexy or exciting.  It&#8217;s a grind-it-out, lengthy process (especially when your opponent is unaware of what you&#8217;re doing).  But it works every time, and it&#8217;s easy to do.</p>
<p>So why is this post titled Chess <i>and Politics</i>?  Because you can draw a direct analogy to the current Democratic presidential primary between Clinton and Obama.  The pundits were looking to see if Obama would strike a knockout blow last Tuesday with the Texas and Ohio primaries.  He did, but the pundits don&#8217;t realize it yet.  It&#8217;ll take a few weeks to sink in.  Here&#8217;s why:</p>
<ol>
<li>Texas and Ohio were the only states remaining big enough to provide a significant shift in the difference between delegate counts.</li>
<li>The total shift resulting from those primaries was less than 10 delegates.</li>
<li>The Democratic party&#8217;s super delegates won&#8217;t go against the will of the voters.  Not this year, not this election.</li>
</ol>
<p>All this sets up the equal exchange strategy for Obama.  All he needs to do is make sure pieces are removed from the board nearly equally for each player the remaining primaries.  Each time this happens, Obama&#8217;s power relative to Clinton grows.  </p>
<p>Obama&#8217;s no longer playing to win, he&#8217;s playing <i>to tie</i>.  And that is much easier to do.  Of course anything can happen in politics (which is what the Clinton camp is depending on at this point).  But I think it&#8217;s fair to say that if Obama isn&#8217;t able to get the nomination with his current advantage, then he probably wouldn&#8217;t make a good presidential candidate.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neilmix.com/2008/03/09/chess-and-politics/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Winter Daze</title>
		<link>http://www.neilmix.com/2008/02/26/winter-daze/</link>
		<comments>http://www.neilmix.com/2008/02/26/winter-daze/#comments</comments>
		<pubDate>Tue, 26 Feb 2008 15:42:55 +0000</pubDate>
		<dc:creator>Neil</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://www.neilmix.com/2008/02/26/winter-daze/</guid>
		<description><![CDATA[I haven&#8217;t posted in a while.  Rather than list off a litany of lame excuses  (why should you care?), I&#8217;ll just share one activity that&#8217;s taking up some time for me these days:



We&#8217;ve already set a new record for snowfall this year.  And being of contrarian nature, I choose not to own [...]]]></description>
			<content:encoded><![CDATA[<p>I haven&#8217;t posted in a while.  Rather than list off a litany of lame excuses  (why should you care?), I&#8217;ll just share one activity that&#8217;s taking up some time for me these days:</p>
<p><img src="http://lh5.google.com/sarahmix/R72y3s0ZnWI/AAAAAAAAG5Y/U1TYXmQ1eT0/IMG_2231.jpg?imgmax=640"></p>
<p><img src="http://lh5.google.com/sarahmix/R72mCs0Zm4I/AAAAAAAAGx4/COxlwBr9Oqg/IMG_2232.jpg?imgmax=640"></p>
<p><img src="http://lh5.google.com/sarahmix/R72mFs0Zm7I/AAAAAAAAGyQ/Tb2la6R-nk0/IMG_2235.jpg?imgmax=640"></p>
<p>We&#8217;ve already set a new record for snowfall this year.  And being of contrarian nature, I choose not to own a snow blower since shoveling is amongst the only exercise I get.  (Sure beats sitting at a desk all day every day.)</p>
<p>But this is getting out of hand.  By my estimates, I&#8217;ve shoveled around 200 cubic yards of snow this winter. That would fill 13 dump trucks, or 5,000 shovel scoops.  The neighbor kids have taken to using our snow mounds for sledding.</p>
<p>Only another month or so to go.  Next year I&#8217;m getting a snow blower.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neilmix.com/2008/02/26/winter-daze/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Your Facebook Profile Doesn&#8217;t *Really* Matter, Does It?</title>
		<link>http://www.neilmix.com/2008/01/24/your-facebook-profile-doesnt-really-matter-does-it/</link>
		<comments>http://www.neilmix.com/2008/01/24/your-facebook-profile-doesnt-really-matter-does-it/#comments</comments>
		<pubDate>Thu, 24 Jan 2008 22:37:46 +0000</pubDate>
		<dc:creator>Neil</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://www.neilmix.com/2008/01/24/your-facebook-profile-doesnt-really-matter-does-it/</guid>
		<description><![CDATA[Buried in this Reuters article is a paragraph stunning in its implications for journalism, even if only by accident:

Kerviel could not be reached for comment. A headshot of him cut from a trading Website showed an earnest-looking young man. At the start of the afternoon, when his identity was revealed, he had 11 friends listed [...]]]></description>
			<content:encoded><![CDATA[<p>Buried in <a href="http://news.yahoo.com/s/nm/20080124/bs_nm/socgen_dc_15">this Reuters article</a> is a paragraph stunning in its implications for journalism, even if only by accident:</p>
<blockquote><p>
Kerviel could not be reached for comment. A headshot of him cut from a trading Website showed an earnest-looking young man. At the start of the afternoon, when his identity was revealed, he had 11 friends listed on the facebook.com social website. That number later dropped to four.
</p></blockquote>
<p>I&#8217;m speechless.  Welcome to the social web?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neilmix.com/2008/01/24/your-facebook-profile-doesnt-really-matter-does-it/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Beyond DOM</title>
		<link>http://www.neilmix.com/2008/01/06/beyond-dom/</link>
		<comments>http://www.neilmix.com/2008/01/06/beyond-dom/#comments</comments>
		<pubDate>Sun, 06 Jan 2008 22:08:47 +0000</pubDate>
		<dc:creator>Neil</dc:creator>
		
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.neilmix.com/2008/01/06/beyond-dom/</guid>
		<description><![CDATA[The title of this article is (of course) referring to the browser DOM.  Don&#8217;t get me wrong, the DOM abstraction was a great invention.  IE4 was incredibly innovative, the progenitor of Ajax as we know it today.
But as the Ajax evolution continues on, I keep waiting for a &#8220;killer&#8221; UI platform that nudges [...]]]></description>
			<content:encoded><![CDATA[<p>The title of this article is (of course) referring to the browser DOM.  Don&#8217;t get me wrong, the DOM abstraction was a great invention.  IE4 was incredibly innovative, the progenitor of Ajax as we know it today.</p>
<p>But as the Ajax evolution continues on, I keep waiting for a &#8220;killer&#8221; UI platform that nudges us back toward the simplicity of HTML markup.  Remember that?  Back in the early days of the web you wrote server-side &#8220;scripts&#8221; that generated markup on-the-fly.  Some people naively thought that manually generating HTML with C/Perl/whatever was OK.  Others realized that you could incorporate read-only processing instructions in the markup, rather than markup in your application code, and thus was born tools like Velocity, TAL,  and other such <a href="http://backpan.perl.org/authors/id/D/DL/DLOWE/Text-Tmpl-0.16.readme">templating systems</a>.  It wasn&#8217;t hard to see the value of these tools, how much better than the alternative, how much easier than stateful programming.</p>
<p>Eventually the abstractors barged in, tried to change HTML to XML, tried to change templating to XSL. And they had&#8230;mixed&#8230;success.</p>
<p>And meanwhile we got sick of having to go back to the server and regenerate pages every time our customers did something interesting.  We wanted small, nay miniscule, updates that allow us to do more with less.  And thus Ajax was born.</p>
<p>But what a diversion!  What happened to that simple markup we used to write?  The server-side frameworks didn&#8217;t have enough time to sort out their differences, to evolve to the right level of simplicity.  Yet we&#8217;ve already moved on.  The clarity of execution flow in generating a web page?  Gone.  The simplicity of learning curve?  Absent.</p>
<p>Am I the only one who yearns to circle back?</p>
<p>Here&#8217;s the problem as I see it:  the UI I&#8217;ve coded, what you see on the screen, is a reflection (some would call it a transformation) of the data sitting in memory in my JavaScript objects.  So why is it that every time the data changes I have to go twiddle something in the DOM?  Shouldn&#8217;t that just happen automagically?</p>
<p>Why should I have to wrap my head around two UI representations, the markup and the DOM?  Markup is easy to read but captures a small sliver of the UI gestalt.  The DOM captures everything else, but sits in memory.  Can&#8217;t it all just be markup, so that I don&#8217;t have to spend so much time visualizing data structures whose only representation is either in code or in Firebug?</p>
<p>The DOM is hot property, a cool kid these days.  So it won&#8217;t surprise me if this plea falls on deaf ears.  But I believe that the world could use UI that is described rather than commanded, stateless rather than iterative, that puts the V back in MVC.</p>
<p>I can&#8217;t help but feel we&#8217;re moving inexorably in the wrong direction, bit-by-bit, and no one is noticing.  </p>
<p>And so I sit waiting patiently, occasionally scheming&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neilmix.com/2008/01/06/beyond-dom/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Disphoria</title>
		<link>http://www.neilmix.com/2008/01/03/disphoria/</link>
		<comments>http://www.neilmix.com/2008/01/03/disphoria/#comments</comments>
		<pubDate>Thu, 03 Jan 2008 17:05:20 +0000</pubDate>
		<dc:creator>Neil</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://www.neilmix.com/2008/01/03/disphoria/</guid>
		<description><![CDATA[Dan discussed &#8220;flow&#8221; recently and made some observations that stunningly mirror my own life.  Quoth Dan:

I’d deliberately side-stepped IM and Twitter, but without consciously noticing it, I let my email and blogs reading habits — distractions on their own — to become interrupts&#8230;Previously, I’d get to the end of the day and feel unsatisfied. [...]]]></description>
			<content:encoded><![CDATA[<p>Dan <a href="http://www.unpossible.com/2008/01/02/dan-in-the-new-year-focus-on-flow/">discussed &#8220;flow&#8221;</a> recently and made some observations that stunningly mirror my own life.  Quoth Dan:</p>
<blockquote><p>
I’d deliberately side-stepped IM and Twitter, but without consciously noticing it, I let my email and blogs reading habits — distractions on their own — to become interrupts&#8230;Previously, I’d get to the end of the day and feel unsatisfied. One of the ways I feel satisfied when I’m creating and learning, so I’d go looking for something new to read about in blogland and, before I knew it, it’d be 1:00am.
</p></blockquote>
<p>Dan plans to re-arrange his life so that all of his activities &#8212; work or leisure &#8212; are broken into uninterrupted chunks.  That means scheduling time to check email and read blogs, rather than letting such activities creep in throughout the daily routine.</p>
<p>I&#8217;m so sympathetic to this it hurts.  But I have a problem: my workday tasks contain empty space.  Much of my worktime consists of the following cycle:</p>
<ol>
<li>think</li>
<li>write</li>
<li>compile</li>
<li>test</li>
</ol>
<p>Steps 3 and 4 are mostly automated, so they don&#8217;t require a lot of active engagement.  Furthermore, they take time enough that it&#8217;s difficult to sit and stare at the screen and wait for them to finish without doing something else.  But they&#8217;re not long enough to really dig in and engage in other work-related tasks.</p>
<p>So I often fill my time in steps 3 and 4 with activities like emails or a blog reading.  (For example, I&#8217;m writing this amidst build-and-test cycles.)  But I find the context switch to be tiring by day&#8217;s end, thus leaving me in what I call &#8220;disphoria&#8221; &#8212; an over-stimulated, partially-connected brain-state that&#8217;s productive but unfulfilled and disorienting.  Exactly what Dan describes.</p>
<p>So what does one do during these empty mid-task moments?  Meditate?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neilmix.com/2008/01/03/disphoria/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Generators and Erlang Processes</title>
		<link>http://www.neilmix.com/2007/12/21/generators-and-erlang-processes/</link>
		<comments>http://www.neilmix.com/2007/12/21/generators-and-erlang-processes/#comments</comments>
		<pubDate>Fri, 21 Dec 2007 14:53:31 +0000</pubDate>
		<dc:creator>Neil</dc:creator>
		
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.neilmix.com/2007/12/21/generators-and-erlang-processes/</guid>
		<description><![CDATA[I&#8217;ve always thought that there&#8217;s a convenient symmetry between generators and Erlang-style processes.  So it&#8217;s neat to see that Alex Graveley has been exploring Erlang-style &#8220;concurrency&#8221; in JavaScript by piggy-backing off my generator based &#8220;threading&#8221; library.
I sometimes wonder what it would take to expand JavaScript generators to become truly concurrent.  Maybe something as [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve always thought that there&#8217;s a convenient symmetry between generators and Erlang-style processes.  So it&#8217;s neat to see that Alex Graveley has been <a href="http://www.beatniksoftware.com/blog/?p=80Er.js">exploring Erlang-style &#8220;concurrency&#8221; in JavaScript</a> by piggy-backing off my <a href="http://www.neilmix.com/2007/02/07/threading-in-javascript-17/">generator based &#8220;threading&#8221; library</a>.</p>
<p>I sometimes wonder what it would take to expand JavaScript generators to become truly concurrent.  Maybe something as simple as a &#8220;start&#8221; method on a generator object:</p>
<pre>
function myConcurrent(param) {
  yield wasteTime(param);
}

let gen = myConcurrent(someValue);
gen.start();
let result = wasteMoreTime();
result += gen.next();
gen.close();
</pre>
<p>where start() causes the generator to begin execution concurrently, and next() or send() act like a thread join.</p>
<p>It&#8217;s such a small but powerful extension.  It seems appealing up-front, but the devil is in the details.  What&#8217;s the memory model?  Much of Erlang&#8217;s appeal stems from its shared-nothing semantics.  How would you replicate that with JS generators?  Enforce pass-by-value?  If next() and send() join, then how exactly do we get the Erlang-style message passing going?</p>
<p>Or maybe there&#8217;s no enforcement of shared nothing and caveat emptor?  But then you need synchronization for shared objects.  <a href="http://weblogs.mozillazine.org/roadmap/archives/2007/02/threads_suck.html">Blech.</a></p>
<p>An interesting thought experiment.  To be clear, there&#8217;s no talk of anything like this (AFAIK) amongst the JavaScript language designers.  Just a random Friday daydream.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neilmix.com/2007/12/21/generators-and-erlang-processes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Auto-Update Problem</title>
		<link>http://www.neilmix.com/2007/12/11/the-auto-update-problem/</link>
		<comments>http://www.neilmix.com/2007/12/11/the-auto-update-problem/#comments</comments>
		<pubDate>Tue, 11 Dec 2007 15:14:28 +0000</pubDate>
		<dc:creator>Neil</dc:creator>
		
		<category><![CDATA[Engineering]]></category>

		<guid isPermaLink="false">http://www.neilmix.com/2007/12/11/the-auto-update-problem/</guid>
		<description><![CDATA[
If it&#8217;s a good idea, go ahead and do it. It is much easier to apologize than it is to get permission.
- Admiral Grace Hopper

Auto-updating software is neat.  It saves the customer from painful manual updates, and it helps the vendor by keeping people up-to-date with their software.
Unfortunately, the auto-update feature got off to [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>
If it&#8217;s a good idea, go ahead and do it. It is much easier to apologize than it is to get permission.</p>
<div style="text-align:right">- Admiral Grace Hopper</div>
</blockquote>
<p>Auto-updating software is neat.  It saves the customer from painful manual updates, and it helps the vendor by keeping people up-to-date with their software.</p>
<p>Unfortunately, the auto-update feature got off to a bad start in UI.  Due to mindless follow-the-leader mentality, it&#8217;s had a hard time recovering ever since.</p>
<p>Case in point:<br />
<img src="http://img441.imageshack.us/img441/671/lolfirefoxrj1.jpg"></p>
<p>While this is an extreme case, it also illustrates a problem that we&#8217;ve all had with auto updates, namely how they manage to interrupt at the most inopportune times.</p>
<p>The problem boils down to 2 factors: a) permission, and b) timing.  A little forethought solves both problems fairly easily, but bad precedent of previous implementations casts a long shadow.</p>
<p>Programmers often get snagged on the concept of permission.  The (non-conscious) line of thought is: we wouldn&#8217;t want to disappoint someone, so let&#8217;s make sure it&#8217;s OK before we proceed.  What&#8217;s missing is opportunity cost: people like having their chores done for them.  By thinking that doing-without-consent is risky, we miss the opportunity to make the customer to be pleased as punch that someone is quietly getting-things-done for them.</p>
<p>Early on in the history of software auto-updates, someone decided that it was very important to interrupt the customer to make sure that they don&#8217;t object to having their software updated.  Early versions of auto-updates went something like this:</p>
<ul>
<li>start the app
<li>app says, &#8220;Updates to your software may be available.  Would you like me to go check?&#8221;
</ul>
<p>First off, how lazy!  This comes straight from the playbook of how to ruin your career: when a simple but helpful task needs doing, check with your manager before doing anything.  He or she will be impressed with the amount of reassurance and micro-management you require.</p>
<p>At some point someone realized, &#8220;hey, that&#8217;s kind of annoying.&#8221;  And thus the auto-update question was no longer asked on startup, but instead asked at some random time on some random interval &#8212; but the same time and interval each time, so as not to be confusing.</p>
<p>Did you see the bait-and-switch?  The problem was with asking too much permission.  But &#8220;fix&#8221; was to change the timing.  I quoted the word &#8220;fix&#8221; because the solution didn&#8217;t improve things much.  We went from an annoying every-time-I-start-the-app question to an annoying randomly-interrupt-me-in-the-middle-of-my-workday question.</p>
<p>After a while, someone made the startling realization, &#8220;hey, we could check for updates automatically!&#8221;  No doubt someone objected that permission should be asked first, but thankfully the objections were overridden.  So now we have: randomly-interrupt-me-when-updates-are-available.  Which is better.  And this is pretty much state-of-the-art for auto-updates these days.</p>
<p>But we&#8217;re not quite there yet, are we?</p>
<p>So what to do?</p>
<ol>
<li>Just grab the update already!  Beg forgiveness rather than ask permission.
<li>Don&#8217;t interrupt me while I&#8217;m working! Wait until the next time the app is started, <i>then</i> perform the update and let your customer know what you&#8217;ve changed.
</ol>
<p>So now we&#8217;re at: annoying-interruption-on-startup-only-when-updates-have-been-made.  But how annoying is the interruption, really?  Presumably you&#8217;ve got great new features for your customer that they&#8217;ll be happy to hear about.  Perhaps rather than being annoyed, your customers will feel pleasantly surprised by the gift of new features they&#8217;ve received this morning.  Your software just made their lives easier, on multiple levels.</p>
<p>Still sound too aggressive, too risky?  Consider this: there&#8217;s already strong precedent for the auto-update process I described, just not on the desktop.  It&#8217;s on the web.  Websites don&#8217;t ask permission before updating the software.  (They can&#8217;t, really.)  In some cases, when the updates are really big, they might let you know about the changes your first time in.  (And occasionally they may provide a graceful &#8220;downgrade&#8221; to the old version if you protest.)</p>
<p>But most of us never really noticed this subtle distinction between desktop and web auto-updates.  That&#8217;s because we&#8217;re too sympathetic to the underlying technology.  But when we wipe the technical details away (as we should when designing our UIs), the truly-auto-update isn&#8217;t so scary after all, now is it?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neilmix.com/2007/12/11/the-auto-update-problem/feed/</wfw:commentRss>
		</item>
		<item>
		<title>You Want Me To Do What?</title>
		<link>http://www.neilmix.com/2007/12/08/you-want-me-to-do-what/</link>
		<comments>http://www.neilmix.com/2007/12/08/you-want-me-to-do-what/#comments</comments>
		<pubDate>Sat, 08 Dec 2007 13:26:33 +0000</pubDate>
		<dc:creator>Neil</dc:creator>
		
		<category><![CDATA[Engineering]]></category>

		<guid isPermaLink="false">http://www.neilmix.com/2007/12/08/you-want-me-to-do-what/</guid>
		<description><![CDATA[Here&#8217;s a little something I&#8217;ve seen around the web a few times:

What does this mean to you?  What pictures form in your head when you see this?
Now before anyone accuses me of being naughty, I can assure you that this is a Safe-For-Work post.  The story behind this image is hardly controversial.
click here [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a little something I&#8217;ve seen around the web a few times:</p>
<p><center><img src="/wp-content/uploads/2007/12/rollover_out_of_context.jpg" /></center></p>
<p>What does this mean to you?  What pictures form in your head when you see this?</p>
<p>Now before anyone accuses me of being naughty, I can assure you that this is a Safe-For-Work post.  The story behind this image is hardly controversial.</p>
<p><center><a href="/wp-content/uploads/2007/12/rollover_in_context.jpg">click here to see the image in context</a></center></p>
<p>If the phrase &#8220;rollover for more&#8221; seems perfectly innocuous to you, stop for a moment and consider how your grandmother would react if you told her to &#8220;rollover for more.&#8221;   Mmmmmaybe you aught to find a way to reword this.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neilmix.com/2007/12/08/you-want-me-to-do-what/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Case for ES4</title>
		<link>http://www.neilmix.com/2007/11/29/the-case-for-es4/</link>
		<comments>http://www.neilmix.com/2007/11/29/the-case-for-es4/#comments</comments>
		<pubDate>Fri, 30 Nov 2007 01:36:24 +0000</pubDate>
		<dc:creator>Neil</dc:creator>
		
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.neilmix.com/2007/11/29/the-case-for-es4/</guid>
		<description><![CDATA[Brendan has written up an extensive, detailed post making his case for the need for ES4.  It&#8217;s a good read.  I think he makes a strong case.
I fear that it may be too nuanced to be consumed and condensed into &#8220;sound bytes&#8221; appropriate for the political firestorm that is underway.  This is not &#8220;light&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>Brendan has written up <a href="http://weblogs.mozillazine.org/roadmap/archives/2007/11/my_media_ajax_keynote.html">an extensive, detailed post making his case for the need for ES4</a>.  It&#8217;s a good read.  I think he makes a strong case.</p>
<p>I fear that it may be too nuanced to be consumed and condensed into &#8220;sound bytes&#8221; appropriate for the political firestorm that is underway.  This is not &#8220;light&#8221; reading.</p>
<p>In other words, it takes time for the gestalt of ES4 to sink in.  If you read the post and find it not to your liking, put it away and come back later. Write some JS code, think about the difficulties you&#8217;re facing.  Perhaps some &#8220;aha!&#8221; moments will ensue.  For me, the essence of ES4 didn&#8217;t kick in for a long time &#8212; several months.  Your mileage may vary.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neilmix.com/2007/11/29/the-case-for-es4/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
