<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>apocryph.org &#187; software engineering</title>
	<atom:link href="http://apocryph.org/tag/software-engineering/feed/" rel="self" type="application/rss+xml" />
	<link>http://apocryph.org</link>
	<description>Notes to my future self</description>
	<lastBuildDate>Mon, 09 Aug 2010 16:59:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Software Anarchy</title>
		<link>http://apocryph.org/2007/08/07/software_anarchy/</link>
		<comments>http://apocryph.org/2007/08/07/software_anarchy/#comments</comments>
		<pubDate>Tue, 07 Aug 2007 17:14:00 +0000</pubDate>
		<dc:creator>anelson</dc:creator>
				<category><![CDATA[Migrated from Drupal]]></category>
		<category><![CDATA[anarchy]]></category>
		<category><![CDATA[politics]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://apocryph.org/?p=444</guid>
		<description><![CDATA[As anyone who knows me at all can tell you, I have evolved a fairly libertarian political ideology, which is in many ways quite different than the conservative ideology I growing up. One of the major influences on my libertarian, laissez fair philosophy was not Friedman or Hayek or even Rand, but rather my experiences [...]]]></description>
			<content:encoded><![CDATA[<p>As anyone who knows me at all can tell you, I have evolved a fairly libertarian political ideology, which is in many ways quite different than the conservative ideology I growing up.  One of the major influences on my libertarian, <em>laissez fair</em> philosophy was not Friedman or Hayek or even Rand, but rather my experiences as a software engineer.</p>
<p>When I first started writing code in the early 90&#8242;s, the software industry was in one of its constant phases of reinvention.  At that time, the game changers were object oriented programming (OOP), and (to a lesser extent) what we now call model-driven development (MDD).  OOP is just a fancy way of describing programming languages that let programmers model their software systems in terms of objects like Person, Employee, Customer, Order, etc, instead of the somewhat less expressive languages of the past which focused on procedure and algorithm over entity.  MDD is just a set of agreed-upon graphical notations for describing various aspects of a software system.</p>
<p>Anyway, the emphasis among professional developers at that time was on a highly structured, phased approach to building software.  The first phase involved talking to customers and other stakeholders to determine what the system should do (the so-called &#8216;requirements gathering&#8217; phase).  Next came the design phase, when architects (who may or may not have actually written code, but almost certainly were assholes) would write documents and build graphical models of the solution as they envisioned it based on the requirements documents.  During the development phase, programmers (who may or may not have been involved in the design phase) implemented the spec from the architects.  In the testing phase (which may or may not involve any actual users), testers tested the software to see that it implemented the requirements correctly, and developers fixed any bugs the testers found.  After that came deployment, when admins rolled out the software to actual users, who in all likelihood would be seeing the new system for the first time at that point and would hate it.  Last the project ends in maintenance mode, where all the requirements analysts, architects, developers and testers with any ambition or skill had long-since left the project leaving only the dregs and those without knowledge of the system to keep it running.</p>
<p>As a kid learning to write software, I didn&#8217;t know enough to question this model, but as I grew more experienced I begin to find it woefully inadequate.  Requirements analysts cannot hope to capture all the details of the system as the user representatives articulate them.  User reps cannot hope to think clearly and far enough ahead to articulate all their needs unambiguously to the analysts.  Inevitably corner-cases or users with odd needs will be left out of the discussion.  Architects are not likely to build a system that can accommodate these unspoken needs, and often struggle just to implement the requirements as given.  Developers have trouble keeping faithful to the design, particularly when the design doesn&#8217;t anticipate a conflict or gotcha, or is based on the world within the architect&#8217;s reality distortion field.  Testers can&#8217;t understand the requirements from the user&#8217;s perspective, so they inevitably end up dutifully conforming to the letter of the requirements docs.  Admins won&#8217;t know the system and may have knowledge of the deployment environment that would&#8217;ve been handy back in the design phase.  Maintenance is shit-work nobody wants to do, so it&#8217;s often done poorly.  Fred Glass articulates this much more clearly in his book, <em>Facts and Fallacies of Software Development</em>, but now I digress.</p>
<p>I&#8217;ve come to see this as but one of many examples in nature and human activity wherein complex, ordered, top-down systems fail to scale.  Anyone who&#8217;s hit a particularly annoying deficiency in Windows or Visual Studio knows what I&#8217;m talking about.  Whatever underlying phenomenon causes complexity to explode and exceed the ability of host organizations to understand it has the same influence on markets and societies as it does on software.</p>
<p>By contrast, the growing success of the Agile movement, which focuses on small groups, tight integration with the customer, and frequent, short iterations of the requirements/design/develop/test/deploy cycle over the life of the project, demonstrates the opposite approach to software, somewhat akin to <em>laissez fair</em> economic policy: small groups of motivated actors converging on a right answer iteratively, constantly responding to inevitable changes that couldn&#8217;t be foreseen at the outset of the project and thus are not.  I&#8217;m of course horribly simplifying agile methods, but that&#8217;s the general idea.</p>
<p>One of the most striking features of agile teams that is hard to accept if you&#8217;re more comfortable with the top-down rigor of heavy process is the almost casual approach to possible changes.  Since each iteration is short, and there&#8217;s a tight feedback loop from end-users to developers, agile teams don&#8217;t waste time trying to cover all their bases, design for possible future contingencies, or building elaborate frameworks to accommodate every imaginable need, because they know they can respond _if_ any of those things come up much more effectively at the time they face those issues, and thus don&#8217;t dwell on them from afar.</p>
<p>When I read <a href="http://www.cato-unbound.org/2007/08/06/peter-t-leeson/anarchy-unbound-or-why-self-governance-works-better-than-you-think/">this from paper Cato about spontaneous order arising from anarchy</a>, I immediately thought of agile methods.  Some of the same emergent behaviors appear in the resulting software, just as they do in human societies.  It&#8217;s yet another example where &#8216;common sense&#8217; is actually wrong.</p>
]]></content:encoded>
			<wfw:commentRss>http://apocryph.org/2007/08/07/software_anarchy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A developer skill continuum courtesy Bill</title>
		<link>http://apocryph.org/2005/11/13/a_developer_skill_continuum_courtesy_bill/</link>
		<comments>http://apocryph.org/2005/11/13/a_developer_skill_continuum_courtesy_bill/#comments</comments>
		<pubDate>Sun, 13 Nov 2005 20:35:21 +0000</pubDate>
		<dc:creator>anelson</dc:creator>
				<category><![CDATA[Migrated from Drupal]]></category>
		<category><![CDATA[epiphany]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://apocryph.org/?p=52</guid>
		<description><![CDATA[My co-worker and boss, Bill, posted a concise, insightful article on the skill continuum of IT developers. I worked on the same project with him for a couple years, and feel like we&#8217;ve both explored pretty much the entire range of the spectrum. A further wrinkle in the IT development experience (as in all multi-human [...]]]></description>
			<content:encoded><![CDATA[<p>My co-worker and boss, <a href="http://fecund.org/bd/blog/">Bill</a>, posted a concise, insightful article on the <a href="http://www.fecund.org/bd/blog/?p=18">skill continuum of IT developers</a>.  I worked on the same project with him for a couple years, and feel like we&#8217;ve both explored pretty much the entire range of the spectrum.</p>
<p>A further wrinkle in the IT development experience (as in all multi-human activities) is along an orthogonal axis in humanspace: personality.  Sometimes the &#8216;detrimenal&#8217; and &#8216;useless&#8217; devs are sociable, pleasant, likable as people, perhaps even ingratiating.  Similarly, the &#8216;good&#8217; and &#8216;heoric&#8217; devs are occassionally insufferable assholes, or more likely emotionally stunted borderline-autistic introverts (like, uh, me).  I personally have fired a borderline plugger/good developer due to a toxic personality, and I&#8217;ve knowm a couple pluggers who really needed firing, but were such decent people that the economically obvious termination decision was not so clearcut.</p>
<p>For those on the top of the pile, working with the mainstream masses can be quite trying at times, as Bill relates.  I suspect this is a problem at even the most elite of organizations; even with an elite population, some are more elite than others.  The answer is clear, and I&#8217;ve known it all along: humans are not worth the hassle.</p>
]]></content:encoded>
			<wfw:commentRss>http://apocryph.org/2005/11/13/a_developer_skill_continuum_courtesy_bill/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Custom Enterprise Development Different From Commercial Software?</title>
		<link>http://apocryph.org/2005/10/21/custom_enterprise_development_different_from_commercial_software/</link>
		<comments>http://apocryph.org/2005/10/21/custom_enterprise_development_different_from_commercial_software/#comments</comments>
		<pubDate>Fri, 21 Oct 2005 20:27:13 +0000</pubDate>
		<dc:creator>anelson</dc:creator>
				<category><![CDATA[Migrated from Drupal]]></category>
		<category><![CDATA[eiphany]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://apocryph.org/?p=21</guid>
		<description><![CDATA[During a conversation with a colleague at BearingPoint, something occurred to me which I expect is already well-understood by most of my peers: the practice of custom enterprise software development is qualitatively different than developing commercial software. By that I don&#8217;t just mean the customers are different, or the resultant tools do different things, but [...]]]></description>
			<content:encoded><![CDATA[<p>During a conversation with a colleague at <a href="http://www.bearingpoint.com/">BearingPoint</a>, something occurred to me which I expect is already well-understood by most of my peers: the practice of custom enterprise software development is qualitatively different than developing commercial software.  By that I don&#8217;t just mean the customers are different, or the resultant tools do different things, but the risks, challenges, and economics differ substantially.  In particular, the workforce quality economics are significantly different.</p>
<p>I had this article in my unpublished queue for a couple weeks, and have only now come back to it.  I read Bill&#8217;s piece on the <a href="http://www.fecund.org/bd/blog/?p=18">development skills continuum</a>, which reminded me of the epiphany I describe in this post.</p>
<p>One of Bill&#8217;s assertions is:</p>
<blockquote><p>
    a successful company could be formed merely by avoiding the above groups [mediocre devs] and only allowing in good developers (or better)
</p></blockquote>
<p>I have long held this opinion as well.  However, my work on federal government IT projects at BearingPoint has brought about an epiphany of sorts, which leads me to question this belief.</p>
<p>I acknowledge that an operating system, a search engine, even an office productivity suite or a web browser, cannot be reliably and efficiently developed by the mediocre half of Bill&#8217;s skill continuum, the &#8216;detrimenal&#8217; and &#8216;useless&#8217; classes.  The nature of the work is substantively a technical challenge, which must be met by technically competent people (&#8216;pluggers&#8217; at minimum, with at least some &#8216;good&#8217; or &#8216;heroic&#8217; devs thrown in for force multiplication).</p>
<p>However, the custom IT development work which I&#8217;ve been engaged in for the last couple of years it unlike operating system development, search engine development, or productivity suite development.  The technologies are usually well-understood, the specifications seldom present significant technical challenges, and the quality of the resulting system is less important (although not totally irrelevant; an ususable system might still be refused).</p>
<p>My conclusion after working on a typical IT project with a team that spans almost the entire skill continuum (I don&#8217;t think we had any heroes) is that &#8216;good&#8217; developers can do work alot faster and much better than &#8216;pluggers&#8217;, as would be expected.  However, given strong manager and a realistic schedule (that is, one that reflects the weakness of one&#8217;s team), pluggers are only slightly less likely to product an acceptable system.</p>
<p>I attribute this conclusion (albeit empirical and qualitative) to a few observations:</p>
<ul>
<li>The clients for whom these IT projects are performed usually lack the sophistication required to discern between &#8216;plugger&#8217; and &#8216;good&#8217; work products.  While I suspect a client might favor the work of a &#8216;good&#8217; team when compared side-by-side with the &#8216;plugger&#8217; output, the client is nonetheless unlikely to refuse the &#8216;plugger&#8217; deliverable because the code stinks, test coverage is practically negative, and it takes two days to set up a machine capable of building it (quality issues may drag down the &#8216;plugger&#8217; deliverable, but you&#8217;d be amazed at the high shit tolerance in large IT projects).</li>
<li>Non-technical risks dominate the technical ones, reducing net project impact a &#8216;good&#8217; dev can make.  Wishful schedules, missing, ambiguous, and constantly changing requirements, client-side political wrangling, and dependencies on other teams present significant risks which even a &#8216;heroic&#8217; dev would be hard-pressed to eliminate.</li>
<li>IT and large consulting firms tend to be staffed by &#8216;plugger&#8217;s and &#8216;useless&#8217; devs (not surprising considering the likely statistical distribution of tech skills among likely candidates).  Thus, their culture and processes are designed for (and probably by) such skill groups.  This further impairs the ability of &#8216;good&#8217; and &#8216;heroic&#8217; devs to leverage their superior abilities.  This can manifest in a number of ways, such as:</li>
<li>Inadequate equipment and tools, selected by PHBs, bean-counters, and cable monkeys</li>
<li>Minimal incentive and stimulation to achieve</li>
<li>Work assignments typically lacking the challenge which intelligent minds require for stimulation and maximal performance</li>
<li>The client environment is frequently plagued by &#8216;bullshit&#8217; constraints, which cause frustration, disillusionment, and cynicism among technical minds inclined to roam a bit more freely</li>
</ul>
<p>All that said, I&#8217;ve spent alot of my career in commercial software development, and I can&#8217;t say any of the above factors are completely absent.  I do feel, however, that they are less pronounced, and the economic value of the technical endeavor is higher, leading to a higher probability that a &#8216;good&#8217; or &#8216;heroic&#8217; dev is the difference between likely success and likely failure.</p>
<p>I wonder what it&#8217;s like to work at Google&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://apocryph.org/2005/10/21/custom_enterprise_development_different_from_commercial_software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
