<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Rogish Reading Writing]]></title>
  <link href="http://MattRogish.github.com/atom.xml" rel="self"/>
  <link href="http://MattRogish.github.com/"/>
  <updated>2013-03-01T20:04:32-05:00</updated>
  <id>http://MattRogish.github.com/</id>
  <author>
    <name><![CDATA[Matt Rogish]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Why Marissa Mayer is Probably Right]]></title>
    <link href="http://MattRogish.github.com/blog/2013/03/01/why-marissa-mayer-is-probably-right/"/>
    <updated>2013-03-01T19:21:00-05:00</updated>
    <id>http://MattRogish.github.com/blog/2013/03/01/why-marissa-mayer-is-probably-right</id>
    <content type="html"><![CDATA[<p>The internet is in an uproar again: <a href="http://techcrunch.com/2013/02/27/mayers-means/">Marissa Mayer told Yahoo! remote workers to
come back to the mothership or leave</a>.</p>

<p>Initially, I was like everyone else - appalled that Mayer would have such disregard
for the many hard-working remote folks at Yahoo! and surprised that she would shoot
herself in the foot so badly.</p>

<p>On the <a href="http://news.ycombinator.com/item?id=5295618">HackerNews post</a>, I wrote:</p>

<blockquote><p>Why does pulling people into the office finally give Yahoo the ability to fire under-performers? You don&#8217;t need to see butts in seats in order to identify people who are not pulling their weight.</p><p>If people are coasting at home OR at the office you can tell that by their work output. Where they do their work doesn&#8217;t enter into it.</p><p>Adopting a Results Only Work Environment (http://gorowe.com) would allow them to have folks who work from anywhere and give management the tools to fire under-performers.</p><p>If this were only a temporary measure, a &#8220;reset&#8221; so to speak, then I still don&#8217;t agree with it (I think you can do that without the disruption), but it would be understandable. As they have not said that this is temporary, I have no reason to think it&#8217;ll come back in the future, which is the tragedy.</p><p>It doesn&#8217;t have to be like this.</p></blockquote>


<p>The more I think about it though, I was wrong. Yes, the internet is right
that remote workers are not <a href="http://37signals.com/svn/posts/3453-no-more-remote-work-at-yahoo">inherently unproductive</a> and that pulling everyone back
punishes the many for the misdeeds of the few. More gallingly, revoking remote work shows you
don&#8217;t trust your coworkers.</p>

<p>You know what? She probably doesn&#8217;t.</p>

<p>Since 2009, Yahoo! has had 5 CEOs (interim or otherwise) and gone through at least one
complete reorg. Lots of people are coming out of the woodwork stating that
remote work at Yahoo! was like a vacation. And, Yahoo! has long been the butt of a joke:</p>

<p>Q. How do you take a profitable, popular startup and kill it?</p>

<p>A. <a href="http://37signals.com/svn/posts/2777-what-happens-after-yahoo-acquires-you">Get acquired by Yahoo!</a></p>

<p>So, can you really trust anyone at the company? Sure, some responsible
remote workers are caught in the crosshairs but with reports of
&#8220;We’ve checked and some people who work from home haven&#8217;t even logged into the VPN&#8221;
how can you trust their immediate management to do the right thing? And their managers?</p>

<p>Whom can you trust? Who is taking advantage of Yahoo and who is merely
 caught up in the downward-spiral that has been Yahoo! for the last decade?</p>

<p>Marissa wants to look into every employee&#8217;s eyes and make that call. And I can&#8217;t
really blame her. There&#8217;s probably more dead wood at Yahoo! than South Dakota in
the 1870&#8217;s, and it&#8217;s going to be a long, slow journey to get things back on track.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[I judge a company by its bathrooms]]></title>
    <link href="http://MattRogish.github.com/blog/2012/12/12/i-judge-a-company-by-its-bathrooms/"/>
    <updated>2012-12-12T10:24:00-05:00</updated>
    <id>http://MattRogish.github.com/blog/2012/12/12/i-judge-a-company-by-its-bathrooms</id>
    <content type="html"><![CDATA[<p>I travel quite a bit. As such, I have a membership to my preferred airline&#8217;s lounge.
It provides a nice quiet space away from the blaring security announcements
and inane airport CNN. The airline has recently spent a lot of money renovating
the lounge network to give it a &#8220;fresh&#8221; look-and-feel. I think it looks sort of
tacky, but the one thing they got right happened in the bathrooms.</p>

<ul>
<li>They&#8217;re noisy. That is to say, there&#8217;s an exhaust fan that is just the right
amount of white noise.</li>
<li>The urinals have an appropriately sized divider between them</li>
<li>The stalls are actually little rooms. Floor to ceiling walls, a door that closes.</li>
<li>The sinks are fashionable, have towels, and hand lotion.</li>
</ul>


<p>It&#8217;s really quite nice. So, why do most employee bathrooms look like a prison?</p>

<p><img class="center" src="http://MattRogish.github.com/images/bathroom/terrible.jpg"></p>

<p>I actually interviewed at a well-known, highly funded (tens of millions)
tech company here in NYC and visited the restroom. It was dead quiet.
The stalls faced the sink and had large gaps between the door and frame,
so when you washed your hands and looked in the mirror, you could see right
into the embarrassed eyes of the person sitting there.</p>

<p><img class="center" src="http://MattRogish.github.com/images/bathroom/high_doors.jpg"></p>

<p>I casually mentioned how quiet the bathroom was to one of the interviewing
engineers and he said &#8220;Oh yeah, it&#8217;s terrible. No one uses it unless they
have to. I go home to use the bathroom, other people use the coffee shop downstairs.&#8221;</p>

<p><img class="center" src="http://MattRogish.github.com/images/PicardDoubleFacepalm.jpg"></p>

<p>Companies: it&#8217;s not hard to make humane bathrooms that don&#8217;t stress people out.
Take care of your coworkers by providing reasonable accommodations. I didn&#8217;t
take the job at that company for a number of reasons; the terrible bathrooms
was one of them.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Windows is a Burning Platform]]></title>
    <link href="http://MattRogish.github.com/blog/2012/12/08/windows-is-a-burning-platform/"/>
    <updated>2012-12-08T21:55:00-05:00</updated>
    <id>http://MattRogish.github.com/blog/2012/12/08/windows-is-a-burning-platform</id>
    <content type="html"><![CDATA[<p>Windows, as a consumer product, is a burning platform. <a href="https://www.computerworld.com/s/article/9234145/Windows_8_brings_zero_pop_to_consumer_PC_sales">Innovation has stopped</a>.
<a href="http://www.digitimes.com/news/a20121128PD215.html">Or isn&#8217;t in the right direction</a>.</p>

<p>This chart says it all:</p>

<p><img src="http://MattRogish.github.com/images/msft/msft_share.jpg"></p>

<p>Yes, it&#8217;s relative share (a smaller part of a bigger pie) but PC growth has <a href="http://www.idc.com/getdoc.jsp?containerId=prUS23660312">stagnated</a>.
Microsoft makes a significant bulk of its Windows revenue from new PC sales and business
upgrades - very few consumers actually upgrade their Windows absent a new computer.
Back in the 90&#8217;s technology moved so quickly that a computer released in 1998 had
technology not even heard of in 1996. You&#8217;d be a fool not to upgrade! Nowadays?
<a href="http://www.computerworld.com/s/article/9229410/Windows_revenue_falls_13_share_of_sales_drops_to_23_">Not so much</a>.</p>

<p>Why? Because <a href="http://www.youtube.com/watch?v=mOgOP_aqqtg">Microsoft has no taste</a>.
And more importantly, neither do most Windows software developers. Open up virtually
any popular Windows application and you&#8217;re presented with a really ugly interface:</p>

<p><img src="http://MattRogish.github.com/images/msft/quickbooks.jpg"></p>

<p>Boring grids, lackluster UX and visual design, indecipherable <a href="http://www.joelonsoftware.com/uibook/chapters/fog0000000059.html">&#8220;help wizards&#8221;</a>.</p>

<p>iOS and OSX app developers have a strong design aesthetic. OSX apps look nice:</p>

<p><img src="http://MattRogish.github.com/images/msft/flint.png"></p>

<p><img src="http://MattRogish.github.com/images/msft/tweetbot.jpg"></p>

<p>Web developers share the same design-as-a-core-competency philosophy influenced
by Apple:</p>

<ul>
<li><a href="http://www.wired.com/business/2012/10/square-apple/">Square</a></li>
<li><a href="http://blog.mailchimp.com/inside-the-mailchimp-interface-design-process/">MailChimp</a></li>
<li><a href="http://www.siliconprairienews.com/2011/09/sunday-video-wufoo-co-founder-on-designing-web-apps-users-love">Wufoo</a> (<a href="http://blog.mailchimp.com/autoresponder-design-idea-from-apple/">and</a>)</li>
</ul>


<p>And developers are on the same <a href="http://www.quora.com/Computer-Programming/Why-do-most-professional-programmers-prefer-Macs">OSX</a>
<a href="http://www.cio.com/article/463763/Why_Software_Developers_Prefer_Macs">bandwagon</a>.
At virtually every innovative conference and meetup I attend, ranging from
JavaScript to Ruby to the <a href="http://businessofsoftware.org/">Business of Software</a>
conference, I&#8217;m met with a sea of glowing Apple logos on MacBook Airs and Pros
(or the subdued Apple logo on iPads).</p>

<p>Yes, if you go to a .NET conference or perhaps a big-enterprise conference, you&#8217;ll
likely see a lot more Windows machines in the audience. But the &#8220;get &#8216;em young&#8221;
strategy is likely to work well for Apple, as future developers starting with
OSX and Apple are significantly more likely to continue with the platform as
they enter the workforce, demanding OSX development environments or not working
at predominantly Windows shops.</p>

<p>Microsoft realized this <a href="http://www.networkworld.com/community/blog/get-them-while-they%E2%80%99re-young">years ago</a>
but only recently has there been a flip-flop on the younger generation as
new college students prefer <a href="http://www.inc.com/tech-blog/computer-preferences-your-future-recruits.html">Mac to PC</a>.</p>

<p><img src="http://MattRogish.github.com/images/msft/apple_laptops.jpg"></p>

<p>This is a trend that is likely to continue as long as Windows clone manufacturers
continue to <a href="http://www.macworld.com/article/1140068/satisfaction.html">underperform</a>
against Apple. And, without the halo effect of a strong phone and tablet, Microsoft
has no hope of luring consumers back to the Windows ecosystem.</p>

<p>Because Microsoft has no taste neither do their developers, and so there&#8217;s nothing
in the Windows ecosystem that is <em>desirable</em>:</p>

<p><img src="http://MattRogish.github.com/images/msft/ipad.png"></p>

<p>Today&#8217;s children are tomorrow&#8217;s consumers (and business owners!) and they are overwhelmingly rejecting
Microsoft&#8217;s (non-Xbox) <a href="http://bgr.com/2012/11/20/nielsen-children-survey-ios-devices/">offerings</a>
in favor of Apple (and to a lesser extent, Android).</p>

<p>But what about businesses? Microsoft has long held a lock on large enterprises
that require strong controls and IT departments. Apple has a history of ignoring
this market, and there&#8217;s no evidence of this changing. However, with the &#8220;BYOD&#8221;
movement, Apple is proving to be a <a href="http://www.patexia.com/feed/apple-security-protects-the-byod-movement-20120923">competent player</a>
and Microsoft is <a href="http://appleinsider.com/articles/12/11/26/microsoft-to-raise-user-licensing-fees-in-response-to-byod-movement">increasing costs</a>.
Enterprise Apple sales are <a href="http://gigaom.com/apple/mac-making-a-move-in-the-enterprise-grew-44-percent-in-q3/">outperforming Windows</a>.</p>

<p>Microsoft also held a lock on the small and medium sized businesses that could
setup Windows computers, servers, and services (Exchange, MS Office, etc.).
However, SMBs are increasingly replacing expensive locally hosted solutions
with <a href="http://www.exoprise.com/2011/05/12/gmail-replace-exchange/">cloud based</a>
that are cheaper, require significantly less management, and provide better
availability and performance.</p>

<p>The loss of developer, youth, and app mindshare is a huge blow to the Windows platform.
iOS and Android ecosystems are defined by the apps that run on their devices.
And the web is increasingly becoming the way we run applications on our bigger
desktop and laptop computers.</p>

<p>Microsoft has billions of dollars in revenue and is not likely to disappear any time
soon, but the era of Microsoft as a dominant consumer platform is over. Developers are moving
to the web in droves and switching to OSX (or Linux). American youth are preferring
Apple and iOS products, and small and medium sized businesses are replacing Microsoft
software with web-based apps to manage and run their business.</p>

<p>Software companies that don&#8217;t have design as a core, integral component to
their software design are at an ever-increasing disadvantage against
<a href="http://www.nbcnews.com/technology/technolog/6-pillars-steve-jobs-design-philosophy-119120">companies that do</a>.</p>

<p>(Edit: Updated with a more recent image of QuickBooks.)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[On Estimation and Software Development]]></title>
    <link href="http://MattRogish.github.com/blog/2012/09/14/dont-build-big-software-a-small-software-manifesto/"/>
    <updated>2012-09-14T14:28:00-04:00</updated>
    <id>http://MattRogish.github.com/blog/2012/09/14/dont-build-big-software-a-small-software-manifesto</id>
    <content type="html"><![CDATA[<blockquote><p>Facts do not cease to exist because they are ignored.</p><footer><strong>Aldous Huxley</strong> <cite>&#8220;Proper Studies&#8221;</cite></footer></blockquote>


<p>In my last post, I discussed why <a href="http://MattRogish.github.com/blog/2012/08/16/software-effort-estimation-considered-harmful/">software effort estimation was harmful</a>.
I mentioned that you can&#8217;t add up all the individual tasks to get a completion
date at some arbitrary point in the future, and you can&#8217;t (with some caveats)
use estimation to &#8220;staff up&#8221; a project from the beginning.</p>

<p>Where does this leave us? Should we not estimate at all? These folks think so:</p>

<ul>
<li><a href="http://steve-yegge.blogspot.com/2006/09/good-agile-bad-agile_27.html">Good Agile, Bad Agile</a></li>
<li><a href="http://neilkillick.com/2012/04/12/do-not-estimate-software-projects-at-all/">Do not estimate software projects at all</a></li>
<li><a href="http://web.mit.edu/smadnick/www/papers/J019.pdf">Impact of Schedule Estimation on Software Project Behavior</a></li>
</ul>


<p>And even if you could estimate, they&#8217;re always wrong because of the difficulty
in estimation coupled with the inherent variability of development:</p>

<ul>
<li><a href="http://www.compaid.com/caiinternet/ezine/Wiegers-Rainy.pdf">Saving for a Rainy Day</a></li>
<li><a href="http://www.compaid.com/caiinternet/ezine/card-prod.pdf">The Challenge of Productivity Measurement </a></li>
<li><a href="http://cwis.usc.edu/dept/ATRIUM/Papers/Software_Productivity.html">Understanding Software Productivity</a></li>
<li><a href="http://www.galorath.com/wp/engagement-level-and-impact-on-productivity.php">Engagement Level and Impact on Productivity</a></li>
</ul>


<h3>How We Estimate</h3>

<p><img class="right" src="http://MattRogish.github.com/images/smallsoftware/cups.jpg" width="250" height="150">
Some folks have asked how I/we estimate. In general, I think fine-grained
estimation (hours, etc.) is a waste of time. Hours are not interchangeable
(one developer may get it done in seven hours, another in six) and don&#8217;t accurately
take into account risk.</p>

<p>At <a href="http://fundinggates.com">work</a>, we use relative points-based estimation where
1 point = small, 2 points = medium, and 3 points = large (large stories are
almost always broken into smaller stories before development begins). We have
a guide that gives representative stories for each size point.</p>

<p>Initially we fill our backlog with a large number of stories, broken down into
individual deliverable units (e.g. &#8220;user can login&#8221;, &#8220;system sends email reminders&#8221;).
We take a rough estimate of size (for some reason a well-gel&#8217;ed team can agree
on relative sizes without too much difficulty) and use that for basic prioritization.</p>

<p>We then pull items off of the top of the backlog and work on them. As we go, if
a story feels &#8220;too big&#8221; it&#8217;s broken up into smaller tasks. In general, no one
should work on a &#8220;large&#8221; story - it should be decomposed into small and medium
sized stories.</p>

<p>We can use velocity and &#8220;gut feel&#8221; to continually keep the backlog stacked with
a few weeks worth of stories, ensuring that each developer has enough work to
keep them busy (Google&#8217;s &#8220;Priority Queue&#8221;).</p>

<h3>Why Points?</h3>

<p>Points reflect that software development is inherently a chaotic and un-knowable
endeavor, full of uncertainty and icebergs. But, this doesn&#8217;t allow us to abandon
accountability or plan for the future. We&#8217;re professionals, and we act like it.
Points lets us spend our incredibly valuable and scarce time working on what we
do best: crafting amazing software, not agonizing whether feature X will
take Y or Z &#8220;ideal hours&#8221;.</p>

<p>Points also reflect that a given story contains the same amount of risk or size
no matter who works on it. Switching from PostgreSQL to MongoDB represents
the same amount of risk and relative effort no matter who works on it.</p>

<h3>Lingering Questions</h3>

<p>There were a few questions raised in the last article that I&#8217;d like to address.</p>

<ul>
<li>How do we know how to staff a project?</li>
<li>When will it be done?</li>
<li>How will we make internal/external commitments?</li>
</ul>


<h3>How do we know how to staff a project?</h3>

<p>If you look at the <em>best</em> estimators, they have a few things in common:</p>

<ul>
<li>Teams are fixed (no churn in developers)</li>
<li>They have a lot of historical data to depend on</li>
<li>They are often working on few, long-term projects or many projects that are very similar</li>
</ul>


<p>These things typically only exist at large, established companies. Those that probably
operate under a waterfall-type model - minimize risk and cost. The software they
create is rarely used to disrupt entrenched markets but to claw share from competitors
- and viewed under this lens it makes sense that any given software project at
these companies generates little measurable value and so requires the most control.</p>

<p>(This post is not for people working at those companies, although I think given
enough prodding, you could get your management to be more flexible.)</p>

<p>But - if you&#8217;re asking &#8220;how many people?&#8221; then you&#8217;re removing the main support of
effective estimation - that is, fixed team composition. Historical data estimation
only works if you have the same people working on the future project. Otherwise,
the estimates are significantly less valuable, especially in the short run as teams
of new people fight to <a href="http://www.amazon.com/Peopleware-Productive-Projects-Second-Edition/dp/0932633439">&#8220;gel&#8221;</a>
(and don&#8217;t forget the mythical 10x developer).</p>

<p><img class="right" src="http://MattRogish.github.com/images/smallsoftware/9womenmakeababy1month.png"></p>

<p>More interestingly, though, is that each additional programmer past a certain
number gives diminishing returns. This is something (generally) not accounted
for in historical data. You can&#8217;t take the performance of a four person team
and multiply it by ten to achieve the performance of a forty person team.</p>

<p>If you have n-number of &#8220;programmer months&#8221; you also can&#8217;t simply throw a large
number of developers at the project to get it done &#8220;faster&#8221; (also known as schedule compression).</p>

<p>The larger the team, the less schedule compression you achieve, and the greater
<a href="http://www.dfpug.de/loseblattsammlung/online/workshop/design_patterns/sonstiges.htm">diseconomies of scale</a>.
It sounds surprising at first, but intuition should help. If it took five people
a year to work on a project, would it take ten to finish in six months? Maybe,
but that seems doubtful. Not everything on a software project can be worked in
parallel. Gut intuition tells you that it should be done later than 6 months.</p>

<p>What about twenty people. Could you get it done in three months? That seems a lot less
likely. What about forty people? Could forty programmers get it done in a month
and a half? Absolutely not.</p>

<p>The data backs this up:</p>

<ul>
<li><a href="http://www.qsm.com/risk_02.html">Haste Makes Waste When You Over-Staff to Achieve Schedule Compression</a></li>
<li><a href="http://www.qsm.com/blog/2012/top-performing-projects-use-small-teams">Top Performing Projects Use Small Teams</a></li>
<li><a href="http://www.qsm.com/blog/2012/part-ii-small-teams-deliver-lower-cost-higher-quality">Small Teams Deliver Lower Cost and Higher Quality</a></li>
<li><a href="http://en.wikipedia.org/wiki/The_Mythical_Man-Month#The_surgical_team">Mythical Man-Month Surgical Team</a></li>
</ul>


<blockquote><p>So what might account for these results? Over three decades of data from the<br/>QSM database suggest that defect creation and density are highly correlated<br/>with the number of people (and hence communication paths) present on a given<br/>project. Larger teams create more defects, which in turn beget additional<br/>rework. Fixed code must be retested and the team may find new defects injected<br/>during rework. These unplanned find/fix/retest cycles take additional time,<br/>drive up cost, and cancel out any schedule compression achieved by larger<br/>teams earlier in the lifecycle.</p><footer><strong>Small Teams Deliver Lower Cost and Higher Quality</strong> <cite>QSM</cite></footer></blockquote>


<p>Conclusion: Minimize team size. The &#8220;optimal&#8221; size of teams is relatively
fixed (less than <a href="http://www.qsm.com/blog/2012/part-iii-finding-optimal-team-size-your-project">five developers</a>).
&#8220;How many developers should we have on this project?&#8221; is the wrong question to ask.</p>

<p><img class="left" src="http://MattRogish.github.com/images/smallsoftware/redblack.png" width="320" height="154"></p>

<p>&#8220;How can we subdivide the project into 2-4 person teams&#8221; is the right question,
and planning can help with that. I&#8217;ve never had estimation be a high-order
term in the equation, though. Generally putting a list of all of the different
features broken into small chunks, organized by rough size (Small, Medium,
Large) seems to work just fine.</p>

<p>I think a key point of this is on larger software projects, you must subdivide
the work into separate components that don&#8217;t rely on shared state, etc. between them.
This means your different components will act via message passing and an API.</p>

<p>Steve Yegge&#8217;s infamous <a href="https://plus.google.com/112678702228711889851/posts/eVeouesvaVX">&#8220;API ALL THE THINGS&#8221;</a>
post is a good example. It&#8217;s not an exact fit, but if you squint a bit and cross
your eyes so you can see <em>through</em> the picture, you get an idea of what I mean.</p>

<h3>When will it be done?</h3>

<p>What does &#8220;done&#8221; mean? There&#8217;s always a feature you can add. Always some
refactoring or improvements to make. &#8220;Done&#8221; is just an arbitrary pile of
features that are &#8220;good enough&#8221; to be shipped.</p>

<div class='caption-wrapper right' style="width:350px"><img class='' src='http://MattRogish.github.com/images/smallsoftware/tob.jpg' width='350' height='264' alt='Tower of Babel' title='Tower of Babel'><div class='caption-text'>Tower of Babel</div></div>


<p>What seems to happen most often is that over time, software never gets &#8220;done&#8221;
because developers don&#8217;t have a clear &#8220;done&#8221; criteria. This leads to software
built very <em>wide</em> (lots of features) but not very <em>deep</em> (not fully &#8220;done&#8221;),
leading to the age-old <a href="http://en.wikipedia.org/wiki/Ninety-ninety_rule">&#8220;90/90&#8221; rule</a>.</p>

<p>Even if a feature has well-defined &#8220;done-ness&#8221; estimation has a strong
<a href="http://en.wikipedia.org/wiki/Anchoring">anchoring effect</a> that encourages &#8220;90%&#8221;
done features. If you estimate a feature to be eight hours but it really takes
twenty to be &#8220;done&#8221;, in most companies you&#8217;ll receive pressure to compromise
on quality or take shortcuts because you&#8217;re &#8220;taking too much time&#8221;.</p>

<p>Absent external pressure, I&#8217;ve often seen developers put too much emphasis on
the initial estimate - even if there&#8217;s no manager breathing down their neck,
the selfsame developer will feel guilty that they are taking &#8220;too long&#8221;.</p>

<p>Conclusion: Features should be fully &#8220;done&#8221; before moving on to other features.
Avoid anchoring effect and be willing to invest the appropriate time to release
high-quality code.</p>

<h4>How will we make internal/external commitments?</h4>

<blockquote><p>The creation of genuinely new software has far more in common with developing<br/>a new theory of physics than it does with producing cars or watches on an<br/>assembly line. <a href="http://scribblethink.org/Work/kcsest.pdf">ref</a></p><footer><strong>Large Limits to Software Estimation</strong> <cite>J. P. Lewis</cite></footer></blockquote>


<p>This is a hard problem. I argue that building software is a lot closer to writing
poetry than building a bridge. Ask a poet how long until the sonnet is written
and you&#8217;ll get a blank stare.</p>

<p>Unless you&#8217;re building something very similar to something you&#8217;ve done before,
you&#8217;re fundamentally creating something that has never existed before. Even
the most &#8220;scientific&#8221; estimates contain a large chunk of
<a href="http://en.wikipedia.org/wiki/WinFS">risk</a> (or &#8220;unknown unknowns&#8221;) that cannot
be quantified ahead of time.</p>

<p>If you must make a commitment to a random date in the future <strong>and</strong> scope is
fixed, you&#8217;re almost always screwed. Agile development helps avoid this by
encouraging (requiring?) incremental development. Start working on the most important
features first; aim for always shippable/deployable software by keeping the
features small.</p>

<p>In this manner, you&#8217;ll always have working, testable software and will be moving
towards the goal. Your customer/stakeholder will see the progress (or lack thereof)
instantly, and be able to re-prioritize as necessary. Since you&#8217;ve got shippable
software at every point in the game, Marketing and Sales can accurately inform
customers on what&#8217;s going to be in the next release in a &#8220;just-in-time&#8221; fashion.</p>

<p>Many <a href="http://www.macrumors.com/2011/12/21/microsoft-to-end-participation-in-ces-keynotes-after-2012/">software</a>
<a href="http://gigaom.com/apple/macworld-2010-life-without-apple/">companies</a> have been
abandoning announcing arbitrary dates for their latest products and
announcing at conferences and tradeshows because it&#8217;s
too restrictive and places their development on someone else&#8217;s timeline.</p>

<p>When Apple does a product announcement, the software has been in a feature freeze
for months, and the hardware inventory has already been piling up. They don&#8217;t
release handwavy dates &#8220;sometime next year&#8221; because they give a date
once they&#8217;re already finished (iOS betas are more or less feature complete:
Apple spends a long time polishing and fixing bugs, but no major features are
usually released once the betas are released to the public.)</p>

<p>And, the functionality that is delivered is not promised ahead of time. I suspect
Apple has a high level roadmap and works on the most important features first
and cuts anything that isn&#8217;t ready or good enough.</p>

<p>If Microsoft and Apple can&#8217;t predict the future, what chance do you have?</p>

<p>Conclusion: Work on the most valuable features first in an iterative fashion.
Always be delivering working software.</p>

<p><img class="center" src="http://MattRogish.github.com/images/smallsoftware/ABC.jpg"></p>

<h3>How to be Successful With Minimal Estimating - Build Small Software</h3>

<blockquote><p>Many small things make a big thing.</p></blockquote>


<p>Since team productivity is maximized with smaller team size, effort is fixed,
and software is inherently unpredictable, this leads to an interesting conclusion:
don&#8217;t build big software projects.</p>

<p>Large software projects are cost/productivity inefficient. Large software
projects contain a large amount of risk that cannot be determined a priori.
Large software projects <a href="http://cross5talk2.squarespace.com/storage/issue-archives/2005/200503/200503-Humphrey.pdf">fail more often</a>
than smaller ones.</p>

<ul>
<li>Use rough approximations of feature size for high-level planning and guidance</li>
<li>Use small teams to build small software</li>
<li>Deliver frequently, working on the highest-value features first</li>
<li>API all the things to enable different teams to integrate via a standardized API</li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Software Effort Estimation Considered Harmful]]></title>
    <link href="http://MattRogish.github.com/blog/2012/08/16/software-effort-estimation-considered-harmful/"/>
    <updated>2012-08-16T12:38:00-04:00</updated>
    <id>http://MattRogish.github.com/blog/2012/08/16/software-effort-estimation-considered-harmful</id>
    <content type="html"><![CDATA[<p><img class="right" src="http://MattRogish.github.com/images/estimation/dal73.png" width="405" height="357"></p>

<p>Delta Air Lines tells me it will take two hours and twenty-five minutes
to fly from New York City to Atlanta, GA. American says two thirty. United?
Two thirty-four. Yet, the captain just told me it was &#8220;one-hour forty-five&#8221; minutes
&#8220;wheels-up to wheels-down&#8221;. What gives?</p>

<p>It turns out that the US Department of Transportation (US DOT) rates the airlines
by &#8220;on-time performance&#8221;: whether or not the aircraft reaches the gate by the quoted
time. So, like any rational actors, the airlines pad the flight time to account
for ground delays (waiting by the gate for the tug driver to appear),
re-routes due to bad weather, etc. - but also to goose the ratings.</p>

<p>They could massively pad and say the flight takes three hours, but that impacts
the ability for folks to connect to other flights. Airlines constantly tweak
the advertised flight time: too much padding and the wasted time on the ground
costs dearly; too little and the DOT will come after you.</p>

<h3>Software</h3>

<p>Software developers are often called upon to estimate various tasks, features,
or bugs. Oftentimes this is measured in hours, but for larger stories it could
be days or weeks (month-long estimates don&#8217;t seem to be as common).</p>

<p>These estimates are used to estimate the effort for a given task and, in the hands
of a business user/project manager, added up to get the completion date for
the project as a whole (e.g. feature X takes 2 weeks, feature Y takes 3,
X + Y = 5 weeks to launch). This completion date is then used in a formula to
calculate total project cost (salary per day * days, or equivalent).</p>

<p><span class='pullquote-right' data-pullquote='This is such a depressing situation I cannot dare think of it further.'>
In really terrible places to work, someone other than the developer will
actually do the estimating. This estimate will then be given to the developer
as an implicit (or at especially evil places, explicit) <em>time not to exceed</em>.
This is such a depressing situation I cannot dare think of it further.</p>

<p></span></p>

<p><img src="http://MattRogish.github.com/images/estimation/dilbert.jpeg"></p>

<h3>Estimation Process</h3>

<p>The estimation process itself is not very well defined at many software companies.
Often the developer will try and compare feature X to a known feature they have
completed in the past. For example, &#8220;Create login form&#8221; may have taken them four
hours on a previous project, so they can reasonably estimate likewise for a login
form on a new project. Or, &#8220;Add a customer&#8221; seems a little bit harder than a login
form, so multiply the login form estimate by 1.5x to get 6 hours.</p>

<p>It gets a lot trickier for larger features, like &#8220;Customer Analytics&#8221;. What does
&#8220;Customer Analytics&#8221; mean? Hopefully the developer has been given a specifications
document from a business analyst (or equivalent) that spells out all of the requirements:</p>

<ul>
<li>Bar chart of Customers over time (group by signup date)</li>
<li>Ability to change scale (view week, month, year)</li>
<li>Exclude inactive Customers</li>
<li>etc.</li>
</ul>


<p>In this case, the smart developer would decompose the feature into smaller
features that can be compared to past experiences. The dumb developer would try
and estimate the feature as a whole. Bad, naughty developer!</p>

<h3>Missing Data</h3>

<p>Most estimation is drawn from past experience. What if the developer doesn&#8217;t have
this experience? How can they estimate? This is where things get tricky. And by
tricky, I mean &#8220;completely made up.&#8221; Sure, for things that have been done before
by <em>someone</em> the developer can draw some parallels and make a guesstimate. But
what about the stuff that has never been done before (presumably, the secret-sauce
that makes you money)? Usually you just take a Wild-Ass Guess (WAG-estimation)
and hope you&#8217;re not wrong. Given the rarity of being punished for
under-promising and over-delivering this WAG tends to be a massive over-estimation.</p>

<h3>Effort vs. Accuracy</h3>

<p>It seems obvious that the more time you spend on your estimates, the more likely
you are to &#8220;get it right.&#8221; Right? This thesis is basically the entire justification
for the <a href="http://en.wikipedia.org/wiki/Waterfall_model">Waterfall</a> model of
software development.</p>

<p>Completely spec out the entire system ahead of time, spend a lot of time researching
and estimating the problem, determine project dependencies, and you can determine
the &#8220;finish date&#8221; before writing a line of code! It&#8217;s seductive and taps into
the part of our brain that craves order and dependability.</p>

<div class='caption-wrapper center' style="width:px"><img class='' src='http://MattRogish.github.com/images/estimation/gantt.gif' width='' height='' alt='Pretty little stories all in a row' title='Pretty little stories all in a row'><div class='caption-text'>Pretty little stories all in a row</div></div>


<p>It turns out that effort spent estimating only provides marginal returns and,
eventually, becomes negative. Why? Because of <a href="http://en.wikipedia.org/wiki/Overfitting">overfitting</a>.</p>

<p>In machine learning, overfitting generally results from having too little training data
(edited: incorrect usage of test data)
or focusing on irrelevant metrics. The costing algorithm you evolve into can only
accurately predict your training data. When fed a new problem the algorithm
provides widely variable or incorrect information.</p>

<p>Human estimation algorithms fall into the same trap - the more you try and dig
into a problem, the more you see parallels that don&#8217;t exist and the less you
account for randomness (or &#8220;unknown unknowns&#8221;). You end up being very confident
in your estimation but ultimately are wildly wrong.</p>

<div class='caption-wrapper center' style="width:500px"><img class='' src='http://MattRogish.github.com/images/estimation/effortvaccuracy.png' width='500' height='348' alt='"Agile Estimation and Planning" Addison-Wesley' title='"Agile Estimation and Planning" Addison-Wesley'><div class='caption-text'>&#8220;Agile Estimation and Planning&#8221; Addison-Wesley</div></div>


<h3>Why Estimate?</h3>

<p>Let&#8217;s back up a bit. Earlier I wrote that folks estimate in order to determine
the completion date for the project as a whole.</p>

<p>And? What&#8217;s the point of knowing when the entire project will be complete? Who
cares? Typical answers are:</p>

<p><img class="right" src="http://MattRogish.github.com/images/estimation/beatings.jpg"></p>

<ul>
<li>So we know whether or not to undertake the task</li>
<li>So we know how many developers to put on the problem</li>
<li>So we don&#8217;t overspend</li>
<li>So they can generate a ship date for marketing/PR reasons</li>
</ul>


<p>But I think the deeper, much-less admitted reason is that managers and other
&#8220;business people&#8221; don&#8217;t do a particularly good job of calculating business value,
motivating, and managing software people and projects. They wield the estimate
as a cudgel: perform X by Y date <em>or else</em>.</p>

<h3>Business Value Knife Fight</h3>

<p>In his 1986 book,
&#8221;<a href="http://www.amazon.com/Controlling-Software-Projects-Management-Measurement/dp/0131717111">Controlling Software Projects: Management, Measurement, and Estimation</a>&#8221;
Tom DeMarco (yes, of Peopleware fame) wrote &#8220;You can&#8217;t control what you can&#8217;t measure.&#8221;
This is true, but is it important in software projects? Some 23 years later Tom
doesn&#8217;t think so.</p>

<blockquote><p>&#8220;You can&#8217;t control what you can&#8217;t measure.&#8221; This line contains a real truth,<br/>but I&#8217;ve become increasingly uncomfortable with my use of it. Implicit in<br/>the quote (and indeed in the book&#8217;s title) is that control is an important<br/>aspect, maybe the most important, of any software project. But it isn&#8217;t.</p><footer><strong>Tom DeMarco</strong> <cite>IEEE Software Magazine - Viewpoints</cite></footer></blockquote>


<p><a href="http://www2.computer.org/cms/Computer.org/ComputingNow/homepage/2009/0709/rW_SO_Viewpoints.pdf">The full article text is here</a>.</p>

<p>Tom goes further to state:</p>

<blockquote><p>My early metrics book [&#8230;] played a role in the way many budding software<br/>engineers quantified work and planned their projects. In my reflective mood,<br/>I&#8217;m wondering, was its advice correct at the time, is it still relevant, and do<br/>I still believe that metrics are a must for any successful software development<br/>effort? My answers are no, no, and no.</p><footer><strong>Tom DeMarco</strong> <cite>IEEE Software Magazine - Viewpoints</cite></footer></blockquote>


<p>The tl;dr of his article is that the software projects that require tight cost control are the ones delivering little or no marginal value. That is,</p>

<blockquote><p>To understand control&#8217;s real role, you need to distinguish between two drastically<br/>different kinds of projects:</p><p>* Project A will eventually cost about a million dollars and produce value of around $1.1 million.<br/>* Project B will eventually cost about a million dollars and produce value of more than $50 million.</p><p>What&#8217;s immediately apparent is that control is really important for Project A but<br/>almost not at all important for Project B. This leads us to the odd conclusion<br/>that strict control is something that matters a lot on relatively useless projects<br/>and much less on useful projects. It suggests that the more you focus on control,<br/>the more likely you&#8217;re working on a project that&#8217;s striving to deliver something<br/>of relatively minor value.</p><p>To my mind, the question that&#8217;s much more important than how to control a software project is, why on earth are we doing so many projects that deliver such marginal value?</p><footer><strong>Tom DeMarco</strong> <cite>IEEE Software Magazine - Viewpoints</cite></footer></blockquote>


<p>If the value of software we&#8217;re writing is so low, is it worth being written? If
the project has such tight time constraints that a schedule slip will doom the
project then you&#8217;re in a world of hurt. (The solution is agile: work on the most
important things first, have an always-working project, and cut scope to hit
a date.)</p>

<p>This exposes a major weakness in most software companies: the inability to determine
project value. Given a project of unknown value, the conservative business will
then attempt to minimize cost. Unfortunately as we&#8217;ll see, cost minimization ends
up becoming very expensive in the long run.</p>

<h3>Hierarchy as a Service</h3>

<p><img class="right" src="http://MattRogish.github.com/images/estimation/hier.gif" width="273" height="215"></p>

<p>Most companies are incredibly hierarchical - programmers report to a tech lead
who reports (tangentially, to a project manager) to a mid-manager who has one
or two layers in-between them and the CIO/CTO/CEO. The further up the stack the
greater the nosebleed: the lack of visibility of the day-to-day machinations of
the software organization and the less concrete decision making (aka vision over
strategy/tactics).</p>

<p>This results in senior/mid tier managers that don&#8217;t know much about how software
actually gets written. Given the perverse cost-minimization (because they didn&#8217;t
do their job) organizations go to great lengths (of both time and money) to
keep projects under tight control:</p>

<ul>
<li>They require big up front design before any code is worked on</li>
<li>They require sign-offs and constant oversight</li>
<li>Anything that isn&#8217;t directly driving completion of a task is forbidden (or at least, implicitly disincentivized)</li>
</ul>


<p>What does this do? It encourages waste via <a href="http://en.wikipedia.org/wiki/Parkinson%27s_Law">Parkinson&#8217;s Law</a>.
It discourages refactoring when software entropy becomes unmanageable. Ultimately,
estimation ensures software projects underachieve. By strictly managing
cost, an organization guarantees the value is strictly limited.</p>

<p>(I&#8217;m not entirely sure what this means, but I&#8217;ve never seen the folks who are
writting the specs, requirements, etc. ever being asked to estimate how long
each spec will take to write. Or have the CEO give a date when the company will
hit some arbitrary metric, although see the perversity in public company
earnings estimates and reporting.)</p>

<h3>Trust me, I&#8217;m Lying</h3>

<p><img class="left" src="http://MattRogish.github.com/images/estimation/trust-no-one.jpg"></p>

<p>Ultimately companies require estimation because they
<a href="http://MattRogish.github.com/blog/2012/04/16/expense-reports-are-bullshit/">don&#8217;t trust anyone</a>. They
don&#8217;t trust developers to deliver results. They don&#8217;t trust mid-management to
motivate their reports. The underlying reality is that the folks &#8220;in charge&#8221;
are worried that everyone is going to rip off the company and only by holding
people to arbitrary deadlines are they assured stuff will get done.</p>

<p>Committing to a date allows them to sleep better at night and shifts the blame
from them to the folks on the front lines. And this is wrong, both morally and
from a pure technical perspective. (See: <a href="http://www.gorowe.com">Results Only Work Environment</a>
for how to manage based on results.)</p>

<h3>Estimation considered harmful</h3>

<p>Estimation is ultimately a futile effort. Software, more or less, is like writing
poetry. Or solving mathematical proofs. It takes as long as it takes, and it&#8217;s
done when it&#8217;s done. Perfect, or imperfect, estimation won&#8217;t change how long it
takes to complete the work. If that sounds horrible to you, then go do something else.</p>

<p>Even if we could completely accurately estimate all of the pieces,
software of any complexity has interdependencies and &#8220;unknown unknowns&#8221; that
tend to not surface until implementation time. You can&#8217;t know the end date
<em>a priori</em> by simply adding up all the components.</p>

<p>Estimation actually <strong>slows down development</strong> because estimation isn&#8217;t free.
The developer is incentivised to take as long as possible estimating in an effort
to not get beaten when they miss the estimate. Why waste that time when the metric
the developer is attempting to hit ultimately generates negative value?</p>

<p>(In <em>Peopleware</em> they discovered that projects where no estimation was done
had the highest average productivity; any estimation lowered productivity no
matter who performed the estimation.)</p>

<p><img class="right" src="http://MattRogish.github.com/images/estimation/brickwall.jpg" width="320" height="212"></p>

<p>Software is not like <a href="http://MattRogish.github.com/blog/2012/04/17/working-too-much-is-stupid/">bricklaying</a> -
you can&#8217;t speed it up without major consequences. The <a href="http://en.wikipedia.org/wiki/The_Mythical_Man-Month">Mythical Man-Month</a>
teaches us that adding developers to a late project will only make it later
due to exponential communication and ramp-up (coined &#8221;<a href="http://en.wikipedia.org/wiki/Brooks's_law">Brook&#8217;s Law</a>&#8221;).</p>

<p>This results in folks that think adding more developers to a project at the beginning
will allow them to hit an arbitrary date by spreading out the workload. Unfortunately
new software doesn&#8217;t work this way, either, as the same exponential communication
overhead occurs in the beginning, too. You merely end up with a giant mass of
incoherent code. And you waste a lot of money employing people who don&#8217;t add
much value, sitting on the bench waiting for their part of the project to begin.</p>

<p>The solution is &#8220;Don&#8217;t build big software&#8221;, which I&#8217;ll cover in a future post.</p>

<h3>Two Points for Honesty</h3>

<p>Estimation isn&#8217;t all bad, though. The act of estimating forces you to consider
the problem domain in some detail. As Winston Churchill said, &#8220;Failure to plan
is planning to fail.&#8221;</p>

<p>This is why I espouse the agile activity of relative points-based estimation.
Regardless of which point system you use (linear, exponential, etc.) group-based
estimation helps the entire team arrive at a shared understanding of what
each feature/story/etc. is supposed to do. This is critical to keeping a high
<a href="http://en.wikipedia.org/wiki/Bus_factor">bus factor</a>.</p>

<p>The key point is that these estimates are never, ever used to try and pinpoint
a &#8220;ship date&#8221; (you should be using continuous deployment anyway) or used to
punish a developer for &#8220;taking too long&#8221;.</p>

<p>The estimation process should take place relatively quickly. Break stories up
into trivial tasks (which by definition don&#8217;t need estimating) and then roughly
estimate the risk posed by other stories (external integrations, hard machine
learning problems, etc.). In all, this process shouldn&#8217;t take very long.</p>

<p>This ensures minimal estimation waste, keeps developers happy, and velocity high.</p>

<h3>(UPDATE) Evidence of What?</h3>

<p>Some folks have asked: <a href="http://www.joelonsoftware.com/items/2007/10/26.html">&#8220;What about evidence-based scheduling?&#8221;</a></p>

<p>That&#8217;s a very good question. I have a huge man-crush on Joel.
Probably so much that if I saw him in person I&#8217;d babble like a child and be
basically incoherent. He&#8217;s done more to advance the state of programmer
work environments and software development than anyone I can think of in recent history.</p>

<p>Joel doesn&#8217;t strike me as the kind of guy who would use hourly estimates to
punish developers. So, I think it comes from a good place, and not the deep-dark
evil place that most estimation requirements come from. But, when it comes to
EBS, I&#8217;m not sure it really provides that much value relative to the overhead
vs. relative points-based.</p>

<p>It&#8217;s really close to what agile points give, namely a <a href="http://en.wikipedia.org/wiki/Burn_down_chart">burndown chart</a>, except
you&#8217;ve got all the overhead of keeping track of exactly how long it takes to finish
(I admit that I may be overestimating the time it takes to manage this reporting.)</p>

<p>Even if it&#8217;s easy to record the hours, I&#8217;m still skeptical that things like
<a href="http://en.wikipedia.org/wiki/Parkinson's_law">Parkinson&#8217;s Law</a> might intrude
or that the <a href="http://pm.stackexchange.com/questions/2765/agile-why-use-points-instead-of-hours">psychological effects of hours-based estimation</a>
may have unintended consequences. I&#8217;d rather stick to points.</p>

<p><a href="http://news.ycombinator.com/item?id=4393756">Click here for the Hacker News discussion</a></p>

<h4>Defensive Disclaimer</h4>

<p>Building safety-critical software is necessarily out of
scope, as that is a completely different animal. I&#8217;ve never built space shuttle
software or something that could easily kill someone so the suitability of this
technique is undefined.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Apple's Biggest UX Fail]]></title>
    <link href="http://MattRogish.github.com/blog/2012/07/21/apples-biggest-ux-fail/"/>
    <updated>2012-07-21T18:07:00-04:00</updated>
    <id>http://MattRogish.github.com/blog/2012/07/21/apples-biggest-ux-fail</id>
    <content type="html"><![CDATA[<p>Many years ago I took a job as a Database Administrator for a genetics company.
On my first day I was given the option of a Linux or Windows box. The entire
IT department was running Linux, so I naturally picked that. This was my first
exposure to Linux as a day-to-day development environment - prior I&#8217;d only used
it on the servers, ssh&#8217;ing in from my Windows XP machine.</p>

<p>It was nice, especially in a company that was full of Linux developers. My home
directory was magically NFS mounted, all of our software &#8220;just worked&#8221; when I&#8217;d
log in to another machine, and we could get pretty cheap computers that performed
exceptionally well! All the software I had on the server I had locally (vim, psql,
etc.) and it was very seamless and awesome.</p>

<p>When it worked, it was just magical. When it didn&#8217;t, which was rare, it wasn&#8217;t too
difficult to work around whatever was going on. I learned the value of a really
well-run IT department that had the budget to &#8220;do it <strong>right</strong>&#8221; instead of the
typical &#8220;do it <strong>right now</strong>&#8221;.</p>

<p>The problem was all that infrastructure was pretty expensive to maintain. We had
SAN guys who kept the home directories performant. I&#8217;d see company-wide emails go out
&#8220;Please keep your home directories under xxGB!&#8221; as folks were publicly shamed
for using &#8220;too much&#8221; shared storage. At the time, automatic updates wasn&#8217;t a
&#8220;thing&#8221; so the IT folks would come by periodically and physically swap out
machines that had the latest <code>apt-get update</code> run. Woe be the developer that
installed anything outside of their home directory!</p>

<p>Anyway, after that I was hooked. Sure, Windows had some sort of &#8220;roaming profile&#8221;
business but it really didn&#8217;t work as well as the Linux NFS solution. I made the
decision that I was never using Windows again.</p>

<p>Fast forward a bit, and I found myself at an all Mac shop running OS X. I found
OS X to be an amazing blend of a better GUI than Windows with the power of Linux
(it&#8217;s BSD underneath). Wow! Finally, a decent GUI (GNOME was terrible at the time)
but with all of my usual GNU/Linux tools! Huzzah! All was well in the land of
OS X.</p>

<p>Except for one thing: the <em>.dmg.</em></p>

<h3>Mac Package Deployment</h3>

<p>OS X has this peculiar method of deploying software. Instead of an &#8220;Installer&#8221;
like Windows, that litters your environment with configuration, registry, and
userland data files, OS X (typically) distributes software without installers
as stand-alone .app directories bundled in mountable disks. This is quite an
interesting and elegant solution, I think. Except it&#8217;s implemented in the worst
possible way.</p>

<p>Download most OS X software and you end up with a .dmg file sitting in your downloads.
Double-click it and you&#8217;re presented with the following:</p>

<p><img src="http://MattRogish.github.com/images/dmg/wat.png"></p>

<p>What am I supposed to do here? There&#8217;s no discovery. What if I double click
the icon? Oh, it opens the program. That&#8217;s how I run it, right? But what about the
&#8220;Applications&#8221; folder there. What am I supposed to do with that? Turns out you&#8217;re
supposed to DRAG the Skype icon to the Applications folder, thus &#8220;Installing&#8221;
it to your machine.</p>

<p>It&#8217;s gotten so bad that some apps, like the most-excellent <a href="http://getcloak.com">Cloak</a>,
give you instructions:</p>

<p><img src="http://MattRogish.github.com/images/dmg/cloak.png"></p>

<p>Provided I follow those instructions, I&#8217;ve now installed it to my Applications
folder, I guess. Now I want to get rid of the installer, so I delete it and empty the trash:</p>

<p><img src="http://MattRogish.github.com/images/dmg/inuse.png"></p>

<p><img class="right" src="http://MattRogish.github.com/images/dmg/ejectme.png"></p>

<p>But, cloak isn&#8217;t running? What do I need to do now? Turns out you need to &#8220;eject&#8221;
the dmg. What you&#8217;re doing, under the covers, is actually unmounting the virtual disk
that OS X helpfully mounted for you when you double-clicked the .dmg.</p>

<p>Only <em>then</em> can you empty your trash.</p>

<p><img src="http://MattRogish.github.com/images/clap.gif"></p>

<p>This makes no sense for the average user.</p>

<p>I guess eventually you can figure that out and memorize these steps except for
one thing: OS X, as of Mountain Lion, hides the &#8220;Applications&#8221; folder. If you
install a fresh copy of Mountain Lion you rarely see the &#8220;Applications&#8221;
folder. It&#8217;s not on the dock, like &#8220;Documents&#8221; and &#8220;Downloads&#8221; are. Why not?</p>

<h3>OS X App Store</h3>

<p>With Mountain Lion, Apple has introduced the concept of the App Store as <em>the</em> way
to install apps to your computer. If your app is downloaded outside of the app store,
you&#8217;re presented with a scary dialog that doesn&#8217;t (easily) let you install the app.</p>

<p>Apple is trying to push OS X developers to distribute through the app store; the .dmg
is not long for this world. I doubt we&#8217;ll see any design improvements to the .dmg
process in further OS X releases. Developers should consider the App Store and,
if it fits your business model, target the store <em>first</em>. If you must deliver
software via the .dmg, please make it as easy-to-use as possible, like Cloak.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Case of the Disappearing iPad]]></title>
    <link href="http://MattRogish.github.com/blog/2012/05/30/the-case-of-the-disappearing-ipad/"/>
    <updated>2012-05-30T16:21:00-04:00</updated>
    <id>http://MattRogish.github.com/blog/2012/05/30/the-case-of-the-disappearing-ipad</id>
    <content type="html"><![CDATA[<p>Some time ago I noticed that my iPhone and iPad stopped appearing in iTunes.
I didn&#8217;t think much of it since my devices still seemed to successfully sync
and, since I had converted them to &#8220;WiFi Syncing&#8221;, I figured it was just
a quirk of the wireless sync.</p>

<p><img class="center" src="http://MattRogish.github.com/images/itunes/dudewheresmyiphone.png"></p>

<p>Today I happened to have iTunes open when I plugged in my iPhone for charging
and I noticed that the iPhone quickly appeared in the &#8220;Devices&#8221; list before
mysteriously vanishing again. To the internet!</p>

<p><img class="center" src="http://MattRogish.github.com/images/itunes/missingipad.png"></p>

<p>A quick Google search showed quite a few people feeling my pain - the devices
sync but don&#8217;t appear in iTunes and only reinstalling iTunes would fix it.
I dug into my Mac&#8217;s system logging and saw various red herrings about being
unable to sync via USB but nothing panned out.
<a href="http://www.youtube.com/watch?v=nn2FB1P_Mn8">I tried turning it off and on again</a>
but nothing worked.</p>

<p>Defeated I gave up and went back to iTunes to resume IDD
(<a href="http://www.amazon.com/Inception-Hans-Zimmer/dp/B003ODL004">Inception</a> Driven
Development) when my mouse cursor errantly floated over the &#8220;Devices&#8221; column.
Actually, not the column itself, but the word &#8220;Devices&#8221;. And all was clear.</p>

<div class='caption-wrapper left' style="width:px"><img class='' src='http://MattRogish.github.com/images/itunes/showbuttonofdoom.png' width='' height='' alt='What they did' title='What they did'><div class='caption-text'>What they did</div></div>


<p>Clicking &#8220;Show&#8221; revealed my iOS devices.</p>

<p>Wow.</p>

<div class='caption-wrapper right' style="width:236px"><img class='' src='http://MattRogish.github.com/images/itunes/clickme.png' width='236' height='78' alt='What they should have done' title='What they should have done'><div class='caption-text'>What they should have done</div></div>


<p> What terrible UX! The iOS devices live in an invisible panel with no visible
affordances to indicate that this panel exists. Is this really necessary?
Are there iOS fanatics out there with dozens of attached devices that need
the extra screen space granted by hiding the list? Even if so why not put those
little arrows like you see everywhere else in iOS (and Windows and websites)?</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Vagrant and veewee: A Repeatable Dev Project Setup]]></title>
    <link href="http://MattRogish.github.com/blog/2012/05/17/vagrant-a-repeatable-dev-project-setup/"/>
    <updated>2012-05-17T11:04:00-04:00</updated>
    <id>http://MattRogish.github.com/blog/2012/05/17/vagrant-a-repeatable-dev-project-setup</id>
    <content type="html"><![CDATA[<p>A few weeks ago I <a href="http://MattRogish.github.com/blog/2012/05/03/on-repeatable-dev-project-setup/">wrote a post</a>
lamenting the lack of standardized project bootstrapping. Several of the commenters
suggested <a href="http://vagrantup.com/">Vagrant</a>, so I have spent the last week or so
giving it a try.</p>

<p><img class="center" src="http://MattRogish.github.com/images/challenge_accepted.jpg"></p>

<p>Here is what&#8217;s awesome about Vagrant:</p>

<ul>
<li>Uses Chef or Puppet to add packages to a base VM</li>
<li>Easily maintain and rebuild VMs</li>
<li>Pretty straightforward install process on OS X, Linux, and Windows</li>
<li>Mounts your source project internally so you can work on your code in the VM</li>
</ul>


<p>Here&#8217;s what I don&#8217;t like about Vagrant:</p>

<ul>
<li>SSH&#8217;ing into the VM all the time is a pain</li>
<li>Creating your own box from scratch is a bit difficult</li>
<li>Working in a group/team environment is left up to you to figure out</li>
</ul>


<p>Enter: <a href="https://github.com/jedi4ever/veewee">veewee</a>. Veewee helps you build your
own vagrant boxen instead of using predefined boxes that come with Vagrant.
If you&#8217;re an untrusting person, as well you should be, you kinda want
to build your own VM from scratch.</p>

<p>Combined with something like Dropbox or a local server, you can easily set up
a group/team environment, build your own boxen, and then distribute them
to your teammates.</p>

<p>Once you have your base VirtualBox boxen defined, you can skip straight to
running the last step of loading the box into vagrant, of course, so this
is really only necessary if you want to define your own boxen.</p>

<p><img class="center" src="http://MattRogish.github.com/images/vagrant/boxen.jpg"></p>

<p>Here&#8217;s how I did it:</p>

<ol>
<li>Download and install <a href="https://www.virtualbox.org/wiki/Downloads">VirtualBox</a></li>
<li>Download and install <a href="http://vagrantup.com/docs/getting-started/index.html">Vagrant</a></li>
<li>Setup Dropbox and put my Ubuntu ISOs in a shared location</li>
<li>git clone git@github.com:FundingGates/fg_veewee_scripts.git</li>
<li>Run fg_veewee_scripts/setup.sh</li>
<li>Follow the <a href="https://github.com/jedi4ever/veewee/blob/master/doc/vagrant.md">instructions</a> to build a box</li>
<li>Note, the validation of veewee-validation nfs mount may fail; it appears to be a transient bug in VBox. It doesn&#8217;t appear NFS is at fault, so it seems you can safely ignore it.</li>
<li>Place the VirtualBox boxen in Dropbox (box box box).</li>
<li>Load the boxen into vagrant, run <code>vagrant up</code> in your project (check in a Vagrantfile to all your projects). The end!</li>
</ol>


<p>I created a <a href="https://github.com/FundingGates/fg_veewee_scripts">little shell script</a>
to help share the virtual box definitions within our team. You can see how the
shell script works for more information but basically I do two things:</p>

<ol>
<li>Pull down veewee</li>
<li>Symlink /definitions and /iso into veewee from shared locations</li>
</ol>


<p>Now that we&#8217;ve got a repeatable, sharable dev/vagrant setup, we can now
work on integrating it with all of our projects!</p>

<p><img class="center" src="http://MattRogish.github.com/images/great_success.jpg"></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[On a repeatable dev project setup]]></title>
    <link href="http://MattRogish.github.com/blog/2012/05/03/on-repeatable-dev-project-setup/"/>
    <updated>2012-05-03T10:19:00-04:00</updated>
    <id>http://MattRogish.github.com/blog/2012/05/03/on-repeatable-dev-project-setup</id>
    <content type="html"><![CDATA[<p>Last night I had the following exchange on Twitter:</p>

<p><img class="center" src="http://MattRogish.github.com/images/devsetup/devsetuptwitter.png"></p>

<p>Having just jumped on board to a newish Django project here at <a href="http://fundinggates.com">work</a>,
I feel their pain. Although I don&#8217;t know the Django ecosystem as well as Rails,
I do know that projects should contain a readme, and I shouldn&#8217;t have to:</p>

<ol>
<li>execute server runner</li>
<li>install missing lib or package that it complained about</li>
<li>goto: 1 until working</li>
</ol>


<p>Every development project, no matter how complex,
should have a repeatable, predictable (preferably scripted) new developer
project bootstrap.</p>

<p>Why?</p>

<ul>
<li>New developers can get their machine(s) setup and commit/deploy on the first day</li>
<li>Existing developers can easily upgrade to new machines without spending days getting it all setup again</li>
<li>Light-duty hackers (support folks) can have a copy of the site running locally (super awesome for debugging and general playing around)</li>
<li>Designers can tweak styling, implement new designs, etc. without needing to involve a developer</li>
<li>Spinning up throwaway testing/dev servers becomes very easy (you can treat them like a dev box)</li>
</ul>


<p>A repeatable, predictable project bootstrap should, minimally, consist of the following:</p>

<ul>
<li>A root-level README that explains exactly how to setup the project. This should
contain step-by-step tasks (start with <code>git clone ...</code>)</li>
<li>A script to install pre-requisites (likely one for OSX, Linux)</li>
<li>A script to bootstrap their data storage (build the structure, load default users, etc.)</li>
<li>A script to deploy to staging/production</li>
</ul>


<h4>Root level README</h4>

<p>This is your project&#8217;s bible. It&#8217;s in the project because web pages, wikis,
and spec docs all have a way of disappearing.</p>

<p>The README shouldn&#8217;t contain any marketing speak about the project. It also shouldn&#8217;t
contain any architectural documents, the history of the company, or anything
like that. It&#8217;s simply a list of steps that you need to perform to get the
app up and running on your machine, depending on your operating system.</p>

<p>This is the first thing a new person on the project will read. As part of a new
hire&#8217;s &#8220;orientation&#8221; you should create a task in your tracker to &#8220;Follow the README&#8221;.
Sometimes, but not often, some change may have invalidated the README. Part of
the new hire&#8217;s job will be to fix the process to reflect the new project state.</p>

<p>It should also be part of standard operating procedure to follow the README when setting
up a new developer machine (as old ones are swapped out) and any bugs
immediately addressed.</p>

<p>Like code comments, broken or out-of-date project bootstraps are worse than none at all.</p>

<p>The README should also include any relevant links to the project wiki, bug tracker,
project management, chat rooms, etc.</p>

<p>It <em>should</em> be opinionated - if you&#8217;re on ruby pick rvm or rbenv. If you&#8217;re
on Python/Django, have a virtual environment. OSX? Homebrew.</p>

<p>This is not a negotiation - some level of consistency and standardization is
a good thing. Don&#8217;t get carried away: let developers choose their own text editor,
browser, etc. but project-level standards are expected to be enforced.</p>

<p><img class="center" src="http://MattRogish.github.com/images/fullmetaljacket.jpg"></p>

<p>My README template is (loosely):</p>

<ul>
<li>External Links (wiki, bug tracker, chat)</li>
<li>Dev setup (assuming a fresh machine - so this may include installing git, homebrew)</li>
<li>External dependencies and versioning (if applicable)</li>
<li>Project conventions that deviate from the norm (if you use some weird test runner&#8230;)</li>
</ul>


<h4>Scripts</h4>

<p>Where at all possible - script script script! Yes, you could tell the developer the
series of commands to create a new user in the database (I&#8217;ve seen raw SQL insert
statements in a README before! Eeek!) but it&#8217;s far better to run ./setup_db.</p>

<p>Obviously a script introduces overhead but a good team, over time, instinctively
seems to find a good balance of scriptability vs. maintenance.</p>

<h4>Deployability</h4>

<p>A hallmark of a great engineering process/culture has new hires deploying on their
first day. This is only possible if the deploy process is scripted. The README should
say how to deploy to the various environment(s) and if there are any externalities to
resolve (ssh keys).</p>

<h5>Edit - May 4, 2012</h5>

<p>Some folks have suggested <a href="http://vagrantup.com/">Vagrant</a> + <a href="https://github.com/opscode/chef">Chef</a>
or <a href="https://github.com/puppetlabs">Puppet</a> as a solution to the problem. I haven&#8217;t
used it at all, but it certainly looks promising. I&#8217;d love to build a Puppet-based
config for my local machine (we use Puppet-based <a href="https://github.com/railsmachine/moonshine">Moonshine</a>
on our servers, so I&#8217;m not entirely sure why I didn&#8217;t think of it) and I suspect
that&#8217;s what I&#8217;ll try first.</p>

<p>My only hesitation is that I primarily use a MacBook Air and, although a perfectly
capable development machine, running Ubuntu on VMWare is intolerably slow. Benchmarking
is probably a task for another day.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Working too Much is Stupid]]></title>
    <link href="http://MattRogish.github.com/blog/2012/04/17/working-too-much-is-stupid/"/>
    <updated>2012-04-17T10:35:00-04:00</updated>
    <id>http://MattRogish.github.com/blog/2012/04/17/working-too-much-is-stupid</id>
    <content type="html"><![CDATA[<p>There is a big brouhaha because Facebook COO Sheryl Sandberg
&#8220;admits &#8230; walk[ing] out of this office every day at 5:30&#8221;.</p>

<p>Oh, the <a href="http://news.ycombinator.com/item?id=3852190">shock and horror</a>. <a href="http://news.ycombinator.com/item?id=3848760">The wailing and gnashing of teeth</a>.</p>

<p>Why is this news? Why do folks think that working gobs and gobs of hours, as
software developers, leads to better software, faster?</p>

<p>Sure, for something repetitive and methodological like bricklaying, you can
crank up the hours worked dial and see the wall getting built faster. And,
sure, there&#8217;ll be small bugs here and there (sloppiness as the worker gets
tired, etc.) but generally nothing that will materially affect the structural
integrity of the wall.</p>

<p><a href="http://www.alternet.org/visions/154518/why_we_have_to_go_back_to_a_40-hour_work_week_to_keep_our_sanity?page=entire">Not so in software development</a>, however. It&#8217;s been my experience that
productivity falls off a cliff not far after <a href="http://www.worklessparty.org/timework/ford.htm">40 hours a week</a>, and quickly
goes negative as developers start adding more bugs than features.</p>

<p>Pretty soon, however, the bugs are not small, easily cleaned up after ones,
but those that will cause you to go massively in debt. These kinds of wrong
architectural decisions when uncovered days/weeks/months later will bring
the whole project to a halt while the extent of the damage is estimated and
then repaired.</p>

<p>It kinda looks something like this (completely made up but feels approximately correct):</p>

<p><img class="center" src="http://MattRogish.github.com/images/productivity/productivity_cliff.png" title="Oops" ></p>

<p>That&#8217;s why one metric I have software developers track per week is whether
or not they feel they are on a sustainable pace. Hours are a reasonable
approximation of sustainable pace (e.g. on average, don&#8217;t work much more
than 40 hrs/week) but not sufficient. Frequent check-ins are crucial to establish
what &#8220;sustainable pace&#8221; means for each individual software developer.</p>

<p>Given that <a href="http://www.fundinggates.com/jobs">we</a> also follow the <a href="http://www.gorowe.com">&#8220;Results Only Work Environment&#8221;</a>
total number of hours worked doesn&#8217;t really mean anything anyway. With ROWE, you
work wherever you want, whenever you want. Every meeting is optional.</p>

<p>All that matters is:</p>

<ol>
<li>Are you getting your job done, awesomely?</li>
<li>Are you, individually, working at a sustainable pace?</li>
</ol>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Expense Reports Are Bullshit]]></title>
    <link href="http://MattRogish.github.com/blog/2012/04/16/expense-reports-are-bullshit/"/>
    <updated>2012-04-16T17:52:00-04:00</updated>
    <id>http://MattRogish.github.com/blog/2012/04/16/expense-reports-are-bullshit</id>
    <content type="html"><![CDATA[<h3>Or: Every Developer gets an Amex</h3>

<p>How often does this happen where you work:</p>

<ol>
<li>Developer begs, pleads with boss to go to technical conference</li>
<li>Boss negotiates with developer on getting a cheaper hotel. (It&#8217;s only $69 a night! Clean sheets optional. 30 minute bus ride from conference. What a steal!)</li>
<li>Boss orders developer to get cheaper, three stop flight instead of more expensive non-stop</li>
<li>Developer attends conference</li>
<li>Developer returns from conference with a pile of low value receipts ($20 for lunch, $40 for cab to airport)</li>
<li>Developer spends two hours painstakingly scanning each receipt and constructs a spreadsheet with itemized list of charges</li>
<li>Boss approves charges without even looking at them</li>
<li>goto 1</li>
</ol>


<p>How brain-dead is this? Here you have a highly-paid software developer doing super-low value data entry. It probably cost you $200 to have them enter all this junk.</p>

<p><img class="center" src="http://MattRogish.github.com/images/worffacepalm.gif"></p>

<p>What does this tell the developer?</p>

<ul>
<li>I don&#8217;t trust you</li>
<li>Scanning receipts is more valuable than writing awesome code</li>
<li>Your time is not particularly valuable</li>
<li>I don&#8217;t trust you</li>
</ul>


<p>Give the developer a corp Amex, ask them to be a responsible adult, and be done with it.
Have them forward receipts (where applicable) to a specific email address to satisfy potential
IRS complications. The end.</p>

<p>Anything else is over-optimization of a low-probability event
(being audited and needing to justify a latte at the airport).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Change will do me good]]></title>
    <link href="http://MattRogish.github.com/blog/2012/03/29/change-will-do-me-good/"/>
    <updated>2012-03-29T11:10:00-04:00</updated>
    <id>http://MattRogish.github.com/blog/2012/03/29/change-will-do-me-good</id>
    <content type="html"><![CDATA[<p>Today I start my first day at <a href="http://www.fundinggates.com">Funding Gates</a> as CTO. I’m extraordinarily excited to be working with an amazing leadership team, staff, investors, and advisors to massively disrupt the small business technology space.</p>

<p>Over the last couple of months of casual conversation over drinks and dinners, I’ve discovered the two co-founders, <a href="http://www.linkedin.com/pub/ismail-kursat-colak/14/b25/3a7">Ismail Colak</a> and <a href="http://www.linkedin.com/pub/jean-marc-freuler/5/405/15a">Jean-Marc Freuler</a>, share my passion for building insanely great products by hiring the smartest, best developers, treating them like rock stars, and then getting out of their way.</p>

<p>That also means I’ll be leaving <a href="http://www.toura.com">Toura</a>, a place I’ve called home for the past two years. I leave knowing we’ve built an amazing team, awesome products, and have made our dent in the world. I expect them to continue to do great things and wish them all the best.</p>

<p>P.S. <a href="http://fundinggates.com/jobs/">We’re hiring!</a> Looking for an amazing workplace that is run by folks that understand and value software developers? It’s my job to make Funding Gates the best place that you could ever work, and I hope you’ll check us out!</p>

<p>P.P.S I’ll be in Phoenix, AZ April 1-4 at JSConf, followed by RailsConf April 23-25 in Austin, TX. Come talk with me about software development, good beer, or anything else that comes to mind. I’m buying!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Open plan offices must die!]]></title>
    <link href="http://MattRogish.github.com/blog/2012/03/17/open-plan-offices-must-die/"/>
    <updated>2012-03-17T09:50:00-04:00</updated>
    <id>http://MattRogish.github.com/blog/2012/03/17/open-plan-offices-must-die</id>
    <content type="html"><![CDATA[<blockquote><p>&#8220;There are a million ways to lose a work day, but not even a single way to get one back.&#8221;</p><footer><strong>DeMarco &amp; Lister</strong> <cite>Peopleware</cite></footer></blockquote>




<blockquote><p>&#8220;How does a large software project get to be one year late? Answer: One day at a time!&#8221;</p><footer><strong>Brooks</strong> <cite>The Mythical Man-Month</cite></footer></blockquote>




<div class='caption-wrapper right' style="width:320px"><img class='' src='http://MattRogish.github.com/images/office_space/applestore.jpg' width='320' height='200' alt='Apple Store Upper West Side' title='Apple Store Upper West Side'><div class='caption-text'>Apple Store Upper West Side</div></div>


<p>It&#8217;s trendy right now to produce office space that looks like an Apple store. Bright,
airy, cheerful, lots of open space, big ceilings, blonde wood, attractive and friendly
employees. I can&#8217;t blame the urge - I love seeing the latest architectural masterpieces
the geniuses at Apple routinely cook up. Living in New York I have the opportunity
of being a short hop away from no less than five of them.</p>

<p>Apple retail stores invoke the sprits of great cathedrals of the 14th century
or some vast ancient library. If you&#8217;ve ever stepped foot into one, however,
the library or cathedral-like comparison vanishes into the cacophony of hundreds of
conversations, various iTunes-sponsored music clips, and the ringing of countless
iPhones. Often when I walk into one of these stores I&#8217;ll put on my noise-isolating
earbuds - not to listen to music, but to act as earplugs.</p>

<p>So why is it that companies - small and large, startup and established player -
continually take high-pay, high-skilled, super-smart programmers and cram them into
giant rooms full of noise and distraction?<sup id='fnref:9'><a href='#fn:9' rel='footnote'>9</a></sup></p>

<p>Examples are everywhere:
<a href="http://www.businessinsider.com/appnexus-office-tour#the-appnexus-floor-is-huge-but-were-told-the-company-has-already-outgrown-it-and-is-hunting-for-a-new-space-12">AppNexus</a> - <a href="http://companies.thedailymuse.com/klout/office">Klout</a> - <a href="http://companies.thedailymuse.com/kiva/office">Kiva</a> - <a href="http://companies.thedailymuse.com/zerocater/office">ZeroCater</a> - <a href="http://companies.thedailymuse.com/justintv/office">JustinTV</a> - <a href="http://www.publicstuff.com/about">PublicStuff</a></p>

<p>Things you&#8217;ll notice in virtually all of these include: <a href="http://www.youtube.com/watch?v=0N05WL2NlLo">folks talking on phones</a>,
people listening to headphones, small groups standing and talking, and the deafening
sound of thousands of dollars of productivity being sucked out of the room.</p>

<p>Go to any of these offices and ask each programmer: how often are you distracted?
Do you ever find yourself drawn into conversations that you aren&#8217;t a part of?</p>

<p>I interviewed at a company that had a giant office (imagine a hundred folks in one room)
and one of their engineers proudly said: &#8220;We have a generous work from home policy.
I love it because I can never get any work done around here!&#8221;
<img class="center" src="http://MattRogish.github.com/images/facepalm.jpg"></p>

<h4>Flow</h4>

<p>Programmers work in a state of &#8220;flow&#8221;<sup id='fnref:1'><a href='#fn:1' rel='footnote'>1</a></sup> - it takes a tremendous amount
of mental wrangling to page in to memory all the data required to comprehend the micro
<em>and</em> the macro of software systems. Recalling the object hierarchy, database
schema, or GUI architecture for a complex system is akin to building a house of
cards. One slight bump and the whole thing comes tumbling down.</p>

<p>Some estimates have suggested it takes 15-30 minutes or more<sup id='fnref:2'><a href='#fn:2' rel='footnote'>2</a></sup> to
get in the zone<sup id='fnref:3'><a href='#fn:3' rel='footnote'>3</a></sup>. What is less-known is how long it takes to re-start
flow once you&#8217;re knocked out. Given an average NYC fully-loaded salary, a simple
email &#8220;Ding!&#8221; or an answer to a &#8220;quick question&#8221; could cost a company $50.</p>

<p>Of course, it is too simplistic a measure and vastly
underestimates the true cost of distraction<sup id='fnref:4'><a href='#fn:4' rel='footnote'>4</a></sup>; many larger features
or architectural decision-making requires continual effort to maintain progress.
A few interruptions strategically placed through the course of a day could
make a four-hour task take two days.</p>

<p>Sure, large companies are so full of inefficiencies and waste that the lack of agility
won&#8217;t hurt them. But startups? If your programmers are less efficient
than the competition that could mean you launch months late. That you can&#8217;t iterate
as quickly as you need. And that next amazing idea - that idea that fundamentally
transforms your company and changes the world - simply doesn&#8217;t have the time
and focus to exist. It&#8217;s lost in the noise.</p>

<h4>Solutions</h4>

<p>The evidence is pretty clear that massive open-plan offices where the entire office
is colocated are terrible interruptors of programmers<sup id='fnref:8'><a href='#fn:8' rel='footnote'>8</a></sup>. At the the
other extreme we can place programmers in private offices (with a door that
actually closes!) to keep them isolated from the noise and movement of the office.</p>

<p>DeMarco and Lister, via Peopleware<sup id='fnref:7'><a href='#fn:7' rel='footnote'>7</a></sup>, argue for private offices for
each developer because most software development is done in isolation.</p>

<div class='caption-wrapper right' style="width:432px"><img class='' src='http://alkimie.com/wp-content/uploads/2010/12/agile-east-offices1.jpg' width='432' height='259' alt='Communal Workshop' title='Communal Workshop'><div class='caption-text'>Communal Workshop</div></div>


<p>&#8220;Agile&#8221; methodology, on the other hand, states that communication is the most
important factor and that private offices destroy communication<sup id='fnref:12'><a href='#fn:12' rel='footnote'>12</a></sup>.
Oram and Wilson, via &#8220;Making Software: What Really Works and Why We Believe It&#8221; argue
very strongly that the Communal Workshop (smaller units of open-plan with,
say, six or seven programmers in their own room) layout is the most efficient for teams
that require lots of collaboration and have loose requirements.[Oram and Wilson, pg. 346]<sup id='fnref:12'><a href='#fn:12' rel='footnote'>12</a></sup></p>

<p>As a counterpoint, Joel Spolsky suggests that communication isn&#8217;t harmed via
private offices.<sup id='fnref:10'><a href='#fn:10' rel='footnote'>10</a></sup> <sup id='fnref:11'><a href='#fn:11' rel='footnote'>11</a></sup></p>

<p>There are valid points to each solution but I&#8217;m not aware of any hard data that
can conclusively determine the &#8220;victor&#8221;, if there is such a thing.</p>

<p>Regardless of the layout, here are some rules that must be enforced:</p>

<h5>Create a quiet workplace free of unnecessary distractions</h5>

<p>Some distractions, like going to lunch or pair programming, are necessary. Most
distractions, like ringing cell phones, conversations not involving the team,
eating lunch, and playing music are unnecessary and disruptive.<sup id='fnref:5'><a href='#fn:5' rel='footnote'>5</a></sup></p>

<h5>Keep ambient noise to a minimum</h5>

<p>At our office, we have a shared space where the developers work and everyone else
is in a separate location. We treat the programmer space as we would a library.
No irrelevant conversations<sup id='fnref:6'><a href='#fn:6' rel='footnote'>6</a></sup>, don&#8217;t bother anyone, stick to IM and IRC whenever
possible. Meetings either are team-wide (standups), so can take place in the
shared space, or individual, and are taken out of the room.</p>

<h5>Leverage Technology</h5>

<p>We use group chat with logging, private instant messaging, wikis, blogs, etc.
to keep general chit-chat down. The side effect, too, is that two programmers
can have a discussion in a chat room and any passive bystander can chime in
if they feel like. If they&#8217;re busy or not in the office, they should browse
the chat log upon returning to work. As they catch up, they can re-engage
the other programmers if they choose.</p>

<h5>No meetings</h5>

<p>The more meetings a programmer has the less time they have to work. We only
have one meeting, our daily standup - everything else is ad hoc and optional.</p>

<h4>Conclusion</h4>

<p>With a little bit of time, thought, and effort, we can have office space that is
much more enjoyable, productive, and focused on programmer happiness.</p>

<p><img class="center" src="http://MattRogish.github.com/images/office_space/happiness.jpg" width="300" height="300"></p>

<h6>Footnotes</h6>

<div class="footnotes">
    <ol>
        <li id='fn:1'><a href="http://www.devx.com/DevX/Article/11659">Psychology of Programmers</a> <a href='#fnref:1' rev='footnote'>↩</a></li><li id='fn:2'><a href="http://www.joelonsoftware.com/articles/fog0000000043.html">The Joel Test</a> <a href='#fnref:2' rev='footnote'>↩</a></li><li id='fn:3'><a href="http://programmers.stackexchange.com/questions/20542/how-do-you-get-into-the-zone-how-long-does-it-take-what-steps-do-you-take-befo">How do you get in the zone?</a> <a href='#fnref:3' rev='footnote'>↩</a></li><li id='fn:4'><a href="http://www.amazon.com/Distracted-Erosion-Attention-Coming-Dark/dp/1591026237">Distracted: The Erosion of Attention and the Coming Dark Age</a> <a href='#fnref:4' rev='footnote'>↩</a></li><li id='fn:5'><a href="http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2669750/">Coherence of the Irrelevant-Sound Effect: Individual Profiles of Short-term Memory and Susceptibility to Task-Irrelevant Materials</a> <a href='#fnref:5' rev='footnote'>↩</a></li><li id='fn:6'><a href="http://chatterblocker.com/whitepapers/conversational_distraction.html">Coping with Speech Noise in the Modern Workplace</a> <a href='#fnref:6' rev='footnote'>↩</a></li><li id='fn:7'><a href="http://www.amazon.com/Peopleware-Productive-Projects-Teams-Second/dp/0932633439">Peopleware - Productive Projects and Teams</a> <a href='#fnref:7' rev='footnote'>↩</a></li><li id='fn:8'><a href="http://www.sciencedaily.com/releases/2001/01/010125080258.htm">Even Low-Level Office Noise Can Increase Health Risks And Lower Task Motivation For Workers, Cornell Researchers Find</a> <a href='#fnref:8' rev='footnote'>↩</a></li><li id='fn:9'><a href="http://agiletracksoftware.com/blog.html?id=7">Software Developer Office Space</a> <a href='#fnref:9' rev='footnote'>↩</a></li><li id='fn:10'><a href="http://www.joelonsoftware.com/items/2006/07/30.html">Private Offices Redux</a> <a href='#fnref:10' rev='footnote'>↩</a></li><li id='fn:11'><a href="http://www.joelonsoftware.com/articles/FieldGuidetoDevelopers.html">Field Guide to Developers</a> <a href='#fnref:11' rev='footnote'>↩</a></li><li id='fn:12'><a href="http://c2.com/cgi/wiki?CaveAndCommons">Cave and Commons</a> <a href='#fnref:12' rev='footnote'>↩</a></li><li id='fn:13'><a href="http://www.amazon.com/Making-Software-Really-Works-Believe/dp/0596808321">Making Software: What Really Works, and Why We Believe It</a> <a href='#fnref:13' rev='footnote'>↩</a></li>
    </ol>
</div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Hello world!]]></title>
    <link href="http://MattRogish.github.com/blog/2012/02/20/hello-world/"/>
    <updated>2012-02-20T15:05:00-05:00</updated>
    <id>http://MattRogish.github.com/blog/2012/02/20/hello-world</id>
    <content type="html"><![CDATA[<p>My first blog entry. Isn&#8217;t it so cute? I&#8217;ll skip the awkward &#8220;hello, world!&#8221;
and get into the basics of what I&#8217;d like to do here:</p>

<ul>
<li>Discuss ways to build better software</li>
<li>How to hire, retain, and keep awesome software developers happy</li>
<li>General this-and-that interests me</li>
</ul>

]]></content>
  </entry>
  
</feed>
