<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>The Powers of Observation</title>
	<atom:link href="http://subjectiveobserver.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://subjectiveobserver.wordpress.com</link>
	<description>Apple and tech and me</description>
	<lastBuildDate>Sun, 04 Dec 2011 03:59:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='subjectiveobserver.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>The Powers of Observation</title>
		<link>http://subjectiveobserver.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://subjectiveobserver.wordpress.com/osd.xml" title="The Powers of Observation" />
	<atom:link rel='hub' href='http://subjectiveobserver.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Economies of Scalar</title>
		<link>http://subjectiveobserver.wordpress.com/2011/12/04/economies-of-scalar/</link>
		<comments>http://subjectiveobserver.wordpress.com/2011/12/04/economies-of-scalar/#comments</comments>
		<pubDate>Sun, 04 Dec 2011 03:59:39 +0000</pubDate>
		<dc:creator>subjectiveobserver</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://subjectiveobserver.wordpress.com/?p=501</guid>
		<description><![CDATA[I came across something peculiar in a coworker&#8217;s custom Core Data entity class recently: boilerplate code for getter/setter methods that looked like it had been generated by Xcode, but was based on scalar rather than object values, like so: - (NSInteger)age; - (NSInteger)age { [self willAccessValueForKey:@"age"]; NSNumber *result = [self primitiveAge]; [self didAccessValueForKey:@"age"]; return [result [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=501&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I came across something peculiar in a coworker&#8217;s custom Core Data entity class recently: boilerplate code for getter/setter methods that <em>looked</em> like it had been generated by Xcode, but was based on scalar rather than object values, like so:<br />
<code>
<pre>- (NSInteger)age;

- (NSInteger)age {
    [self willAccessValueForKey:@"age"];
    NSNumber *result = [self primitiveAge];
    [self didAccessValueForKey:@"age"];
    return [result integerValue];
}</pre>
<p></code></p>
<p>He swears this boilerplate code is untouched Xcode-generated code, but every Xcode I tried only generated object-based code. (Spoiler: he doesn&#8217;t remember, but I think he must have written it himself, like <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods.html" target="_blank">Apple recommends</a>.)</p>
<p>Xcode doesn&#8217;t even generate object-based boilerplate anymore by default. As of 10.5 and up, the runtime will create object-based getter/setter methods for you, so Xcode only generates property stubs, like this:</p>
<p><code>
<pre>@property (nonatomic, retain) NSNumber *age;

@dynamic age;</pre>
<p></code></p>
<p>Very nice, but Xcode 4.2 has a curious new checkbox called &#8220;Use scalar properties&#8221; in the class generation sheet:</p>
<p><img src="http://subjectiveobserver.files.wordpress.com/2011/11/xcode-sheet.png?w=700" alt="Screenshot of a portion of Xcode's Create NSManagedObject Subclass sheet, with the 'Use scalar properties for primitive data types' checkbox highlighted" title="Xcode Sheet" class="alignnone size-full wp-image-509" /></p>
<p>When you check it, the new property declaration/definition is indeed scalar-based:</p>
<p><code>
<pre>@property (nonatomic, retain) uint16_t age;

@dynamic age;</pre>
<p></code></p>
<p>Could I use this to replace the mysterious boilerplate in my coworker&#8217;s class? Well&#8230;.</p>
<p>If you build and run this, it&#8217;ll work just fine <em>sometimes</em>. But some people have reported problems with it. (Can&#8217;t find the link right now, sorry.) The trick is that this new ability to generate scalar-based getter/setters at runtime is limited to iOS 5 and Mac OS X 10.7 &#8220;Lion&#8221;, and won&#8217;t work on earlier versions of those OSes. (To make matters worse, Apple&#8217;s documentation hasn&#8217;t been updated to mention this scalar functionality at all.)</p>
<p>Hm&#8230;I want the benefits of runtime-created getter/setters, which will almost certainly be more efficient than manually boxing and unboxing NSNumber objects in my own code&#8230;but I also want to support the older OSes. What&#8217;s a programmer to do?</p>
<p><a href="http://rentzsch.github.com/mogenerator/" target="_blank">mogenerator</a> to the rescue!</p>
<p>mogenerator is&#8230;well, I&#8217;ll just put in the &#8220;elevator pitch&#8221; from the website:</p>
<blockquote><p>mogenerator is a command-line tool that, given an .xcdatamodel file, will generate two classes per entity. The first class, _MyEntity, is intended solely for machine consumption and will be continuously overwritten to stay in sync with your data model. The second class, MyEntity, subclasses _MyEntity, won&#8217;t ever be overwritten and is a great place to put your custom logic.</p></blockquote>
<p>mogenerator&#8217;s default template declares object-based getter/setters <em>and</em> also declares a second set of fully-implemented scalar-based getter/setters. For example, if the object-based accessor is <code>age</code>, then the the scalar-based getter is <code>ageValue</code>.</p>
<p>But I want something a little different: I want a scalar-based definition of <code>age</code> and <code>setAge:</code>, but only if the OS is earlier than 5.0/10.7. If not, I want no definition, so that the OS will generate it for me.</p>
<p>How do I do that? Here&#8217;s a partial example of a mogenerator-generated &#8220;machine&#8221; entity source code file, using my custom template:</p>
<p><code>
<pre>#import &lt;objc/runtime.h&gt;

#import "OSVersion.h"

@implementation _Measurements

@dynamic age;

static short ageIMP(id self, SEL _cmd) {
    [self willAccessValueForKey:@"age"];
    NSNumber *result = [self primitiveAge];
    [self didAccessValueForKey:@"age"];
    return [result shortValue];
}

+ (BOOL)resolveInstanceMethod:(SEL)selector {
    if ([OSVersion isLionOrGreater] == NO) {
        if (selector == @selector(age)) {
            class_addMethod([self class], selector, (IMP)ageIMP,
                [[NSString stringWithFormat:@"%s@:", @encode(short)] UTF8String]);
            return YES;
    }

    return [super resolveInstanceMethod:selector];
}</pre>
<p></code></p>
<p>There are two tricks here. First is the use of <code>resolveInstanceMethod:</code> to add the method implementation, stashed in the otherwise hidden <code>ageIMP()</code> function. The code here is straight out of Apple&#8217;s documentation, so <A HREF="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html#//apple_ref/occ/clm/NSObject/resolveInstanceMethod:" target="_blank">take a look there for details</A>.</p>
<p>Second is the use of the custom class <code>OSVersion</code>, which conveniently tells us which OS version we&#8217;re running on. That class is included in my <a href="http://github.com/apontious/mogenerator-Example" target="_blank">mogenerator-Sample</a> project on github (my first!).</p>
<p>Note: my github project&#8217;s sample app uses scalar getter/setters via a rather impractical UI, because for simple projects, object-based methods really fit better with Cocoa design patterns. For example, an object must be used as the value of an NSTableView cell. It&#8217;s only when you have more custom UI (or none) that scalar methods start making sense.</p>
<p>The most important detail, however, is that <code>isLionOrGreater</code> must be fast, because it is called dozens of times for even one simple class. In my first implementation, which wasn&#8217;t fast, I managed to slow down our iPad app by about 30 seconds (!).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/subjectiveobserver.wordpress.com/501/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/subjectiveobserver.wordpress.com/501/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/subjectiveobserver.wordpress.com/501/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/subjectiveobserver.wordpress.com/501/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/subjectiveobserver.wordpress.com/501/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/subjectiveobserver.wordpress.com/501/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/subjectiveobserver.wordpress.com/501/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/subjectiveobserver.wordpress.com/501/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/subjectiveobserver.wordpress.com/501/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/subjectiveobserver.wordpress.com/501/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/subjectiveobserver.wordpress.com/501/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/subjectiveobserver.wordpress.com/501/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/subjectiveobserver.wordpress.com/501/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/subjectiveobserver.wordpress.com/501/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=501&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://subjectiveobserver.wordpress.com/2011/12/04/economies-of-scalar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/657bbe449148e6e1bf160fd31d8ba537?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">subjectiveobserver</media:title>
		</media:content>

		<media:content url="http://subjectiveobserver.files.wordpress.com/2011/11/xcode-sheet.png" medium="image">
			<media:title type="html">Xcode Sheet</media:title>
		</media:content>
	</item>
		<item>
		<title>The Serving of the Snark</title>
		<link>http://subjectiveobserver.wordpress.com/2011/10/16/the-serving-of-the-snark/</link>
		<comments>http://subjectiveobserver.wordpress.com/2011/10/16/the-serving-of-the-snark/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 21:56:50 +0000</pubDate>
		<dc:creator>subjectiveobserver</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://subjectiveobserver.wordpress.com/?p=490</guid>
		<description><![CDATA[I&#8217;ve enjoyed all the recent tweets from the Mac intelligentsia as they try out various phrases with Siri on an iPhone 4S, and report back the often whimsical results. &#8220;Open the pod bay doors&#8221; is of course a classic, as well as &#8220;Beam me up&#8221; and &#8220;What&#8217;s the meaning of life&#8221;. I think the sheer [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=490&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve enjoyed all the recent tweets from the Mac intelligentsia as they try out various phrases with Siri on an iPhone 4S, and report back the often whimsical results. &#8220;Open the pod bay doors&#8221; is of course a classic, as well as &#8220;Beam me up&#8221; and &#8220;What&#8217;s the meaning of life&#8221;.</p>
<p>I think the sheer variety we&#8217;re seeing, and the, let&#8217;s call it the level of teasing, is directly based on how all the content comes from Apple&#8217;s servers, not the local copy of iOS on your phone. And that&#8217;s for three reasons.</p>
<p>1. Space. As we&#8217;ve seen, there are often multiple responses for each phrase. And there are different responses if you&#8217;ve repeated a phrase versus saying it new. While each response might only take up a tiny amount of space, 5-10 answers for <I>every single thing</I> Apple engineers think of responding to probably adds up.</p>
<p>2. Schedule. I would bet real money that at least some of the answers that have so tickled the Mac/iPhone tech folks were invented <I>after</I> iOS 5 went golden master, after all the exhaustive testing that was done to ensure that it worked well enough to ship. There just wouldn&#8217;t have been time to both finish the feature and add this level of polish for a 1.0 release.</p>
<p>3. Response time. This one&#8217;s the killer. I think the reason Apple can provide the cutesy answers that it does is in part because they know they can yank any particular answer in a heartbeat. Otherwise, if they came up with a snarky response that offended someone, that made the news and gave them lots of bad press, the earliest they&#8217;d be able to fix it on the device itself might be months away, given other iOS priorities and testing requirements. Apple has a large and busy contingent of lawyers, and I think they would have limited the OS itself to a much more conservative set of responses if they knew they might be stuck with them for a long, long time.</p>
<p>Instead, the Apple engineers must be feeling an unfamiliar sense of freedom. They can provide jokes to statements like &#8220;I need to hide a body&#8221; and &#8220;Talk dirty to me&#8221; and &#8220;Who&#8217;s your daddy&#8221;. I&#8217;m sure, at some point, we&#8217;ll find one that&#8217;s in bad enough taste that it&#8217;ll make the news.</p>
<p>But we won&#8217;t find it for long.</p>
<p><strong>Note #1:</strong> I&#8217;ve thought a lot about Matt Gemmell&#8217;s <a href="http://mattgemmell.com/2011/09/20/seo-for-non-dicks/" target="_blank">&#8220;SEO for Non-Dicks&#8221;</a> article, but I can&#8217;t bring myself to switch from whimsical titles to  titles &#8220;that are relevant to the content&#8221;. It&#8217;s always going to be a pun or a reference or something. If it keeps me from getting hits, well, I can live with that. Good advice if you&#8217;re smarter than me, though.</p>
<p><strong>Note #2:</strong> Since I&#8217;m talking about snark <em>anyway</em>, I&#8217;m going to throw in a plug for Dan Benjamin for his role as co-host on many of the <a href="http://5by5.tv/" target="_blank">5 by 5 podcasts</a>. Mostly he&#8217;s there to listen and goose things along a bit, but I find that his understated, deadpan snark makes the episodes a <em>lot</em> more enjoyable. The reaction of his co-hosts to the little digs he makes is classic. John Gruber plays along with even drier wit, while both Marco Arment and John Siracusa just kind of pause in annoyance before continuing. It amuses me, anyway.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/subjectiveobserver.wordpress.com/490/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/subjectiveobserver.wordpress.com/490/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/subjectiveobserver.wordpress.com/490/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/subjectiveobserver.wordpress.com/490/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/subjectiveobserver.wordpress.com/490/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/subjectiveobserver.wordpress.com/490/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/subjectiveobserver.wordpress.com/490/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/subjectiveobserver.wordpress.com/490/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/subjectiveobserver.wordpress.com/490/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/subjectiveobserver.wordpress.com/490/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/subjectiveobserver.wordpress.com/490/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/subjectiveobserver.wordpress.com/490/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/subjectiveobserver.wordpress.com/490/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/subjectiveobserver.wordpress.com/490/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=490&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://subjectiveobserver.wordpress.com/2011/10/16/the-serving-of-the-snark/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/657bbe449148e6e1bf160fd31d8ba537?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">subjectiveobserver</media:title>
		</media:content>
	</item>
		<item>
		<title>Legacy</title>
		<link>http://subjectiveobserver.wordpress.com/2011/10/08/legacy/</link>
		<comments>http://subjectiveobserver.wordpress.com/2011/10/08/legacy/#comments</comments>
		<pubDate>Sat, 08 Oct 2011 07:42:56 +0000</pubDate>
		<dc:creator>subjectiveobserver</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://subjectiveobserver.wordpress.com/?p=467</guid>
		<description><![CDATA[1. &#8220;Bottom Feeding&#8221; Many of my colleagues in the Mac/iPhone/iPad developer community had a deep, personal connection to Steve Jobs, which they expressed on Twitter and in blogs immediately after his death. I&#8217;ve never seen anything like it, and I&#8217;m grateful for it. Along the way, I saw a number of attacks on those who [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=467&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>1. &#8220;Bottom Feeding&#8221;</strong></p>
<p>Many of my colleagues in the Mac/iPhone/iPad developer community had a deep, personal connection to Steve Jobs, which they expressed on Twitter and in blogs immediately after his death. I&#8217;ve never seen anything like it, and I&#8217;m grateful for it.</p>
<p>Along the way, I saw a number of attacks on those who didn&#8217;t stick to the positive: Daniel Jalkut <A HREF="http://twitter.com/#!/danielpunkass/status/121822672337387521">called it</A> &#8220;bottom feeding&#8221;, and Jeff LaMarche <A HREF="http://iphonedevelopment.blogspot.com/2011/10/respect-shame.html">called it</A> &#8220;cruel&#8221;, &#8220;hurtful&#8221;, and &#8220;little&#8221;.</p>
<p>Personally? The unwavering praise combined with a circling of the wagons made me uncomfortable, and awoke my contrarian nature.</p>
<p>Do you think the man who started phone calls with strangers by <A HREF="http://daringfireball.net/linked/2008/07/26/nocera-jobs">swearing at them</A> would begrudge a realistic portrayal of himself after death? Articles on public figures, including obituaries, don&#8217;t omit flaws and failures. The page-long article from the October 8th issue of <I>The Economist</I> called &#8220;The Magician&#8221;, for example, has, amid the tribute, a single-sentence caveat in it.</p>
<p>We haven&#8217;t had our caveat yet.</p>
<p><strong>2. &#8220;Mourning a Billionaire&#8221;</strong></p>
<p>Here&#8217;s a <A HREF="https://twitter.com/#!/jneslo/status/122065628822646784">tweet</A> from Jana Olsen on October 6th: &#8220;Kind of weird how we all went from talking about a huge protest against big business to mourning a billionaire.&#8221;</p>
<p>The <A HREF="http://occupywallst.org/">Occupy Wall Street</A> movement started its encampment in New York City on September 17, over two weeks before Steve Jobs died. His death prompted criticism of the group from both the right and the left. The right <A HREF="http://digbysblog.blogspot.com/2011/10/more-tea-party-solidarity.html">made fun</A> of the protesters for the contradiction of protesting the actions of the richest 1% while grieving the death of a very rich one. The left <A HREF="http://nielsenhayden.com/makinglight/archives/013234.html">hectored</A> the protestors for feeling any sympathy for Jobs at all.</p>
<p>I&#8217;m a lifelong Mac developer. I&#8217;m also as liberal as they come, and it&#8217;s becoming harder and harder to reconcile the two. On the one hand: the Apple vision of ever-sleeker, ever more useful devices connected to a burgeoning global network of information. On the other: the end of the Western way of life when the oil dries up with no realistic substitute. On the one hand: a thriving consumer market and developer ecosystem providing a good standard of living for many of my colleagues and friends. On the other: deepening unemployment and inequality, fostered by a corrupt media and political class.</p>
<p><strong>3. &#8220;Steve Jobs Didn&#8217;t&#8221;</strong></p>
<p>The always insightful Horace Dediu wrote a <A HREF="http://www.asymco.com/2011/10/06/steve-jobs-didnt/">clever article</A> using the deflation of some of the myths attributed to Steve Jobs to point out his true accomplishments.</p>
<p>I&#8217;m going to be less original, and point out the things that he <I>really</I> didn&#8217;t do:</p>
<p>1. He didn&#8217;t challenge the entrenched, monopolistic power of most of the industries Apple got involved with. While the big music labels are dying, that&#8217;s not Apple&#8217;s doing, and in some ways Apple helped prop them up temporarily by dragging them into the digital age. Apple has done nothing to disrupt the movie/television/cable industry that&#8217;s in the process of killing TiVo and Netflix. And the telephone carriers, while they can&#8217;t dictate phone models like they used to, still follow anti-consumer practices with impunity.</p>
<p>2. He didn&#8217;t break the glass ceiling or the tech industry boy&#8217;s club. The current Apple <A HREF="http://www.apple.com/pr/bios/">executive bios page</A> contains no women. The parts of Apple that I saw had the same lopsided ratios of men to women in their engineering sections as the rest of the industry. I&#8217;m not without blame: when I was a hiring manager at Apple, I didn&#8217;t try hard enough to find qualified women candidates, and I&#8217;m sorry for that.</p>
<p>3. He didn&#8217;t help prepare the industry for the post-peak oil era. Bit more of a futuristic point than the others, and even more crazy-hard, but still true.</p>
<p>4. Perhaps most importantly in the near term, he didn&#8217;t challenge two great harmful industrial trends, the outsourcing that has all but destroyed America&#8217;s manufacturing base and jobs, and the employment of foreign companies that cut corners and endanger workers in order to keep prices low.</p>
<p>You can argue that none of these things were his responsibility, that he had his own company to run and his own vision to follow  (which he did extremely well). You can argue that these problems are simply insurmountable or just the Way Things Are&mdash;many do. </p>
<p>The reason I think it&#8217;s worthwhile to bring these things up in the context of Steve Jobs, in the context of our Mac community, at this very moment, is that our praise of Steve Jobs brings it all to a head: if he was so innovative and unorthodox and uncompromising, if he could achieve the impossible (if he was, as the <em>Onion</em> snarked, the &#8220;last American who <A HREF="http://www.theonion.com/articles/last-american-who-knew-what-the-fuck-he-was-doing,26268/">knew the fuck what he was doing</A>&#8220;), what does that say about how we view these problems when we give him a pass on them? They&#8217;re worse than impossible? They&#8217;re not anyone&#8217;s responsibility?</p>
<p>Or as a beginning, maybe this, trite as it is: there&#8217;s a lot of bad shit coming down the pike, and we can&#8217;t rely on our heroes to save us from it.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/subjectiveobserver.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/subjectiveobserver.wordpress.com/467/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/subjectiveobserver.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/subjectiveobserver.wordpress.com/467/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/subjectiveobserver.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/subjectiveobserver.wordpress.com/467/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/subjectiveobserver.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/subjectiveobserver.wordpress.com/467/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/subjectiveobserver.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/subjectiveobserver.wordpress.com/467/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/subjectiveobserver.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/subjectiveobserver.wordpress.com/467/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/subjectiveobserver.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/subjectiveobserver.wordpress.com/467/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=467&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://subjectiveobserver.wordpress.com/2011/10/08/legacy/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/657bbe449148e6e1bf160fd31d8ba537?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">subjectiveobserver</media:title>
		</media:content>
	</item>
		<item>
		<title>Cocoa Swap</title>
		<link>http://subjectiveobserver.wordpress.com/2011/10/03/cocoa-swap/</link>
		<comments>http://subjectiveobserver.wordpress.com/2011/10/03/cocoa-swap/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 06:37:19 +0000</pubDate>
		<dc:creator>subjectiveobserver</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://subjectiveobserver.wordpress.com/?p=429</guid>
		<description><![CDATA[A fair number of my colleagues at Apple wouldn&#8217;t touch C++ with a ten-foot pole1. Which is a shame, because it has some good ideas. One idea that&#8217;s stuck with me in the 8 years (8 years!) since I wrote my first draft of this post is std::swap(). You use std::swap() like so: instead of [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=429&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A fair number of my colleagues at Apple wouldn&#8217;t touch C++ with a ten-foot pole<a href="#F1"><sup>1</sup></a>. Which is a shame, because it has some good ideas.</p>
<p>One idea that&#8217;s stuck with me in the 8 years (8 years!) since I wrote my first draft of this post is <code>std::swap()</code>.</p>
<p>You use <code>std::swap()</code> like so: instead of doing all your work on your actual objects, you do it on temporary objects instead. Reading in a file&#8217;s contents, making a change to your document, parsing a user&#8217;s input, it all happens detached from your data model. When the work, and all the possibilities for errors, have been slogged through, you use <code>std::swap()</code> to exchange the temporary objects&#8217; content with that of the real objects.</p>
<p>This is important in C++ because codeflow-interrupting exceptions are a much larger part of error-handling, and because <code>std::swap()</code> is guaranteed not to throw.</p>
<p>Why should I care about this in Objective-C? After all, Apple&#8217;s developer documentation goes out of its way to discourage any use of exceptions for normal error handling, instead recommending that methods use NSError parameters<a href="#F2"><sup>2</sup></a>.</p>
<p>Let&#8217;s leave aside that it can be rather cumbersome to add an extra parameter to all of your methods, and to be sure deeply nested errors are passed all the way up. Even if no exceptions are thrown, if you encounter an error in the midst of complex changes to your data model, it can be tough to back all the changes out safely. Using temporaries reduces that risk to zero.</p>
<p>Is it worth it? You may, after all, wind up swapping out your entire data model if the changes you&#8217;re accumulating are extensive. If you&#8217;re working on a 4 GB image file, for example, then this technique probably isn&#8217;t for you.</p>
<p>And what if one of the things you&#8217;re changing is a file? Here, too, you can swap a temporary with the real thing in a way that&#8217;s virtually guaranteed never to cause problems&mdash;at least, if you&#8217;re willing to drop down a bit from the high-level Cocoa APIs and use Core Service&#8217;s <code>FSExchangeObjects()</code> method. (And are willing to bet that a method that uses <code>FSRef</code> types isn&#8217;t going to be deprecated. Hey, they ported it to iOS.) My understanding is that <code>FSExchangeObjects()</code> makes only HFS+ metadata changes, if the two files are on the same HFS+ partition. No worries about running out of disk space, permissions, etc. You can use it for ten files in a row, and they should all Just Work.</p>
<p>&nbsp;</p>
<p><a name="F1"></a>1. A fair number of my <em>other</em> colleagues at Apple were <a href="http://clang.llvm.org/">C++ fiends</a>.</p>
<p><a name="F2"></a>2. &#8220;Instead of exceptions, error objects (NSError) and the Cocoa error-delivery mechanism are the recommended way to communicate expected errors in Cocoa applications.&#8221;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/subjectiveobserver.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/subjectiveobserver.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/subjectiveobserver.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/subjectiveobserver.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/subjectiveobserver.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/subjectiveobserver.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/subjectiveobserver.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/subjectiveobserver.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/subjectiveobserver.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/subjectiveobserver.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/subjectiveobserver.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/subjectiveobserver.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/subjectiveobserver.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/subjectiveobserver.wordpress.com/429/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=429&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://subjectiveobserver.wordpress.com/2011/10/03/cocoa-swap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/657bbe449148e6e1bf160fd31d8ba537?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">subjectiveobserver</media:title>
		</media:content>
	</item>
		<item>
		<title>Christ, What an Asshole</title>
		<link>http://subjectiveobserver.wordpress.com/2011/08/25/christ-what-an-asshole/</link>
		<comments>http://subjectiveobserver.wordpress.com/2011/08/25/christ-what-an-asshole/#comments</comments>
		<pubDate>Thu, 25 Aug 2011 06:29:49 +0000</pubDate>
		<dc:creator>subjectiveobserver</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://subjectiveobserver.wordpress.com/?p=422</guid>
		<description><![CDATA[Lots of other people have already covered Steve Jobs&#8217;s resignation from Apple in tasteful, circumspect ways. Really, go read them. My contribution? Well&#8230;. There was a joke going around for a while about how every New Yorker cartoon was funnier if its caption was replaced with &#8220;Christ, What an Asshole.&#8221; We all know it: Steve [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=422&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Lots of other people have already covered Steve Jobs&#8217;s resignation from Apple in tasteful, circumspect ways.</p>
<p><a href="http://www.red-sweater.com/blog/2143/steve-jobs" target="_blank">Really</a>, <a href="http://glassboard.com/blog/?p=80" target="_blank">go</a> <a href="http://waffle.wootest.net/2011/08/25/steve/" target="_blank">read</a> <a href="http://daringfireball.net/2011/08/resigned" target="_blank">them</a>.</p>
<p>My contribution? Well&#8230;.</p>
<p>There was a joke <a href="http://boingboing.net/2010/03/30/recaptioning-new-yor.html" target="_blank">going around for a while</a> about how every <em>New Yorker</em> cartoon was funnier if its caption was replaced with &#8220;Christ, What an Asshole.&#8221;</p>
<p>We all know it: Steve Jobs is a jerk.</p>
<p>I mean that in a lot of ways, but the most important is: he has strong opinions and <em>he doesn&#8217;t care what you think</em>.</p>
<p>He doesn&#8217;t care what <em>I</em> think. He doesn&#8217;t care about stepping on toes. He doesn&#8217;t care about making friends. With him at the helm, Apple has ruthlessly exploited its partners, its third-party developers, the media, and anyone else it has leverage over. The only reason it hasn&#8217;t attacked its rivals more is because it doesn&#8217;t care what they think, either. You either live with it or you don&#8217;t.</p>
<p>As an Apple employee, I was delighted to have this awesome weapon pointed <em>outward</em>. It was less pleasant to realize I was surrounded by it. From what I saw, Apple has spent years busily discovering, hiring, and fast-tracking the most razor-sharp, take-no-prisoners assholes it could find throughout its ranks. John Gruber <a href="http://daringfireball.net/2011/08/resigned" target="_blank">phrases it as</a>, &#8220;The company is a fractal design.&#8221; I would say: it&#8217;s assholes all the way down.</p>
<p><em>That&#8217;s</em> why I&#8217;m not worried about my former employer.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/subjectiveobserver.wordpress.com/422/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/subjectiveobserver.wordpress.com/422/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/subjectiveobserver.wordpress.com/422/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/subjectiveobserver.wordpress.com/422/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/subjectiveobserver.wordpress.com/422/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/subjectiveobserver.wordpress.com/422/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/subjectiveobserver.wordpress.com/422/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/subjectiveobserver.wordpress.com/422/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/subjectiveobserver.wordpress.com/422/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/subjectiveobserver.wordpress.com/422/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/subjectiveobserver.wordpress.com/422/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/subjectiveobserver.wordpress.com/422/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/subjectiveobserver.wordpress.com/422/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/subjectiveobserver.wordpress.com/422/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=422&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://subjectiveobserver.wordpress.com/2011/08/25/christ-what-an-asshole/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/657bbe449148e6e1bf160fd31d8ba537?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">subjectiveobserver</media:title>
		</media:content>
	</item>
		<item>
		<title>Putting It to the Test</title>
		<link>http://subjectiveobserver.wordpress.com/2011/08/21/putting-it-to-the-test/</link>
		<comments>http://subjectiveobserver.wordpress.com/2011/08/21/putting-it-to-the-test/#comments</comments>
		<pubDate>Sun, 21 Aug 2011 19:45:08 +0000</pubDate>
		<dc:creator>subjectiveobserver</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://subjectiveobserver.wordpress.com/?p=176</guid>
		<description><![CDATA[I&#8217;ve been thinking about automated tests recently, and I&#8217;ve come up with a number of observations based on my experience. I&#8217;ve rarely if ever seen unit tests break. In theory, the tests exist so that when you add functionality to a class or a group of classes in a way that changes the code paths [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=176&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been thinking about automated tests recently, and I&#8217;ve come up with a number of observations based on my experience.</p>
<p><strong>I&#8217;ve rarely if ever seen unit tests break.</strong><br />
In theory, the tests exist so that when you add functionality to a class or a group of classes in a way that changes the code paths of existing functionality, you&#8217;re sure the existing functionality still works. In practice, I&#8217;ve seen that either those classes are never touched again, or they&#8217;re only added to, not modified, or the modifications are simple enough that they just don&#8217;t lead to breakage.</p>
<p><strong>Rewrites don&#8217;t bring the tests along.</strong><br />
In my experience, when you&#8217;re doing a rewrite of your GUI application code, for, let&#8217;s say, a new major release, you&#8217;re generally changing the logic in the new code enough that the automated tests don&#8217;t come along. So any exhaustive, pre-existing tests you have need to be thrown out. For example, if you&#8217;re moving your model to Core Data for version 2 of your app, much of your existing model classes tests are now outdated.</p>
<p>I&#8217;ve only had one case where a rewrite kept the same logic, and that was for a recent side project that was more of an example than anything else. And in that case, I wrote the exhaustive tests <em>right before</em> doing the rewrite. That worked really nicely, but, if anything, it&#8217;s an argument for putting <em>off</em> writing such exhaustive tests until you know you need them for something specific.</p>
<p><strong>Regression tests tend to run into sorting issues.</strong><br />
I&#8217;ve written extensive regression tests for some projects, and I&#8217;ve tended to run into problems with sorting. NSArray&#8217;s sorting APIs are <a href="http://en.wikipedia.org/wiki/Sorting_algorithm#Stability">unstable</a>. So I&#8217;ve often had to write extra logic into the production code to provide reproducibility that it doesn&#8217;t actually need, for the sake of testing.</p>
<p>Whenever I talk to any colleagues about automated testing, there&#8217;s always a wistful quality to it; yes, we don&#8217;t have automated tests or we only have a few, but we <em>should</em> be testing everything. We&#8217;ll get to it when we have time. You&#8217;re not a real developer unless you&#8217;ve done it or at least feel inadequate about it.</p>
<p>But in my, possibly limited experience (I did, after all, work on the same app for almost 6 years), I just don&#8217;t see them as the panacea that others do.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/subjectiveobserver.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/subjectiveobserver.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/subjectiveobserver.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/subjectiveobserver.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/subjectiveobserver.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/subjectiveobserver.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/subjectiveobserver.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/subjectiveobserver.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/subjectiveobserver.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/subjectiveobserver.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/subjectiveobserver.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/subjectiveobserver.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/subjectiveobserver.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/subjectiveobserver.wordpress.com/176/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=176&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://subjectiveobserver.wordpress.com/2011/08/21/putting-it-to-the-test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/657bbe449148e6e1bf160fd31d8ba537?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">subjectiveobserver</media:title>
		</media:content>
	</item>
		<item>
		<title>A Bridge Too Far</title>
		<link>http://subjectiveobserver.wordpress.com/2011/08/21/a-bridge-too-far/</link>
		<comments>http://subjectiveobserver.wordpress.com/2011/08/21/a-bridge-too-far/#comments</comments>
		<pubDate>Sun, 21 Aug 2011 19:31:33 +0000</pubDate>
		<dc:creator>subjectiveobserver</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://subjectiveobserver.wordpress.com/?p=54</guid>
		<description><![CDATA[I was looking through my Gang of Four design patterns book recently, a book I last cracked open many years ago. Maybe it&#8217;s the experience I&#8217;ve had since then, but one pattern jumped out at me in a way that I don&#8217;t remember happening before: the Bridge pattern. And not in a good way. The [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=54&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I was looking through my <a href="http://en.wikipedia.org/wiki/Design_Patterns_(book)">Gang of Four design patterns</a> book recently, a book I last cracked open many years ago. Maybe it&#8217;s the experience I&#8217;ve had since then, but one pattern jumped out at me in a way that I don&#8217;t remember happening before: the Bridge pattern.</p>
<p>And not in a <em>good</em> way.</p>
<p>The pattern purportedly heads off this kind of class hierarchy, where the abstract public classes are in blue, and the concrete classes are in black:</p>
<p><img src="http://subjectiveobserver.files.wordpress.com/2010/08/regular-abstraction-layer.png?w=700&#038;h=275" alt="Regular Abstraction Layer" title="Regular Abstraction Layer" width="700" height="275" class="alignnone size-full wp-image-61" /></p>
<p>The idea above being that for every public, abstract class, like Window and its subclass CircleWindow, you&#8217;ll need a full array of concrete classes hanging off of it, like OSXWindow and OSXCircleWindow. That can lead to a proliferation of classes, even in the two-level deep hierarchy shown above.</p>
<p>The Bridge pattern makes it unnecessary to have any more than a single array of concrete classes:</p>
<p><img src="http://subjectiveobserver.files.wordpress.com/2010/08/body-abstraction-layer.png?w=700" alt="Body Abstraction Layer" title="Body Abstraction Layer"   class="size-full wp-image-67" /></p>
<p>But it does this by making a very brittle assumption: the only concrete method implementations that will <em>ever</em> be needed <em>anywhere</em> in the system can be put into that base implementation class. (Here, WindowImp.)</p>
<p>The example given in the book is drawing. The concrete classes implement DrawText() and DrawLine(), and everything else can be derived from that&mdash;geometric shapes, icon borders, etc.</p>
<p>I have no faith in that. There isn&#8217;t a single complex architecture I&#8217;ve worked on&mdash;and why would you use this for very simple architectures?&mdash;where you can comfortably put everything you need in a base class like that. You will always need weird, subclass-specific logic, and tossing such things into a base class leads to confusion, lack of proper separation, and maintenance headaches.</p>
<p>&#8220;Oh,&#8221; you say, &#8220;well then, make an Imp class hierarchy and&#8230;.&#8221; Dammit, multiple hierarchies are what this pattern was supposed to <em>solve</em>!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/subjectiveobserver.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/subjectiveobserver.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/subjectiveobserver.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/subjectiveobserver.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/subjectiveobserver.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/subjectiveobserver.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/subjectiveobserver.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/subjectiveobserver.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/subjectiveobserver.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/subjectiveobserver.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/subjectiveobserver.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/subjectiveobserver.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/subjectiveobserver.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/subjectiveobserver.wordpress.com/54/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=54&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://subjectiveobserver.wordpress.com/2011/08/21/a-bridge-too-far/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/657bbe449148e6e1bf160fd31d8ba537?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">subjectiveobserver</media:title>
		</media:content>

		<media:content url="http://subjectiveobserver.files.wordpress.com/2010/08/regular-abstraction-layer.png" medium="image">
			<media:title type="html">Regular Abstraction Layer</media:title>
		</media:content>

		<media:content url="http://subjectiveobserver.files.wordpress.com/2010/08/body-abstraction-layer.png" medium="image">
			<media:title type="html">Body Abstraction Layer</media:title>
		</media:content>
	</item>
		<item>
		<title>10 Unanswered Questions About the New Yahoo Mail</title>
		<link>http://subjectiveobserver.wordpress.com/2011/05/30/10-unanswered-questions-about-the-new-yahoo-mail/</link>
		<comments>http://subjectiveobserver.wordpress.com/2011/05/30/10-unanswered-questions-about-the-new-yahoo-mail/#comments</comments>
		<pubDate>Mon, 30 May 2011 01:18:03 +0000</pubDate>
		<dc:creator>subjectiveobserver</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://subjectiveobserver.wordpress.com/?p=364</guid>
		<description><![CDATA[Recently, I got an email from Yahoo saying that I would be required to upgrade to the new Yahoo Mail in about a month. This led me to a series of questions, which, alas, are not answered on the Overview or Mail Help pages I was directed to. 1. Why do I have to agree [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=364&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Recently, I got an email from Yahoo saying that I would be required to upgrade to the new Yahoo Mail in about a month.</p>
<p>This led me to a series of questions, which, alas, are not answered on the <A HREF="http://overview.mail.yahoo.com/">Overview</A> or <A HREF="http://help.yahoo.com/l/us/yahoo/mail/ymail/basics/migration.html">Mail Help</A> pages I was directed to.</p>
<p>1. Why do I have to agree to the upgrade? If Yahoo can upgrade its mail to be better, why not just do it without requiring me to do anything? Wouldn&#8217;t that be better?</p>
<p>OK, so that&#8217;s three questions. And actually, there is an answer <A HREF="http://help.yahoo.com/l/us/yahoo/mail/ymail/basics/basics-006.html">here</A>. It says, &#8220;Due to the new and exciting features within Yahoo! Mail&#8221;. But&hellip;<I>which</I> features? As I&#8217;ll be mentioning below, many of the &#8220;features&#8221; you talk about are actually just improvements to the service, not features per se, which you shouldn&#8217;t need my permission to roll out. So: why? And will I get a straight answer to this question anywhere on your website?</p>
<p>2. Why does your <A HREF="http://overview.mail.yahoo.com/">Overview</A> page prominently feature useless Flash videos that don&#8217;t tell me anything? Aren&#8217;t you trying a little too hard here?</p>
<p>3. Under the &#8220;Awesome Features&#8221; tab of the Overview page, you mention faster email, better spam protection, and unlimited storage. All for the good, but why did I have to wait until now for these improvements? And as part of this mysterious &#8220;upgrade&#8221;? I&#8217;ve had an email account with you for 10 years, for crying out loud. Is this the first time you&#8217;ve made any of these things better? Or are you really just throwing those in to sweeten the &#8220;upgrade&#8221; I haven&#8217;t agreed to yet?</p>
<p>4. Why does the new web email interface, which you tout heavily on the Overview page, look almost as ugly as the current interface? (Now with more purple!) Why do your video tutorials take great pains to crop out the areas of the interface where ads normally reside? Even if the new interface were bee-yootiful, if it had the vast number of ugly ads that festoon the old interface, it would be an unpleasant experience regardless.</p>
<p>5. If these new web abilities of your email are so great, why can&#8217;t you get the HTML of your own Overview page right? Here&#8217;s how it acts in Safari 5.0.5 if you make the window too narrow:</p>
<p>Before:<br />
<img src="http://subjectiveobserver.files.wordpress.com/2011/05/tab.png?w=700" alt="Space below selected 'Faster Email' tab has purple background and promotional contents." title="Now you see it." /><br />
After:<br />
<img src="http://subjectiveobserver.files.wordpress.com/2011/05/too-narrow.png?w=700" alt="Space below selected 'Faster Email' tab is just blank and gray, with just the edge of a purple box all the way to the right." title="Now you don't." /></p>
<p>And here&#8217;s a bit more tomfoolery I found:<br />
<img src="http://subjectiveobserver.files.wordpress.com/2011/05/tomfoolery.png?w=700" alt="White promotional text on top of other white promotional text, a big mess, on a purple background. The only clear text is at the end, which says, 'Everybody's happy.'" title="Yup, that's right: everybody's happy." /></p>
<p>6. You mention a new Mobile interface, but never quite get around to mentioning on the Overview page that this is a web interface, not a native interface. What&#8217;s going to happen with the native iOS Yahoo mail? Anything? If not, can&#8217;t I just keep using that rather than agreeing to this &#8220;upgrade&#8221;? You mention waaaaay at the bottom of your &#8220;Emailing: The Basics&#8221; help page that, &#8220;If you upgrade to Yahoo Mail Beta, your experience using Yahoo Mail on your mobile device will not be affected&#8221;. But (a) that doesn&#8217;t answer my question, and (b) why the heck is a question like that on a &#8220;The Basics&#8221; page which is mostly about the nuts and bolts of using the email interface? Are you maybe trying to hide it?</p>
<p>7. Why does your help page say, &#8220;If you aren&#8217;t ready to try it out, no problem!&#8221; but the email I received say that I only have a month before I <I>have</I> to upgrade?</p>
<p>8. When I was clicking around trying to find information about iOS, I found your page about what operating systems you support, last updated in October 2010. You know what it says? &#8220;Mac OSX &#8220;Tiger&#8221; and &#8220;Leopard&#8221; (10.4 &amp; 10.5)&#8221;. For a service called &#8220;New Yahoo Mail&#8221;, wouldn&#8217;t you have expected someone to go through all the support pages and update them with the most up-to-date information? Doesn&#8217;t this say something about your attention to detail? And even if nobody did <I>that</I>, wasn&#8217;t Mac OS X 10.6 &#8220;Snow Leopard&#8221; actually released a year <I>earlier</I> than the last time this page was updated? Or are you actually saying you <I>don&#8217;t</I> officially support Snow Leopard? (Let alone Mac OS X 10.7 &#8220;Lion&#8221;!)</p>
<p>9. Hey, what&#8217;s all this in your <A HREF="http://info.yahoo.com/privacy/us/yahoo/mail/betafaq/details.html">Mail Beta FAQ</A> about &#8220;relevant ads&#8221;? Well, OK, you <I>do</I> answer that question in the FAQ itself; it sounds like one of the major things about the new Yahoo Mail is that it scans your email content, like Google, in order to show you ads that are, yes, relevant. That&#8217;s really one of the &#8220;features&#8221;, isn&#8217;t it? Part of the &#8220;new and exciting features&#8221; you mention above? But somehow can only think to mention at all, let alone in any detail, in your text-only, sans-exciting-videos-or-graphics FAQ? That you probably hope will be tl;dr for most people? Hey, at least for now, you let people opt out of it. That&#8217;s something.</p>
<p>10. Why do I still use Yahoo Mail?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/subjectiveobserver.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/subjectiveobserver.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/subjectiveobserver.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/subjectiveobserver.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/subjectiveobserver.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/subjectiveobserver.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/subjectiveobserver.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/subjectiveobserver.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/subjectiveobserver.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/subjectiveobserver.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/subjectiveobserver.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/subjectiveobserver.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/subjectiveobserver.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/subjectiveobserver.wordpress.com/364/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=364&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://subjectiveobserver.wordpress.com/2011/05/30/10-unanswered-questions-about-the-new-yahoo-mail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/657bbe449148e6e1bf160fd31d8ba537?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">subjectiveobserver</media:title>
		</media:content>

		<media:content url="http://subjectiveobserver.files.wordpress.com/2011/05/tab.png" medium="image">
			<media:title type="html">Now you see it.</media:title>
		</media:content>

		<media:content url="http://subjectiveobserver.files.wordpress.com/2011/05/too-narrow.png" medium="image">
			<media:title type="html">Now you don't.</media:title>
		</media:content>

		<media:content url="http://subjectiveobserver.files.wordpress.com/2011/05/tomfoolery.png" medium="image">
			<media:title type="html">Yup, that's right: everybody's happy.</media:title>
		</media:content>
	</item>
		<item>
		<title>Backwater</title>
		<link>http://subjectiveobserver.wordpress.com/2011/05/29/backwater/</link>
		<comments>http://subjectiveobserver.wordpress.com/2011/05/29/backwater/#comments</comments>
		<pubDate>Sun, 29 May 2011 05:56:02 +0000</pubDate>
		<dc:creator>subjectiveobserver</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://subjectiveobserver.wordpress.com/?p=355</guid>
		<description><![CDATA[In John Siracusa&#8217;s and Dan Benjamin&#8217;s now-old podcast episode &#8220;The Bridges of Siracusa County&#8221;, Siracusa talks about how Perl has been an incubator of language innovation, not despite being a backwater, but because of it. Since it wasn&#8217;t straightjacketed by the requirements of an important platform, its users could experiment freely. Let me tell you [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=355&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In John Siracusa&#8217;s and Dan Benjamin&#8217;s now-old podcast episode <a href="http://5by5.tv/hypercritical/15">&#8220;The Bridges of Siracusa County&#8221;</a>, Siracusa talks about how Perl has been an incubator of language innovation, not <em>despite</em> being a backwater, but <em>because</em> of it. Since it wasn&#8217;t straightjacketed by the requirements of an important platform, its users could experiment freely.</p>
<p>Let me tell you a bit about what I saw at Apple.</p>
<p>There were at least three places I knew of—in areas you might not expect—where being a relative backwater in the grand scheme of Apple&#8217;s priorities helped make a project both <em>better</em> and more enjoyable for the engineers involved.</p>
<p>Let&#8217;s tackle the first one: because the projects weren&#8217;t anyone&#8217;s priority, they didn&#8217;t have to be flashy or aligned with unrelated interests or subject to political whims. The engineers could, y&#8217;know, just do what they saw fit. Now, I&#8217;ve drunk enough Apple Kool-Aid to believe the engineers shouldn&#8217;t <em>solely</em> be in charge of a project. There still need to be real designers involved, among others. But the engineers who work day in and day out on a project are often the ones with the best insight on the important bugs, the little annoyances, the things that the actual users want. And given their freedom, they can fix and provide those things.</p>
<p>(The lower-tier engineers are generally <em>not</em> the ones to go to for sweeping, breathtaking new directions. And since Apple&#8217;s management skews <em>towards</em> that, you can see why they don&#8217;t listen to those engineers very much.)</p>
<p>And the second: because the engineers were allowed to exercise a little judgment and do their own thing, they had more fun. Important Apple projects can be extended death marches, where you both work insanely hard and really aren&#8217;t given much creative freedom. Maybe that&#8217;s the only way to get the kind of quality Apple provides consistently.</p>
<p>But, y&#8217;know, what fun is <em>that</em>?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/subjectiveobserver.wordpress.com/355/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/subjectiveobserver.wordpress.com/355/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/subjectiveobserver.wordpress.com/355/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/subjectiveobserver.wordpress.com/355/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/subjectiveobserver.wordpress.com/355/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/subjectiveobserver.wordpress.com/355/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/subjectiveobserver.wordpress.com/355/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/subjectiveobserver.wordpress.com/355/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/subjectiveobserver.wordpress.com/355/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/subjectiveobserver.wordpress.com/355/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/subjectiveobserver.wordpress.com/355/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/subjectiveobserver.wordpress.com/355/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/subjectiveobserver.wordpress.com/355/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/subjectiveobserver.wordpress.com/355/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=355&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://subjectiveobserver.wordpress.com/2011/05/29/backwater/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/657bbe449148e6e1bf160fd31d8ba537?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">subjectiveobserver</media:title>
		</media:content>
	</item>
		<item>
		<title>Harsh Language</title>
		<link>http://subjectiveobserver.wordpress.com/2011/04/20/harsh-language/</link>
		<comments>http://subjectiveobserver.wordpress.com/2011/04/20/harsh-language/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 06:04:54 +0000</pubDate>
		<dc:creator>subjectiveobserver</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://subjectiveobserver.wordpress.com/?p=292</guid>
		<description><![CDATA[Apple&#8217;s in danger! Because they don&#8217;t have a modern programming language and runtime, unlike their competitors. And even if they introduced one tomorrow, getting their developers to switch over would be difficult and take many years, putting them even further behind. That&#8217;s John Siracusa&#8217;s thesis (paraphrased) in his latest Hypercritical podcast. He mentions Microsoft&#8217;s C# [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=292&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><em>Apple&#8217;s in danger! Because they don&#8217;t have a modern programming language and runtime, unlike their competitors. And even if they introduced one tomorrow, getting their developers to switch over would be difficult and take many years, putting them even further behind.</em></p>
<p>That&#8217;s John Siracusa&#8217;s thesis (paraphrased) in his latest <a href="http://5by5.tv/hypercritical/14">Hypercritical podcast</a>. He mentions Microsoft&#8217;s C# and .NET transition, a decade long and still with a significant amount of non-adoption.</p>
<p>I don&#8217;t know about that. But it occurred to me that Apple&#8217;s transition, when and if it happens, will be far swifter, due to the App Stores.</p>
<p>Microsoft has to <em>convince</em> its developers to switch. With rational arguments! On iOS, at least, Apple can simply <em>require</em> it as a prerequisite of approval. Apple&#8217;s unequal treatment of their developers has led to a situation where none of the aspects of such a demand would even be <em>new</em>. </p>
<p>Onerous, sometimes arbitrary approval requirements? Check. Retroactive new requirements that, if not met, will get you yanked from the store after a certain date? Check. Little expectation of influence or bargaining power on the part of its applicants? Check check check!</p>
<p>It <em>amazes</em> me how well-positioned Apple is to force such a transition. I imagine they could go from language/runtime initial introduction to required status for iOS App Store inclusion in less than, say, two years. As long as the iOS App Store remains lucrative, developers have both the financial incentive and the mental conditioning to go along with it.</p>
<p>And does anyone doubt that the Mac App Store will have a similar stranglehold, in effect, on app purchases within 1-2 OS revisions?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/subjectiveobserver.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/subjectiveobserver.wordpress.com/292/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/subjectiveobserver.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/subjectiveobserver.wordpress.com/292/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/subjectiveobserver.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/subjectiveobserver.wordpress.com/292/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/subjectiveobserver.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/subjectiveobserver.wordpress.com/292/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/subjectiveobserver.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/subjectiveobserver.wordpress.com/292/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/subjectiveobserver.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/subjectiveobserver.wordpress.com/292/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/subjectiveobserver.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/subjectiveobserver.wordpress.com/292/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subjectiveobserver.wordpress.com&amp;blog=12835567&amp;post=292&amp;subd=subjectiveobserver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://subjectiveobserver.wordpress.com/2011/04/20/harsh-language/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/657bbe449148e6e1bf160fd31d8ba537?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">subjectiveobserver</media:title>
		</media:content>
	</item>
	</channel>
</rss>
