<?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>Vincent Gable's Blog &#187; iPhone</title>
	<atom:link href="http://vgable.com/blog/tag/iphone/feed/" rel="self" type="application/rss+xml" />
	<link>http://vgable.com/blog</link>
	<description>my weblog.</description>
	<lastBuildDate>Tue, 29 Nov 2011 22:20:23 +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>Quality is Money</title>
		<link>http://vgable.com/blog/2010/06/07/quality-is-money/</link>
		<comments>http://vgable.com/blog/2010/06/07/quality-is-money/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 08:57:47 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Quotes]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[Quality]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/?p=615</guid>
		<description><![CDATA[The truth is that an iPad app is neither easier nor harder to make than an iPhone app (or a Mac or Windows app), in any general, reasonable, defensible way. Software doesn’t work like that; we don’t have to work twice as hard to cover twice as many pixels on screen. It’s all about the [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>The truth is that an iPad app is neither easier nor harder to make than an iPhone app (or a Mac or Windows app), in any general, reasonable, defensible way. Software doesn’t work like that; we don’t have to work twice as hard to cover twice as many pixels on screen. It’s all about the elusive quality factor.
</p></blockquote>
<p>&#8211;<a href="http://mattgemmell.com/2010/06/04/ipad-app-pricing">Matt Legend Gemmell, on <cite>iPad App Pricing</cite></a></p>
<p>Amen!</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2010/06/07/quality-is-money/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>For iPhone and or iPod Touch and or Other Things As Well</title>
		<link>http://vgable.com/blog/2009/07/19/for-iphone-and-or-ipod-touch-and-or-other-things-as-well/</link>
		<comments>http://vgable.com/blog/2009/07/19/for-iphone-and-or-ipod-touch-and-or-other-things-as-well/#comments</comments>
		<pubDate>Sun, 19 Jul 2009 10:17:46 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Announcement]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Diction]]></category>
		<category><![CDATA[iPhone OS]]></category>
		<category><![CDATA[iPod Touch]]></category>
		<category><![CDATA[Names]]></category>
		<category><![CDATA[Writing]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/?p=363</guid>
		<description><![CDATA[It&#8217;s very clear that a program &#8220;for Mac OS X&#8221; works with any personal computer Apple sells, because they all have &#8220;Mac&#8221; in their name. Unfortunately, the flavor of OS X that runs on the iPhone and iPod Touch is officially called &#8220;iPhone OS&#8221; by Apple, which it implies an incompatibility with the iPod Touch, [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s very clear that a program &#8220;for Mac OS X&#8221; works with any personal computer Apple sells, because they all have &#8220;Mac&#8221; in their name. Unfortunately, the flavor of OS X that runs on the iPhone and iPod Touch is officially called &#8220;iPhone OS&#8221; by Apple, which it implies an <em>incompatibility</em> with the iPod Touch, and <em>any</em> future device that doesn&#8217;t have &#8220;phone&#8221; in the name.</p>
<p>I don&#8217;t know a good way to unambiguously say that a program is for <em>any</em> iPhone OS device, without tedious enumeration.</p>
<p><strong>&#8220;For iPhone OS&#8221; sounds like it excludes the iPod Touch.</strong></p>
<p><strong>&#8220;For all models of iPhone and iPod Touch&#8221; sounds terrible.</strong> It will sound even worse when Apple comes out with other iPhone OS devices (&#8220;…for iPhone or iPod Touch or iTablet or iFPGA…&#8221;).</p>
<p>Apple could help by renaming &#8220;iPhone OS&#8221; to &#8220;Mobile OS X&#8221;, but I don&#8217;t see this happening.</p>
<p>I personally lean towards using &#8220;for iPhone&#8221; in general writing, and clarifying, if necessary, in &#8220;systems requirements&#8221; fine print. This feels closest to how the press covers iPhone OS applications, and of course it&#8217;s how Apple named the OS.</p>
<p><strong>I&#8217;d love to hear what you call iPhone OS applications, and why</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2009/07/19/for-iphone-and-or-ipod-touch-and-or-other-things-as-well/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How To Write Cocoa Object Getters</title>
		<link>http://vgable.com/blog/2009/03/31/how-to-write-cocoa-object-getters/</link>
		<comments>http://vgable.com/blog/2009/03/31/how-to-write-cocoa-object-getters/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 18:51:51 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Sample Code]]></category>
		<category><![CDATA[autorelease]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Memory Management]]></category>
		<category><![CDATA[NSObject]]></category>
		<category><![CDATA[retain]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/2009/03/31/how-to-write-cocoa-object-getters/</guid>
		<description><![CDATA[Setters are more straightforward than getters, because you don&#8217;t need to worry about memory management. The best practice is to let the compiler write getters for you, by using Declared Properties. But when I have to implement a getter manually, I prefer the (to my knowledge) safest pattern, - (TypeOfX*) x; { &#160;&#160;return [[x retain] [...]]]></description>
			<content:encoded><![CDATA[<p>Setters are more straightforward than <a href="http://vgable.com/blog/2009/03/29/how-to-write-cocoa-object-setters/">getters</a>, because you don&#8217;t <em>need</em> to worry about memory management. </p>
<p>The best practice is to let the compiler write getters for you, by using <a href="http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html">Declared Properties</a>.</p>
<p>But when I have to implement a getter manually, I prefer the (to my knowledge) safest pattern,</p>
<pre>- (TypeOfX*) x;
{
&nbsp;&nbsp;return [[x retain] autorelease];
}</pre>
<p>Note that by convention in Objective-C, a getter for the variable <code>jabberwocky</code> is simply called <code>jabberwocky</code>, <em>not</em> <code>getJabberwocky</code>.</p>
<h3>Why <code>retain</code> Then <code>autorelease</code></h3>
<p>Basically <code>return [[x retain] autorelease];</code> <em>guarantees</em> that what the getter returns will be valid for as long as any local objects in the code that called the the getter.</p>
<p>Consider,</p>
<pre>NSString* oldName = [person name];
[person setName:@"Alice"];
NSLog(@"%@ has changed their name to Alice", oldName);</pre>
<p>If <code>-setName:</code> immediately <code>release</code>es the value that <code>-name</code> returned, <code>oldName</code> will be invalid when it&#8217;s used in <code>NSLog</code>.  But if the implementation of <code>[x name]</code> used <code>retain/autorelease</code>, then <code>oldName</code> would still be valid, because it would not be destroyed until the autorelease pool around the <code>NSLog</code> was drained.</p>
<p>Also, autorelease pools are <em>per thread</em>; different threads have different autorelease pools that are drained at different times. <code>retain/autorelease</code> makes sure the object is on the calling thread&#8217;s pool.</p>
<p>If this cursory explanation isn&#8217;t enough, read <a href="http://www.sethwillits.com/blog/?p=24">Seth Willitis&#8217; detailed explanation of <code>retain/autorelease</code></a>. I&#8217;m not going to explain it further here, because he&#8217;s done such a through job of it.</p>
<h3>Ugly</h3>
<p><code>return [[x retain] autorelease];</code> is more complicated, and harder to understand then a simple <code>return x;</code>.  But sometimes that ugliness is necessary, and the best place to hide it is in a one-line getter method. It&#8217;s self documenting. And once you understand Cocoa memory management, it&#8217;s entirely clear what the method does. For me, <strong>the tiny readability cost is worth the safety guarantee</strong>.</p>
<h3>Big</h3>
<p><code>return [[x retain] autorelease];</code> increases peak memory pressure, because it can defer <code>dealloc</code>-ing unused objects  until a few autorelease pools are drained. Honestly I&#8217;ve never measured memory usage, and found this to be a significant problem.  It certainly could be, especially if the thing being returned is a large picture or chunk of data. But in my experience, it&#8217;s nothing to worry about for getters that return typical objects, unless there are measurements saying otherwise.</p>
<h3>Slow</h3>
<p><code>return [[x retain] autorelease];</code> is obviously slower then just <code>return x;</code>. But I doubt that optimizing an O(1) getter is going to make a significant difference to your application&#8217;s performance &#8212; especially compared to other things you could spend that time optimizing.  So until I have data telling me otherwise, I don&#8217;t worry about adding an the extra method calls.</p>
<h3>This is a Good Rule to Break</h3>
<p>As I mentioned before, getters don&#8217;t <em>need</em> to worry about memory management. It could be argued that <strong>the <code>return [[x retain] autorelease];</code> pattern is a <em>premature optimization</em> of <em>theoretical</em> safety at the expense of <em>concrete</em> performance</strong>.</p>
<p>Good programmers try to avoid premature optimization; so perhaps I&#8217;m wrong to follow this &#8220;safer&#8221; pattern. But until I have data showing otherwise, I like to do the safest thing.</p>
<p><strong>How do you write getters, and <em>why</em>?</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2009/03/31/how-to-write-cocoa-object-getters/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>How To Write Cocoa Object Setters</title>
		<link>http://vgable.com/blog/2009/03/29/how-to-write-cocoa-object-setters/</link>
		<comments>http://vgable.com/blog/2009/03/29/how-to-write-cocoa-object-setters/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 19:53:40 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Bug Bite]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Sample Code]]></category>
		<category><![CDATA[autorelease]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Memory Management]]></category>
		<category><![CDATA[NSObject]]></category>
		<category><![CDATA[retain]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/2009/03/29/how-to-write-cocoa-object-setters/</guid>
		<description><![CDATA[There are several ways to write setters for Objective-C/Cocoa objects that work. But here are the practices I follow; to the best of my knowledge they produce the safest code. Principle 0: Don&#8217;t Write a Setter When possible, it&#8217;s best to write immutable objects. Generally they are safer, and easier to optimize, especially when it [...]]]></description>
			<content:encoded><![CDATA[<p>There are several ways to write setters for Objective-C/Cocoa objects that work. But here are the practices I follow; to the best of my knowledge they produce the safest code.</p>
<h3>Principle 0: Don&#8217;t Write a Setter</h3>
<p>When possible, it&#8217;s best to write <a href="http://en.wikipedia.org/wiki/Immutable_object">immutable objects</a>.  Generally they are safer, and easier to optimize, especially when it comes to concurrency.</p>
<p>By definition immutable objects have no setters, so <strong>always ask yourself if you <em>really</em> need a setter</strong>,  before you write one, and whenever revisiting code.</p>
<p>I&#8217;ve removed many of my setters by making the thing they set an argument to the class&#8217;s <code>-initWith:</code> constructor.  For example,</p>
<pre>CustomWidget *widget = [[CustomWidget alloc] init];
[widget setController:self];</pre>
<p>becomes,</p>
<pre>CustomWidget *widget = [[CustomWidget alloc] initWithController:self];</pre>
<p>This is less code, and now, <code>widget</code> is never in a partially-ready state with no controller.</p>
<p>It&#8217;s not always practical to do without setters. If an object looks like it needs a settable property, it probably does. But in my experience, questioning the assumption that a property needs to be changeable pays off  consistently, if infrequently.</p>
<h3>Principle 1: Use <code>@synthesize</code></h3>
<p>This should go without saying, but as long as I&#8217;m enumerating best-practices: if you are using Objective-C 2.0 (iPhone or Mac OS X 10.5 &#038; up) you should <strong>use <code>@synthesize</code>-ed <a href="http://developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW1">properties</a> to implement your setters.</strong></p>
<p>The obvious benefits are less code, and setters that are guaranteed to work by the compiler.  A less obvious benefit is <a href="http://cocoawithlove.com/2008/08/in-defense-of-objective-c-20-properties.html">a clean, abstracted way to expose the state values of an object</a>.  Also, <a href="http://vgable.com/blog/2008/12/20/automatically-freeing-every-property/">using properties can simplify you <code>dealloc</code> method</a>.</p>
<p>But watch out for the a <a href="http://vgable.com/blog/2009/03/17/mutable-property-and-copy-gotcha/">gotcha if you are using <code>copy</code>-assignment for an <code>NSMutable</code> object</a>!</p>
<p>(Note: Some Cocoa programmers strongly dislike the dot-syntax that was introduced with properties and lets you say <code>x.foo = 3;</code> instead of <code>[x setFoo:3];</code>.  But, <strong>you can use properties without using the dot-syntax</strong>.  For the record, I think the dot syntax is an improvement.  But don&#8217;t let a hatred of it it keep you from using properties.)</p>
<h3>Principle 2: Prefer <code>copy</code> over <code>retain</code></h3>
<p><a href="http://vgable.com/blog/2008/11/14/prefer-copy-over-retain/">I covered this in detail here</a>.  In summary, use <code>copy</code> over <code>retain</code> whenever possible: <strong><code>copy</code> is safer</strong>, and with most basic Foundation objects, <strong><code>copy</code> is just as fast and efficient as <code>retain</code>.</strong></p>
<h3>The Preferred Pattern</h3>
<p>When properties are unavailable, this is my &#8220;go-to&#8221; pattern:</p>
<pre>
- (void) setX:(TypeOfX*)newX;
{
&nbsp;&nbsp;[memberVariableThatHoldsX autorelease];
&nbsp;&nbsp;memberVariableThatHoldsX = [newX copy];
}
</pre>
<p>Sometimes I use use <code>retain</code>, or very rarely <code>mutableCopy</code>, instead of <code>copy</code>. But if <code>autorelease</code> won&#8217;t work, then I use a different pattern. I have a few reasons for writing setters this way.</p>
<h4>Reason: Less Code</h4>
<p>This pattern is only two lines of code, and has <strong>no conditionals</strong>.  There is very little that can I can screw up when writing it. It always does the same thing, which simplifies debugging.</p>
<h4>Reason: <code>autorelease</code> Defers Destruction</h4>
<p>Using <code>autorelease</code> instead of <code>release</code> is just a little bit safer, because it does not immediately destroy the old value.</p>
<p>If the old value is immediately released in the setter then this code will sometimes crash,</p>
<pre>
NSString* oldName = [x name];
[x setName:@"Alice"];
NSLog(@"%@ has changed their name to Alice", oldName);
</pre>
<p>If <code>-setName:</code> immediately releasees the value that <code>-name</code> returned, <code>oldName</code> will be invalid when it&#8217;s used in <code>NSLog</code>.</p>
<p>But if If <code>-setName:</code> <code>autorelease</code>-ed the old value instead, this wouldn&#8217;t be a problem; <code>oldName</code> would still be valid until the current autorelease pool was drained.</p>
<h4>Reason: Precedent</h4>
<p>This is <a href="http://google-styleguide.googlecode.com/svn/trunk/objcguide.xml#Autorelease_Then_Retain">the pattern that google recommends.</a></p>
<blockquote><p>
When assigning a new object to a variable, one must first release the old object to avoid a memory leak. There are several &#8220;correct&#8221; ways to handle this. We&#8217;ve chosen the &#8220;autorelease then retain&#8221; approach because it&#8217;s less prone to error. Be aware in tight loops it can fill up the autorelease pool, and may be slightly less efficient, but we feel the tradeoffs are acceptable.</p>
<pre>- (void)setFoo:(GMFoo *)aFoo {
  [foo_ autorelease];  // Won't dealloc if |foo_| == |aFoo|
  foo_ = [aFoo retain];
}
</pre>
</blockquote>
<h3>Backup Pattern (No <code>autorelease</code>)</h3>
<p>When <code>autorelease</code> won&#8217;t work, my Plan-B is:</p>
<pre>
- (void) setX:(TypeOfX*)newX;
{
&nbsp;&nbsp;id old = memberVariableThatHoldsX;
&nbsp;&nbsp;memberVariableThatHoldsX = [newX copy];
&nbsp;&nbsp;[old release];
}
</pre>
<h4>Reason: Simple</h4>
<p>Again, there are no conditionals in this pattern. There&#8217;s no <code>if(oldX != newX)</code> test for me to screw up. (Yes, I have done this. It wasn&#8217;t a hard bug to discover and fix, but it was a bug nonetheless.) When I&#8217;m debugging a problem, I <em>know</em> exactly what <code>setX:</code> did to it&#8217;s inputs, without having to know what they are.</p>
<h4>On <code>id old</code></h4>
<p>I like naming my temporary old-value <code>id old</code>, because that name &#038; type <em>always</em> works, and it&#8217;s short. It&#8217;s less to type, and less to think about than <code>TypeOfX* oldX</code>.</p>
<p>But I don&#8217;t think it&#8217;s necessarily the best choice for doing more to <code>old</code> than sending it <code>release</code>.</p>
<p>To be honest I&#8217;m still evaluating that naming practice.  But so far I&#8217;ve been happy with it.</p>
<h3>Principle 3: Only Optimize <em>After</em> You Measure</h3>
<p>This is an old maxim of Computer Science, but it bears repeating.</p>
<p>The most common pattern for a setter feels like premature optimization:</p>
<pre>- (void) setX:(TypeOfX*)newX;
{
&nbsp;&nbsp;if(newX != memberVariableThatHoldsX){
&nbsp;&nbsp;&nbsp;&nbsp;[memberVariableThatHoldsX release];
&nbsp;&nbsp;&nbsp;&nbsp;memberVariableThatHoldsX = [newX copy];
&nbsp;&nbsp;}
}
</pre>
<p>Testing <code>if(newX != memberVariableThatHoldsX)</code> can avoid an expensive <code>copy</code>.</p>
<p>But it also slows <em>every</em> call to <code>setX:</code>.  <code>if</code> statements are more code, that takes time to execute.  When the processor <a href="http://en.wikipedia.org/wiki/Branch_prediction">guesses wrong</a> while loading instructions after the branch, <code>if</code>&#8216;s become <a href="http://en.wikipedia.org/wiki/Instruction_pipeline#Complications">quite expensive</a>.</p>
<p>To know what way is faster, you have to measure real-world conditions. Even if a <code>copy</code> is  <em>very</em> slow, the conditional approach isn&#8217;t necessarily faster, unless there is code that sets a property to it&#8217;s current value.  Which is kind of silly really.  How often do you write code like,</p>
<pre>[a setX:x1];
[a setX:x1]; //just to be sure!</pre>
<p>or</p>
<pre>[a setX:[a x]];</pre>
<p>Does that look like code you want to optimize? (Trick question! You don&#8217;t know until you test.)</p>
<h4>Hypocrisy!</h4>
<p>I constantly break Principle 3 by declaring properties in <em>iPhone</em> code as <code>nonatomic</code>, since it&#8217;s the pattern Apple uses in their libraries. I assume Apple has good reason for it; and since I will need to write synchronization-code to safely use <em>their</em> libraries, I figure it&#8217;s not much more work to reuse the same code to protect access to my objects.</p>
<p>I can&#8217;t shake the feeling I&#8217;m wrong to do this.  But it seems more wrong to not follow Apple&#8217;s example; they wrote the iPhone OS in the first place.</p>
<h3>If you know a better best practice, say so!</h3>
<p>There isn&#8217;t a way to write a setter that works optimally <em>all</em> the time, but there is a setter-pattern that works optimally more often then other patterns. With your help I can find it.</p>
<h4>UPDATE 03-30-2009:</h4>
<p> <a href="http://www.wilshipley.com/blog/2005/07/code-insults-mark-i.html">Wil Shiply disagrees</a>.  Essentially his argument is that setters are called a lot, so if they aren&#8217;t aggressive about freeing memory, you can have thousands of dead objects rotting in an autorelease pool. Plus, setters often do things like registering with the undo manager, and that&#8217;s expensive, so it&#8217;s a good idea to have conditional code that only does that when necessary.</p>
<p>My rebuttal is that you should optimize big programs by draining autorelease pools early anyway; and that mitigates the dead-object problem.</p>
<p>With complex setters I can see why it makes sense to check if you <em>need</em> to do something before doing it. I still prefer safer, unconditional, code as a <em>simple first implementation</em>. That&#8217;s why it&#8217;s my go-to pattern. But if most setters you write end up being more complex, it might be the wrong pattern.</p>
<p>Really you should <a href="http://www.wilshipley.com/blog/2005/07/code-insults-mark-i.html">read what Wil says</a>, and decide for yourself. He&#8217;s got much more experience with Objective-C development then I do.</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2009/03/29/how-to-write-cocoa-object-setters/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Crazy Idea: Using iPhones During Interviews</title>
		<link>http://vgable.com/blog/2009/03/25/crazy-idea-using-iphones-during-interviews/</link>
		<comments>http://vgable.com/blog/2009/03/25/crazy-idea-using-iphones-during-interviews/#comments</comments>
		<pubDate>Wed, 25 Mar 2009 17:34:24 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Interviewing]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/2009/03/25/crazy-idea-using-iphones-during-interviews/</guid>
		<description><![CDATA[Using an iPhone as a resource during a job interview is an idea worth considering. An iPhone can google answers to trivial questions Unlike a laptop, it can be used while people face each other, and it&#8217;s small enough not to obscure someone. Additionally, it can&#8217;t compile and test code, so candidates must still think [...]]]></description>
			<content:encoded><![CDATA[<p>Using an iPhone as a resource during a job interview is an idea worth considering.  An iPhone can google answers to trivial questions Unlike a laptop, it can be used while people face each other, and it&#8217;s small enough not to obscure someone.  Additionally, it can&#8217;t compile and test code, so candidates must still think everything through in their head.</p>
<p><strong>Adding technology to an interview, just because it&#8217;s technology, is a bad idea</strong> for exactly the same reasons that <a href="http://vgable.com/blog/2008/11/06/alan-kay-on-why-computer-based-teaching-fails/">just putting computers in a classroom isn&#8217;t helpful without special curriculum</a>.</p>
<p>But since an iPhone is so unobtrusive, I think it&#8217;s uses are worth considering.</p>
<p>In technical interviews, it&#8217;s very common for the interviewee to have a question about an API or other detail.  The standard practice is for them to agree with the interviewer on an assumed answer and run with it.  <em>This works</em>.  But it might be interesting to have the real answer available.</p>
<p>Another open question is if google-fu is something that <em>should</em> be tested during an interview. If so, an iPhone might be one way to do it.</p>
<p>Do you have an idea for incorporating some technology into a face-to-face interview?</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2009/03/25/crazy-idea-using-iphones-during-interviews/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Competing Software Engineering Approaches</title>
		<link>http://vgable.com/blog/2009/02/18/competing-software-engineering-approaches/</link>
		<comments>http://vgable.com/blog/2009/02/18/competing-software-engineering-approaches/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 23:18:20 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Quotes]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mobility]]></category>
		<category><![CDATA[Palm]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/2009/02/18/competing-software-engineering-approaches/</guid>
		<description><![CDATA[Tim Bray, &#8230;Palm&#x2019;s approach is radically different from both Android&#x2019;s and Apple&#x2019;s. Since they&#x2019;re all here at more or less the same time, running the same Web browser on roughly equivalent hardware, this represents an unprecedented experiment in competitive software-engineering approaches. Language Framework Notes Apple Objective-C Cocoa Old-school object-oriented language compiled to the metal; general-purpose [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.tbray.org/ongoing/When/200x/2009/02/18/Engineering-Experiment">Tim Bray</a>,</p>
<blockquote>
<p>&#8230;Palm&#x2019;s approach is<br />
radically different from both Android&#x2019;s and Apple&#x2019;s.  Since they&#x2019;re all here<br />
at more or less the same time, running the<br />
<a href='http://webkit.org/'>same Web browser</a> on roughly<br />
equivalent hardware, this represents an unprecedented experiment in<br />
competitive software-engineering approaches.</p>
<table cellpadding="5">
<tr align="left" valign="top">
<td class="empty"></td>
<th>Language</th>
<th>Framework</th>
<th>Notes</th>
</tr>
<tr align="left" valign="top">
<th>Apple</th>
<td>Objective-C</td>
<td>Cocoa</td>
<td>Old-school object-oriented language compiled to the metal; general-purpose UI<br />
framework with roots reaching back to NeXT.</td>
</tr>
<tr align="left" valign="top">
<th>Android</th>
<td>Java</td>
<td>Android</td>
<td>Java language, custom VM, built-from-scratch UI<br />
framework aimed at small-form-factor devices, fairly abstraction-free, based<br />
on &#x201c;Actions&#x201d; and &#x201c;Intents&#x201d;.</td>
</tr>
<tr align="left" valign="top">
<th>web OS</th>
<td>JavaScript</td>
<td>&#x201c;Mojo&#x201d;</td>
<td>All Web technology all the time. Innovative and visually-impressive<br />
&#x201c;card&#x201d;-based UI.</td>
</tr>
</table>
<p><em>(I think it&#8217;s interesting to see Windows Mobile on the list:</p>
<table cellpadding="5">
<tr align="left" valign="top">
<th>Windows Mobile</th>
<td>C/C++</td>
<td>Windows CE/.NET Micro</td>
<td>Philosophically tries to bring Windows to the phone. When I did WinCE development it felt like doing C++ for a Windows OS from the past.</td>
</tr>
</table>
<p>)</em>
</p></blockquote>
<p>I see way too many other factors to attribute success/failure of the devices to the language.  So I wouldn&#8217;t call this an experiment.</p>
<p>But it is interesting how much development for each platform diverges at a fundamental level!</p>
<p>Historically most operating systems &#8212;<br />
UNIX, OS/2, Linux, Windows, Solaris, Mac (Classic and OS X) &#8212; were predominantly, written in C/C++.  While each platform has it&#8217;s own frameworks, they all have strong support for C++ development.  (Although Mac OS X has <a href="http://arstechnica.com/apple/news/2007/06/64-bit-support-in-leopard-no-carbon-love.ars">is slowly dropping support for it&#8217;s C/C++ &#8220;Carbon&#8221; API</a>, and Windows wants to be moving to C# .NET)</p>
<p>It&#8217;s really cool to see mobile platforms doing something radically different from each other.  There are good arguments for each approach &#8212; may the best one win.</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2009/02/18/competing-software-engineering-approaches/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>No Ducking Way!</title>
		<link>http://vgable.com/blog/2009/02/09/no-ducking-way/</link>
		<comments>http://vgable.com/blog/2009/02/09/no-ducking-way/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 14:57:23 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Quotes]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Diction]]></category>
		<category><![CDATA[Failure]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Profanity]]></category>
		<category><![CDATA[Spell Checkers]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/2009/02/09/no-ducking-way/</guid>
		<description><![CDATA[I&#8217;ve finally found an example of, someone intentionally typing &#8220;ducking&#8221; on their iPhone, Plotting routes to meetings based on who I&#8217;m currently ducking. It&#8217;s good for exercise. Also that time iPhone was correct- I meant ducking. Obviously we can&#8217;t have a spellchecker suggesting profanity. But is it really so wrong to just leave it alone? [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve <em>finally</em> found an example of, <a href="http://twitter.com/joeschmitt/statuses/1034806618">someone intentionally typing &#8220;ducking&#8221; on their iPhone</a>,</p>
<blockquote><p>Plotting routes to meetings based on who I&#8217;m currently <strong>ducking</strong>. It&#8217;s good for exercise. Also that time <a href="http://search.twitter.com/search?q=&#038;ands=ducking+iPhone&#038;phrase=&#038;ors=&#038;nots=&#038;tag=&#038;lang=all&#038;from=&#038;to=&#038;ref=&#038;near=&#038;within=15&#038;units=mi&#038;since=&#038;until=2008-12-03&#038;rpp=50">iPhone was correct- I meant <strong>ducking</strong></a>.
</p></blockquote>
<p>Obviously we can&#8217;t have a spellchecker <em>suggesting</em> profanity.  But is it really so wrong to just leave it alone?  Can we trust that <strong>if someone says something that strongly they really meant it?</strong></p>
<p>Word 2008 seems to try, bless it&#8217;s heart.  It won&#8217;t suggest or correct,  &#8220;<a href="http://www.atomicwang.org/motherfucker/Index/Index.html">Mike Lee</a>&#8221; (at least when it&#8217;s written as two words).</p>
<p>But it still can&#8217;t stand <em>one</em> of <a href="http://www.youtube.com/watch?v=3_Nrp7cj_tM&#038;fmt=18">the heavy seven</a> (<a href="http://www.sccs.swarthmore.edu/users/98/dylan/mp3/7%20words.mp3">original MP3</a>).  Word gives it the scarlet underline. That strikes me as odd. I wish I knew the story behind it.  Is it actually a dangerously common typo?  Is it statistically more taboo?  Did someone just make a Puritan judgement call, and decide people <em>wanted</em> to be <em>corrected</em> for writing it? (UPDATE 2009-11-18: apparently it <em>is</em> <a href="http://www.guardian.co.uk/lifeandstyle/2007/jul/28/weekend.jonronson">the worst swear word in the World</a>, at least according to that cute story.)</p>
<p>Ask yourself, are obscenity filters <a href="http://www.codinghorror.com/blog/archives/001176.html">a Bad Idea, or an Incredibly Intercoursing Bad Idea?</a></p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2009/02/09/no-ducking-way/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://www.sccs.swarthmore.edu/users/98/dylan/mp3/7%20words.mp3" length="6768728" type="audio/mpeg" />
		</item>
		<item>
		<title>Optimize CPU Usage of Your Website</title>
		<link>http://vgable.com/blog/2008/12/08/optimize-cpu-usage-of-your-website/</link>
		<comments>http://vgable.com/blog/2008/12/08/optimize-cpu-usage-of-your-website/#comments</comments>
		<pubDate>Mon, 08 Dec 2008 19:55:58 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Quotes]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Laptops]]></category>
		<category><![CDATA[Mobility]]></category>
		<category><![CDATA[Netbooks]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/2008/12/08/optimize-cpu-usage-of-your-website/</guid>
		<description><![CDATA[The thing is, web developers should test their pages for CPU usage the same as app developers do. And anytime a page is idle, CPU usage should be at 0%. Same as with any other app. &#8211;Brent Simmons Last quarter notebooks outsold desktops for the first time. Netbooks, and iPhones have been exploding in popularity [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>The thing is, web developers should test their pages for CPU usage the same as app developers do. And anytime a page is idle, CPU usage should be at 0%. Same as with any other app.</p></blockquote>
<p>&#8211;<a href="http://inessential.com/?comments=1&#038;postid=3570">Brent Simmons</a></p>
<p><a href="http://www.msnbc.msn.com/id/27556783/">Last quarter notebooks outsold desktops for the first time</a>.  Netbooks, and iPhones have been exploding in popularity as well. That means a significant number of your website&#8217;s visitors will be running off a battery, and since battery life decreases proportionally with CPU load, you really do owe it to your users to do this.  The internet shouldn&#8217;t be something you have to be plugged into a power outlet to use.</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2008/12/08/optimize-cpu-usage-of-your-website/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Function Over Brand</title>
		<link>http://vgable.com/blog/2008/10/09/function-over-brand/</link>
		<comments>http://vgable.com/blog/2008/10/09/function-over-brand/#comments</comments>
		<pubDate>Thu, 09 Oct 2008 06:26:33 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Quotes]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/2008/10/09/function-over-brand/</guid>
		<description><![CDATA[There is something to be said for the fact that the phone with the strongest brand in the world has no visible branding whatsoever on its front face. &#8211;John Gruber on the iPhone. But you knew what phone he was talking about. I&#8217;ve always been deeply opposed to any branding strategy that values a brand [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>There is something to be said for the fact that the phone with the strongest brand in the world has no visible branding whatsoever on its front face.</p></blockquote>
<p>&#8211;<a href="http://daringfireball.net/2008/10/iphone_3g">John Gruber on the iPhone</a>.  But you knew what phone he was talking about.</p>
<p>I&#8217;ve always been deeply opposed to any branding strategy that values a brand over a product.  Adding branding to something&#8217;s &#8220;face&#8221; makes it harder to use, because it adds visual noise to the very part of the thing you have to interact with (and figure out how to use).  For example, an &#8220;Intel Inside&#8221; sticker next to a keyboard is one more square-thing you have to rule out when looking for the right button to press.</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2008/10/09/function-over-brand/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

