<?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>rosscarter.com &#187; Cocoa</title>
	<atom:link href="http://rosscarter.com/category/cocoa/feed" rel="self" type="application/rss+xml" />
	<link>http://rosscarter.com</link>
	<description></description>
	<lastBuildDate>Tue, 07 Feb 2012 19:58:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>When does a UX failure deserve to be called stupid?</title>
		<link>http://rosscarter.com/2010/348.html</link>
		<comments>http://rosscarter.com/2010/348.html#comments</comments>
		<pubDate>Tue, 24 Aug 2010 18:04:41 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Commentary]]></category>

		<guid isPermaLink="false">http://rosscarter.com/?p=348</guid>
		<description><![CDATA[Recently I bought a pair of convertible cargo pants&#8212;you know, with legs that zip off to convert your pants into shorts. The detached legs are not quite identical, so the manufacturer provided L and R tags. Simple enough. What could go wrong? Well, the manufacturer&#8212;Columbia&#8212;attached the L and R tags not to the legs, but [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I bought a pair of convertible cargo pants&mdash;you know, with legs that zip off to convert your pants into shorts. The detached legs are not quite identical, so the manufacturer provided L and R tags. Simple enough. What could go wrong?</p>
<p>Well, the manufacturer&mdash;Columbia&mdash;attached the L and R tags not to the legs, but to the shorts.</p>
<p><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2010/08/cargo_shorts500x384.jpg" alt="Columbia pants" border="0" width="500" height="384" /><br /><em>The left leg is marked &#8220;L&#8221;. I knew that.</em></p>
<p>You would think that at some point during the design and manufacture of these pants, someone at Columbia would have said, &#8220;You know, it&#8217;s hard to tell the detached left leg from the right, but anyone can look at a pair of shorts and tell which is left and which is right. The L and R tags ought to be on the legs, not on the shorts.&#8221;</p>
<p>Evidently, that never happened.</p>
<p>Before you suppose that the sewing factory simply put the labels in the wrong place, let me point out that the labels are designed to attach to the zipper pulls, and the zippers are most definitely designed to remain with the shorts.</p>
<p>That is a UX failure of the grossest kind. But does it deserve to be called stupid?</p>
<p>(When I was a lawyer, UX was an abbreviation for <em>uxor</em>, Latin for wife. Now it means User Experience. Feel free to make a joke out of that.)</p>
<p>Shortly after I bought the cargo pants, I replaced the entry locksets in our home. Our Kwikset units were ten years old and had corroded so badly you could barely get a key in the lock. I upgraded to Schlage locksets.</p>
<p>The function of a lockset, by the way, is to lock intruders out. Not to lock yourself out.</p>
<p>With these new Schlage locksets, you twist a little button to lock the door from the inside. If you then turn the handle to go outside, the button remains in locked position. So if you step outside to retrieve the morning paper, and the door shuts behind you, you are locked out. Every other lockset I&#8217;ve worked with unlocks the door when you open it from the inside.</p>
<p><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2010/08/schlage1_500x544.jpg" alt="Schlage 1" width="500" height="544" /><br /><em>The door is locked.</em></p>
<p><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2010/08/schlage2_500x515.jpg" alt="Schlage 2" width="500" height="515" /><br /><em>The door is still locked.</em></p>
<p>After spending 45 minutes locked in my garage, I decided to trash the Schlage devices and replace everything again.</p>
<p>Schlage locksets. UX failure? Definitely. Stupid? Possibly.</p>
<p>There is a bar down the street named O&rsquo;Neill&rsquo;s. As we all learned in school, those &rsquo; marks are apostrophes. They curl to the left. The big illuminated sign for the bar says O&lsquo;Neill&rsquo;s.</p>
<p><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2010/08/oneills.jpg" alt="" title="O&#039;Neill&#039;s" width="500" height="423" /><br /><em>Well, at least they got the second one right.</em></p>
<p>Stupid? Quite likely. Illiterate for sure.</p>
<p>Our old clothes dryer had a buzzer that sounded when the dryer stopped. It was convenient and it worked. Our new Amana clothes dryer starts beeping long before the drying is over. It beeps and it beeps and it beeps. When the beeping stops, that&#8217;s your signal that the dryer has stopped. I couldn&#8217;t believe it when I heard it.</p>
<p>UX failure? Absolutely. Stupid? It damn well is.</p>
<p>But what has this got to do with software?</p>
<p>I posit this axiom: the bigger the company, the more vulnerable it is to stupid mistakes.</p>
<p>The failures I&#8217;ve mentioned are not the result of misjudgment by a single person. Columbia is a big company, as are Schlage and Amana. The bar is small time, but two businesses&mdash;the bar and the sign company&mdash; jointly committed the error. <em>In pari stupido</em>, as it were. There&#8217;s a huge difference between the mistake of a single person and the systemic ineptitude of an entire organization.</p>
<p>Stupid derives from Latin <em>stupere</em>, to stun. If you&#8217;re a big company, UX failures like those mentioned here can result only from mass cerebral paralysis. Reviewers and managers sitting stunned in their chairs, unable to act beyond a weak and fearful hand wave of approval. That&#8217;s what I call stupid.</p>
<p>Well, to be fair, maybe the QA chap was out sick that day, or thought the project was assigned to someone else. Still, <a href="http://rosscarter.com/2008/190.html">big software companies</a> command vast opportunities for error correction. Yet their slop and sludge is far more evident than the slipups of the small software shop, where like as not somebody edited that .xib at three o&#8217;clock in the morning. The quality and attention to detail in indie software never fails to amaze me, while&mdash;well, I really don&#8217;t expect quality from some companies any more.</p>
<p><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2009/08/adobewindow.png" alt="Adobe window" width="500" height="233" /></p>
<p>Anyone can make a simple mistake. When those with responsibility fail to catch it, that&#8217;s a stupid mistake.</p>
<p>I happily assert that none of my software contains stupid mistakes.</p>
]]></content:encoded>
			<wfw:commentRss>http://rosscarter.com/2010/348.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why are Xcode betas under NDA?</title>
		<link>http://rosscarter.com/2010/343.html</link>
		<comments>http://rosscarter.com/2010/343.html#comments</comments>
		<pubDate>Sat, 14 Aug 2010 18:20:39 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
				<category><![CDATA[Cocoa]]></category>

		<guid isPermaLink="false">http://rosscarter.com/?p=343</guid>
		<description><![CDATA[As developers, we all very quickly became familiar with Apple&#8217;s non-disclosure agreements, particularly the Prototype License and Confidentiality Agreement that applies to pre-release Apple software and related documentation and information. It&#8217;s easy to understand the reasoning behind NDAs. No developer wants potential customers to rely on an upcoming product&#8217;s having certain features that might be [...]]]></description>
			<content:encoded><![CDATA[<p>As developers, we all very quickly became familiar with Apple&#8217;s non-disclosure agreements, particularly the <a href="http://developer.apple.com/membership/pdf/terms.pdf">Prototype License and Confidentiality Agreement</a> that applies to pre-release Apple software and related documentation and information.</p>
<p>It&#8217;s easy to understand the reasoning behind NDAs. No developer wants potential customers to rely on an upcoming product&#8217;s having certain features that might be dropped before the product ships. Nor does a developer want new features to leak out in advance and dilute the buzz of the launch event. The developer wants to control public discussion of the new product lest unqualified reporters, who do not know what beta software looks like, give the product an undeservedly bad review. All these things make sense.</p>
<p>Except, I posit, in the case of developer tools.</p>
<h3>What&#8217;s different about developer tools</h3>
<p>Apple&#8217;s developer tools differ from its other products in substantial ways. The first and obvious difference is the price. Developer tools are free. Apple doesn&#8217;t sell them. There is no revenue stream to jeopardize.</p>
<p>Second, in the modern era, there is no competitor to Apple&#8217;s developer tools. Code Warrior is long gone. Can you imagine developing an iPhone app without Xcode? If you develop for Mac OS or iOS, you&#8217;re going to use Xcode, period. It isn&#8217;t like you are going to read a bad review about Xcode and decide to use something else.</p>
<p>Third, the parties who test pre-release developer tools are exactly the same parties who use the tools. I don&#8217;t think I am going out on a limb to say that the only people who use Xcode are developers. And the people who have access to the beta tools are the same developers. Everyone who is going to use the released product has access to the beta. There&#8217;s no risk of beta users misinforming customers who have to wait for the final release because nobody has to wait for the final release.</p>
<p>Developer tools are closer in analogy to in-house software. Many of us have developed software for use within a large organization. Do you think it would improve the product if your users were not allowed to discuss it among themselves?</p>
<p>I&#8217;ve tried to come up with a scenario in which Apple would be harmed by developers talking about Xcode 4. I can&#8217;t think of any. In fact, there is none, because Apple allows us to discuss Xcode 4 on their forum.</p>
<p>Because the forum is open only to developers, one assumes that Apple perceives some harm if the public could read what developers are saying about the new Xcode. I submit that this is nonsense. <em>&#8220;Developers confused by Base SDK vs Target SDK!&#8221; &#8220;Exclusive: method names in documentation index are not aligned!&#8221;</em> I don&#8217;t think we will ever read such headlines. Non-developers don&#8217;t give a tinker&#8217;s damn about the design of Xcode.</p>
<h3>Why the NDA harms Xcode development</h3>
<p>So, my first point is that applying the NDA to beta developer tools is nonsensical. My second point is that it leads to lousy software.</p>
<p>We all know how the bug reporter system works, at least superficially. Duplicates matter. Your chances of getting a bug fixed improve when other developers report the same bug. We routinely urge our peers to file a bug report on something we have already reported. Indeed, Apple engineers recommend the practice. It&#8217;s quite routine for someone to tell me about a bug that I have not personally encountered, but it is definitely in my interest to have the bug fixed before it trips me up, so I will file a duplicate bug report.</p>
<p>That&#8217;s just the way the system works. Except with Xcode betas! Because we are not allowed to discuss bugs among ourselves, the bug reports are limited to reports from developers who have discovered the bug on their own.</p>
<p>That is to say:</p>
<ul>
<li>Apple&#8217;s bug reporting system prioritizes bugs based on number of duplicates.</li>
<li>Bugs of significant importance to developers receive lots of duplicates because we discuss them among ourselves.</li>
<li>For Xcode betas, the bug reporting system continues to prioritize duplicates but denies developers the ability to increase the duplicates for very important bugs.</li>
</ul>
<p>Yes, I realize that Apple&#8217;s developer forums mitigate this flaw to some extent. But, really, those forums are a mess, aren&#8217;t they? As far as I can tell, there is no RSS feed or mailing list where you can keep up to date with what is being discussed. You have to check the site manually. For the Xcode 4 discussion alone, there are eight topics, and you have to check each one separately. When you have navigated beyond the first page of threads, and you click a thread to read it, you can&#8217;t get back to the page you were on; you&#8217;re taken back to page one and have to page forward to find the place where you left off.</p>
<p>As a developer whose skills will never rise beyond the level of intermediate, I rely on the wisdom of intelligent developers whom I respect. I&#8217;m far more likely to understand and agree with those guys than with an unknown poster on the Apple forum. I&#8217;d love to know what Gus and Matt and Marcus and Frasier and Daniel think about Xcode 4. I and others would then file bug reports and in the end we would all enjoy a better Xcode.</p>
<p>As things stand now, I have a feeling that Xcode development is beyond our control, and we are going to have to live with it no matter how awful it turns out. It might well be that some aspect of Xcode 4 is despised by the vast majority of us, but we will not know that until the NDA is lifted and then it will be too late.</p>
<p>I&#8217;ve posted a few items on the Apple forum. I&#8217;d ask you to search for them using my name, so you too can file bug reports, but guess what: that search does not find my posts. There&#8217;s a &#8220;Who&#8221; field in the search bar, but it doesn&#8217;t work, AFAICT.</p>
<h3>The sorry situation</h3>
<p>So all I can do publicly is muse: hmmm, I wonder how Xcode 4 handles Find Selected Text In Project? I wonder how it handles jumping directly to the documentation from source code? I wonder if you can easily jump back and forth between the docs for an object and the delegate methods for that object? I wonder if you can still right-click to fix alignment? I wonder what other features such as user scripts that I use heavily have been left out?</p>
<p>It might turn out that Xcode 4 is the best Xcode yet. If that happens, it won&#8217;t be because we all had a good discussion about it beforehand.</p>
]]></content:encoded>
			<wfw:commentRss>http://rosscarter.com/2010/343.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A better iPad keyboard</title>
		<link>http://rosscarter.com/2010/320.html</link>
		<comments>http://rosscarter.com/2010/320.html#comments</comments>
		<pubDate>Fri, 23 Apr 2010 21:43:53 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Cocoa]]></category>

		<guid isPermaLink="false">http://rosscarter.com/?p=320</guid>
		<description><![CDATA[After a couple of weeks with my iPad, I have to say that I am disappointed with its virtual keyboard. I never learned touch typing (whatever that means; is there another kind? Slam typing?). I get along very well without thinking about which finger goes to which key. On the iPad, my fingers go to [...]]]></description>
			<content:encoded><![CDATA[<p>After a couple of weeks with my iPad, I have to say that I am disappointed with its virtual keyboard.</p>
<p>I never learned touch typing (whatever that means; is there another kind? Slam typing?). I get along very well without thinking about which finger goes to which key. On the iPad, my fingers go to the correct place as accurately as they do on a real keyboard. The loss of tactile feedback doesn&#8217;t slow me down at all, except for the shift key, as I will describe in a moment.</p>
<p>What slows me down&mdash;way down&mdash;is typing anything other than lower case a to z, space, comma, and period. Those, of course, are the characters you can type with one keystroke. Anything else requires either the shift key or a switch to a different keyboard layout, accomplished by two large keys on the main keyboard and two small keys on the auxiliary keyboards.</p>
<p><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2010/04/iPadKeyboard.png" alt="iPadKeyboard.png" border="0" width="512" height="176" /></p>
<p>The shift key slows me down because Apple has been very sparing in representing the state of the key. Pressing the shift key draws its arrow with a blue fill. That&#8217;s a curious choice, because when my finger is on the shift key I cannot see its arrow at all. Yes, there are two shift keys, but my eyes want to go to the one under my finger.</p>
<p>The glyphs on the keys are all upper case. I would have liked the key glyphs to be lowercase, switching to uppercase when the shift key is pressed. That would tell me immediately what is going on, even if some keys are obscured at the moment.</p>
<p>Most of my irritation with letter case comes from Apple&#8217;s attempt to press the shift key for me, for example after a full stop. Even with auto capitalization turned off, the keyboard still tries to type uppercase letters when I don&#8217;t want it to. For example, if I type &#8220;In summary, I propose that&#8221; and decide I want to change <strong>I</strong> to <strong>we</strong>, when I delete the <strong>I</strong> the shift key is engaged and I end up typing <strong>We</strong> instead of <strong>we</strong>.</p>
<p>The auxiliary keyboards slow me down because they do not stay on screen long enough for me to learn where all the characters lie. To type a plus sign you have to tap the<strong> .?123</strong> key to bring up the numeric keyboard, then tap the <b>#+=</b> key to bring up punctuation keyboard. By the way, <strong>.?123</strong> is an odd label. You can already type . and ? from the main keyboard.</p>
<p><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2010/04/iPadPunctuation.png" alt="iPadPunctuation.png" border="0" width="512" height="175" /></p>
<p><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2010/04/iPadNumeric.png" alt="iPadNumeric.png" border="0" width="512" height="175" /></p>
<p>To type a + requires four taps: the <strong>.?123</strong> key, the <b>#+=</b> key, the <b>+</b> key, and finally the <b>ABC</b> key to get back to the main keyboard. At that point my concentration is gone, and whatever I was going to say next has to be thought out again.</p>
<p>After a couple weeks I have made no progress toward learning the whereabouts of any auxiliary keyboard keys other than the numerals at the top of the numeric keyboard.</p>
<p>Many people, perhaps most, type a <b>!</b> or <b>?</b> more frequently than an apostrophe. I am not among them. It takes three taps to get an apostrophe in place. And although the proffered glyph is a properly curved apostrophe, the rendered glyph is a plain straight abomination.</p>
<p>Worst of all, despite all those keyboards there are no arrow keys. Selecting a single character by dragging, or placing the insertion point at a particular spot, is just not easy. I use arrow keys all the time on a regular keyboard, and I want them on my virtual keyboard.</p>
<p>One of my big frustrations vanished when I discovered that you can type an apostrophe by flicking the comma key upward. What a clever and useful feature! How did I miss it? Was it mentioned somewhere? At any rate, I submit that the flickable key idea can be incorporated into the entire keyboard in such a manner that the virtual keyboard rivals, and perhaps excels, the tactile keyboard.</p>
<p>Here&#8217;s how it would work.</p>
<p>1. Every key would respond to up, down, left, and right flicks in addition to taps and holds (a hold pops up a menu for certain keys, showing diacritical options). </p>
<p>2. The four characters produced by the flicks would be drawn on the key.</p>
<p>3. The shift key and the auxiliary keyboards would be removed.</p>
<p>4. Taking the place of the shift and keyboard keys would be keys for managing the selection and cursor position, and keys for families of quotation marks, parentheses, and hyphens.</p>
<p>Forgive me, but I cannot resist calling these flickable keys flickeys.</p>
<p>Here&#8217;s how a flickeyboard might look (click for a full size view):</p>
<p><a href="http://rosscarter.com/wordpress/../wp-content/uploads/2010/04/flickeyboard.png"><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2010/04/flickeyboard.png" alt="flickeyboard.png" border="0" width="512" height="176" /></a></p>
<p>Obviously, this is a US flickeyboard; localized keyboards would differ in the placement of some symbols. How it works should be self-evident. A few ideas merit a closer look.</p>
<p>Flicking down on any letter renders it in uppercase. Flicking downward with two or more fingers anywhere on the keyboard toggles Caps Lock, which is identified by swapping the uppercase and lowercase labels on the flickeys.</p>
<p><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2010/04/topRowFlickeys.png" alt="Top row" title="topRowFlickeys" width="288" height="94" class="alignnone size-full wp-image-326" /></p>
<p>The top row of flickeys mimics the operation of the top row of keys on a standard keyboard. Numerals 1 through 0 are right where you expect them to be; you simply flick upward to type the numeral. Flicking to the left produces the symbols associated with holding the shift key while typing a number key. Flicking upward with two or more fingers swaps in a numeric keypad.</p>
<p>Flicking to the right produces some symbols that appear on the iPad punctuation keyboard. Currency symbols are grouped together; in a happy coincidence the yen symbol appears with the letter <strong>y</strong> and the euro symbol appears with the letter <strong>u</strong>. Multiplication, division, addition, and equals symbols are placed on three adjacent flickeys.</p>
<p>In this mockup, the second row of flickeys has not been assigned any characters. That&#8217;s 27 possibilities.</p>
<p><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2010/04/quoteFlickey.png" alt="Quote flickey" title="quoteFlickey" width="93" height="92" class="alignnone size-full wp-image-327" /></p>
<p>A quotation mark key replaces the left shift key. With one key you can easily type the four typographer&#8217;s quotes, or the abominable straight mark. This, I submit, is an improvement over the shift-option-bracket combinations used on a Mac desktop.</p>
<p>Flicking upward on the bottom row of letters mimics the option key combinations used to type diacritical marks. </p>
<p>At the right of the third row, three punctuation keys provide related symbols. The comma and semicolon use the same flickey. Full stops&mdash;period, exclamation, and question mark&mdash;appear on the period flickey, as does the colon. The rightmost flickey provides hyphen, en hyphen, em hyphen, and underscore.</p>
<p><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2010/04/parenFlickeys.png" alt="Delimiter flickeys" title="parenFlickeys" width="186" height="89" class="alignnone size-full wp-image-328" /></p>
<p>To the right of the space bar, two keys provide matching delimiters: parentheses, brackets, braces, and angle brackets.</p>
<p>The space bar shows a command symbol to denote that holding the space bar in conjunction with a another flickey mimics the command key; space-z invokes undo, space-v invokes paste, and so on.</p>
<p><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2010/04/cursorFlickeys.png" alt="Cursor flickeys" title="cursorFlickeys" width="193" height="85" class="alignnone size-full wp-image-329" /></p>
<p>The leftmost key on the bottom row does nothing when tapped; it responds only to flicks, and it moves the cursor left and right, or line up and line down. Up-left  and down-right flicks mimic the Home and End keys.</p>
<p>The select key (which is not a flickey), when held, turns any cursor movement into a move-and-select. It works in conjunction with the key to its left, or with taps in the document. For example, you can select from the cursor to the beginning of the line by holding the select key and tapping at the beginning of the line. In other words, it creates selections exactly as the shift key does on a regular keyboard.</p>
<p>If users find the layout too busy with all those labels, one possible solution is to toggle the visibility of the flick labels by means of an added key or a flick. Another is to put an opacity slider to the left of the <b>a</b> key.</p>
<p>The flickeyboard takes advantage of the iPad&#8217;s ability to do things that cannot be done on a conventional keyboard. A single, simple, intuitive movement replaces the typewriter-era paradigm of holding a modifier key while tapping a character key. You see all the characters all the time, unlike physical keyboards that require a keyboard viewer application to show you where some characters hide.</p>
<p>It shouldn&#8217;t be too terribly difficult for someone to write an app that would let us try out this concept. A github project, perhaps?</p>
<p><i>(Edited 24 April 2010 in response to Uli&#8217;s comment.)</i></p>
]]></content:encoded>
			<wfw:commentRss>http://rosscarter.com/2010/320.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>NSConference USA 2010</title>
		<link>http://rosscarter.com/2010/312.html</link>
		<comments>http://rosscarter.com/2010/312.html#comments</comments>
		<pubDate>Mon, 01 Mar 2010 18:26:27 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
				<category><![CDATA[Cocoa]]></category>

		<guid isPermaLink="false">http://rosscarter.com/?p=312</guid>
		<description><![CDATA[Sometimes I think I&#8217;m not a real developer. I don&#8217;t like cats, loud music, television, or science fiction. I like beer, but when I go to a bar I order just one or two at the most, not five or six. I can&#8217;t stay up till 3 a.m. I&#8217;m a slow typist. Menlo bothers me [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes I think I&#8217;m not a real developer. I don&#8217;t like cats, loud music, television, or science fiction. I like beer, but when I go to a bar I order just one or two at the most, not five or six. I can&#8217;t stay up till 3 a.m. I&#8217;m a slow typist. Menlo bothers me because the * is too low.</p>
<p>But when I go to NSConference, I become part of a fraternity that has a rollicking good time.</p>
<p>What if, instead of attending the Atlanta conference last week, I had taken a cruise, or gone to the Olympics, or gone skiing in the Alps or toured the world&#8217;s top museums&mdash;would I have had any more fun than I had hanging out with Cocoa developers? What if I had tickets to the funniest play on Broadway&mdash;would I have laughed more loudly than I did at the Cocoa Rumble? What if I had set aside a few days for quiet study of Cocoa documentation&mdash;would I have learned any more?</p>
<p>It goes without saying that the answer to all these questions is an emphatic No. I don&#8217;t know how Scotty and his team do it, but they&#8217;ve come up with a conference formula that packs a couple of days full of fun <em>and</em> material. It was rather like the time I got to sit right next to Tommy Emanuel while he was playing guitar. I could see his hands, and I could hear the music, but I couldn&#8217;t believe that all that music came from just those two hands. At NSConference, I couldn&#8217;t believe I was having such a good time and learning so much at the same time.</p>
<p>NSConference 2011? Sign me up now.</p>
]]></content:encoded>
			<wfw:commentRss>http://rosscarter.com/2010/312.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPad: the world has changed</title>
		<link>http://rosscarter.com/2010/308.html</link>
		<comments>http://rosscarter.com/2010/308.html#comments</comments>
		<pubDate>Fri, 29 Jan 2010 17:33:40 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Cocoa]]></category>

		<guid isPermaLink="false">http://rosscarter.com/?p=308</guid>
		<description><![CDATA[The iPad is going to change the way we use computers. The change is huge, and it affects everybody. I&#8217;m going to tell you why in one word: abstraction. Degrees of abstraction We can differentiate between tasks that require high and low degrees of abstraction. When you take a pencil and draw a picture of [...]]]></description>
			<content:encoded><![CDATA[<p>The iPad is going to change the way we use computers. The change is huge, and it affects everybody. I&#8217;m going to tell you why in one word: abstraction.</p>
<h2>Degrees of abstraction</h2>
<p>We can differentiate between tasks that require high and low degrees of abstraction. When you take a pencil and draw a picture of a cup, that&#8217;s a low degree of abstraction. It looks like a cup; when you drew it you were thinking of an actual cup; and when someone looks at it they think of an actual cup, too.</p>
<p><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2010/01/cup.png" alt="cup.png" border="0" width="75" height="89" /> <img src="http://rosscarter.com/wordpress/../wp-content/uploads/2010/01/u.png" alt="u.png" border="0" width="75" height="89" /></p>
<p>If instead of a cup you draw the letter u, you invoke a high degree of abstraction. The shape that you drew contributes meaning in the context of its grouping with other shapes. The process of accumulating many abstractions into a larger meaning is immensely complex; we all learned it when our young brains were fantastically adept at this sort of thing. Even so, learning to read and write took years of study and practice.</p>
<p>Communicating through written language, without doubt, is the most complex and abstract task that we routinely perform. This is equally true for alphabetic and pictographic writing systems; pictographs arguably require less abstraction but more complexity because of the large number of glyphs.</p>
<p><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2010/01/cuneiform.png" alt="cuneiform.png" border="0" width="300" height="155" /></p>
<p>Written text is not the only highly abstract activity we perform. Numbers are abstract, with arbitrary representations. Recall that the roman alphabet we use today long preceded the arabic numbering system. Dates and times are also abstract. &#8220;The first Thursday of the month&#8221; references a complete abstraction.</p>
<p>On our computers, we constantly switch back and forth between high- and low-abstraction tasks. As I write this, I pause from the highly abstract task of typing text to the non-abstract task of repositioning the window by dragging the mouse.</p>
<p>Now, pay attention here. Moving the window was low-abstraction because I have a low-abstraction input device. If I had no trackpad or mouse, I would have to move the window by typing keystrokes, which would involve quite a bit of abstraction. I don&#8217;t think I have ever moved a window via the keyboard. I have no idea how to go about it. I haven&#8217;t learned that particular abstraction, so I can&#8217;t move the window with the keyboard because abstractions are the only kind of input a keyboard understands.</p>
<p>Here&#8217;s the theorem: if the input method matches the abstraction of the task, executing the task is simple; if not, executing the task is complex. Or, if you like: the ease with which a task can be performed is directly proportional to the impedance match between the abstraction level of the task and the abstraction capability of the input system.</p>
<h2>How computing devices handle abstraction</h2>
<p>Now let&#8217;s do  a quick review of the progress we&#8217;ve made in thirty years of interacting with personal computing devices.</p>
<p><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2010/01/altair-computer.jpg" alt="altair-computer.jpg" border="0" width="400" height="211" /></p>
<p>Before Apple, computers used toggle switches for input and lights for output. Looking at such a device today one is repulsed by the high level of abstraction required to interact with it. You have to associate meaning with various patterns of light and switch state. Interacting with the machine seems almost impossibly difficult. In fact the process is probably no more abstract than our writing system; we simply don&#8217;t want to undertake the great effort required to master it.</p>
<p>The Apple computer designed by Steve Wozniak was the first personal computer to use a keyboard for input and a monitor for output. This provided an enormous increase in usability by replacing an unfamiliar system of abstraction with a system we already knew.</p>
<p><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2010/01/Apple_I.jpg" alt="Apple_I.jpg" border="0" width="400" height="243" /></p>
<p>The keyboard is remarkably adaptable. You can use your typing skills, or you can learn some new abstractions and use the keyboard to play games or make musical tones or emulate a calculator. The keyboard beneath my fingers right now has seventy-eight keys. All but five (the keys for adjusting brightness and volume) are totally abstract. The four arrow keys I consider semi-abstract.</p>
<p>Because the keyboard is designed for high-abstraction tasks, it is terrible for low-abstraction tasks. Our human impulse to use our hands for grasping and manipulating objects must be replaced with an abstraction because abstraction is the only kind of interface that a keyboard provides.</p>
<p>That&#8217;s why the mouse-equipped Macintosh was so revolutionary. It gave us two input devices that provide input in both high and low levels of abstraction.</p>
<p><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2010/01/Mac-Plus.jpg" alt="Mac-Plus.jpg" border="0" width="400" height="333" /></p>
<p>But the mouse is not ideal, is it? There&#8217;s still some abstraction involved&mdash;the physical object moved and the movement on the display occur in different places. Sometimes I have to wiggle the mouse in order to find the pointer of my display. When I try to draw with the mouse I usually see the brush going a different place than I wanted. After all, the mouse is an extension of the hand, not the fingers. You wouldn&#8217;t want to resize a picture by executing the pinch gesture with a mouse in each hand. Other low-abstraction input devices such as trackpads and drawing tablets address some of these limitations. Still, the input sensor is external to the display, so there is necessarily some abstraction involved, and in any event you have to manipulate at least two different devices to provide both high- and low-abstraction input.</p>
<p>The ultimate low-abstraction devices are our fingers, and that of course brings us to the iPhone. Cocoa Touch provides the sense of manipulating objects directly with your fingers. That&#8217;s a very satisfying thing to do, and perhaps explains why I prefer to do some tasks on my iPhone when I could do them just as effectively on my Mac. Because the input occurs at the same location as the result, nearly all the abstraction is removed. For low-abstraction input, the touch screen beats the mouse hands down.</p>
<p>Sometimes we forget that the touch screen is not the only input system on the iPhone. The accelerometer turns the entire device into an input sensor that responds to motion and orientation in  three-dimensional space. Together the two systems provide a wealth of low-level abstractions that far exceed the capabilities of the input systems on desktop and laptop computers. There are no peripheral objects to capture input; on the contrary, the notion that input is distinct from output all but vanishes, merged into a single concept that embraces output, input, and the computing device itself.</p>
<p>According to our theorem, the iPhone should be ill-suited for high-abstraction tasks. And it is.  I, for one, cannot type with two thumbs. A pocket-size device is simply too small to accept rapid input from ten fingers. For better or worse, that&#8217;s how we provide the complex input required for high-abstraction tasks: we type on a keyboard. And you can&#8217;t do that on an iPhone. </p>
<h2>How the iPad handles abstraction</h2>
<p>To recap: </p>
<table style="border:1px solid black; padding:5px;">
<tr>
<td style="width:8em;"><strong>Device</strong></td>
<td style="width:15em;"><strong>High-abstraction input</strong></td>
<td style="width:12em;"><strong>Low-abstraction input</strong></td>
</tr>
<tr>
<td>Apple II</td>
<td>Excellent</td>
<td>Terrible</td>
</tr>
<tr>
<td>Mac</td>
<td>Excellent</td>
<td>Good</td>
</tr>
<tr>
<td>iPhone</td>
<td>Poor</td>
<td>Outstanding</td>
</tr>
</table>
<p></p>
<p>As of 27 January 2010 we must add this:</p>
<table style="border:1px solid black; padding:5px;">
<tr>
<td style="width:8em;">iPad</td>
<td style="width:15em;">Outstanding</td>
<td style="width:12em;">Outstanding</td>
</tr>
</table>
<p></p>
<p>With the iPad, we have a device that provides the outstanding low-abstraction input of the iPhone, and high-abstraction input that is superior to the Mac. (People who think the iPad is a big iPhone have it backwards; the iPhone is a miniature iPad.) </p>
<p>At the product launch event, we watched people drive a car by turning the iPad like a steering wheel; create a presentation by dragging slides around with a finger; and type text on a qwerty keyboard. All this was done on a device that has no peripheral attachments&mdash;a device that, like the iPhone, conflates the notions of input, output, and the device itself.</p>
<p>That&#8217;s why the iPad is going to change the way we interact with computers. Most of the recent clatter misses the point. Cameras and tech specs and book prices are the trees; the way we interact with the device is the forest, and I hope people start to see it.</p>
<p>Why do I deem the iPad keyboard superior to the one I&#8217;m typing on now? Primarily because the iPad is not limited to just one keyboard. The iPad introduces the concept of different keyboards for different tasks. In the demo we saw the traditional qwerty keyboard, what we might be tempted to call a numeric keypad, and a delightful innovation: a keyboard for inputting date and time information. (&#8220;Keyboard&#8221; is something of a misnomer on the iPad, as there are no keys; maybe &#8220;button board&#8221; or just &#8220;board&#8221; is a better term to denote an infinitely configurable system of processing highly abstract input.)</p>
<p>It&#8217;s no coincidence that those three keyboards correspond to the three abstract systems I described at the beginning of this essay. These alternative input systems seem to live in another dimension, popping into our existence only when we need them. We&#8217;ll see more of them in the fullness of time. I look forward to the button board designed for musical composition. </p>
<h2>The virtues of the virtual keyboard</h2>
<p>Some might object that typing on a glass keyboard will never rival typing on a regular keyboard. Let&#8217;s reason this through. There are three factors that define a typing experience: the distance that the key travels, the force required to initiate key movement, and the cushion or give when the movement reaches bottom.</p>
<p>It&#8217;s easy to see where key travel has been heading.</p>
<p><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2010/01/Underwood.jpg" alt="Underwood.jpg" border="0" width="400" height="293" /></p>
<p>Back when typewriters were made of iron, the key travel was as much as two inches. Electric typewriters reduced key travel to about three-eights of an inch. (Just guesses; I don&#8217;t have either one, and I don&#8217;t know anyone who does, so I didn&#8217;t measure. But I&#8217;ve done quite bit of typing on both electric and mechanical typewriters, including one so old that when you pressed the shift key it raised the carriage instead of lowering the keys, and these numbers seem right.)</p>
<p>I took a ruler and measured the key travel on some keyboards I have around the house. Here&#8217;s the key travel data, measured in thirty-seconds of an inch:</p>
<p>Very old mechanical typewriter: 64<br />
1960s mechanical typewriter: 32<br />
Electric typewriter: 12<br />
Keyboard from first-generation iMac: 6<br />
2002 Microsoft keyboard: 5<br />
Keyboard from iMac G5: 4<br />
Keyboard from new iMac: 3<br />
Keyboard on MacBook Air: 2<br />
iPad virtual keyboard: 0</p>
<p>Every reduction in key travel has improved the typing experience. In my view, the iPad marks the inevitable end of a progression that has been happening for the last hundred years. Just as 6/32 seems like way too much travel to me now, I&#8217;m sure that anything greater than 0 will seem too much after I&#8217;ve used the iPad for a while.</p>
<p>The force required to execute a keystroke cannot be measured without an iPad, and even if I had one I wouldn&#8217;t know how to measure it. I expect it is very small, like the iPhone. At any rate, I&#8217;m sure that touch sensitivity can be tweaked by the operating system, or possibly by user preference, and the default value will be much less than the value for a mechanical keyboard.</p>
<p>The landing experience, in my unschooled opinion, cannot be judged apart from the force exerted. The harder you have to push to make a key move, the more you need a soft landing. As we grow accustomed to typing on glass, I think we&#8217;ll soften the force we apply to our fingers and the experience will be quite natural and painless. I&#8217;ve never heard anyone complain that using an iPhone makes their fingertips sore.</p>
<p>Furthermore, we won&#8217;t need a desk to set the iPad on. An iPad resting in your lap will absorb quite a bit of typing impact. Typing on the iPad won&#8217;t be like drumming your fingers on a glass tabletop.</p>
<p>I also suspect that the diminution of key travel and key force over the years has changed the way we position our fingers over the keys. In the old days, you had to type with the tips of your fingers because that was the only way to exert enough force to execute the mechanical movement required. I still remember jabbing a stiffened little finger into the shift key in order to move the entire keyset. When little or no force need be applied, we can type with the balls of our fingers, which have more natural cushion than our fingertips.</p>
<h2>The world has changed</h2>
<p>The best low-abstraction input system the world has seen, and an infinitely adaptable high-abstraction input system, in a product that is a simple thin rectangle&mdash;how that can be anything but revolutionary?</p>
<p>It&#8217;s going to be a long sixty days.</p>
]]></content:encoded>
			<wfw:commentRss>http://rosscarter.com/2010/308.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>First foray into accessibility</title>
		<link>http://rosscarter.com/2009/285.html</link>
		<comments>http://rosscarter.com/2009/285.html#comments</comments>
		<pubDate>Mon, 30 Nov 2009 20:06:11 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
				<category><![CDATA[Cocoa]]></category>

		<guid isPermaLink="false">http://rosscarter.com/?p=285</guid>
		<description><![CDATA[Recently I received feedback from a blind user complimenting Pagehand on its accessibility. This surprised me because accessibility is one of those things I intended to look into one day, and I had not done anything special to make it happen. Curious, I put Pagehand through its paces in VoiceOver. The exercise left me horrified. [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I received feedback from a blind user complimenting Pagehand on its accessibility. This surprised me because accessibility is one of those things I intended to look into one day, and I had not done anything special to make it happen.</p>
<p>Curious, I put <a href="http://pagehand.com">Pagehand</a> through its paces in VoiceOver. The exercise left me horrified. Far from deserving praise from this user, I instead deserve severe disapprobation for neglect.</p>
<p>It took a while (and some great help from the <a href="http://www.lists.apple.com/mailman/listinfo/accessibility-dev">accessibility mailing list</a>) to figure out how to fix the worst of my transgressions.  For the benefit of others who, like me, are a blank slate when it comes to accessibility support, I&#8217;d like to share what I&#8217;ve discovered so far.<br />
<span id="more-285"></span></p>
<h2>First discovery: VoiceOver reads tooltips.</h2>
<p>It turns out that I got a big jump on accessibility simply by filling in the Tool Tip fields in Interface Builder. VoiceOver reads tooltips as accessibility help tags. Without my doing anything special, VoiceOver users got the benefit of those tooltips:</p>
<p><img src="http://rosscarter.com/wordpress/../wp-content/uploads/2009/11/VOhelpTextExample.png" alt="VOhelpTextExample.png" border="0" width="520" height="125" /></p>
<h2>Second discovery: VoiceOver sees things that we do not see.</h2>
<p>The most surprising discovery I&#8217;ve made is that VoiceOver&#8217;s notion of what is visible is different from what is in fact visible on screen. Specifically, VoiceOver sends a <code>-isHidden</code> message to a NSView to determine whether the view is visible. It ignores the view&#8217;s frame. If you hide a view by setting its height to 0, or move it out sight, the view is invisible on the screen but fully visible to VoiceOver.</p>
<p>Pagehand uses simple proxy animations to open and close views. Controls are subviews of an NSView subclass named Palette, and the animation hides the Palette by setting its height to 0. Palettes are placed side by side in another NSView subclass named Sidebar, and Sidebars are made visible by adjusting the x origin of their superview, again using animation. The superview is the width of one Sidebar, so the Sidebars appear to slide horizontally into place.</p>
<p>This all looks fine on screen, but VoiceOver does not understand any of it. VoiceOver thinks all the Palettes in all the Sidebars are visible all the time.</p>
<p>I can think of three simple approaches for fixing this problem: send <code>setHidden:YES</code> at the end of animation that hides a Palette or Sidebar, and <code>setHidden:NO</code> at the beginning of all other animations; override <code>setFrame:</code> to send <code>setHidden:</code> as appropriate; or override <code>setHidden:</code> to look at the receiver&#8217;s frame and return YES if the Palette or Sidebar is completely hidden.</p>
<p>For now, I am using the third approach. I don&#8217;t know which is best.</p>
<h2>Third discovery: You cannot supply accessibility text for an NSSegmentedControl in Interface Builder.</h2>
<p>VoiceOver will read the items in an NSSegmentedControl as &#8220;radio button 2 of 4.&#8221; You might expect that the Accessibility Description field in Interface Builder would allow you to set the description for each cell. But the Description field applies to the entire segmented control, not to individual cells. You have to provide the accessibility description in code.</p>
<p>You can see how to do this in Apple&#8217;s <a href="http://developer.apple.com/mac/library/samplecode/ImageMapExample/">ImageMapExample</a>. To help keep the accessibility strings organized, I subclassed NSSegmentedControl and set a unique tag for each control in Interface Builder. Basically it&#8217;s just a copy-and-paste job from the example:</p>
<p><pre><code>@implementation CCMAXSegmentedControl

// copied from ImageMapExampleController.m:
static void SetSegmentDescriptions(NSSegmentedControl *control, NSString *firstDescription, ...) {
&nbsp;&nbsp;&nbsp;&nbsp;// Use NSAccessibilityUnignoredDescendant to be sure we start with the correct object.
&nbsp;&nbsp;&nbsp;&nbsp;id segmentElement = NSAccessibilityUnignoredDescendant(control);
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;// Use the accessibility protocol to get the children.
&nbsp;&nbsp;&nbsp;&nbsp;NSArray *segments = [segmentElement accessibilityAttributeValue:NSAccessibilityChildrenAttribute];
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;va_list args;
&nbsp;&nbsp;&nbsp;&nbsp;va_start(args, firstDescription);
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;id segment;
&nbsp;&nbsp;&nbsp;&nbsp;NSString *description = firstDescription;
&nbsp;&nbsp;&nbsp;&nbsp;NSEnumerator *e = [segments objectEnumerator];
&nbsp;&nbsp;&nbsp;&nbsp;while ((segment = [e nextObject])) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (description != nil) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[segment accessibilitySetOverrideValue:description forAttribute:NSAccessibilityDescriptionAttribute];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Exit loop if we run out of descriptions.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;description = va_arg(args, id);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;va_end(args);
}

- (void)awakeFromNib {
&nbsp;&nbsp;if ([self tag] == 2) {&nbsp;&nbsp;&nbsp;&nbsp;// paragraph alignment:
&nbsp;&nbsp;&nbsp;&nbsp;NSString *leftAlign = NSLocalizedStringFromTable(@&quot;left align&quot;, @&quot;AX&quot;, &quot;left align&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;NSString *centerAlign = NSLocalizedStringFromTable(@&quot;center align&quot;, @&quot;AX&quot;, &quot;center align&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;NSString *rightAlign = NSLocalizedStringFromTable(@&quot;right align&quot;, @&quot;AX&quot;, &quot;right align&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;NSString *justifyAlign = NSLocalizedStringFromTable(@&quot;justify align&quot;, @&quot;AX&quot;, &quot;justify align&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;SetSegmentDescriptions(self, leftAlign, centerAlign, rightAlign, justifyAlign, nil);
&nbsp;&nbsp;}
}</code></pre></p>
<p>NSAccessibility reminds me of AppleScript: sometimes it&#8217;s hard to figure out what it wants, and you save a lot of time by just copying what someone else has done.</p>
<p>To summarize, I addressed the worst of my accessibility problems by:</p>
<p>1. Supplying tooltips and descriptions in Interface Builder;</p>
<p>2. Making sure that non-visible views return YES from -isHidden;</p>
<p>3. Writing code to provide accessibility descriptions for segmented controls.</p>
<p>This is just the beginning. Plenty of accessibility work lies ahead.</p>
]]></content:encoded>
			<wfw:commentRss>http://rosscarter.com/2009/285.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>NSNirvana 2009</title>
		<link>http://rosscarter.com/2009/250.html</link>
		<comments>http://rosscarter.com/2009/250.html#comments</comments>
		<pubDate>Mon, 20 Apr 2009 22:01:11 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
				<category><![CDATA[Cocoa]]></category>

		<guid isPermaLink="false">http://rosscarter.com/?p=250</guid>
		<description><![CDATA[I have just returned from the best conference of all time. NSConference 2009, in Hatfield, U.K., was perfect in so many ways I hardly know where to begin. The facility: The deHavilland Conference Center seem to have recruited their employees from the Society of Happy Helpful People. The room was just right, the food was [...]]]></description>
			<content:encoded><![CDATA[<p>I have just returned from the best conference of all time. <a href="http://www.nsconference.com/">NSConference 2009</a>, in Hatfield, U.K., was perfect in so many ways I hardly know where to begin.</p>
<p><i>The facility:</i> The deHavilland Conference Center seem to have recruited their employees from the Society of Happy Helpful People. The room was just right, the food was excellent, the beer was real, and my stay there was delightful.</p>
<p><i>The speakers:</i> I&#8217;ve <a href="http://rosscarter.com/2009/241.html">written</a> about how programmers are smart. The speakers were the smartest of the smart. The presentations were engaging, informative, useful, and well planned.</p>
<p><i>The organizers:</i> The entire event reflected Scotty&#8217;s infectiously jolly character. As it turns out, he&#8217;s quite an organizer, too. For a first-time event, the smooth and efficient operation was remarkable. His motto could have been, &#8220;All needs anticipated, all preferences accommodated.&#8221;</p>
<p><i>The design competition:</i> The conference closed with an inspired idea: two teams of developers were given a set of requirements and had to design, but not build, an application. It was all the fun of Iron Coder without the work. Scotty kept saying the idea might be a disaster. It wasn&#8217;t.</p>
<p><i>The attendees:</i> NSConference 2009 was populated by developers from all over Europe, with a few North American infiltrators added to the mix. What made the group especially cohesive was our shared experience with the loneliness of being a Cocoa developer. Here in Kentucky I am certainly never going to meet another Cocoa developer, and I&#8217;m sure my European counterparts know the feeling. We don&#8217;t have a NSCoder Night to attend. Our wives and girlfriends might listen sweetly as we talk about AppKit, but it&#8217;s not the same, really. So, you throw a hundred of these guys together and you can be sure they are going to have a great time.</p>
<p>All the folks I met at the conference write code and inhabit a spot somewhere along the trajectory of application development: from the thinking about it stage, to the actively working on it stage, to the selling it and making money stage. At other conferences I&#8217;ve attended there were writers and CEOs and representatives from big companies mingled among the coders. At NSConference, we were all coders.</p>
<p>And that might explain why, from the opening moments of the conference, we were all talking about next year. It&#8217;s just inconceivable that such a wonderful event would be a one-off; there simply <i>has</i> to be one next year. Banks may fail and economies may sour, but please oh please let there be NSConference 2010.</p>
<p>When the taxi driver took me to the train station on the morning after the conference, he shook my hand and wished me a pleasant journey. It had to end just that way. The taxi driver&#8217;s little pleasantry was emblematic of the time I spent in Hatfield.</p>
<p>The friendships forged at NSConference 2009 will last a very long time. Thanks, Scotty.</p>
]]></content:encoded>
			<wfw:commentRss>http://rosscarter.com/2009/250.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>NSConference 2009</title>
		<link>http://rosscarter.com/2009/237.html</link>
		<comments>http://rosscarter.com/2009/237.html#comments</comments>
		<pubDate>Wed, 18 Feb 2009 18:37:08 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
				<category><![CDATA[Cocoa]]></category>

		<guid isPermaLink="false">http://rosscarter.com/?p=237</guid>
		<description><![CDATA[I&#8217;ll be there!]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ll be there!</p>
]]></content:encoded>
			<wfw:commentRss>http://rosscarter.com/2009/237.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Write your Help files before you release your beta</title>
		<link>http://rosscarter.com/2009/227.html</link>
		<comments>http://rosscarter.com/2009/227.html#comments</comments>
		<pubDate>Fri, 09 Jan 2009 23:55:25 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
				<category><![CDATA[Cocoa]]></category>

		<guid isPermaLink="false">http://rosscarter.com/?p=227</guid>
		<description><![CDATA[That&#8217;s what I learned this week. Fortunately I made the right decision. When a developer&#8217;s blog falls silent, you can expect that he is working ridiculous hours getting a new product or point release ready to ship. Or at least you can expect that in my case. After 36 months of work over a four-year [...]]]></description>
			<content:encoded><![CDATA[<p>That&#8217;s what I learned this week. Fortunately I made the right decision.<span id="more-227"></span><br />
When a developer&#8217;s blog falls silent, you can expect that he is working ridiculous hours getting a new product or point release ready to ship. Or at least you can expect that in my case. After 36 months of work over a four-year period, I have my first application almost ready for the beta testers to tear to shreds.</p>
<p>The temptation to release the beta now sits on my shoulder every day while I work.  &#8220;You can write the help files while you wait for the responses,&#8221; it coos. &#8220;Go ahead. You&#8217;ve frozen the feature set. You&#8217;ve cleared all the FIX MEs. Release the beta. You&#8217;ll feel so good when you do.&#8221;</p>
<p>From my other shoulder I hear, &#8220;But you want the testers to evaluate your help files, too. Well-written help makes the beta that much more impressive.&#8221;</p>
<p>For the last few days I&#8217;ve been working on writing Help, and I&#8217;m ever so glad I didn&#8217;t release the beta. What I&#8217;ve learned is that writing Help makes you exercise every feature of your app, <i>including the ones you&#8217;ve broken while fixing something else.</i> Typically I write for half an hour, then spend four hours fixing the bugs I&#8217;ve discovered. Foolish me, I thought I had found all the obvious bugs. Ha! I wasn&#8217;t even close.</p>
<p>When I think about all the bug reports that would have come back, I shudder. Writing help files is not much fun, but it&#8217;s invaluable as a way of giving your app a once-over before you release it to testing.</p>
]]></content:encoded>
			<wfw:commentRss>http://rosscarter.com/2009/227.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apple&#8217;s lack of iPhone app standards: maybe not such a bad thing</title>
		<link>http://rosscarter.com/2008/219.html</link>
		<comments>http://rosscarter.com/2008/219.html#comments</comments>
		<pubDate>Mon, 08 Sep 2008 18:59:54 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
				<category><![CDATA[Cocoa]]></category>

		<guid isPermaLink="false">http://rosscarter.com/?p=219</guid>
		<description><![CDATA[I spent the weekend at C4 in Chicago, where I heard some complaining about Apple&#8217;s practice of removing apps from the App Store without first providing a set of guidelines for developers. The majority opinion seems to reflect what Erica Sadun said recently on TUAW: Until Apple offers developers a firm set of guidelines, developers [...]]]></description>
			<content:encoded><![CDATA[<p>I spent the weekend at C4 in Chicago, where I heard some complaining about Apple&#8217;s practice of removing apps from the App Store without first providing a set of guidelines for developers. The majority opinion seems to reflect what Erica Sadun said recently on <a href="http://www.tuaw.com/2008/09/04/iphone-app-rejected-for-limited-utility/">TUAW</a>:<br />
<span id="more-219"></span></p>
<blockquote><p>Until Apple offers developers a firm set of guidelines, developers will continue to be ticked off by seemingly arbitrary rejections. . . . Apple needs to step forward, and do so soon, with a clear set of guidelines that explain to developers exactly what to expect when they press that &#8220;submit&#8221; button for their new app.</p></blockquote>
<p>Erica and others know a lot more about software development than I do, and they might well be right. We all have an innate, acute sense of injustice, and secret rules by their very nature send a jolt to our injustice neurons.</p>
<p>Sometimes, though, life isn&#8217;t fair, and sometimes there&#8217;s a reason why life isn&#8217;t fair.</p>
<p>As a developer, I concede my inexperience. I have twenty years less development experience than the people whose opinions I value. What I do have is twenty years more experience practicing law, and I can tell you a few things about rules and regulations that you might not have had the opportunity to observe.</p>
<p>Justice Holmes wrote, &#8220;Whenever the law draws a line there will be cases very near each other on opposite sides.&#8221; <i>United States v. Wurzbach,</i> 280 U.S. 396, 399, 50 S.Ct. 167, 74 L.Ed. 508 (1930). The establishment of a line&mdash;what lawyers call a bright line&mdash;means that people are free to get just as close as they possibly can to the line without crossing it. As a consequence, human nature being what it is, a bright line becomes an attractor. Behavior patterns that otherwise would have been distributed equally across a spectrum will tend to clump together near a bright line.</p>
<p>In civil law, that result is acceptable. If a tax law says you can deduct $500, then by all means go ahead and deduct the full $500. That&#8217;s OK. Get right up against that $500 line. Just don&#8217;t cross over it and try to deduct $501.</p>
<p>In criminal law, we have to step back and think a moment. Do we really want to allow people to get as close as they possibly can to murder, as long as they stay just a hair&#8217;s breadth on the good side of the line? Certainly not. So in the criminal area we see laws that establish degrees of guilt with graduated penalties. If you almost but not quite committed first degree murder, you might be guilty of second degree murder, or reckless homicide, or wanton endangerment, or some other offense.</p>
<p>The principle that we can enunciate is this: if you can tolerate people congregating around a bright line, draw a bright line. If you want a line that keeps people away, you have to draw a gradient instead of a bright line.</p>
<p>NSGradient now makes it much easier to draw a gradient in computer code, but in legal codes, it&#8217;s still hard. Think about it. When you write a block of code, whom do you have to satisfy? First and foremost, the compiler; not eleven compilers selected by the President, <i>the</i> compiler. Fine. Anything else? Well, if the block is to be used only in the context of other code you are writing, then it has to provide the expected result to the rest of your code. That&#8217;s easy enough. If you&#8217;re writing a framework, then you have to account for a larger set of considerations. But it&#8217;s a finite list, and a short one at that.</p>
<p>Writing a law is hard. I&#8217;ve done it. I know. You have to satisfy a wholly unknown and unpredictable set of circumstances that will be adjudicated by an unknown and unpredictable set of arbiters. Can you imagine writing code when you don&#8217;t know what platform it will run on, or which compiler it will run through? That&#8217;s sort of the challenge of writing a good law. (I wasn&#8217;t particularly good at it myself, but I never met anyone who was.)</p>
<p>That is why a whopping proportion of the laws that affect you and me are not codified. It&#8217;s just too hard to write out a single set of rules that will hold up (that is to say, will satisfy our innate sense of justice) when applied to the magnificent variety of fact patterns that human activity creates.</p>
<p>What we have instead is the common law.</p>
<p>Justice Holmes&#8217;s <i>The Common Law</i>&mdash;a splendid book that is read, tragically, by only a tiny percentage of lawyers&mdash; describes how common law, unlike the bright lines of codified law, evolves and advances just as life, language, and culture do. Common law by its nature is adaptive. Codified law is not. One is not inherently better than the other. We need both. And we have both.</p>
<p>When I look at the App Store situation, I do not see a process that invokes words like &#8220;secretive and arbitrary,&#8221; &#8220;seemingly arbitrary&#8221;, and &#8220;out of thin air.&#8221; I see a system of common law. I see a set of decisions made on a case by case basis that will over time congeal into a set of gradients. Not bright lines, which attract activity toward the forbidden zone, but gradients, which repel activity from the forbidden zone. It&#8217;s not a great system. It&#8217;s frustrating and imperfect. But, as history validates for those of us acculturated in English/American jurisprudence, it&#8217;s not bad.</p>
<p>Yes, certainly, Apple could announce a rule &#8220;No fart humor.&#8221; Some people would interpret that rule as a green light for defecation and urination humor. So Apple could refine the rule into &#8220;No applications that deal primarily with solid, liquid, or gaseous human ejecta.&#8221; Then someone would be afraid to write an application that provides first aid advice to deal with severe vomiting. You think writing computer code is hard? Well, writing human code is mighty hard. Given the imprecision inherent in human language, it&#8217;s often impossible. The sharpest minds in the world can&#8217;t do it.</p>
<p>It&#8217;s very difficult for me to comprehend a situation in which a developer with, let&#8217;s say, 50% of the average human allotment of intelligence and responsibility would experience genuine uncertainty about the fate of an application submitted to the App Store. The developers who complain about the lack of guidelines, as far as I can tell, are not complaining on their own behalf, but on behalf of an imaginary population of fart-app-writers whom they deem to be at risk of some future injustice.</p>
<p>Count me as one developer who says, you fart-app-writers are on your own. You&#8217;ll get no support from me.</p>
]]></content:encoded>
			<wfw:commentRss>http://rosscarter.com/2008/219.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
