<?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>More Than Coding</title>
	<atom:link href="http://morethancoding.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://morethancoding.com</link>
	<description>Because machines still need humans</description>
	<lastBuildDate>Sat, 04 May 2013 05:36:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='morethancoding.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>More Than Coding</title>
		<link>http://morethancoding.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://morethancoding.com/osd.xml" title="More Than Coding" />
	<atom:link rel='hub' href='http://morethancoding.com/?pushpress=hub'/>
		<item>
		<title>UX, Then Architecture, Then Tools</title>
		<link>http://morethancoding.com/2013/03/12/ux-then-architecture-then-tools/</link>
		<comments>http://morethancoding.com/2013/03/12/ux-then-architecture-then-tools/#comments</comments>
		<pubDate>Tue, 12 Mar 2013 11:57:13 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://morethancoding.com/?p=805</guid>
		<description><![CDATA[Imagine you are building your dream house. Would you trust a general contractor who talks like this? First, we&#8217;re going to pick out the material for the kitchen counter and the glass for the windows. Let&#8217;s just guess the amounts of each to buy for now. Then we&#8217;ve got to buy some of that new [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=805&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Imagine you are building your dream house. Would you trust a general contractor who talks like this?</p>
<blockquote><p>First, we&#8217;re going to pick out the material for the kitchen counter and the glass for the windows. Let&#8217;s just guess the amounts of each to buy for now.</p>
<p>Then we&#8217;ve got to buy some of that new concrete everyone&#8217;s been talking about. I suppose a truckload will do it for now, but we could always order more later. I just can&#8217;t wait to try it out!</p>
<p>After putting the beams in place we should decide how many floors the house should have. And right at the end we should decide what style the house will be. Sometime before you move in we should get planning permission, and I&#8217;ll probably contact an architect for some drawings after you&#8217;ve settled in.</p></blockquote>
<p>It sounds ludicrous because there&#8217;s a well-established method for building houses, and it&#8217;s based on common sense. You start with a vision, get a set of plans, pour a foundation, build the framework, fill in the internal stuff, and finally finish all the little details.</p>
<p>Putting any step out of order would cause complete chaos. Finishing the walls before the electrical would mean you&#8217;d have to punch holes in all your walls in order to run wires around the house. Cleaning it before it is completely finished would be a wasted effort given the amount of dust builders cause while they work.</p>
<p>However many coders <strong>build their systems backwards</strong>. They become enamored with the latest whizz-bang framework or charmed by the reportedly speedy performance of the newest database. And they lead their thinking with those choices as they build new features, whether those technologies are appropriate or not.</p>
<p>More importantly, using a technology-first design typically means that the user experience (UX) will be left until last. And if you put your users last in your order of priorities, it will unfortunately be very evident in your system&#8217;s lack of usability.</p>
<h3>UX First</h3>
<p>The first order of business in application design is deciding what its users will experience. This should be a high-level vision sketched out on paper or in simple digital mockups, and it should express the flow of the system from the user&#8217;s perspective.</p>
<p>It doesn&#8217;t matter if you&#8217;re building a web application for senior citizens or a system-level tool for serious computing nerds. <strong>The UX must be designed first.</strong></p>
<table width="528" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="122">
<p align="center"><b>Type of System</b></p>
</td>
<td valign="top" width="225">
<p align="center"><b>Your First Thought Should NOT Be…</b></p>
</td>
<td valign="top" width="122">
<p align="center"><b>Your First Thought SHOULD Be…</b></p>
</td>
</tr>
<tr>
<td valign="top" width="122">Online music player</td>
<td valign="top" width="225">“I’m going to design the database schema!”</td>
<td valign="top" width="122">“Let’s design the UX”</td>
</tr>
<tr>
<td valign="top" width="122">Social media plugin</td>
<td valign="top" width="225">“Let me start hacking around with some online social media APIs!”</td>
<td valign="top" width="122">“Let’s design the UX”</td>
</tr>
<tr>
<td valign="top" width="122">Multiplayer Game</td>
<td valign="top" width="225">“SuperFastDB is apparently really scalable, I’ll start testing it today!”</td>
<td valign="top" width="122">“Let’s design the UX”</td>
</tr>
<tr>
<td valign="top" width="122">Virus Checker</td>
<td valign="top" width="225">“I’ve been dying to write a new virus scanning algorithm, so I’m jumping right into that!”</td>
<td valign="top" width="122">“Let’s design the UX”</td>
</tr>
<tr>
<td valign="top" width="122">GPS Device</td>
<td valign="top" width="225">“I’m going to research the latest in OLED technology right away!”</td>
<td valign="top" width="122">“Let’s design the UX”</td>
</tr>
</tbody>
</table>
<h3>Then Comes The Architecture</h3>
<p>Once the UX has been designed and the vision of the system has been defined, an architecture should be laid out to make sure that the code that eventually gets written will actually meet the needs of the users. The choices made in the UX design radically shape and inform a system&#8217;s architecture.</p>
<p>A good UX design will cater for less obvious things that might be part of the overall user experience. A well-written specification might include requirements such as &#8220;the overall load time for page loads must be less than 200 msec&#8221; because the designers know the consequences of <a href="http://blog.kissmetrics.com/loading-time/">slow page load speeds</a>. It might also call for close-to-zero downtime, so the architecture might end up requiring a <a href="http://www.informationweek.com/cloud-computing/infrastructure/amazon-outage-multiple-zones-a-smart-str/240009598">multi-datacenter deployment</a>.</p>
<h3>Last But Not Least, The Tools</h3>
<p>Now it&#8217;s finally playtime! Once the UX has been defined and the architecture has been laid out, the process of picking the right technologies, frameworks and libraries can begin. The crucial point is that now the tools are being chosen with the UX and architecture in mind, so any tool that doesn&#8217;t fulfill the needs of either can be quickly disregarded.</p>
<h3>This Does Not Mean &#8220;Waterfall&#8221;</h3>
<p>If you think that this design sequence requires an outdated <a href="http://en.wikipedia.org/wiki/Waterfall_model">Waterfall-like</a> approach to accommodate it, think again! This is completely appropriate for <a href="http://en.wikipedia.org/wiki/Agile_software_development">Agile</a> development. The implementation of a whole new product, an <a href="http://agile101.net/2009/08/10/the-difference-between-agile-themes-epics-and-user-stories/">epic</a> or even a single user story should follow the UX -&gt; architecture -&gt; tools sequence. When beginning the development of a product or epic, <a href="http://uxdesign.smashingmagazine.com/2012/11/06/design-spikes-fit-big-picture-ux-agile-development/">spikes</a> should be used to design the UX and the architecture. And individual user stories should include enough details for the engineer to know what the UX for that story should be once it is fully implemented, and the engineer should also estimate enough points to cater for architectural planning to be done once work on that story begins.</p>
<p>Tools are great fun to research and to experiment with. Programmers love discovering new ones and finding &#8220;The Next Big Thing&#8221; in the framework jungle, and having lots of tools at your disposal is wonderful when the time comes to build a system that satisfies the UX and the architecture. Just don&#8217;t begin the entire design process with them. So remember: UX first, then architecture, then tools.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/morethancoding.wordpress.com/805/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/morethancoding.wordpress.com/805/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=805&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://morethancoding.com/2013/03/12/ux-then-architecture-then-tools/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/213eb69a69509afef6766346df650204?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">brikelly</media:title>
		</media:content>
	</item>
		<item>
		<title>3 Signs of Narcissistic UI Design</title>
		<link>http://morethancoding.com/2013/01/08/3-signs-of-narcissistic-ui-design/</link>
		<comments>http://morethancoding.com/2013/01/08/3-signs-of-narcissistic-ui-design/#comments</comments>
		<pubDate>Tue, 08 Jan 2013 13:56:10 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://morethancoding.com/?p=88</guid>
		<description><![CDATA[User Interface (UI) and User Experience (UX) design is hard, no doubt about it. Sadly, many software applications appear to have been built by narcissists, because they seem to assume that: We enjoy being constantly interrupted by them We love to repeatedly try out every feature available they have, including things we will never need [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=88&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>User Interface (UI) and User Experience (UX) design is hard, no doubt about it. Sadly, many software applications appear to have been built by <strong>narcissists</strong>, because they seem to assume that:</p>
<ul>
<li>We enjoy being constantly interrupted by them</li>
<li>We love to repeatedly try out every feature available they have, including things we will never need</li>
<li>We believe it&#8217;s worth spending hours re-wiring our brains to deal with their unconventional design choices</li>
</ul>
<p>How do you know if your application is just as vain? Here are 3 signs of design narcissism:</p>
<h2>1. Being Too Noisy</h2>
<p>Imagine you hired a babysitter who called you every few minutes during your night out to say:</p>
<p><em>&#8220;Hey, everything is OK! I&#8217;m still here and everything is fine! I&#8217;ll be calling back every 2 minutes whether you want me to or not! Bye!&#8221;</em></p>
<p>Nobody in their right mind would be happy with that kind of nuisance, but many software applications behave similarly. We somehow convince ourselves that it&#8217;s normal, and we put up with it. We even let it cause us some <a title="When Outlook Attacks" href="http://morethancoding.com/2012/01/06/when-outlook-attacks/">major embarrassment</a>.</p>
<p>Applications with a singular purpose (for example, automatic backup programs) have historically been built by developers who felt they had to repeatedly show the value of that one feature to you. So every time they successfully performed their only important task, they would notify you. They would scream over emails and dialog boxes: <em>&#8220;Hey I just backed up your files for the 3,716<sup>th </sup>straight hour!&#8221;</em> That&#8217;s the narcissistic approach, and it assumes that the user wants to hear that noise on a regular basis.</p>
<p>And of course, no customer wants to hear it. There&#8217;s no value in telling users that nothing is wrong and that the application is working just fine. Instead, they want to hear about things that are not typical. They want to be told about events that require <strong>immediate attention</strong>.</p>
<p>For example:</p>
<table width="522" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="148"><b><span style="text-decoration:underline;">Application</span></b></td>
<td valign="top" width="148"><b><span style="text-decoration:underline;">Please Interrupt Me If&#8230;<br />
</span></b></td>
<td valign="top" width="148"><b><span style="text-decoration:underline;">Don’t Interrupt Me If&#8230;<br />
</span></b></td>
</tr>
<tr>
<td valign="top" width="148">Outlook</td>
<td valign="top" width="148">I have an upcoming meeting</td>
<td valign="top" width="148">There are new emails in my Inbox</td>
</tr>
<tr>
<td valign="top" width="148">Skype</td>
<td valign="top" width="148">Someone is calling me</td>
<td valign="top" width="148">One of my contacts has a birthday</td>
</tr>
<tr>
<td valign="top" width="148">Anti-Virus</td>
<td valign="top" width="148">A virus was detected</td>
<td valign="top" width="148">A routine scan was started</td>
</tr>
<tr>
<td valign="top" width="148">Web Browser</td>
<td valign="top" width="148">I’m browsing a phishing site</td>
<td valign="top" width="148">I can upgrade to a new version</td>
</tr>
<tr>
<td valign="top" width="148">Music Player</td>
<td valign="top" width="148">Never, I’ll notice if the music stops</td>
<td valign="top" width="148">Ever</td>
</tr>
</tbody>
</table>
<p><a href="https://www.dropbox.com/">DropBox</a> is an application that is not narcissistic. It knows not to bother me, and I <em>love</em> that about it. It sits very quietly in my Mac&#8217;s status bar, its tiny logo remaining unobtrusive and its noise levels almost at zero.  When I save a file to my DropBox folder, it quite happily synchronizes it without requiring any clicks, acknowledgments or action on my part. When it&#8217;s finished, it doesn&#8217;t presume that I am waiting with bated breath for the final confirmation of success, so it stays quiet. If I really need some reassurance that it is healthy then I can make the choice to look for the &#8220;green tick&#8221; on the icon.</p>
<p>Microsoft has also been doing better with reducing interruptions recently. Their latest versions of Office have <a href="http://blogs.msdn.com/b/jensenh/archive/2006/06/14/629189.aspx">drastically reduced</a> the number of annoying &#8220;informational&#8221; message boxes shown to the user, but they still have a <a href="http://humanized.com/weblog/2006/09/11/monolog_boxes_and_transparent_messages/">few more to go</a>.</p>
<p>A user&#8217;s attention should be considered valuable, and any software that tries to grab more of their brain&#8217;s time than it deserves will likely be quickly uninstalled.</p>
<h2>2. Being Too Helpful</h2>
<p>It&#8217;s impossible for every single feature in an application to also be the most important one for the user to select. However, most software gives every feature similar amounts of real estate on your screen, regardless of their relative importance. A good example of this is in Microsoft Excel&#8217;s toolbar (click the image to enlarge):</p>
<p style="text-align:center;"><a href="http://morethancoding.files.wordpress.com/2013/01/excel-toolbar.png"><img class="size-thumbnail wp-image-758 aligncenter" alt="Excel Toolbar" src="http://morethancoding.files.wordpress.com/2013/01/excel-toolbar.png?w=615&#038;h=100" width="615" height="100" /></a></p>
<p>It&#8217;s basically a &#8220;<a href="http://www.findwaldo.com/">Where&#8217;s Waldo?</a>&#8221; of features. Since I&#8217;m not a financial professional, I never use most of these features. It always takes me far too long to find the &#8220;Σ&#8221; symbol to sum up data, and that&#8217;s because it&#8217;s right next to icons for completely unrelated things like Copy, Paste and Undo.</p>
<p>The importance of different features changes over time for each user. Wouldn&#8217;t it be nice if an application were smart enough to hide icons from you if you hadn&#8217;t used them in a few months? I&#8217;d also love to see an application react to the way I use its features. For example, I always use keyboard commands to Copy and Paste, so I would love if my applications would automatically realize that and would just make those wasted icons disappear and give more room to the things I&#8217;m working on.</p>
<p>Many developers try to meet everyone&#8217;s needs partially but end up meeting no one&#8217;s completely. Users are usually faced with the results of design-by-committee interfaces that never seem to meet the needs of each individual. It&#8217;s like trying to order a meal at a restaurant that has far too many things on its menu from a waiter who <a href="http://www.youtube.com/watch?v=x5haDL78AJE">never stops offering suggestions</a>. Time and time again, customers must adapt to the <em>application&#8217;s need</em> to offer them every possible option all the time, when all they want is the same dinner they ordered the last twenty times. If you take all users across your install base, chances are every feature is used by someone. But that shouldn&#8217;t mean that every user needs to see every feature.</p>
<p>So, before any more <a href="http://en.wikipedia.org/wiki/Office_Assistant">Paperclip Assistants</a> are conceived, let&#8217;s make sure the software world knows that their customers just want to get their work done, not to have vast numbers of irrelevant features presented to them on a never-ending basis.</p>
<h2>3. Being Too Different</h2>
<p>Narcissistic software developers will regularly assume that users will be happy to use an application that completely disregards UI <a href="https://developer.apple.com/library/mac/#documentation/userexperience/Conceptual/AppleHIGuidelines/Intro/Intro.html">design conventions</a> and <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa511258.aspx">interaction guidelines</a>. This is usually done to make an application really &#8220;stand out,&#8221; but in reality the developer&#8217;s vanity often makes their application unusable.</p>
<p>There are plenty of examples of terrible user interfaces <a href="http://stackoverflow.hewgill.com/questions/238/177.html">to be found</a>. One thing they all share is a complete disregard for consistency with established standards. Making a user re-learn how to perform basic operations would normally be a recipe for the application&#8217;s total failure in the marketplace, but some lucky products lack any competition, leaving the user no alternative. For example, most of the peripheral hardware devices that I&#8217;ve purchased over the years (sound cards, printers, etc) came with proprietary software that look like they were designed as an April Fool&#8217;s prank (click the image to enlarge):</p>
<p><a href="http://morethancoding.files.wordpress.com/2013/01/overclocker.gif"><img class="aligncenter size-thumbnail wp-image-782" alt="overclocker" src="http://morethancoding.files.wordpress.com/2013/01/overclocker.gif?w=204&#038;h=175" width="204" height="175" /></a></p>
<p>Developers should have the humility to respect established UI and UX standards unless they can truly show <em>significant</em> value by breaking the mold. But be prepared for an initial backlash if you don&#8217;t <a href="http://uxmag.com/articles/overhauling-a-ui-without-upsetting-current-users">manage that change</a> well enough.</p>
<p>So, to every software developer out there: remember, if there&#8217;s anyone who has a right to be a narcissist when it comes to UI design, it&#8217;s not you, but rather the user.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/morethancoding.wordpress.com/88/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/morethancoding.wordpress.com/88/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=88&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://morethancoding.com/2013/01/08/3-signs-of-narcissistic-ui-design/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/213eb69a69509afef6766346df650204?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">brikelly</media:title>
		</media:content>

		<media:content url="http://morethancoding.files.wordpress.com/2013/01/excel-toolbar.png?w=150" medium="image">
			<media:title type="html">Excel Toolbar</media:title>
		</media:content>

		<media:content url="http://morethancoding.files.wordpress.com/2013/01/overclocker.gif?w=150" medium="image">
			<media:title type="html">overclocker</media:title>
		</media:content>
	</item>
		<item>
		<title>The Web APIs You Use Will Fail</title>
		<link>http://morethancoding.com/2012/10/24/the-web-apis-you-use-will-fail/</link>
		<comments>http://morethancoding.com/2012/10/24/the-web-apis-you-use-will-fail/#comments</comments>
		<pubDate>Wed, 24 Oct 2012 13:54:27 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://morethancoding.com/?p=676</guid>
		<description><![CDATA[If you’ve built an application that calls any kind of remote Web API – be it based on SOAP, REST/HTTP, Thrift, JSON-RPC or otherwise &#8211; your code must absolutely expect it to fail. Expecting your remote API calls to always work is a recipe for a late-night call to your phone during a future system [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=676&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>If you’ve built an application that calls any kind of remote Web API – be it based on SOAP, REST/HTTP, Thrift, JSON-RPC or otherwise &#8211; your code must absolutely expect it to fail. Expecting your remote API calls to always work is a recipe for a late-night call to your phone during a future system disaster. As Steve Vinoski <a href="http://steve.vinoski.net/blog/2008/07/01/convenience-over-correctness/">correctly states</a>, the “illusion of RPC” runs deep in the programming world, and engineers who treat remote Web API calls the same way as local function calls do so at their peril.</p>
<p>Here are some of the many ways that a call to a distributed system can fail. It’s not an exhaustive list by any means, but it’s a start.</p>
<h2>Failures of Infrastructure</h2>
<p>These are the most basic of failures, usually experienced at the network level.</p>
<h5>DNS Lookup Failures</h5>
<p>The <a href="http://www.zdnet.com/go-daddy-claims-internal-problems-not-an-attack-took-it-down-7000004066/">GoDaddy failure of August 2012</a> caused millions of DNS names to be unreachable. It’s likely that your application code expects healthy, speedy conversion of domain names to IP addresses, but if DNS doesn&#8217;t respond then it won’t get past even the first hurdle.</p>
<h5>Lack of Network Access</h5>
<p>Skilled mobile developers assume that their code will communicate over a cellular network that may not be always available, and handle its intermittent nature gracefully. How many developers assume the same unreliability when creating an application intended for deployment within a data center? Routers, cables, switches and power supplies fail all the time, and a failure of any of those devices could leave your system without the ability to reach the outside world right when you need it most.</p>
<h5>Loss of Data Center</h5>
<p>Amazon’s popular and affordable AWS services are used by a significant number of SaaS providers. Their <a href="http://aws.amazon.com/ec2/">EC2</a> uptime guarantee of <a href="http://aws.amazon.com/ec2-sla/">99.95%</a> entices many developers to build Web APIs to be hosted within it. While that SLA sounds good, the <a href="http://bits.blogs.nytimes.com/2011/04/21/amazon-cloud-failure-takes-down-web-sites/">2011 failure</a> of Amazon’s US-East availability zone showed the technology world what happens when during the 0.05% period. A vast majority of the systems hosted there were completely unreachable during that time, causing a major disruption for many. Importantly, those that followed <a href="http://www.webmonkey.com/2011/04/lessons-from-a-cloud-failure-its-not-amazon-its-you/">Amazon’s advice</a> to build redundancy across availability zones (such as <a href="http://techblog.netflix.com/2011/04/lessons-netflix-learned-from-aws-outage.html">Netflix</a>) were able to handle the outage without interruption.</p>
<h5>SSL Certificate Issues</h5>
<p>SSL certificates are the backbone of secure web communications, but they can be the cause of a lot of frustration. If a server’s domain name changes and the certificate presented by it doesn’t match, the SSL handshake will fail (with good reason).</p>
<p>Should a certificate on either side expire, the SSL handshake will fail too. Web server administrators usually do a good job of preventing server-side certificate expiration, but client-side certificates – while required much less frequently – are sometimes deployed by users who are not very tech-savvy and who <a title="Like it or not, your samples will go into production" href="http://morethancoding.com/2011/08/22/like-it-or-not-your-samples-will-go-into-production/">don’t keep track of when they expire</a>.</p>
<h2>Failures in Communication</h2>
<p>Even if your application has basic network connectivity, a variety of errors can still be experienced as it tries to communicate with the target Web API.</p>
<h5>Timeouts</h5>
<p>A web service that is experiencing greater than peak load might take many seconds (or worse, minutes) to respond to your call. A query resulting in a huge amount of data retrieval and analysis might take just as long to process even on a lightly loaded server. Both of these scenarios could lead to your client giving up and throwing a timeout error when it fails to receive a response. Even if your client call is configured to never time out, a firewall in between your application and the server might decide to kill your connection if it looks idle for so long.</p>
<h5>Origin Restrictions</h5>
<p>If you’re building a browser-based application and expect all your Ajax calls to reach your server, you’re in for a surprise if you ever break one of the <a href="http://en.wikipedia.org/wiki/Same_origin_policy">same-origin rules</a> as an attempt to make a call to another endpoint will be blocked by almost all browsers. Even changing something as innocuous as the TCP port number in your URL could prevent your call from working, so make sure you only make Ajax calls to your origin web server.</p>
<h5>Syntax Errors</h5>
<p>Products that implement older middleware technologies such as <a href="http://en.wikipedia.org/wiki/SOAP">SOAP</a>, <a href="http://www.corba.org/">CORBA</a> and <a href="http://en.wikipedia.org/wiki/Distributed_Component_Object_Model">DCOM</a> provide stubs that take care of encoding the entire payload for you, as well as transmitting it to the server and decoding any response. However using newer architectural approaches like <a href="http://en.wikipedia.org/wiki/Representational_state_transfer">REST</a> can mean that the management of the media types and payload formats will be left to the application programmer. While offering great flexibility, that approach does place a bigger burden on the client developer to ensure that it transmits and understands data in the form the server expects.</p>
<h5>Redirections</h5>
<p>A number of RESTful Web APIs use a redirection technique to instruct the client to resend their original request to another URI, and the HTTP standard offers response codes like <a href="http://en.wikipedia.org/wiki/HTTP_301">301</a> and <a href="http://en.wikipedia.org/wiki/HTTP_302">302</a> for that purpose. But if your client code hasn’t been built using a library that handles them automatically then you&#8217;ll have to add redirection logic for all API calls to prevent surprises when 300-range response codes are returned. And when you&#8217;re working with well-designed RESTful APIs, <a title="URI construction: give it a REST" href="http://morethancoding.com/2011/09/07/uri-construction-give-it-a-rest/">you should expect them to be returned</a>.</p>
<h5>Credential Expiration</h5>
<p>Almost all OAuth tokens and server-side account passwords expire after a limited lifetime. It can be easy to forget this fact when you are in the heat of rolling out your application to production, so make sure that you mark your calendar ahead of their expiration dates, and that you build behaviors into your application to handle a credential failure if it occurs (perhaps by raising a system alert or emailing your IT team).</p>
<h5>Unexpected International Content</h5>
<p>If your application makes any assumption that the server will always send back <a href="http://www.asciitable.com/">ASCII</a> or <a href="http://en.wikipedia.org/wiki/ISO/IEC_8859-1">ISO-Latin-1</a> characters, you be in for a rough day when the server sends back <a href="http://www.unicode.org/">Unicode</a> content and your code has no idea how to decode it. Using data formats that natively support encodings like <a href="http://www.ibm.com/developerworks/xml/library/x-utf8/">UTF-8</a> (for example, XML and JSON) should help somewhat but it doesn’t mean that all your work is done. You’ll still have to handle multi-byte characters and store or render them appropriately.</p>
<h5>Proxy Servers Getting in the Way</h5>
<p>Using a hotel or airplane’s Wi-Fi connection can cause some really interesting behavior for your application. Most pay-to-surf hotspots use an HTTP proxy server to intercept web traffic and ensure that payment is made, but sometimes those proxies do more than just ask for your money. I’ve seen some proxy servers force all HTTP 1.1 traffic down to version 1.0, causing difficulties for applications that relied on features in the 1.1 protocol. Thankfully, most invasive HTTP proxy server behavior can be bypassed by moving to HTTPS (because proxies can’t decrypt that kind of traffic between client browsers and the server as long as the server uses a properly-signed certificate).</p>
<h5>Enormous responses</h5>
<p>Most web services do a good job of truncating huge query result sets before transmitting them to the caller, but some do not. If you accidentally run an enormous query on the server side, it might cause a failure for your client application. Receiving a huge amount of data requires at least as much memory to store it, and (depending on the quality of the parser) might even need to be temporarily duplicated in memory in order to parse it. Make sure that you use any pagination or truncation features available in your API to prevent your application from being slammed with a gigantic result set. If those kinds of features are not available, try to craft your queries to prevent enormous responses.</p>
<h2>Failures in Conversation</h2>
<p>Even if your application successfully communicates with a web service API at first, failures can still occur after that point.</p>
<h5>Throttling</h5>
<p>This is one of the most common reasons for web service API failure. If you hit an API hard enough – even one that you’re paying for – you might discover that the vendor offering it has just cut you off. Of course, this could very well happen to your system at the worst possible moment. Some APIs have no traffic limit when they’re first released but apply them later (something Twitter API developers <a href="http://techcrunch.com/2012/08/27/twitter-api-changes-are-already-posing-challenges-to-tweetbot-developers/">realized recently</a>, much to their surprise and disappointment).</p>
<p>Keep in mind too that an orchestrated <a href="http://techcrunch.com/2012/08/27/twitter-api-changes-are-already-posing-challenges-to-tweetbot-developers/">DDOS</a> attack on your system (or even an innocuous load test of your own) could lead to you quickly reaching an unexpected limit with the Web APIs your application depends on.</p>
<h5>Time Differences</h5>
<p><a href="http://en.wikipedia.org/wiki/Leap_year">February 29<sup>th</sup></a>. <a href="http://en.wikipedia.org/wiki/Daylight_saving_time">Daylight Saving Time</a>. <a href="http://en.wikipedia.org/wiki/International_Date_Line">The International Date Line</a>. <a href="http://www.wired.com/wiredenterprise/2012/07/leap-second-bug-wreaks-havoc-with-java-linux/">The Leap Second</a>. Time zones with <a href="http://en.wikipedia.org/wiki/Nepal_Time">partial</a>-<a href="http://en.wikipedia.org/wiki/Newfoundland_Standard_Time_Zone">hour</a> offsets. Even if you believe your application isn’t time-sensitive, any of these temporal oddities could affect the results you get from the Web APIs you are calling. Testing for them ahead of time might be difficult, but it could be time well spent.</p>
<h5>Subscription Expiration</h5>
<p>When you sign up for an API on the Web, make sure you set your calendar to remind you ahead of the renewal date. Forgetting to renew an API account subscription will leave egg on your face – and nasty errors on the screens of your users.</p>
<h5>The API Disappears</h5>
<p>It’s rare, but it happens: vendors pull their API out of your market area, or they go out of business completely and shut down their services without notice. Either way the net effect is the same, and you’ll have to quickly scramble to find an alternative service.</p>
<h5>Unexpected Payload Format</h5>
<p>Yahoo! recently made an <a href="http://developer.yahoo.com/forum/PlaceFinder-General-Discussion/PlaceFinder-API-v2-released-/1349096254137-b9ba25b6-f983-4fed-afc6-97a35e7fb644">unannounced incompatible upgrade</a> to their popular <a href="http://developer.yahoo.com/geo/placefinder/">Placefinder</a> API, moving it from version 1.0 to 2.0 overnight. Normally a move like that would be orchestrated in such a way to provide both old and new API versions side-by-side, but the company offered users no way to keep using the older 1.0 data format while they made the switch.</p>
<p>Instead, their API users woke up one day to find that Yahoo! had completely broken their applications, and the only options on the table were to either quickly move to the 2.0 format or to switch to a different service. Worse still, some users quickly made the switch to 2.0, only for Yahoo! to realize their mistake two days later and switch the API back to 1.0 – two incompatible changes in as many days.</p>
<p>If vendors as large as Yahoo! can make accidental incompatible changes to their API services, you have to assume that all vendors could do the same.</p>
<h2>What You Can Do</h2>
<p>While there are innumerable ways for Web API calls to fail, protecting your application against problems with them can be done by following a few simple guidelines:</p>
<p><b>Assume that every Web API call you make will fail</b>. Always check that you get a response (and do so within a reasonable timeframe) and that you parse the returned payload carefully. Code very defensively when calling what are essentially unreliable functions. Build monitoring and instrumentation into your system so that your IT team gets called when remote APIs stop responding. And if you&#8217;re really confident, <a href="http://techblog.netflix.com/2012/07/chaos-monkey-released-into-wild.html">inject failure</a> into your production system.</p>
<p><b>Know what your users will experience when a Web API fails.</b> For core services that you are completely dependent on (for example, PayPal for payment processing) make sure that you fail gracefully and tell the user something useful instead of just throwing a stack trace on the screen. For secondary services (for example, Google Maps for showing store locations) consider having an alternative service available that you can fall back to, especially if you hit a traffic ceiling with your main API provider due to high traffic.</p>
<p><b>Simulate the failure of each Web API you depend upon. </b>Testing for failure is by far the best way to defend against future surprises. If you can do it in an automatic fashion then all the better, but simply changing your <a href="http://en.wikipedia.org/wiki/Hosts_%28file%29">hosts file</a> to make the hostname of your remote Web APIs fail to resolve to a usable IP address will probably uncover a ton of issues that you might not have expected.</p>
<p>Web APIs are great, and developers love mashing them up into something exciting. But if you don’t plan for the failure of those APIs, you’ll just end up frustrating your users and driving them away from your product.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/morethancoding.wordpress.com/676/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/morethancoding.wordpress.com/676/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=676&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://morethancoding.com/2012/10/24/the-web-apis-you-use-will-fail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/213eb69a69509afef6766346df650204?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">brikelly</media:title>
		</media:content>
	</item>
		<item>
		<title>The Programming Language Skill Scale</title>
		<link>http://morethancoding.com/2012/08/17/the-programming-language-skill-scale/</link>
		<comments>http://morethancoding.com/2012/08/17/the-programming-language-skill-scale/#comments</comments>
		<pubDate>Fri, 17 Aug 2012 12:28:12 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://morethancoding.com/?p=658</guid>
		<description><![CDATA[Beginner Know nothing about it Know enough to successfully pretend to know it during lunch Know enough to be dangerous with it Know enough to be employed to be dangerous with it Intermediate Know enough to ask intelligent questions about it on stackoverflow.com Know enough to answer n00b homework questions about it on stackoverflow.com Know [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=658&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><strong>Beginner</strong></p>
<ul>
<li>Know nothing about it</li>
</ul>
<ul>
<li>Know enough to successfully pretend to know it during lunch</li>
</ul>
<ul>
<li>Know enough to be dangerous with it</li>
</ul>
<ul>
<li>Know enough to be employed to be dangerous with it</li>
</ul>
<p><strong>Intermediate</strong></p>
<ul>
<li>Know enough to ask intelligent questions about it on stackoverflow.com</li>
</ul>
<ul>
<li>Know enough to answer n00b homework questions about it on stackoverflow.com</li>
</ul>
<ul>
<li>Know enough to ridicule n00b homework questions about it on stackoverflow.com</li>
</ul>
<ul>
<li>Know enough to contribute to open-source projects written in it</li>
</ul>
<ul>
<li>Know enough to be disgusted with the state of open-source projects written in it</li>
</ul>
<p><strong>Expert</strong></p>
<ul>
<li>Know enough to start writing a compiler for it</li>
</ul>
<ul>
<li>Know enough to abandon writing a compiler for it</li>
</ul>
<ul>
<li>Know enough to invent an improved version of it to create The One True Language</li>
</ul>
<ul>
<li>Know enough to get bored and find another language to obsess over for a decade or so</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/morethancoding.wordpress.com/658/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/morethancoding.wordpress.com/658/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=658&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://morethancoding.com/2012/08/17/the-programming-language-skill-scale/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/213eb69a69509afef6766346df650204?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">brikelly</media:title>
		</media:content>
	</item>
		<item>
		<title>Interoperability Success Stories</title>
		<link>http://morethancoding.com/2012/07/12/interoperability-success-stories/</link>
		<comments>http://morethancoding.com/2012/07/12/interoperability-success-stories/#comments</comments>
		<pubDate>Thu, 12 Jul 2012 12:24:24 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://morethancoding.com/?p=632</guid>
		<description><![CDATA[If you spend any time writing software, you&#8217;ll eventually hit an interoperability wall: two components that should talk to each other just refuse to do so. Maybe it&#8217;s a web API that has just been modified without proper concern for backward compatibility, breaking your existing application in the process. Or perhaps you&#8217;re trying to use [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=632&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>If you spend any time writing software, you&#8217;ll eventually hit an interoperability wall: two components that should talk to each other <em>just refuse to do so</em>.</p>
<p>Maybe it&#8217;s a web API that has just been modified without proper concern for backward compatibility, breaking your existing application in the process. Or perhaps you&#8217;re trying to use two middleware products together, only to find that the communication standard they implement is horrendously complex, causing each vendor to interpret it ever-so-slightly differently and making them completely useless when brought together.</p>
<p>For all of the many <a href="http://quod.lib.umich.edu/j/jep/3336451.0014.103?rgn=main;view=fulltext#5.5">painful incompatibilities</a> of the past, there are plenty of wonderful success stories of software and specifications that enabled collaboration and integration in myriad ways. You just don&#8217;t hear them praised that often.</p>
<p>Here are some examples of technologies that do their job, and then get out of the way.</p>
<h3>HTTP</h3>
<p><em>&#8220;It&#8217;s way too simple.&#8221; &#8220;It should be a binary protocol.&#8221; &#8220;It&#8217;s far too slow.&#8221;</em></p>
<p>HTTP has had all kinds of criticisms leveled at it over the years, and yet it prevails. It&#8217;s the basis for all web traffic and the vast amounts of secure e-commerce conducted over it, and a whole lot more besides.</p>
<p>A lot of its power comes from incredible simplicity: both computers and humans can understand HTTP commands and headers. Whether you&#8217;re a proxy server or an overworked systems admin, HTTP is easy to deal with. A proliferation of tools have been built to support it, further strengthening its foothold.</p>
<p>Dig deeper into its details, and you&#8217;ll find a lot of very sophisticated and smartly-designed features: encoding negotiation, authentication, encryption, caching, resumable downloads, redirection, compression, locale matching, and hooks for easily making custom extensions.</p>
<p>And heck, it must be good given that after 20 years it&#8217;s still only at version 1.1.</p>
<h3>TCP/IP</h3>
<p>Without the adoption of TCP/IP as the network protocol of choice for the Internet, the world would be a very different place. Coming up on nearly four decades of existence, the ubiquitous packet-switching protocol that is used in almost every server, desktop, laptop and mobile device has become synonymous with the word &#8220;networking.&#8221;</p>
<p>When was the last time you had a network issue that could be blamed on a deficiency of the TCP/IP specification? Or the last time you had one vendor&#8217;s TCP/IP stack fail to correctly implement the protocol?</p>
<p>The world loves IP addresses (well, maybe it loves DNS names more), and they&#8217;re here to stay. Why? Because a group of very smart people engineered a beautifully flexible and truly usable technology. And while there are some very compelling improvements being <a href="http://www.worldipv6launch.org/">made</a> (or <a href="http://googlecode.blogspot.com/2012/01/lets-make-tcp-faster.html">proposed</a>) right now, this outstanding work from the mid-1970&#8242;s still benefits us all today.</p>
<h3>JSON</h3>
<p>I&#8217;ll admit it: I can&#8217;t read XML. My eyes simply glaze over the never-ending stream of &lt; and &gt; characters and the duplicated start and end tags. At its basic level, it&#8217;s a reasonable language for handling unstructured data, but the awful complexity sometimes laid upon it (XML Schema and SOAP come to mind) can make it very tiresome to deal with. For many years, it seemed like every new software standard that appeared just <em>had</em> to be specified in XML, regardless of its suitability for the problem at hand. It looked like we were going to be stuck with it forever. And then along came JSON.</p>
<p>JSON evolved within the world of JavaScript but quickly won favor with engineers everywhere as a tremendously useful and simple data format. For one thing, it is completely readable, certainly more so than XML, at least to my eyes. It is also fast to parse because it doesn&#8217;t have to go through a secondary validation step to ensure compliance to some overbearing schema. Instead, semantic validation can be performed at the application level, if desired.</p>
<p>Now you&#8217;ll find JSON as the underlying syntax in most popular web APIs. It&#8217;s even being used as the storage format for <a href="http://stackoverflow.com/questions/853265/databases-using-json-as-storage-transport-format">new databases</a>. Every modern web browser has native and efficient support for it. And when was the last time you found that your browser or parsing library failed to process valid JSON? Certainly I&#8217;ve never encountered that problem. Thank its wonderfully concise grammar for making it so easy for parsers to be created in so many different languages.</p>
<h3>There are more&#8230;and we need even more</h3>
<p>There are plenty of success stories to be found related to well-designed interoperability standards that have spurred innovation by being interoperable. Specifications like the <a href="http://en.wikipedia.org/wiki/List_of_Java_virtual_machines">Java Virtual Machine</a> and the <a href="http://en.wikipedia.org/wiki/List_of_CLI_languages">CLI</a> are prime examples of hugely successful standards. But why do many other standards find it hard to get an adoption foothold?</p>
<p>The answer is simple. Or, to put it another way, the answer is: <em>simple</em>.</p>
<p>Interoperability standards succeed when engineers are able to adopt them en masse, and that is most likely to happen <strong>if the standard is as simple as possible</strong>. Specifications that try to <a href="http://www.imatix.com/articles:whats-wrong-with-amqp/">boil the ocean</a> will solve little of value because their complexity will lead to less acceptance in the developer community.</p>
<p>Good engineers will usually take the path of least resistance in their work, so if a standard is too complex it can quickly get ignored in favor of an alternative grassroots-driven solution or even incompatible vendor-driven extensions. Conversely, if useful tools exist that lower a developer&#8217;s barrier to entry (for example IDE support, SDKs, etc), a standard can be adopted more rapidly.</p>
<p>The software market cares about getting stuff done easily and quickly. If an interoperability standard helps in that regard, it will likely get adopted &#8211; regardless of whether it was designed by a committee or a community.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/morethancoding.wordpress.com/632/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/morethancoding.wordpress.com/632/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=632&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://morethancoding.com/2012/07/12/interoperability-success-stories/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/213eb69a69509afef6766346df650204?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">brikelly</media:title>
		</media:content>
	</item>
		<item>
		<title>5 signs that you should hire a programmer on the spot</title>
		<link>http://morethancoding.com/2012/04/30/5-signs-that-you-should-hire-a-programmer-on-the-spot/</link>
		<comments>http://morethancoding.com/2012/04/30/5-signs-that-you-should-hire-a-programmer-on-the-spot/#comments</comments>
		<pubDate>Tue, 01 May 2012 01:52:53 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Interviews]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[hiring]]></category>
		<category><![CDATA[interviews]]></category>
		<category><![CDATA[refactoring]]></category>

		<guid isPermaLink="false">http://morethancoding.com/?p=590</guid>
		<description><![CDATA[Bringing a programmer in for an interview and a coding test can lead to some interesting experiences, both for the interviewer and the interviewee. Most end up with the hiring manager telling them that they&#8217;ll &#8220;be in touch,&#8221; but sometimes a candidate just nails it. That&#8217;s when you consider extending a job offer before they [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=590&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Bringing a programmer in for an interview and a coding test can lead to some interesting experiences, both for the interviewer and the interviewee. Most end up with the hiring manager telling them that they&#8217;ll &#8220;be in touch,&#8221; but sometimes a candidate just<em> nails it</em>. That&#8217;s when you consider extending a job offer before they get a chance to leave the building.</p>
<p>At <a title="TimeTrade" href="http://www.timetrade.com" target="_blank">TimeTrade</a> we run a coding test during interviews that, for the majority of programmers, should take about 2 hours in total to complete. The whole test is comprised of a number of small problems to solve, each harder than the one before. That gives us a good initial gauge of performance based purely on completion time: if everything has been solved in under an hour, we&#8217;ll be smiling. But if two hours pass and even the first problem still hasn&#8217;t been solved, the candidate will most likely just be shown the door.</p>
<p>Above and beyond just solving test problems quickly, here are some signs that a programmer is truly awesome and should be handed a job offer before they leave your building:</p>
<h3>1. They present multiple solutions</h3>
<p>I recently interviewed a programmer who solved an entire set of tests twice: once with iterative solutions, and again recursively. I quickly made him an offer. Finding multiple solutions to a problem is a skill that engineers will need to use every day.</p>
<h3>2. They write full documentation</h3>
<p>Last year I interviewed someone who was so diligent, so detailed and so professional about his work that he created full Javadoc and comments for his code before he considered the solution complete. He even wrote fully automated unit tests <em>and</em> checked their coverage percentage. When I came back into the room at the 2-hour mark and found him typing furiously I initially thought he was having trouble with the test, but he was actually in the process of adding HTML formatting to his Javadoc. Engineers who do this intuitively are the kind you&#8217;ll want on your team.</p>
<h3>3. They improve the test</h3>
<p>We deliberately create tests that have some minor issues lurking within them, purely to see if the candidate (a) spots them and (b) is willing to fix them. It might be an inconsistent usage of quotation marks for strings, misleading variable names or anything along those lines. Candidates that look at all of the provided code as the test &#8212; not just the pieces we&#8217;ve asked them to write &#8212; are the ones who will do the same in our real product once they join our team.</p>
<p>An engineer who is willing to tell a potential employer that the supplied test contains problems shows that they consider the quality of their work to be more important than just agreeing to do what they&#8217;re told. Hire them and they&#8217;ll likely work wonders for your product, going above and beyond their assigned areas to make improvements where they are needed.</p>
<h3>4. They refactor smartly</h3>
<p>Most candidates like to get a solution working, then sit back and breathe a sigh of relief that they finished it successfully. That&#8217;s good, but rarely good enough to justify an on-the-spot job offer. The candidates that solve the problem but then jump right back in to refactor it are in a different category entirely. Their choice of algorithm doesn&#8217;t feel right, and they can&#8217;t ignore the feeling that it could be more efficient. Their code has some duplication in it, and that burns them up inside. These are the candidates who refactor, rewrite and improve their solution until it&#8217;s been <em>crafted</em>.</p>
<p>This can be a double-edged sword, though. If the candidate just keeps rewriting because they&#8217;re not happy until they reach a mythical point of &#8220;perfection&#8221;, there&#8217;s a chance they are one of those programmers who doesn&#8217;t know when to stop (and similarly, ship). However if they watch the clock carefully and are able to both solve the problem and refactor their solution before their time runs out, that&#8217;s a really good sign that you should consider an offer.</p>
<h3>5. All other signs point to &#8220;hire&#8221;</h3>
<p>Sometimes there are plenty of non-technical signs that you&#8217;ve found the right candidate. Your other team members take you aside and tell you, &#8220;We <em>have</em> to hire this lady.&#8221; Their personality feels like a great fit for the team. They have relevant and recent experience in what they&#8217;ll need to do. You know some people who have worked with them before and they tell you they are wonderful to have on a team (and that they&#8217;d hire them again in a second). The candidate is excited about the company and the opportunity and is hungry to start contributing.</p>
<p>If the candidate passes technical muster and all other signs point to &#8220;hire,&#8221; why wait? If you do, you may lose the candidate to another employer who knows how to read the same signs faster than you can. Instead, be decisive and make the offer fast, thereby telling the candidate how much the company wants them on board. It will help start the whole relationship off on the right foot, for both parties.</p>
<p>So the next time you&#8217;ve got a wonderful candidate in your building, don&#8217;t assume someone even better will arrive the next day. Make them an offer and get yourself &#8211; and the candidate &#8211; back to work.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/morethancoding.wordpress.com/590/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/morethancoding.wordpress.com/590/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=590&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://morethancoding.com/2012/04/30/5-signs-that-you-should-hire-a-programmer-on-the-spot/feed/</wfw:commentRss>
		<slash:comments>126</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/213eb69a69509afef6766346df650204?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">brikelly</media:title>
		</media:content>
	</item>
		<item>
		<title>Web engineer looking for work? Start by rethinking your resume.</title>
		<link>http://morethancoding.com/2012/03/02/web-engineer-looking-for-work-start-by-rethinking-your-resume/</link>
		<comments>http://morethancoding.com/2012/03/02/web-engineer-looking-for-work-start-by-rethinking-your-resume/#comments</comments>
		<pubDate>Fri, 02 Mar 2012 16:05:53 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Interviews]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://morethancoding.com/?p=550</guid>
		<description><![CDATA[We&#8217;re currently hiring web engineers to help build the next-generation of TimeTrade&#8217;s online appointment scheduling system. Lots of resumes come my way, but 99% of them look exactly the same, following this format: Summary &#8220;I&#8217;m a web engineer looking for web engineering work&#8221;. [No link to an online portfolio. No effort to craft the objective [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=550&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>We&#8217;re currently <a href="http://www.timetrade.com/about/careers">hiring web engineers</a> to help build the next-generation of TimeTrade&#8217;s <a title="How to phone-screen programmers and not go insane" href="http://www.timetrade.com/">online appointment scheduling</a> system. Lots of resumes come my way, but 99% of them look exactly the same, following this format:</p>
<blockquote><p><em><span style="text-decoration:underline;"><strong>Summary</strong></span></em></p>
<p><em>&#8220;I&#8217;m a web engineer looking for web engineering work&#8221;.</em><br />
<em> [No link to an online portfolio. No effort to craft the objective to match the position for which they're applying. Typically describes only what the engineer wants to get out of a new position, rather than what she or he will bring to the company that hires them.]</em></p>
<p><em><span style="text-decoration:underline;"><strong>Skills</strong></span></em></p>
<p>HTML, DHTML, XML, CSS, JSON, REST, SOAP, AJAX, PHP, CGI, VI, EMACS, &#8230;</p>
<p><em>[A boat-load of technologies, old and new, sprayed onto the resume as one enormous list of acronyms. No effort made to describe which technologies they are expert in versus what they've spent 5 minutes playing with on a boring Saturday afternoon. Alphabet soup.]</em></p>
<p><em><span style="text-decoration:underline;"><strong>Experience</strong></span></em></p>
<p><em>[A lengthy dissertation about every place the candidate has ever worked. Yawn-inducing descriptions of how they worked there. No URLs for me to see the web applications they built.]</em></p></blockquote>
<p>&#8230;and that&#8217;s usually all I get.</p>
<p>Is there a factory somewhere that churns these out on a conveyor belt? Should I blame Microsoft Word&#8217;s built-in resume templates? Or perhaps it&#8217;s the fault of tech recruiters who encourage this kind of lazy resume format in the name of &#8220;consistency&#8221;?</p>
<p>There are plenty of great engineers who could use their experience <strong>creating awesome web applications</strong> to build incredible resumes for themselves but ironically, never do. These programmers work in a world of <strong>aesthetics, creativity and technical artistry</strong> and yet advertise themselves with the passion of a 40-year accountancy veteran who enjoys working in the windowless basement of a bank and whose favorite color is gray.</p>
<p>So let&#8217;s fix that. Here are some tips that will help you rise far above the crowd.</p>
<h3>Completely rethink your resume format</h3>
<p>Why submit a typical resume at all? Check out these really <a href="http://www.businessinsider.com/7-cool-resumes-we-found-on-pinterest-2012-2">creative online resumes</a> that were found on <a href="http://pinterest.com/">Pinterest</a>. This kind of out-of-the-box thinking might not get you anywhere with old-fashioned employers, but I&#8217;ll be blunt: a submission along those formats <strong>will get you noticed here</strong>, and will very likely put you far ahead of the pack with many other employers.</p>
<h3>Build an online portfolio</h3>
<p>One of the fastest ways for an employer to figure out if they want to interview you is to <strong>show them what you&#8217;ve already built</strong>. Web engineers have a massive advantage over server-side engineers because their work is visible by its very nature, and very often publicly accessible online. If you&#8217;re writing a old-fashioned resume, at least list the URLs for your proudest work at the top.</p>
<p>If your work isn&#8217;t public (because it&#8217;s only available on pay-per-use sites or hidden behind corporate firewalls) then see if you can get screenshots of your web applications in action and submit them along with your job application.</p>
<p>If possible, build a <strong>personal website</strong> to host your work samples and advertise yourself using the technology you work in every day. I&#8217;d be more than happy to receive a set of URLs to personal sites on a daily basis rather than a bunch of 7-page resumes.</p>
<h3>Focus more on the &#8220;what,&#8221; not the &#8220;how&#8221;</h3>
<p>Technology skills are important, but they&#8217;re really a means to an end. Employers want to get things done, and the technologies used to build new features and applications simply aren&#8217;t as important as the effort itself. So tell us what you&#8217;ve built in the past, the impact it had on your customers and business, and why it should matter to us. Then &#8211; and only then &#8211; tell us what whizz-bang technologies you used to do it.</p>
<h3>Prove that you&#8217;re a human</h3>
<p>If you&#8217;re working in the web applications space, you probably have passions in life beyond HTML5 and JavaScript. Do you hike in the hills behind your house every morning at 5am? Did you build a working life-size tractor out of Lego? Are you someone who likes to run marathons for charity while wearing a Darth Vader costume? <strong>Then tell us about it.</strong> Personality can mean a lot to hiring managers, especially with a position that centers primarily around creative and visual elements.</p>
<p>I&#8217;m happy to review any wonderful out-of-the-box resume sent my way and give constructive feedback. Those who follow the suggestions above are more likely to hear the words, <em>&#8220;You need to come and work here!&#8221;</em>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/morethancoding.wordpress.com/550/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/morethancoding.wordpress.com/550/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=550&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://morethancoding.com/2012/03/02/web-engineer-looking-for-work-start-by-rethinking-your-resume/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/213eb69a69509afef6766346df650204?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">brikelly</media:title>
		</media:content>
	</item>
		<item>
		<title>When Outlook Attacks</title>
		<link>http://morethancoding.com/2012/01/06/when-outlook-attacks/</link>
		<comments>http://morethancoding.com/2012/01/06/when-outlook-attacks/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 13:45:12 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[outlook]]></category>
		<category><![CDATA[user interface design]]></category>

		<guid isPermaLink="false">http://morethancoding.com/?p=275</guid>
		<description><![CDATA[Most people have had to deal with awful user interfaces at some point. Cluttered, messy applications are everywhere from Windows to Mac, Android to iPhone. There are already plenty of examples online of terrible user interface design, but there is another problem which gets a lot less attention: unwelcome interruptions. Microsoft Outlook is possibly the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=275&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Most people have had to deal with awful user interfaces at some point. Cluttered, messy applications are everywhere from Windows to Mac, Android to iPhone. There are already <a href="http://www.codinghorror.com/blog/2006/11/this-is-what-happens-when-you-let-developers-create-ui.html">plenty</a> <a href="http://okcancel.com/comic/4.html">of</a> <a href="http://thedailywtf.com/">examples</a> <a href="http://homepage.mac.com/bradster/iarchitect/shame.htm">online</a> of terrible user interface design, but there is another problem which gets a lot less attention: <strong>unwelcome interruptions</strong>.</p>
<p><strong>Microsoft Outlook</strong> is possibly the worst interrupter of all. As the application that receives and manages all of your private email messages, it makes an astonishingly concerted effort to completely ruin that privacy on a regular basis. When you first install Outlook, it enables &#8211; by default &#8211; one of the worst user interface components ever conceived: the &#8220;<span style="text-decoration:underline;">Desktop Alert</span>&#8220;.</p>
<p>From what I can tell, the Outlook Desktop Alert feature was designed to:</p>
<ul>
<li>Show the contents of your incoming emails to anyone looking at your screen while you&#8217;re giving a presentation, demo or web conference</li>
<li>Completely interrupt your train of thought and distract you when you&#8217;re in the middle of important work</li>
<li>Turn your email management experience into something more like an instant chat session</li>
</ul>
<p>Studies show that a single new email notification can break your concentration for <a href="http://writerunderground.com/2008/09/13/email-interruptions-cost-you-64-seconds-in-downtime/">more than a minute</a>, but that&#8217;s not the most egregious problem caused by this dreadful feature. The real issue is one of <strong>privacy</strong>.</p>
<p>Let&#8217;s imagine that you&#8217;re having a very busy week as a manager. It&#8217;s a tough time for your company and you&#8217;re helping your boss reduce the costs incurred by your team. You also happen to be meeting with one of your employees and going over some documents with him using your laptop, and both of you are reading intently from your screen. That&#8217;s when your boss happens to drop you a line:</p>
<p><a href="http://morethancoding.files.wordpress.com/2012/01/meeting.png"><img class="aligncenter size-full wp-image-526" title="meeting" src="http://morethancoding.files.wordpress.com/2012/01/meeting.png?w=630" alt=""   /></a></p>
<p>The next day you visit a customer who is on the verge of signing a deal with your company for a significant product license. You&#8217;re in the final stages of negotiation with them and using your computer to show them an Excel spreadsheet with a pricing breakdown when this appears:</p>
<p><a href="http://morethancoding.files.wordpress.com/2012/01/negotiation.png"><img class="aligncenter size-full wp-image-527" title="negotiation" src="http://morethancoding.files.wordpress.com/2012/01/negotiation.png?w=630" alt=""   /></a></p>
<p>You get back to the office to interview a potential new hire. All is going well, and you&#8217;ve convinced them that it&#8217;s a great place to work. Sadly, while showing them your company&#8217;s software product on your laptop, this is what they happen to see:</p>
<p><a href="http://morethancoding.files.wordpress.com/2012/01/resignation.png"><img class="aligncenter size-full wp-image-529" title="resignation" src="http://morethancoding.files.wordpress.com/2012/01/resignation.png?w=630" alt=""   /></a></p>
<p>Dejected and depressed, you hope that your last appointment of the week will cheer you up: you&#8217;re due to present your company&#8217;s product to a local user group. But just as you start your PowerPoint presentation and begin projecting your slides onto a 10-foot wide screen, your friendly boss sends you another quick email, which everyone in the room can now read:</p>
<p><a href="http://morethancoding.files.wordpress.com/2012/01/presentation.png"><img class="aligncenter size-full wp-image-528" title="presentation" src="http://morethancoding.files.wordpress.com/2012/01/presentation.png?w=630" alt=""   /></a></p>
<p>Of course, Outlook isn&#8217;t the only offender. Skype also has a very noisy default, telling me when each of my contacts have crawled out of their beds and opened up their laptops. Every week, more and more applications offer <del>interruption</del> notification services (and <a href="http://growl.info/">Growl</a> on Mac is making it even more common).</p>
<p>If you&#8217;re a software developer responsible for creating a communication tool, please consider carefully how <strong>noisy</strong> you want your features to be. There&#8217;s a really good chance that your users would prefer to focus on their task at hand rather than be constantly bombarded with information that doesn&#8217;t require immediate action on their part. Just because a user has graciously installed your product doesn&#8217;t mean it&#8217;s a good idea to interrupt them over and over again.</p>
<p>More importantly, please remember that <strong>a computer screen isn&#8217;t always a private work area</strong>. Until features like the Outlook Desktop Alert are turned off by default, users who want to maintain their privacy are forced to either <a href="http://office.microsoft.com/en-us/outlook-help/turn-desktop-alerts-on-or-off-HA010098670.aspx">turn it off</a> or <a href="http://support.microsoft.com/kb/928218">get rid of it completely</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/morethancoding.wordpress.com/275/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/morethancoding.wordpress.com/275/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=275&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://morethancoding.com/2012/01/06/when-outlook-attacks/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/213eb69a69509afef6766346df650204?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">brikelly</media:title>
		</media:content>

		<media:content url="http://morethancoding.files.wordpress.com/2012/01/meeting.png" medium="image">
			<media:title type="html">meeting</media:title>
		</media:content>

		<media:content url="http://morethancoding.files.wordpress.com/2012/01/negotiation.png" medium="image">
			<media:title type="html">negotiation</media:title>
		</media:content>

		<media:content url="http://morethancoding.files.wordpress.com/2012/01/resignation.png" medium="image">
			<media:title type="html">resignation</media:title>
		</media:content>

		<media:content url="http://morethancoding.files.wordpress.com/2012/01/presentation.png" medium="image">
			<media:title type="html">presentation</media:title>
		</media:content>
	</item>
		<item>
		<title>How to phone-screen programmers and not go insane</title>
		<link>http://morethancoding.com/2011/11/02/how-to-phone-screen-programmers-and-not-go-insane/</link>
		<comments>http://morethancoding.com/2011/11/02/how-to-phone-screen-programmers-and-not-go-insane/#comments</comments>
		<pubDate>Wed, 02 Nov 2011 12:54:52 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Interviews]]></category>
		<category><![CDATA[hiring funnel]]></category>
		<category><![CDATA[interviews]]></category>
		<category><![CDATA[phone screen]]></category>
		<category><![CDATA[timetrade]]></category>
		<category><![CDATA[trello]]></category>

		<guid isPermaLink="false">http://morethancoding.com/?p=431</guid>
		<description><![CDATA[Technical phone screens are hard to do right. Yet, they serve an important role. They are the primary filter that ensures you only bring in appropriate candidates to spend valuable hours meeting your team. If you don’t phone-screen correctly, you’ll end up bringing in some real timewasters who don’t even come close to having the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=431&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Technical phone screens are hard to do right. Yet, they serve an important role. They are the primary filter that ensures you only bring in appropriate candidates to spend valuable hours meeting your team. If you don’t phone-screen correctly, you’ll end up bringing in some real timewasters who don’t even come close to having the technical chops or the personality to make it through your in-person interviews.</p>
<p>Your hiring process is a classic funnel and the phone screen phase is near the top of it. That means that a ton of resumes will land on your desk (along with a boatload of eager emails and voicemails from your recruiters), and at each stage you will cast aside a very large percentage of them.</p>
<p style="text-align:center;"><a href="http://morethancoding.files.wordpress.com/2011/11/funnel-small.png"><img class="aligncenter size-full wp-image-454" title="funnel-small" alt="" src="http://morethancoding.files.wordpress.com/2011/11/funnel-small.png?w=630"   /></a></p>
<p>We just finished hiring for four engineering positions here at TimeTrade. Here are the metrics we saw at each level of the funnel:</p>
<ul>
<li>120 resume reviews</li>
<li>53 one-hour technical phone screens</li>
<li>22 four-hour first-round interviews</li>
<li>9 four-hour second-round interviews</li>
<li>4 actual hires</li>
</ul>
<p>As any sales or marketing person will tell you, the more you put into the top of a funnel, the more results you’ll get out at the bottom. That’s just as true of recruiting, too. Your challenge therefore is to figure out how to do lots of phone screens without compromising their quality or your sanity. Here’s how.</p>
<h3>Schedule Efficiently</h3>
<p>The seemingly simple act of setting up the phone screen is usually where you will find your free time disappearing, and fast. As a hiring manager, you almost certainly have a calendar full of existing meetings and commitments, and trying to get dozens of extra appointments with candidates requires a lot of calling, emailing, chasing and waiting. Sometimes the recruiters or candidates will get things wrong and end up double-booking you, causing even more hassles for you to reschedule around the conflicts.</p>
<p>But that’s not everyone’s experience. In fact, it takes me all of <strong>30 seconds</strong> to set up an entire two weeks’ worth of phone screens.</p>
<p>It’s not magic that allows me to do that – it’s technology. Instead of me doing all the negotiation and scheduling, I simply use TimeTrade&#8217;s <a href="http://www.timetrade.com/">online appointment scheduling</a> tool to share my open times for phone screens (for example, 2-4pm every weekday) and it gives me back a single URL that I can email in bulk to all my potential candidates and recruiters. That email might look something like this:</p>
<blockquote><p>I’d like to phone screen you for the engineering position here at TimeTrade. Please <span style="text-decoration:underline;color:#0000ff;">click here</span> to choose one of the available times to speak with me.</p>
<p>- Brian</p></blockquote>
<p>The product is integrated with my Outlook calendar, so the moment a candidate chooses a slot it drops onto my calendar without any effort on my part (and they can add it to their own calendar too, of course).  I’ll admit I am biased since I work for the company, but I can’t imagine going back to spending hours scheduling appointments the old, manual way I did before.</p>
<h3>Be Prepared</h3>
<p>Now that you’ve scheduled your phone screens, you need to run them efficiently and learn as much as you can about the applicant’s skills and personality. Unless you’re extremely experienced in this area, you won’t be able to “wing it,” at least not without sounding like you aren’t very prepared. Having a list of potential questions and areas to probe is an absolutely necessity, and it will give you more confidence to run the phone screen properly if you’re new to doing them.</p>
<p>Importantly, you should make sure to have a number of alternative questions available for each area you would like to probe, and use different ones each time. It’s quite common for friends or colleagues to apply for the same position, and they might share their questions to give their buddy a better chance of being brought in for an interview. If nothing else, it can bring a bit of variety to the process that keeps you interested in it when you’ve just completed your 30<sup>th</sup> phone screen in 4 weeks.</p>
<h3>Code Online</h3>
<p>The most important thing to test with a software engineering candidate is their ability to <strong>solve problems by writing code</strong>. After all, that’s what they’d be doing if they got hired.</p>
<p>Sadly, most phone screeners never tackle this area because they believe they’re limited to questions that can be asked on the phone. That means lots of questions about the details of software (such as, “What class library would you use for socket I/O?”) but almost none that would help you gauge their problem-solving and programming abilities. Of the few people out there who do make people code over the phone, some of their <a href="http://sites.google.com/site/steveyegge2/five-essential-phone-screen-questions">proposed methods</a> (like having the candidate write their code on paper and dictate it back to you) are pretty clunky.</p>
<p>Enter the free and simple online collaboration tool <a href="http://willyou.typewith.me">TypeWith.Me</a>. Problem solved.</p>
<p>Right before the phone screen starts, I email the candidate a URL to a new “document” hosted on that site. When they click on it, they’ll see an empty document in their browser, but anything they type in it will be immediately visible to me. In addition, anything I type will show up on their side too. Think <em>“Google Docs without any registration required”</em>, and you’ve got the idea.</p>
<p>I’m able to paste in a few lines of text from my script that outlines each problem I’d like them to solve (reverse a linked list, compute the Nth Fibonacci number, etc.) and sit back and watch them code in real-time. Since they’re also on the phone, we can easily discuss their overall approach or I can interrupt them to tell them to reconsider that <span style="color:#800000;">if (a = 0)</span> statement they just typed in.</p>
<p><a href="http://morethancoding.files.wordpress.com/2011/11/typewithme.png"><img class="aligncenter size-full wp-image-457" title="typewithme" alt="" src="http://morethancoding.files.wordpress.com/2011/11/typewithme.png?w=630&#038;h=305" width="630" height="305" /></a></p>
<p>To make sure this whole process works, you need to inform your candidates ahead of time that they’ll be asked to use this kind of tool because they’ll need access to a speakerphone and the Internet. All of these instructions are visible when you click on my TimeTrade URL so each candidate gets to read them before picking their appointment time.</p>
<p>You’d be amazed at how many candidates refuse to even start writing code, indignantly claiming that their years of industrial experience mean that they shouldn’t have to perform these types of tests. By claiming as much they will have self-selected themselves out of the process, and I’m always happy to inform them of that fact.</p>
<h3>Sell Something</h3>
<p>Always take the time during the call to sell the company, the team culture and your products. Do this even if the candidate is terrible and would never, ever get hired for your team. A phone screen is as much of a marketing and networking opportunity as it is a chance to make the right hire. You never know when your paths will cross again, or what friends your candidate might refer to you.</p>
<p>Running a screen efficiently using the tools and techniques described earlier shows that you and your company are professional about hiring and take your phone screens seriously. Don’t underestimate what this kind of first impression means to a candidate.</p>
<h3>Track Your Progress</h3>
<p>Now that you know how to schedule and run phone screens properly, the last thing you need to do is figure out how to track the workflow for each candidate as they make their way through the funnel.</p>
<p>I’ve used a variety of tools for this (Excel, Outlook and good ol’ paper) but they all were all lacking in some way. Recently I stumbled upon <a href="https://trello.com">Trello</a> and discovered that it is a complete – and free – solution for my hiring tracking needs.</p>
<p><a href="http://morethancoding.files.wordpress.com/2011/11/trello.png"><img class="aligncenter size-full wp-image-445" title="trello" alt="" src="http://morethancoding.files.wordpress.com/2011/11/trello.png?w=630&#038;h=194" width="630" height="194" /></a></p>
<p>Trello finally gives my team and I the ability to track where each candidate is in the hiring process and to move them effortlessly through the funnel. We can also store their resume there and avoid having to email it around all the time, and since it’s an online SaaS tool there’s no chance of some team members seeing stale information.</p>
<p>Technical phone screens are hard to do right, but the tips above should take them from being a sanity-draining chore to become a regular, enjoyable and effective part of your hiring process. You’re welcome.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/morethancoding.wordpress.com/431/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/morethancoding.wordpress.com/431/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=431&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://morethancoding.com/2011/11/02/how-to-phone-screen-programmers-and-not-go-insane/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/213eb69a69509afef6766346df650204?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">brikelly</media:title>
		</media:content>

		<media:content url="http://morethancoding.files.wordpress.com/2011/11/funnel-small.png" medium="image">
			<media:title type="html">funnel-small</media:title>
		</media:content>

		<media:content url="http://morethancoding.files.wordpress.com/2011/11/typewithme.png" medium="image">
			<media:title type="html">typewithme</media:title>
		</media:content>

		<media:content url="http://morethancoding.files.wordpress.com/2011/11/trello.png" medium="image">
			<media:title type="html">trello</media:title>
		</media:content>
	</item>
		<item>
		<title>URI construction: give it a REST</title>
		<link>http://morethancoding.com/2011/09/07/uri-construction-give-it-a-rest/</link>
		<comments>http://morethancoding.com/2011/09/07/uri-construction-give-it-a-rest/#comments</comments>
		<pubDate>Wed, 07 Sep 2011 14:51:36 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[HATEOAS]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[URI]]></category>

		<guid isPermaLink="false">http://morethancoding.com/?p=393</guid>
		<description><![CDATA[Picture the scene: you&#8217;ve just updated your product&#8217;s REST API. You&#8217;ve added lots of new features, revamped the URI structure and you&#8217;re excited for your clients to start using it. One of these two things will happen within the hour: Your support line will ring off the hook with angry customers screaming about how none [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=393&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Picture the scene: you&#8217;ve just updated your product&#8217;s REST API. You&#8217;ve added lots of new features, revamped the URI structure and you&#8217;re excited for your clients to start using it.</p>
<p>One of these two things will happen within the hour:</p>
<ol>
<li>Your support line will ring off the hook with angry customers screaming about how none of their applications are working anymore, and how they&#8217;re going to wring your neck for breaking their systems at the worst possible time.</li>
<li>Everything works great and your customers send you chocolates in gratitude for the new features.</li>
</ol>
<p>The problems in #1 will occur if your customers do any kind of <strong>URI construction</strong> in their REST API client applications. That innocuous &#8220;revamping&#8221; of your URI structure has just broken all the clients who were tightly bound to the exact format and layout of your old URIs.</p>
<p>Imagine an API for an online entertainment company (let&#8217;s call them <em>Fun.com</em>) that streams both movies and music. Thankfully, the folks at Fun.com have learned enough about REST that they only guarantee a long life for the top-level URI (<a href="https://api.fun.com" rel="nofollow">https://api.fun.com</a>). That means that well-behaved clients will hard-code just that single entry-point, and will only follow other URIs that are returned to them as part of their normal interactions beyond that point.</p>
<p>In their API documentation, they say that to get a listing of the available movies on their site you must first GET the top-level URI, and then look for the link listed as &#8220;Movies&#8221; in the returned payload (defined by its <a href="http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven">media type</a>). They don&#8217;t say what that link&#8217;s format or value will be, but they are very clear that it&#8217;s the one to follow if you want to get the list of movies:</p>
<p style="text-align:center;"><a href="http://morethancoding.files.wordpress.com/2011/09/rest-uri-orig1.png"><img class="aligncenter size-full wp-image-410" title="rest-uri-orig" src="http://morethancoding.files.wordpress.com/2011/09/rest-uri-orig1.png?w=630" alt=""   /></a></p>
<p>So far, so good!</p>
<p>Now the team at Fun.com decides to branch into lots of diverse markets, so the API designers start to organize the URI structure a little to prepare for the new services. They move both movies and music into their own &#8220;entertainment&#8221; area and deploy the new API. Thankfully all the well-behaved REST clients are unaffected, because they don&#8217;t care about the URI formats at all &#8211; they always start at the entry-point and navigate their way around:</p>
<p style="text-align:center;"><a href="http://morethancoding.files.wordpress.com/2011/09/rest-uri-changed-ok1.png"><img class="aligncenter size-full wp-image-409" title="rest-uri-changed-ok" src="http://morethancoding.files.wordpress.com/2011/09/rest-uri-changed-ok1.png?w=630&#038;h=238" alt="" width="630" height="238" /></a></p>
<p>Unlucky for the folks at Fun.com, one of their biggest customers used a hacker <a title="The Programmer Pyramid" href="http://morethancoding.com/2011/05/22/the-programmer-pyramid/">coder</a> to write their API client, and he broke the URI construction rule. He saw the original URI format and thought to himself, &#8220;Why should I waste time always going to the top-level and asking where the movie listings are when I can see the URI for them already? I&#8217;m just going to hard-code in the movies URI and that will make the application run way faster!&#8221;</p>
<p>Sadly, his application is now completely broken:</p>
<p style="text-align:center;"><a href="http://morethancoding.files.wordpress.com/2011/09/rest-uri-changed-bad1.png"><img class="aligncenter size-full wp-image-408" title="rest-uri-changed-bad" src="http://morethancoding.files.wordpress.com/2011/09/rest-uri-changed-bad1.png?w=630" alt=""   /></a></p>
<p>He made the mistake of directly coupling his application with the structure of the URIs and ended up breaking his system in the process.</p>
<h3>Why is URI construction a common problem?</h3>
<p>Encounters with hard-coding hacks like this are not rare, for a number of reasons:</p>
<ol>
<li>Plenty of RESTful API vendors don&#8217;t do a good job of discouraging URI construction in their documentation. Typically, they list all the URIs for their resources rather than focus on the media types which will contain them.</li>
<li>Sample code and demos aren&#8217;t usually provided, leaving clients to figure out for themselves what the &#8220;best practices&#8221; are for calling their API.</li>
<li>URIs have a human-readable, well-understood format and programmers are used to typing them into browser address bars. That leads to an understandable inclination to do the same with RESTful URIs. If clients had to instead deal with MD5 hashes, UUIDs or long hexadecimal numbers, this problem simply wouldn&#8217;t exist. Nobody expects a C++ pointer address to be the same every time a process runs, but unfortunately the same understanding isn&#8217;t usually applied to RESTful URIs.</li>
</ol>
<h3>What can be done about it?</h3>
<p>You can&#8217;t prevent URI construction attempts. What you can do, however, is:</p>
<ul>
<li>Document the correct usage of your API through its media types rather than its URIs. Explain that URI structure is a convenience that benefits the providers of the service more than the programmers who consume it.</li>
<li>Provide sample code which demonstrates best practices (and don&#8217;t forget that your sample code will likely <a title="Like it or not, your samples will go into production" href="http://morethancoding.com/2011/08/22/like-it-or-not-your-samples-will-go-into-production/">go into production</a>).</li>
<li>Talk to your clients and educate them about your API before they build applications with it. REST APIs aren&#8217;t magic, and can still be misused.</li>
</ul>
<p>If coders out there could give URI construction a REST, everyone could rest easy when the APIs evolve. Let&#8217;s make it happen.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/morethancoding.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/morethancoding.wordpress.com/393/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morethancoding.com&#038;blog=14752319&#038;post=393&#038;subd=morethancoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://morethancoding.com/2011/09/07/uri-construction-give-it-a-rest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/213eb69a69509afef6766346df650204?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">brikelly</media:title>
		</media:content>

		<media:content url="http://morethancoding.files.wordpress.com/2011/09/rest-uri-orig1.png" medium="image">
			<media:title type="html">rest-uri-orig</media:title>
		</media:content>

		<media:content url="http://morethancoding.files.wordpress.com/2011/09/rest-uri-changed-ok1.png" medium="image">
			<media:title type="html">rest-uri-changed-ok</media:title>
		</media:content>

		<media:content url="http://morethancoding.files.wordpress.com/2011/09/rest-uri-changed-bad1.png" medium="image">
			<media:title type="html">rest-uri-changed-bad</media:title>
		</media:content>
	</item>
	</channel>
</rss>
