<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.2.3" -->
<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/"
	>

<channel>
	<title>andymatuschak.org &#187; Square Signals</title>
	<link>http://andymatuschak.org</link>
	<description>Flying through the universe of code on a talking spaceship!</description>
	<pubDate>Sun, 11 May 2008 16:30:29 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2.3</generator>
	<language>en</language>
			<item>
		<title>User Interaction 101</title>
		<link>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2008%2F05%2F07%2Fuser-interaction-101%2F&amp;seed_title=User+Interaction+101</link>
		<comments>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2008%2F05%2F07%2Fuser-interaction-101%2F&amp;seed_title=User+Interaction+101#comments</comments>
		<pubDate>Wed, 07 May 2008 08:30:55 +0000</pubDate>
		<dc:creator>Andy Matuschak</dc:creator>
		
		<category><![CDATA[Square Signals]]></category>

		<guid isPermaLink="false">http://andymatuschak.org/articles/2008/05/07/user-interaction-101/</guid>
		<description><![CDATA[I have a lot of trouble explaining my interest in user interaction to others.
A typical response to my reasoning goes something along the lines of: &#8220;Yeah, but with Beryl, Linux looks even better!&#8221;
The computer scientists I talk to just don&#8217;t understand that user interface is about how the program acts, not how it looks. And [...]]]></description>
			<content:encoded><![CDATA[<p>I have a lot of trouble explaining my interest in user interaction to others.</p>
<p>A typical response to my reasoning goes something along the lines of: &#8220;Yeah, but with Beryl, Linux looks even better!&#8221;</p>
<p>The computer scientists I talk to just don&#8217;t understand that user interface is about how the program <strong>acts</strong>, not how it <strong>looks</strong>. And really, I think that&#8217;s why there&#8217;s so much terrible software out there: these are the people who are building it!</p>
<h3>The Five Minutes Left Test</h3>
<p>In five minutes, you&#8217;ve got to leave for a doctor&#8217;s appointment, but there&#8217;s this thing you&#8217;ve really got to get done first, and you need iFoo to do it.</p>
<p>You&#8217;re stressed and in a hurry. Is iFoo going to make you even more stressed, or is it going to sit you down, give you a slap, and tell you everything&#8217;s going to be okay?</p>
<p>The sad truth is that unless I&#8217;m very familiar with it, almost every piece of software is going to do the former. I&#8217;m in a hurry, but now I&#8217;ve got to figure out how to use this thing. More specifically, I&#8217;ve got to figure out <em>how to express what I want to do in terms it can understand</em>.</p>
<h3>Doing It Right</h3>
<p>The difference between mediocre software and superlative software is the language it speaks. Stressful software makes users express what they want to do in its terms; excellent software works on the user&#8217;s terms. It doesn&#8217;t make the user know what to ask or how to ask it, and most importantly, <em>it doesn&#8217;t get in their way.</em>
<p>A number of principles are key to getting this right.</p>
<p>First and foremost is the <a href="http://en.wikipedia.org/wiki/Principle_of_least_astonishment">principle of least astonishment</a>. Essentially, actions shouldn&#8217;t surprise the user. They should work consistently across applications, they should be undoable, and what works elsewhere should work everywhere.</p>
<p>The next level is the <strong>principle of the four-star waiter</strong> (no Wikipedia article on that, I&#8217;m afraid). When you&#8217;re at the Ritz, and you&#8217;ve put all the marshmallows into your hot chocolate, you don&#8217;t have to ask for more. When you turn to grab another, the waiter has already silently refilled the bowl. Clippy and his wizard friends are an attempt to imitate this dapper young man, but they do a terrible job because they&#8217;ve forgotten about the <em>silent</em> part.</p>
<p>Your application should anticipate the user&#8217;s needs and&mdash;without confusing or obtruding&mdash;act appropriately. Things like remembering a window&#8217;s position or the previous input to a form are only the first step. iChat manages your away status for you, asking as few questions as possible. iTunes keeps your iPhone continuously in sync, and if you run out of space, it&#8217;ll leave off things like photos before more critical data like contacts or addresses. Twitterrific focuses tweets directed at you because it knows you want to read them.</p>
<p>The next important step is <strong>minimization of interaction</strong>. You can start by reducing the number of actions required to perform tasks, but that&#8217;s not good enough. When I want to broadcast a thought, I use Twitterrific more often than MarsEdit not so much because of number of steps but rather as a result of <em>how many things I have to deal with.</em> Every control, label, and window makes your application more stressful to use; every time I have to change focus (especially window focus), you&#8217;re breaking my flow a little. Safari is good because its interface is tiny. We like Twitter because it has one text field. iMovie &#8216;08 is a poster child for reduction to a tiny number of core actions.</p>
<h3>Get Out of My Way!</h3>
<p>This is really a matter of <strong>flow</strong>&mdash;flow is the most important thing. Flow is how we move, and it&#8217;s why people sometimes prefer a notepad over an electronic document. When you want to note something, you write it on the pad, and put it in your pocket. You don&#8217;t have to make up a filename or where it should go. You don&#8217;t have to worry about remembering where to find it again later. You don&#8217;t have to think about quitting the app when you&#8217;re done.</p>
<p><strong>Flow</strong> happens when you perform a task, <em>thinking only about what to do, not how to do it</em>. This is why people like things like emacs and vi so much: after the (considerable) learning curve is over, they can move like lightning, slowed by the speed of their ideas rather than by the speed of their tool. When focus isn&#8217;t in the right place, when a modal dialog pops up, or when a button isn&#8217;t placed near the data it affects, it <em>breaks flow</em>. You have to stop thinking about the grand unified theory you&#8217;re writing long enough to explain to the computer what you mean.</p>
<p><strong>That&#8217;s</strong> the real price of bad software.</p>
<p>When a personal finance program sucks, that&#8217;s annoying. But my blogging software gets in my way, so I write fewer posts. And when I can&#8217;t figure out how to change the time signature midway through my piece in a music composition tool, I <em>stop composing</em>. The music stops playing in my head. I look around. I get out the manual. All this because the <em>icon</em> for the tool in question wasn&#8217;t good enough! </p>
<p>As software becomes more powerful, it becomes more essential to <em>creation</em>&mdash;to <em>making things</em>. And if your software is doing anything to distract your users from their magnum opus, the world is never going to hear it. They&#8217;ll hear something just slightly inferior; <em>you</em> will have been responsible for confusing the creator at some pivotal moment.</p>
<p>If you&#8217;ve written something fantastic, though, it&#8217;ll become an extension of the artist&#8217;s hand, just like a paintbrush. It&#8217;s an extra tool that enables him to solve new problems and produce even better results. It&#8217;s something to strive for&mdash;it&#8217;s why <em>I</em> write software.</p>
<h3>Learning</h3>
<p>Fortunately, it&#8217;s not impossible to get a sense of your users&#8217; flow.</p>
<p><strong>Step One: You don&#8217;t count.</strong> You&#8217;re not confused by anything (one hopes) because you wrote the app. Your experiences will only catch blatantly obvious flaws. Use them as an initial filter.</p>
<p><strong>Step Two: Your imagination, however, does.</strong> Write <a href="http://en.wikipedia.org/wiki/User_story">user stories</a>. Write them for every conceivable use case. Throw out the ones that you don&#8217;t want to support. Declare that the ones which remain are the only cases you care about, and <em>stick to that</em>.</p>
<p><strong>Step Three: Watch real users.</strong> Some of the most useful experiences I had during <a href="http://opensword.org/pixen">Pixen&#8217;s</a> development were when I sat down an entirely new user in front of it and watched them go. You&#8217;ll see exactly works and exactly what&#8217;s confusing. You&#8217;ll discover new user stories or (with enough samples) gain the confidence to trash others.</p>
<p>Iterate, iterate, iterate, and never allow anything to grate or confuse. Never tell a user &#8220;well, I guess you can do that, but you have to go do these other two things with the whozit first, then click refresh.&#8221;</p>
<p>And whatever you do, don&#8217;t need a Knowledge Base.</p>
]]></content:encoded>
			<wfw:commentRss>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2008%2F05%2F07%2Fuser-interaction-101%2F&amp;seed_title=User+Interaction+101/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Why I Haven&#8217;t Been Posting Much Recently</title>
		<link>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2008%2F04%2F14%2Fwhy-i-havent-been-posting-much-recently%2F&amp;seed_title=Why+I+Haven%26%238217%3Bt+Been+Posting+Much+Recently</link>
		<comments>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2008%2F04%2F14%2Fwhy-i-havent-been-posting-much-recently%2F&amp;seed_title=Why+I+Haven%26%238217%3Bt+Been+Posting+Much+Recently#comments</comments>
		<pubDate>Tue, 15 Apr 2008 01:59:29 +0000</pubDate>
		<dc:creator>Andy Matuschak</dc:creator>
		
		<category><![CDATA[Square Signals]]></category>

		<guid isPermaLink="false">http://andymatuschak.org/articles/2008/04/14/why-i-havent-been-posting-much-recently/</guid>
		<description><![CDATA[step one:

step two:

step three:

]]></description>
			<content:encoded><![CDATA[<h4 style="margin-bottom: 0.5em">step one:</h4>
<p><img src="http://andymatuschak.org/wp-content/uploads/2008/04/step1.jpg" alt="step1.jpg" border="0" width="432" height="166" /></p>
<h4 style="margin-bottom: 0.5em">step two:</h4>
<p><img src="http://andymatuschak.org/wp-content/uploads/2008/04/step2.jpg" alt="step2.jpg" border="0" width="432" height="166" /></p>
<h4 style="margin-bottom: 0.5em">step three:</h4>
<p><img src="http://andymatuschak.org/wp-content/uploads/2008/04/step3.jpg" alt="step3.jpg" border="0" width="432" height="166" /></p>
]]></content:encoded>
			<wfw:commentRss>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2008%2F04%2F14%2Fwhy-i-havent-been-posting-much-recently%2F&amp;seed_title=Why+I+Haven%26%238217%3Bt+Been+Posting+Much+Recently/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Writing Code and Winning the NetFlix Prize</title>
		<link>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2008%2F02%2F09%2Fwriting-code-and-winning-the-netflix-prize%2F&amp;seed_title=Writing+Code+and+Winning+the+NetFlix+Prize</link>
		<comments>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2008%2F02%2F09%2Fwriting-code-and-winning-the-netflix-prize%2F&amp;seed_title=Writing+Code+and+Winning+the+NetFlix+Prize#comments</comments>
		<pubDate>Sat, 09 Feb 2008 20:03:17 +0000</pubDate>
		<dc:creator>Andy Matuschak</dc:creator>
		
		<category><![CDATA[Square Signals]]></category>

		<guid isPermaLink="false">http://andymatuschak.org/articles/2008/02/09/writing-code-and-winning-the-netflix-prize/</guid>
		<description><![CDATA[I whine a lot about my time at Caltech, but I&#8217;m actually taking a really neat course now which might as well be called &#8220;Win the NetFlix Prize&#8212;the Class.&#8221; If you&#8217;re unfamiliar with the prize, it&#8217;s $1,000,000 for improving upon NetFlix&#8217;s movie recommendation algorithm by 10%.
Not that we&#8217;re going to win or anything, but the [...]]]></description>
			<content:encoded><![CDATA[<p>I whine a lot about my time at Caltech, but I&#8217;m actually taking a really neat course now which might as well be called &#8220;Win the NetFlix Prize&mdash;the Class.&#8221; If you&#8217;re unfamiliar with <a href="http://netflixprize.com">the prize</a>, it&#8217;s $1,000,000 for improving upon NetFlix&#8217;s movie recommendation algorithm by 10%.</p>
<p>Not that we&#8217;re going to win or anything, but the performance and optimization implications of trying to solve this problem have been absolutely fascinating. A few details on the datasets that need to be analyzed:</p>
<ul>
<li>17,700 movies</li>
<li>480,000 users</li>
<li>100,000,000 ratings</li>
<li>2 GB of data (700 MB stored optimally)</li>
<li>Density of the movie-user ratings matrix: 1.18%!</li>
<li>If computing the similarity between two movies takes 0.01 seconds, it takes 18 <strong>days</strong> to finish computing all pairs!</li>
</ul>
<p>So that&#8217;s a little intimidating. There are a couple golden rules on performance that I&#8217;ve always been careful to follow:</p>
<ol>
<li>
<p><strong>Code first; optimize later.</strong></p>
<p>Don&#8217;t write your code thinking about every little performance hit. Make it <em>work</em>. If you focus on making it fast in the first iteration, you&#8217;ll never <em>finish</em> the first iteration, and your code will be really ugly.</p>
</li>
<li>
<p><strong>Don&#8217;t optimize without knowing what&#8217;s slow.</strong></p>
<p>A lot of the time I <em>think</em> I know what&#8217;s slow, but half the time, I&#8217;m wrong. Shark knows what&#8217;s slow. Instruments knows what&#8217;s slow. Make sure you ask before diving in.</p>
</li>
</ol>
<h3>Golden Rules Aren&#8217;t Always Right</h3>
<p>The really great thing about working on the NetFlix Prize is that basically all my software engineering assumptions and practices have had to go <strong>totally out the window.</strong></p>
<p>The first observation, given these numbers, is that Ruby is not going to work even the tiniest bit. Which is really sad since it&#8217;d make life a lot easier. I&#8217;m using Python instead, with Numpy for computation. Most of the heavy lifting, then, is in C.</p>
<p>The fascinating thing about working on these algorithms is that I&#8217;m writing code that would normally work just fine: most of it&#8217;s O(n) or O(log n). But now I&#8217;m finding for the first time that the constant coefficient is actually <em>mattering</em> because it&#8217;s being executed a hundred million times. Every line of code has to be carefully scrutinized for speed considerations, and every loop is the potential for absolute disaster.</p>
<p>Last night I found myself writing a very simple regularization algorithm. The naïve implementation in Ruby was about eight lines. But the implementation I have now is <em>still</em> too slow by an order of magnitude and took <strong>more than four hours</strong> to write.</p>
<p>Moral of the story? If you&#8217;re a consumer software developer, you should probably be following the standard software engineering &#8220;golden rules&#8221; for optimization. But maybe all of us should work on a project at least once that gives us some appreciation for what Google has to go through to deliver us search results in a couple hundred milliseconds.</p>
]]></content:encoded>
			<wfw:commentRss>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2008%2F02%2F09%2Fwriting-code-and-winning-the-netflix-prize%2F&amp;seed_title=Writing+Code+and+Winning+the+NetFlix+Prize/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Mac Developer RoundTable on User Interface</title>
		<link>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2008%2F01%2F26%2Fmac-developer-roundtable-on-user-interface%2F&amp;seed_title=Mac+Developer+RoundTable+on+User+Interface</link>
		<comments>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2008%2F01%2F26%2Fmac-developer-roundtable-on-user-interface%2F&amp;seed_title=Mac+Developer+RoundTable+on+User+Interface#comments</comments>
		<pubDate>Sat, 26 Jan 2008 19:52:40 +0000</pubDate>
		<dc:creator>Andy Matuschak</dc:creator>
		
		<category><![CDATA[Asides]]></category>

		<guid isPermaLink="false">http://andymatuschak.org/articles/2008/01/26/mac-developer-roundtable-on-user-interface/</guid>
		<description><![CDATA[I&#8217;ve just been part of an episode of Mac Developer RoundTable on user interface design today. I had a great time and got to chat with some fantastic other developers, so my thanks go out both to them and to our host, Scotty.
We covered a number of topics in the area, including the recent updates [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just been part of <a href="http://www.macdevnet.com/index.php/podcasts/mdr/38-mdr/153-mdr004">an episode of Mac Developer RoundTable</a> on user interface design today. I had a great time and got to chat with <a href="http://www.shirtpocket.com/">some</a> <a href="http://www.symonds.id.au/marcopolo/">fantastic</a> <a href="http://www.barebones.com/">other</a> <a href="http://www.zarrastudios.com/">developers</a>, so my thanks go out both to them and to <a href="http://www.mamooba.com/">our host, Scotty.</a></p>
<p>We covered a number of topics in the area, including the recent updates to the HIG, paper prototyping, error UIs, and&mdash;my favorite&mdash;machine learning in UIs, so you should <a href="http://www.macdevnet.com/index.php/podcasts/mdr/38-mdr/153-mdr004">definitely have a listen</a> if you&#8217;re interested in user interface.</p>
]]></content:encoded>
			<wfw:commentRss>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2008%2F01%2F26%2Fmac-developer-roundtable-on-user-interface%2F&amp;seed_title=Mac+Developer+RoundTable+on+User+Interface/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Is that a laptop in your pocket, or&#8230;?</title>
		<link>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2008%2F01%2F21%2Fis-that-a-laptop-in-your-pocket-or%2F&amp;seed_title=Is+that+a+laptop+in+your+pocket%2C+or%26%238230%3B%3F</link>
		<comments>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2008%2F01%2F21%2Fis-that-a-laptop-in-your-pocket-or%2F&amp;seed_title=Is+that+a+laptop+in+your+pocket%2C+or%26%238230%3B%3F#comments</comments>
		<pubDate>Mon, 21 Jan 2008 19:40:30 +0000</pubDate>
		<dc:creator>Andy Matuschak</dc:creator>
		
		<category><![CDATA[Square Signals]]></category>

		<guid isPermaLink="false">http://andymatuschak.org/articles/2008/01/21/is-that-a-laptop-in-your-pocket-or/</guid>
		<description><![CDATA[There&#8217;s been a lot of whining about the MacBook Air. Some of it may be justified—I don&#8217;t know, I still pre-ordered one—but there&#8217;s one point of contention in particular that confuses me.

It&#8217;s the same size as the MacBook! Only thinner! And lighter! This isn&#8217;t a real subnotebook!

Okay. Imagine if it were 9 inches across instead [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s been a lot of whining about the MacBook Air. Some of it may be justified—I don&#8217;t know, I still pre-ordered one—but there&#8217;s one point of contention in particular that confuses me.</p>
<blockquote>
<p>It&#8217;s the same size as the MacBook! Only thinner! And lighter! This isn&#8217;t a <em>real</em> subnotebook!</p>
</blockquote>
<p>Okay. Imagine if it were 9 inches across instead of 12. What would this do for you?</p>
<p>Would it be easier to transport? It&#8217;s still not going to fit in your pocket, unless you&#8217;re a scary kind of guy who wears ginormous trenchcoats. You&#8217;re still going to need to put it in a bag to move it around. It&#8217;s basically the size of a notebook or normal paper, so it&#8217;s hardly going to be the limiting factor in bag size.</p>
<p>Would it be easier to use? Yes, if a smaller keyboard makes it easier to use. I don&#8217;t know about you guys, but I have <em>full-sized</em> fingers, and they like a <em>full-sized</em> keyboard. And the screen resolution on 12&#8243; PowerBooks makes me cry.</p>
<p>Would it be more powerful somehow? Come on. The motherboard is already the size of two playing cards.</p>
<p>Honestly, I don&#8217;t understand the little-tiny-laptop thing. Devices are either pocket-sized or bag-sized. Anything in between is really just bag-sized pretending to be&#8230; I&#8217;m not even sure what. Levitation-sized? That would be pretty awesome, but unlikely until the MacBook Lighter-than-Air.</p>
]]></content:encoded>
			<wfw:commentRss>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2008%2F01%2F21%2Fis-that-a-laptop-in-your-pocket-or%2F&amp;seed_title=Is+that+a+laptop+in+your+pocket%2C+or%26%238230%3B%3F/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Why You Care</title>
		<link>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2007%2F12%2F21%2Fwhy-you-care%2F&amp;seed_title=Why+You+Care</link>
		<comments>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2007%2F12%2F21%2Fwhy-you-care%2F&amp;seed_title=Why+You+Care#comments</comments>
		<pubDate>Fri, 21 Dec 2007 17:16:07 +0000</pubDate>
		<dc:creator>Andy Matuschak</dc:creator>
		
		<category><![CDATA[Asides]]></category>

		<guid isPermaLink="false">http://andymatuschak.org/articles/2007/12/21/why-you-care/</guid>
		<description><![CDATA[Bob Warwick has an excellent follow-up to my post last night.
He also makes a very important point:

Unless you’re a member of the small demographic that thinks “There’s gotta be something better than Safari for news feeds”, you’ll never discover NetNewsWire.

You should care about this not just because it means a better experience for users. You [...]]]></description>
			<content:encoded><![CDATA[<p>Bob Warwick has <a href="http://codehackers.net/blog/?p=48">an excellent follow-up</a> to <a href="http://andymatuschak.org/articles/2007/12/20/anything-ubuntu-can-do-we-can-do-better-except-this-stuff">my post last night</a>.</p>
<p>He also makes a very important point:</p>
<blockquote>
<p>Unless you’re a member of the small demographic that thinks “There’s gotta be something better than Safari for news feeds”, you’ll never discover NetNewsWire.</p>
</blockquote>
<p>You should care about this not just because it means a better experience for users. You should care <strong>because it means more customers for you.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2007%2F12%2F21%2Fwhy-you-care%2F&amp;seed_title=Why+You+Care/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Anything Ubuntu can do, we can do better. Except this stuff.</title>
		<link>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2007%2F12%2F20%2Fanything-ubuntu-can-do-we-can-do-better-except-this-stuff%2F&amp;seed_title=Anything+Ubuntu+can+do%2C+we+can+do+better.+Except+this+stuff.</link>
		<comments>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2007%2F12%2F20%2Fanything-ubuntu-can-do-we-can-do-better-except-this-stuff%2F&amp;seed_title=Anything+Ubuntu+can+do%2C+we+can+do+better.+Except+this+stuff.#comments</comments>
		<pubDate>Fri, 21 Dec 2007 07:31:59 +0000</pubDate>
		<dc:creator>Andy Matuschak</dc:creator>
		
		<category><![CDATA[Square Signals]]></category>

		<guid isPermaLink="false">http://andymatuschak.org/articles/2007/12/20/anything-ubuntu-can-do-we-can-do-better-except-this-stuff/</guid>
		<description><![CDATA[When I argue with my Linux-loving friends about OS X vs. Ubuntu, they&#8217;ve only really got a couple points for which I have no retorts. But they&#8217;re big ones. Let&#8217;s think about how to fix them.
Why can&#8217;t I watch this video?
On Ubuntu, if you open an .avi for which you don&#8217;t have the codec, it [...]]]></description>
			<content:encoded><![CDATA[<p>When I argue with my Linux-loving friends about OS X vs. Ubuntu, they&#8217;ve only really got a couple points for which I have no retorts. But they&#8217;re big ones. Let&#8217;s think about how to fix them.</p>
<h3>Why can&#8217;t I watch this video?</h3>
<p>On Ubuntu, if you open an .avi for which you don&#8217;t have the codec, it will fetch it and install it.</p>
<p>On Mac OS X, if you open an .avi for which you don&#8217;t have the codec, QuickTime will give you an entirely useless error message. It won&#8217;t even tell you what codec you&#8217;re missing, so you can&#8217;t Google it.</p>
<h3>Our own private DLL hell</h3>
<p>Say a sinister hacker submits a patch for Sparkle with a security hole in it. Sparkle has maybe a couple hundred thousand users. That&#8217;s <strong>a lot</strong> of vulnerable computers.</p>
<p>Now, if we were using Ubuntu, a week later, our system would say: &#8220;You&#8217;ve got 9 updates available. Install?&#8221; And the user would go, &#8220;Yeah, sure.&#8221; His system would be safe, and he&#8217;d never know how close he came to total annihilation.</p>
<p>But no. Every one of a couple hundred apps has its own copy of Sparkle. Or RBSplitView. Or Growl. We&#8217;ll gloss over the ancillary problem of wasted disk space&mdash;a meg or two for each app. One app&#8217;s got Sparkle 1.0, another&#8217;s got 1.1. Some people are probably still running apps with Sparkle 0.1, riddled with bugs. It&#8217;s not like they&#8217;re dependent on a particular version or anything. No, they just haven&#8217;t bothered to include the updated version of the framework.</p>
<p>Oh dear, oh dear. How do we fix this?</p>
<p>Ooh! Ooh! We could have the app install the library into ~/Library/Frameworks, but only if it&#8217;s newer than what&#8217;s in there. But then every user has a different copy. We could put the framework into /Library/Frameworks, but that would require authentication. And every app&#8217;s distribution still includes all its dependencies.</p>
<p>Even with <em>that</em> hacky solution, the framework in question still wouldn&#8217;t get updated until the user ran some app that had been released recently enough to have included the new version of it. Developers still have to constantly check to see if there are updates available for the libraries they&#8217;re using.</p>
<h3>What the hell is a disk image, anyway?</h3>
<p><strong>A simple user story on Ubuntu:</strong></p>
<p>I have a .torrent file. What the heck is that? I guess I need a program that opens them.</p>
<p>I open Synaptic, search &#8220;torrent&#8221;, check one of the resulting boxes at random, and then I can open the file.</p>
<p><strong>A really stupid user story on Mac OS X:</strong></p>
<p>I have a .torrent file. What the heck is that? I guess I need a program that opens them.</p>
<p>I go to Apple > Mac OS X Software. This opens up Safari, where I search for &#8220;torrent&#8221;. This actually doesn&#8217;t turn up any useful results (what the hell?), but say it did. That brings me to another page, where I click Download. I have to click through a sheet acknowledging that I am, in fact, downloading a program. I click the Downloads stack on my Dock, click the disk image. I drag the application to Applications to install it. Then I go to the Applications folder and execute the app from there. To clean up, I eject the disk image. Then I click the Downloads stack on my Dock, and drag the disk image to the trash.</p>
<p>I don&#8217;t really care so much about the length of the operation, even though it clearly takes less time on Ubuntu. I don&#8217;t even care about flow, though it&#8217;s important to note how in OS X, the user has to click through modal sheets and switch between a number of different apps. I care about <em>the knowledge required to execute these stories.</em></p>
<p>In the case of Ubuntu, the user just has to know that Synaptic Package Manager is the thing to use to install programs. They don&#8217;t need to know how to use it: the interface is self-explanatory so long as they can think to open it. Even knowing that much is asking a good deal.</p>
<p>In the case of OS X, the user has to know the following things:</p>
<ol>
<li>There&#8217;s a Mac OS X Software&#8230; menu item under the Apple menu. Or how to get to the Apple Downloads web page.</li>
<li>That search box on the top menu of the Apple&#8217;s site can search for downloads in addition to everything else on Apple&#8217;s site&mdash;this is not particularly intuitive.</li>
<li>That downloaded things go to the Downloads folder on the Dock.</li>
<li>How to &#8220;install&#8221; an application. This involves knowing how to open up another Finder window and navigate to Applications if a symlink is not included.</li>
<li>How to launch an installed application properly: from /Applications, not from the disk image.</li>
<li>That the disk image can and should be cleaned up by dragging it to the trash.</li>
<li>That the disk image needs to be ejected before the trash can be emptied.</li>
</ol>
<p>Every extra piece of information the user is expected to know makes it more likely that the story will break down and lead to frustration. I see my father and some of my friends putting disk images in Applications and just mounting them and running the app from the image whenever they want it. I see people never deleting their downloaded files, leading to really cluttered folders.</p>
<p>But moreover, I see people having no idea how to complete this relatively simple task.</p>
<h3>Working toward a solution</h3>
<p>In my mind, an operating system&#8217;s merits can be judged by <strong>how easily problems can be solved on it</strong>. Applications help us solve <em>classes</em> of problems: a BitTorrent client allows us to download .torrent files; personal finance applications help us stay on top of our money; Transmit lets us talk to file servers.</p>
<p>We&#8217;ve got all these apps to solve all these problems, but where&#8217;s the app to solve the problem of <em>getting the tool to solve the problem we&#8217;re currently facing?</em></p>
<p>The three issues I&#8217;ve described above are linked, and they have a common solution.</p>
<p>This is a chicken-and-the-egg problem, though, folks. We can&#8217;t just make an app that helps people install apps because a lot of people will never know it exists. A lot more people wouldn&#8217;t be able to install it, even if they <em>did</em> know it existed.</p>
<p>We need something more fundamental.</p>
<p>I&#8217;ve been thinking about how best to solve this for a while, and I don&#8217;t have everything together yet, but it seems to me that Spotlight is a tool for solving some kinds of problems. It could easily become a <em>general</em> tool users turn to to solve problems.</p>
<p>One simple example: A search for &#8220;torrent&#8221; would do well to return Transmission and friends, even if they weren&#8217;t installed. And clicking a result should download and run the app (in a sandbox), not bring the user to the site. Maybe something a little like this shoddy mockup, but with better icons:</p>
<p style="text-align:center;"><img src="http://andymatuschak.org/wp-content/uploads/2007/12/spotlight-mockup.png" alt="spotlight_mockup.png" border="0" width="339" height="40" /></p>
<p>But to do this properly, one needs to display some extra information and buttons in the Spotlight results GUI. It doesn&#8217;t support this, of course. This design is complicated more by the Show All menu item using Finder.</p>
<p>This is obviously a complicated problem, and much more thought is required. I have no idea what the UI should be like; please don&#8217;t let that mockup deter you. Here are some basics of the design I&#8217;m excited about, though:</p>
<ul>
<li>I want to be able to run an app without installing it. A sandbox is probably technically infeasible but would be really neat.</li>
<li>Getting to an app on my system that runs a torrent and getting to an app I don&#8217;t have that runs a torrent are tasks trying to solve the same problem. Let&#8217;s approach them the same way.</li>
<li>Users don&#8217;t know or care what libraries or frameworks are. Handle dependencies behind the scenes.</li>
<li>These apps are like web apps: when you run them, they are always the latest version (cached for offline use). There is no software update.</li>
<li>This system should be a system-wide service so that&mdash;for example&mdash;QuickTime can always have the codec needed to play the video in question.</li>
<li>Code signing everywhere for everything.</li>
</ul>
<p>If you&#8217;re interested in this problem, I&#8217;d like to chat with you about it. My contact information is along the sidebar.</p>
]]></content:encoded>
			<wfw:commentRss>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2007%2F12%2F20%2Fanything-ubuntu-can-do-we-can-do-better-except-this-stuff%2F&amp;seed_title=Anything+Ubuntu+can+do%2C+we+can+do+better.+Except+this+stuff./feed/</wfw:commentRss>
		</item>
		<item>
		<title>RubyCocoa Parses Multiple Return Values!</title>
		<link>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2007%2F12%2F12%2Frubycocoa-parses-multiple-return-values%2F&amp;seed_title=RubyCocoa+Parses+Multiple+Return+Values%21</link>
		<comments>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2007%2F12%2F12%2Frubycocoa-parses-multiple-return-values%2F&amp;seed_title=RubyCocoa+Parses+Multiple+Return+Values%21#comments</comments>
		<pubDate>Thu, 13 Dec 2007 06:58:53 +0000</pubDate>
		<dc:creator>Andy Matuschak</dc:creator>
		
		<category><![CDATA[Asides]]></category>

		<guid isPermaLink="false">http://andymatuschak.org/articles/2007/12/12/rubycocoa-parses-multiple-return-values/</guid>
		<description><![CDATA[RubyCocoa parses Cocoa methods that return multiple values through pointer parameters! Check it out:
&#62;&#62; NSWorkspace.sharedWorkspace.getFileSystemInfoForPath_
isRemovable_isWritable_isUnmountable_description_
type_("/Volumes/SparkleCaster/English.lproj")
=&#62; [true, 1, 0, 1, #&#60;NSCFString "hfs"&#62;, #&#60;NSCFString "hfs"&#62;]
Now we&#8217;ve just got to do something about that really ugly method name&#8230;
]]></description>
			<content:encoded><![CDATA[<p>RubyCocoa parses Cocoa methods that return multiple values through pointer parameters! Check it out:</p>
<pre style="font-size:smaller;">&gt;&gt; NSWorkspace.sharedWorkspace.getFileSystemInfoForPath_
isRemovable_isWritable_isUnmountable_description_
type_("/Volumes/SparkleCaster/English.lproj")
=&gt; [true, 1, 0, 1, #&lt;NSCFString "hfs"&gt;, #&lt;NSCFString "hfs"&gt;]</pre>
<p>Now we&#8217;ve just got to do something about that really ugly method name&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2007%2F12%2F12%2Frubycocoa-parses-multiple-return-values%2F&amp;seed_title=RubyCocoa+Parses+Multiple+Return+Values%21/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Like Free Hugs!</title>
		<link>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2007%2F12%2F05%2Flike-free-hugs%2F&amp;seed_title=Like+Free+Hugs%21</link>
		<comments>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2007%2F12%2F05%2Flike-free-hugs%2F&amp;seed_title=Like+Free+Hugs%21#comments</comments>
		<pubDate>Wed, 05 Dec 2007 20:02:54 +0000</pubDate>
		<dc:creator>Andy Matuschak</dc:creator>
		
		<category><![CDATA[Square Signals]]></category>

		<guid isPermaLink="false">http://andymatuschak.org/articles/2007/12/05/like-free-hugs/</guid>
		<description><![CDATA[It&#8217;s really cool being part of the indie Mac developer community. Back when I was on Windows (shhh!), I never got to know any other coders&#8212;sharing wasn&#8217;t really part of the community.
For Mac development, there&#8217;s lots of places to go. #macsb is an old standby, but I&#8217;ve just recently discovered the magic of Twitter. I [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s really cool being part of the indie Mac developer community. Back when I was on Windows (shhh!), I never got to know any other coders&mdash;sharing wasn&#8217;t really part of the community.</p>
<p>For Mac development, there&#8217;s lots of places to go. #macsb is an old standby, but <a href="http://twitter.com/andy_matuschak">I&#8217;ve just recently discovered</a> the magic of <a href="http://twitter.com">Twitter</a>. I know, I know, I&#8217;m way behind. But if you head over to Twitter and sign up, you can see what a lot of awesome programmers are up to and connect with them in a really easy fashion. It&#8217;s like a big family, full of joy and swearing at Xcode!</p>
]]></content:encoded>
			<wfw:commentRss>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2007%2F12%2F05%2Flike-free-hugs%2F&amp;seed_title=Like+Free+Hugs%21/feed/</wfw:commentRss>
		</item>
		<item>
		<title>RubyCocoa 0.13.0!</title>
		<link>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2007%2F12%2F03%2Frubycocoa-0130%2F&amp;seed_title=RubyCocoa+0.13.0%21</link>
		<comments>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2007%2F12%2F03%2Frubycocoa-0130%2F&amp;seed_title=RubyCocoa+0.13.0%21#comments</comments>
		<pubDate>Tue, 04 Dec 2007 01:31:01 +0000</pubDate>
		<dc:creator>Andy Matuschak</dc:creator>
		
		<category><![CDATA[Asides]]></category>

		<guid isPermaLink="false">http://andymatuschak.org/articles/2007/12/03/rubycocoa-0130/</guid>
		<description><![CDATA[RubyCocoa 0.13.0 is out! You can  download it here, but make sure to check out what&#8217;s new.
Among the awesome new things are inspect methods for NSString, NSArray, NSNumber, NSDictionary, and others, so you can:
Aleph-One:Sparkle andym$ irb -r osx/cocoa
>> OSX::RUBYCOCOA_VERSION
=> "0.13.0"
>> OSX::NSDate.date
=> #&#60;NSDate 2007-12-03 17:29:21 -0800&#62;
Why isn&#8217;t this mentioned on MacOSForge::Ruby?
]]></description>
			<content:encoded><![CDATA[<p>RubyCocoa 0.13.0 is out! You can <a href="http://sourceforge.net/project/showfiles.php?group_id=44114"> download it here</a>, but make sure to <a href="http://sourceforge.net/project/shownotes.php?release_id=556409&#038;group_id=44114">check out what&#8217;s new</a>.</p>
<p>Among the awesome new things are <code>inspect</code> methods for <code>NSString</code>, <code>NSArray</code>, <code>NSNumber</code>, <code>NSDictionary</code>, and others, so you can:</p>
<pre>Aleph-One:Sparkle andym$ irb -r osx/cocoa
>> OSX::RUBYCOCOA_VERSION
=> "0.13.0"
>> OSX::NSDate.date
=> #&lt;NSDate 2007-12-03 17:29:21 -0800&gt;</pre>
<p>Why isn&#8217;t this mentioned on <a href="http://ruby.macosforge.org/">MacOSForge::Ruby</a>?</p>
]]></content:encoded>
			<wfw:commentRss>http://andymatuschak.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fandymatuschak.org%2Farticles%2F2007%2F12%2F03%2Frubycocoa-0130%2F&amp;seed_title=RubyCocoa+0.13.0%21/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 1.260 seconds -->
<!-- Cached page served by WP-Cache -->
<!-- Compression = gzip -->