<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Reflections on Software Engineering</title>
	
	<link>http://neverletdown.net</link>
	<description>by Michael Keeling</description>
	<lastBuildDate>Fri, 16 Jul 2010 04:37:34 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/neverletdown" /><feedburner:info uri="neverletdown" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>neverletdown</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Improvisational Architecture</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/nl-S8iV5uu0/</link>
		<comments>http://neverletdown.net/2010/07/improvisational-architecture/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 04:30:14 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Agile Development]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Big Design Up Front]]></category>
		<category><![CDATA[emergent design]]></category>
		<category><![CDATA[improvisation]]></category>
		<category><![CDATA[jazz]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[xp2010]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=370</guid>
		<description><![CDATA[If you were to go to two improvisational jazz performances, even two concerts by the same band, you&#8217;d hear different music at each show.  The thrill of experiencing something unique, as it is created, without any kind of real plan or rehearsal, is both exciting and entertaining.  Sometimes the music is so spectacular [...]]]></description>
			<content:encoded><![CDATA[<p>If you were to go to two improvisational jazz performances, even two concerts by the same band, you&#8217;d hear different music at each show.  The thrill of experiencing something unique, as it is created, without any kind of real plan or rehearsal, is both exciting and entertaining.  Sometimes the music is so spectacular you feel like you&#8217;re witnessing a miracle.  Other times the group can&#8217;t seem to get it together and the show is one long, painful indulgence in artistic expression.  No matter the outcome, what you hear during that performance will never be experienced again.</p>
<p>Music has always served as a great metaphor for thinking about software development.  At XP2010 during one of the most original key notes I&#8217;ve ever seen, <a title="Wikipedia Entry about Bjørn Alterhaug" href="http://no.wikipedia.org/wiki/Bj%C3%B8rn_Alterhaug">Bjørn Halterhaug</a> and <a title="Wikipedia article about John Pål Inderberg" href="http://en.wikipedia.org/wiki/John_P%C3%A5l_Inderberg">John Pål Inderberg</a>, professors of musicology and improvisation respectively, from the University of Technology and Science in Trondheim, Norway and both veteran jazz musicians, discussed, through music and words how they approach improvisational jazz, the mechanics for making it work, and the general implications on collaboration among artists.  It&#8217;s tempting to romanticize improvisational jazz as a truly spontaneous creation but this isn&#8217;t exactly how it works in reality.  For any improvisational jazz band to be successful <a title="The seven characteristics of jazz improvisation." href="http://hhgttg.de/blog/?p=85">its members must exhibit seven key characteristics</a>.</p>
<ol>
<li>Provocative Competence Interrupting Habit Patterns</li>
<li>Embracing Errors as a Source of Learning</li>
<li>Minimum Structures that allow Maximum Flexibility</li>
<li>Distributed Task: Continual Negotiation toward Dynamic Synchronisation</li>
<li>Reliance of Retrospective Sense Making as Form</li>
<li>Hanging out: Membership in Communities of Practice</li>
<li>Alternating between Soloing and Supporting</li>
</ol>
<p>I propose that these seven characteristics apply directly to how teams who espouse emergent design should approach software architecture.</p>
<p><a href="http://www2.imm.dtu.dk/~hub/"><img src="http://neverletdown.net/images/jazz-xp2010-keynote.jpg" alt="XP2010 Keynote: Bjørn Alterhaug and John Pål Inderberg improvising jazz music on stage." /></a></p>
<h4>Music and Design</h4>
<p>Experienced musicians have an attenuated ear which enables them to hear music in ways that novices can&#8217;t.  Drawing on a well-developed playbook of clichés, an expert in the standup bass for example can not only follow the minimally, well-defined structure of a song but also weave pleasing bass licks into the musical ramblings of his band mates, adjusting his actions based on the paths his band mates choose with appropriate responsiveness as the song develops.  Part of it is musical maturity, a taste or style developed over years of playing, part of it is also trust both in himself as a musician but also in the rest of the group, that they too will not overreact to mistakes and are also able to follow a musical flow as it develops.</p>
<p>Well-defined but minimalist structure.  Contrast this with the music played by a symphony which is also well-defined but has explicit and detailed structure.</p>
<p>When I hear this I immediately think of architecture as seen through the lens of agile software processes which advocate strongly for emergent design.  <strong>Agile software development processes and agile culture in general strongly encourages teams to become improvisational architects.</strong> Create a minimalist, well-defined design of the system and then allow the developers to evolve the system, creating the design as they develop, playing off the code written by their fellow teammates as the system emerges.  The romantic view of this is appealing to some: &#8220;Let&#8217;s go have a code jammin&#8217; session, you dig?&#8221;  But the results of an emergent design can be just as varied as improvisational jazz bands; some designs are elegant and spectacular successes, some designs are flaming piles of disaster, most turn out somewhere in between &#8211; usually good enough for customers who aren&#8217;t paying too much and who expected a somewhat unpredictable but functionally adequate outcome.</p>
<p>So if you enjoy the thrill of experiencing once-in-a-lifetime moments of creation, the outcome of which can never be predicted or known ahead of time, then emergent design is probably right up your alley.  As demonstrated by the near exclusive emphasis on code and shipping, many agile developers fancy themselves as code jammin&#8217;, improvisational architects.</p>
<p>The exact opposite of emergent design, of course, is the easy to hate (and rightly so) enemy of creating things that actually work, Big Design Up Front, where a heavy cost is levied against a project in the beginning without producing any usable code whatsoever.  Sticking with the music metaphor, the well-defined, explicit, and detailed structures of a symphony might take a composer months or even years to create.  But in exchange for this planning you get a piece of music that is guaranteed to be executed (for all intents and purposes) in a nearly identical way in every performance in which it is played.  I am not saying you should use a Big Design Up Front approach, in reality, even Mozart tried out music and made incremental deliveries to his sponsors as he wrote.</p>
<p>While certainly a degree of improvisation happens when we develop software, customers paying for software usually expect more predictability in the outcome.  So, while it might be ok to spend 30 bucks for a fun first date with a girl at a jazz club &#8211; if only for the experience of it &#8211; when I pay 100 bucks a ticket to see the symphony play Mozarts&#8217;s Requiem, I would be more than a little disappointed, angry, and confused if the first chair violinist &#8220;felt a groove&#8221; in the middle of the second movement and began jamming.  The greater the cost of a project, the more highly valued predictability in it will be.</p>
<h4>Who can be an Improvisational Architect?</h4>
<p>Mozart was a true genius, a master of composition.  To play Mozart, you need to be well practiced but you don&#8217;t need to have his level of genius.  On the other hand, most members of a great improvisational jazz group must be experienced musicians &#8211; experienced in composition as well as technical playing ability.  Even then, a great group will usually avoid disaster but occasionally it will still happen because of the nature of improvisation.</p>
<p>In my experience, teams that plan to allow their designs to emerge do an ok job of providing the minimal structure that is essential for evolving a design.  But only a few developers have the necessary experience and background to truly improvise a design.  The implication?  <strong>Most teams are terrible at improvising architecture because they have neither a solid enough understanding of the core fundamentals for software architecture nor the experience with using architectural design to reason about a system.</strong></p>
<p>I believe that most of the seven characteristics of improvisation are deeply ingrained in agile culture, but agile teams often fail to fully embrace all seven characteristics of improvisation when designing a software system.  A team without the experience, who doesn&#8217;t understand design cliché&#8217;s (architectural styles and patterns) will have an unpredictable outcome when allowing the design of a system to emerge as the system is developed.  <strong>This is something the agile community must work to resolve.</strong></p>
<h4>Bonus</h4>
<p><a href="http://blog.coryfoy.com/">Cory Foy</a> was thinking ahead and had the foresight to record video of the performance/keynote.  It comes in 6 parts.</p>
<ul>
<li><a href="http://vimeo.com/12261921">Part 1 &#8211; introduction number</a></li>
<li><a href="http://vimeo.com/12261626">Part 2 &#8211; introduction to improvisational jazz, link to XP, perspectives and group dynamic, a glimpse of how they teach jazz and improvisation</a></li>
<li><a href="http://vimeo.com/12261727">Part 3 &#8211; Second number, application of theory discussed in part 2</a></li>
<li><a href="http://vimeo.com/12261664">Part 4 &#8211; Beginning to introduce the idea of minimalist structures, awesome body percussion number</a></li>
<li><a href="http://vimeo.com/12261822">Part 5 &#8211; communication, the seven characteristics of improvisational jazz, demonstration of &#8220;minimal structure for maximum flexibility&#8221;</a></li>
<li><a href="http://vimeo.com/12260590">Part 6 &#8211; closing remarks and the final number</a></li>
</ul>
<p>Ingvald Skaug was also inspired by this talk and wrote <a href="http://skaug.no/ingvald/2010/06/kanban-agile-jazz.html">an interesting essay which explains kanban as agile jazz</a>.  Check it out for a process perspective on the idea of &#8220;minimal structure for maximum flexibility.&#8221;  If you believe <a href="http://en.wikipedia.org/wiki/Conway's_Law">Conway&#8217;s Law</a>, then it isn&#8217;t coincidence that we would apply the characteristics of improvisation in jazz to both process and design.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/nl-S8iV5uu0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2010/07/improvisational-architecture/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2010/07/improvisational-architecture/</feedburner:origLink></item>
		<item>
		<title>Hacking is not a Dirty Word</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/uSMjiYTTqQ0/</link>
		<comments>http://neverletdown.net/2010/07/hacking-is-not-a-dirty-word/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 03:21:42 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Agile Development]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[action research]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[myth busting]]></category>
		<category><![CDATA[process improvement]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[technical debt]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=358</guid>
		<description><![CDATA[I used to think hacking was bad.  It was something you did when you didn’t have a plan, when you didn’t know what you were doing; it’s what amateurs do, noodling around the code without clear direction or intent.  Or it was something you did, quick and dirty, just to get something out [...]]]></description>
			<content:encoded><![CDATA[<p>I used to think hacking was bad.  It was something you did when you didn’t have a plan, when you didn’t know what you were doing; it’s what amateurs do, noodling around the code without clear direction or intent.  Or it was something you did, quick and dirty, just to get something out the door.  Hacking is the best, surefire way to waste time and create mountains of unmaintainable code you’ll have to rewrite anyway.  I&#8217;ve always struggled with this since I feel so drawn to hacking culture &#8211; DIY, playing with things just to see how they work, ignoring the instruction manual, reveling in the aesthetic of a job well done, making what you can within limited constraints &#8211; and <a href="http://www.amazon.com/gp/product/1449388396?ie=UTF8&amp;tag=nevletdowdotn-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1449388396">many of the brightest minds in software development speak quite passionately about the merits of hacking</a>.</p>
<p>Thinking about this for a while, I&#8217;ve come to the conclusion that there’s nothing wrong with hacking.  Quite the contrary, hacking could be one of the most positive things a team can do.  In fact, many of the agile processes and techniques that have worked for me in the past seem to be designed to cultivate teams of hackers.</p>
<p>It seems I had fallen for some of the myths about hackers.</p>
<h4>Myth:  Hackers don’t have a plan</h4>
<p>Hackers do have a plan but they acknowledge that the plan will change and then plan with this in mind.  This means creating plans only to the level of detail to which you are currently comfortable making plans.  For example we all know that making a detailed plan at the start of a project, down to the code level, for all but the tiniest programs, is silly since the plan is mere conjecture of a positive outcome.  Rather than writing a fantasy on paper, hackers lay plans based on the current knowledge.  These plans then expose areas for further exploration (hacking!), the resultant knowledge of which can be turned into more detailed plans.</p>
<p>In XP these detailed plans are created just in time during the iteration planning game, sometimes even later than that.  That&#8217;s not to say that there wasn&#8217;t a plan before the iteration began.  Not so.  A great degree of planning, communication, and coordination was required to be able to plan so adeptly, so quickly.</p>
<h4>Myth:  Hackers don’t know what they’re doing</h4>
<p>In the literal sense, a lot of times hackers don’t know what they are doing.  That is why they are hacking.  The purpose is to figure out how something works or the best approach for something.  And that’s the key.  At a meta-level, hackers know exactly what they are doing &#8211; they are searching for information, for knowledge, for a means to achieve an end.</p>
<p><img src="http://neverletdown.net/images/action-research-cycle.jpg" alt="description of the cyclic nator of action research" /></p>
<p><a href="http://en.wikipedia.org/wiki/Action_research">Action research</a> is a relatively new-to-software-engineering research method that seemed to take agile researchers by storm at XP2010.  The basic premise is that a researcher works closely with a consenting organization to observe practices in software engineering.  Rather than acting as a passive observer, as is traditionally done, the researcher injects practices directly into the team and observes before and after reactions.  For example, <a href="http://xp2010.org/program?sid=24&amp;o=5">in recent work by Tor Erlend Fægri</a>, having observed issues with team collaboration he suggested several techniques to help solve the problem.  Some suggestions worked, some didn’t.  Fægri was able to take the time to understand what happened and why because he was dedicated to understanding almost as a participant, watching the events unfold.  This take on research makes me think of Jane Goodall’s work with chimpanzees in which she directly interacted with wild primates in order to better observe their behavior.</p>
<p><img src="http://neverletdown.net/images/jane-goodall.jpg" alt="Jane Goodall with a chimpanzee" /></p>
<p>When I first heard about action research it sounded a lot to me like hacking &#8211; trying things out to understand how something works.</p>
<h4>Myth:  Hackers don’t create value</h4>
<p>Yes, the code that comes out of a hard core hacking session might be a big pile of spaghetti, but consider the purpose of this work in context.  Another perspective is that hacking may incur technical debt which sooner or later will need to be paid off.  But it’s important to keep in mind that <a href="http://blogs.construx.com/blogs/stevemcc/archive/2007/11/01/technical-debt-2.aspx">not all technical debt is bad</a>.  When you are hacking, you are either in learning mode or in finish mode.  Learning mode is never wasted effort.  Finish mode, where you are just trying to get something finished so it can be used, can leave scars on your code, but the immediate value provided to customers can be enormous.  When you have a desperate and immediate need, anything that works today is better than something perfect that works next week.</p>
<p>The same goes for architecture.   Of course, many of the architecture researchers use words and phrases like &#8220;experiments&#8221; or &#8220;trade-off analysis&#8221; to describe this same act of quickly creating something for the sake of knowledge.  That&#8217;s really just hacking too.</p>
<p>Sometimes the artifacts you produce are throwaway.  Sometimes the working solution is good enough and you’ll never have to worry about it again.  Sometimes you’ll have to pay off the technical debt.  But hacking for the right reasons is never wasted effort.</p>
<h4>Agile Development Helps Cultivate Good Hackers</h4>
<p>Agile software development, be it controlled through time boxes or flow, is all about ensuring that work doesn’t teeter out of control a day at a time.  The focus on providing customers with value creates an environment that encourages action and creation.  The agile manifesto gently nudges hacking behaviors.  Frequent releases of working software, welcoming changing requirements, focus on simplicity and continuous attention to technical excellence, helping the customer understand what they need and then doing your best to make it for them.  Even the idea of continuous process improvement is about hacking your team to make yourselves better.  Hacking is the very lifeblood of agile software development.</p>
<p>Hacking isn&#8217;t a dirty word.  Hacking could be the most important thing you do all day.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/uSMjiYTTqQ0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2010/07/hacking-is-not-a-dirty-word/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2010/07/hacking-is-not-a-dirty-word/</feedburner:origLink></item>
		<item>
		<title>Lightweight Experiments for Process Improvement</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/qbMMe_FUnBI/</link>
		<comments>http://neverletdown.net/2010/06/lightweight-experiments-for-process-improvement/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 13:30:43 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[Talks]]></category>
		<category><![CDATA[experiment]]></category>
		<category><![CDATA[experimentation]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[measurement]]></category>
		<category><![CDATA[measures]]></category>
		<category><![CDATA[Metrics]]></category>
		<category><![CDATA[MSE]]></category>
		<category><![CDATA[pair programming]]></category>
		<category><![CDATA[planning]]></category>
		<category><![CDATA[process improvement]]></category>
		<category><![CDATA[Risk Management]]></category>
		<category><![CDATA[science]]></category>
		<category><![CDATA[scientific method]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[studio]]></category>
		<category><![CDATA[XP]]></category>
		<category><![CDATA[xp2010]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=339</guid>
		<description><![CDATA[[This post is a recap on the second talk I gave at XP2010.  This was the big one, the experience report talk, one of 15 experience reports published at XP2010.  You can download the slides (pdf) or the full paper (pdf) from this website or from XP2010.org.]
Process improvement is important for nearly all [...]]]></description>
			<content:encoded><![CDATA[<p>[This post is a recap on the second talk I gave at XP2010.  This was the big one, the experience report talk, one of 15 experience reports published at XP2010.  You can<a href="http://neverletdown.net/papers/keeling-xp2010-put-it-to-the-test-talk.pdf"> download the slides</a> (pdf) or <a href="http://neverletdown.net/papers/keeling-xp2010-put-it-to-the-test.pdf">the full paper</a> (pdf) from this website or from <a href="https://preseria.com/#session=hv00lvotq3qyhdd">XP2010.org</a>.]</p>
<p>Process improvement is important for nearly all teams but it can sometimes be difficult for a team to know what is working, what isn’t working, and what to techniques or methods to try when attempting to improvement.  Performing a scientific experiment is one way help overcome these problems but as academic research has shown us, while experimentation can yield interesting results, running an experiment is time consuming, expensive, and requires some serious thinking and control to pull off.  From a practitioner’s standpoint this means that experimentation is a non-starter.</p>
<p>Of course, that’s only if you run experiments like an academic.</p>
<p><img src="http://neverletdown.net/images/xp2010-banner.jpg" alt="Banner from the XP2010 conference in front to the hotel." /></p>
<h4>Back Story</h4>
<p>Just over a year ago, <a href="http://dogbert.mse.cs.cmu.edu/MSE2009/Projects/SquareRoot/">my MSE studio team at Carnegie Mellon</a> had a problem.  We had decided we would use Extreme Programming for the construction phase of our project but some team members had doubts concerning pair programming.  We had decided that we would use some kind of peer review, having already seen the many benefits of inspection when reviewing other artifacts.  The dispute arose over whether pair programming would give similar enough results.  Also, not all team members had experience with pair programming but everyone on the team knew and enjoyed solo programming.</p>
<p>The number one concern was whether pair programming would allow us to meet our very strict deadline.  We had just over three months to complete the construction phase of the project.  <a href="http://dogbert.mse.cs.cmu.edu/MSE2009/Projects/SquareRoot/wiki/threshold_of_success.html">According to our threshold of success</a> this meant implementing all <a href="http://dogbert.mse.cs.cmu.edu/MSE2009/Projects/SquareRoot/wiki/use_cases.html">&#8220;must have&#8221; requirements</a> with a minimum level of quality.  Did we really have time to waste by having two people working on the same code at the same time?  Wouldn’t working independently and inspecting code on an as needed basis allow us to get more work done faster?</p>
<p>At the time it just so happened that I was taking <a href="http://spoke.compose.cs.cmu.edu/ser09/calendar.htm">a reading class with Mary Shaw</a> and in that class we discussed some research findings that might help settle this debate.  Research from Laurie Williams, Ward Cunningham, Barry Boehm, and many others showed that <a href="http://collaboration.csc.ncsu.edu/laurie/Papers/ieeeSoftware.PDF">pair programming requires more effort (but never double the effort) but is faster than programming alone</a> (pdf).  Also <a href="http://csse.usc.edu/csse/TECHRPTS/2007/usc-csse-2007-731/usc-csse-2007-731.pdf">pair programming creates code of about the same quality as coding alone with inspection</a> (pdf).  Of course, the research may not apply to us since Square Root is closer to a professional team working on a large project with a real client, not undergrads working on short term toy projects.</p>
<p>After an iteration where some teammates used pair programming and others refused, we decided to try an experiment to see which practice actually worked better.  The original idea was that we might be able to validate some of the research but decided instead that it was more important just to resolve our own internal conflicts and figure out which processes worked better.</p>
<h4>Conducting a Lightweight Experiment</h4>
<p>With the scientific method as our guide <a href="http://dogbert.mse.cs.cmu.edu/MSE2009/Projects/SquareRoot/wiki/analysis_of_pair_programming.html">we planned and executed a lightweight experiment which pitted programming alone against pair programming</a>.  The results were amazing (<a href="http://dogbert.mse.cs.cmu.edu/MSE2009/Projects/SquareRoot/docs/pair_programming_experiment.html">and you can find the raw data in our project archive</a>).  In conducting the experiment we used a set of novel techniques which I think can be useful in conducting other lightweight experiments.  There&#8217;s more background in the experience report so I&#8217;m only putting the meaty stuff in this post.</p>
<p><strong>Focus narrowly on a single question</strong> &#8211; The essential key to keeping an experiment light is to only tackle one thing at a time.  In this case we focused on comparing and contrasting a single technique, pair programming, rather than multiple techniques or an entire process (such XP vs. TSP).</p>
<p><strong>Divide work, not teams</strong> &#8211; If I were comparing pair programming to programming alone in an academic setting, I would put together two teams of about the same experience and have them each build their own version of the same software, one team using pair programming, the other programming alone.  In a business setting this is a complete waste and few companies can afford to have two teams duplicating effort.  By dividing work instead of teams you may lose some control over variables in the experiment but in most cases isolating more variables doesn’t add any further clarity to helping answer the narrowly focused question.  To divide work successfully you need to have some way of estimating work units for division.  We used use case points as shown in the figure depicting our modified planning game.</p>
<p><img src="http://neverletdown.net/images/pair-programming-experiment-planning-process.png" alt="Steps in modified planning game for dividing work into experiment groups" /></p>
<p><strong>Continue making releases</strong> &#8211; Since we still needed to make a comparison, rather than dividing into teams and duplicating effort we divided the features that were released each iteration.  In this way we built about half the features released during an iteration using each technique.  Working on about half the features using pair programming meant that at least some features were being built by individuals.  At the time this was a risk reduction decision to make sure that if pair programming completely failed we’d still have something to ship at the end of the iteration.  Explicitly managing risks is the only way to know if the lightweight experiment may cause problems for making releases.  Also, we had a strictly defined cut-off for stopping the experiment if it ever stopped us from shipping to our client.</p>
<p><strong>Use the data you have</strong> &#8211; In almost all cases we were able to get the data we needed to evaluate our hypothesis from our current process.  When we couldn’t, we only had to make minor modifications to our data collection practices, for example adding a check box to our SharePoint server for indicating whether a task was paired or individual.</p>
<p>One of the more interesting things we did was to create a &#8220;tally sheet&#8221; for collecting pair programming issue detection statistics in real time, as the issues were discovered.  Given the near instantaneous code-inspect-fix cycle when programming in pairs, this was the only way to collect similar data for comparing pair programming to inspection.</p>
<p><img src="http://neverletdown.net/images/pair-programming-experiment-real-time-tally-sheet.png" alt="Example of a real time tally sheet used for tracking issues discovered while pair programming." /></p>
<p><strong>Statistical significance is overrated</strong> &#8211; The whole point of running a lightweight experiment is to collect just enough data to help you make a better decision or validate your gut feeling.  This technique is not meant for uncovering universal truths or proving something to the rest of the world.  In exchange for keeping the experiment light, the results will only apply to your team.  Over the course of an iteration or two, 4-6 weeks, you’ll only get enough data to start to see trends.  In our case the results were not statistically significant using individual T-tests but that didn’t matter.  The most important thing is that we had data that could be used for comparison, data that everyone felt good about and that helped us gain clarity into what we did and how well it worked.</p>
<p><strong>Retrospectives get immediate value</strong> &#8211; The whole reason the experiment is light is to reduce cost and decrease the lag time to providing value to the team.  Just to give you a little perspective, it took us 6 weeks to run the experiment and had enough data and casual observations to make a decision during the retrospective when the analyzed data was shared.  That event occurred in early August of 2009.  This experience report required almost nine full months of gestation from the paper proposal to the talk I gave at the conference.  The gestation period on &#8220;universal truth&#8221; research can be even longer.  <strong>We, as practitioners, don’t have to wait for those universal truths to be born to get value from research.</strong> By running your own quick and dirty, lightweight experiments, you can get results in a timely fashion that you know will apply to your team because your team was the subject of the experiment.  It’s all about closing the gaps between research and practice and <em>taking</em> the information you need <em>now</em> instead of waiting for academic research to catch up.</p>
<h4>Overall Conclusions</h4>
<p>For the Square Root team it turned out that pair programming was faster, cheaper, and produced code that had more predictable albeit <em>slightly</em> worse quality.  The more important lesson is that we discovered a technique, lightweight experimentation, for learning other interesting things about our team and about software engineering in general.</p>
<p>My paper and this blog post were all about trying to describe the technique, using our experiment as an example.  I think it would be awesome if teams around the world conducted lightweight experiments on a variety of topics.  If enough folks share what they learn, we might start to see trends emerge across teams that could lead to universal truths, validate research, or at least discover some great rules of thumb.</p>
<p>What else might make for a great experiment?  Anything you’ve got a question about on your team!</p>
<ul>
<li>What is the clearer way to write requirements, user stories or use cases?</li>
<li>Which estimation technique is more accurate of X and Y?</li>
<li>Can we skip unit testing if we use inspection (looking at quality, knowledge sharing)?</li>
<li>Is UML a better design notation than the one we made up as a team?</li>
<li>What else&#8230;?</li>
</ul>
<p>If you do a lightweight experiment, let me know!  Share what you learn as a blog post or whitepaper.  Let others know what you’ve learned!  Even if the specific results only apply to your team and the way you’ve executed your project, your experiences help form a baseline, a sort of shared understanding for how software development works, how some of these practices work.  And there’s so much about software engineering that we have yet to learn.</p>
<h4>Acknowledgements</h4>
<p>This paper was my first experience report and it was an awesome journey.  Naturally a lot of folks helped me along the way and I would like to take a moment to make sure they know that I appreciate their influences and support.  The Square Root team:  Marco Len, Yi-Ru Liao, Abin Shahab, and especially my fellow experiment co-champion Sneader Sequeira for having the guts to go along with this idea in the first place.  Some of the faculty at Carnegie Mellon:  Dave Root and John Robert (my studio mentors) for bringing up the idea of writing a paper, and Jonathan Aldrich for helping review my proposal.  <a href="http://agilesoftwaredevelopment.com/">Artem Marchenko</a> was my XP2010 paper shepherd after the proposal was accepted, and the quality of each draft only improved because of his inputs.  A group of my fellow employees at Net Health Systems sat through an early draft of the presentation I gave and shared valuable feedback for improving it.  And finally I thank, Marie, my wife, who was with me from start to finish and read more drafts and sat through more practice talks than anyone else.  She’s probably as much an expert on this subject by now as I.</p>
<h4>A Final Aside</h4>
<p>I wrote the initial draft of this paper as <a href="http://dogbert.mse.cs.cmu.edu/MSE2009/Projects/SquareRoot/papers/michael-keeling-studio-paper.pdf">my final reflection paper for my Master of Software Engineering degree</a> (pdf).  That draft has a very different tone, approach, conclusion, and direction than what I eventually published for XP2010.  This is half due to there not being a hard page limit but also I had a lot more time to think about what was really important when writing for XP2010.  There’s some interesting information, mostly in the lessons learned, that might prove interesting to those who are interested.  You should <a href="http://dogbert.mse.cs.cmu.edu/MSE2009/Projects/SquareRoot/papers.html">check out my Square Root teammates&#8217; reflection papers</a> as well since they are all interesting and well written.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/qbMMe_FUnBI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2010/06/lightweight-experiments-for-process-improvement/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2010/06/lightweight-experiments-for-process-improvement/</feedburner:origLink></item>
		<item>
		<title>Lessons from a Software Engineering Dojo</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/ZoUqvfqhHsk/</link>
		<comments>http://neverletdown.net/2010/06/lessons-from-a-software-engineering-dojo/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 14:00:17 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Leadership]]></category>
		<category><![CDATA[Talks]]></category>
		<category><![CDATA[Carnegie Mellon]]></category>
		<category><![CDATA[coaching]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[mentoring]]></category>
		<category><![CDATA[MSE]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[xp2010]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=323</guid>
		<description><![CDATA[[Here's a recap of the first talk I gave at XP2010.  Since it was a Lightning Talk, rather than posting slides I've summarized my talk and added references directly in this post.  I welcome comments and discussion.]
Craftsmanship is an interesting model for thinking about how to teach someone to become a great software [...]]]></description>
			<content:encoded><![CDATA[<p>[Here's a recap of the first talk I gave at <a href="http://xp2010.org/">XP2010</a>.  Since it was a Lightning Talk, rather than posting slides I've summarized my talk and added references directly in this post.  I welcome comments and discussion.]</p>
<p>Craftsmanship is an interesting model for thinking about how to teach someone to become a great software engineer.  Industry hasn&#8217;t always done the best job taking advantage of this metaphor for enabling training and instruction.  Sure, there&#8217;s agile coaches and conferences like XP2010 where peers can collaborate, but rarely does an organization, a business, deliberately encourage and enable engineering growth for the software engineers they hire.</p>
<p>As we learn how to build software we go through the <a href="http://blog.8thlight.com/articles/2008/9/22/definition-of-software-craftsman">three stages of craftsmanship</a>.  For most of us, we are apprentices in university, taking courses and learning the basics of computer science and software development by imitating our professors and the books we read.  We are journeymen the first few years on the job as we start our careers, applying the lessons we learned in school in practical setting and trading tips with fellow journeymen.  Eventually some of us pass some kind of test under the tutelage of a master and are ourselves declared as such.  The frustrating part is that so few people find masters to help when attempting to cross the threshold from journeyman to master.  How do you know when you&#8217;ve made it?  Where are these great masters, these mentors for helping to learn how to be a great software engineer?</p>
<p><img src="http://neverletdown.net/images/stages-of-craftsmanship.jpg" alt="3 stages of craftmanship - apprentice, journeyman, master" /></p>
<p>Wouldn&#8217;t it be great if there were a place, a dojo if you will, that we could go to practice with other journeymen under the guidance of masters, interacting with apprentices just starting out on their craftsman journey?  As it turns out there is such a place.</p>
<p>The <a href="http://mse.isri.cmu.edu/software-engineering/">Master of Software Engineering program at Carnegie Mellon</a> has been teaching professional software engineers how to build software better for just over 20 years now.  The faculty and staff at the MSE have honed some practices that can be directly applied in industry.  Normally I wouldn&#8217;t advocate transitioning academic education practices to an industrial environment but the MSE is a near perfect hybrid of industry and academia.  The studio project, the capstone project which forms about 50% of the curriculum is a long duration (16 months), real project with business clients who expect software that will provide real business value.  Commitment varies and during the summer semester, student teams are working on the studio project as a full time job, dedicating over 40 hours a week to the project.  In addition, unlike most academic programs, all students are experienced engineers with at least 2 years of industry experience.</p>
<p>A dojo is a place for training, a place where a variety of students with different backgrounds come together to practice and become better at their craft.  So while the MSE makes for an excellent dojo, it&#8217;s not easy for everyone to move to Pittsburgh for 16 months of intense study.  So, how can the success of the MSE be applied within industry? <strong> I think that there are six key practices where the MSE excels that industry should take note for training and professional development</strong>.  These are practices which can be applied in nearly any business setting with effective results.</p>
<p><strong>Education</strong> &#8211; In school we can take classes.  On the job we can read books, start discussion groups, read blogs, and go to conferences.  Education becomes a catalyst for growth.</p>
<p><strong>Mentoring</strong> &#8211; Mentors are guides who encourage growth by asking probing questions and pushing those being mentored out of their comfort zone.  Mentors are there to dust you off when you fail and never directly solving problems for those being mentored (a favorite technique of the MSE mentors is to answers questions with questions).  In the MSE program, every student meets with a mentor once a week for 30 minutes to discuss how the project is going and thoughts on software engineering.  This is a significant commitment for industry and so holding mentor meeting perhaps over lunch maybe once a month is sufficient.  The point is to help novices and journeymen to find masters for guidance.</p>
<p><strong>Proposals</strong> &#8211; Proposals help teams focus on the think-act-reflect cycle for approaching software from an engineering perspective.  In a proposal, teams think through methods, processes, and techniques that will be used and this written (it may be brief or as detailed as necessary) proposal becomes the basis for evaluation and reflection for the team.  In essence the proposal acts as a plan for determining an approach to software engineering practices.  The whole point is to get student engineers to start thinking in terms of the simple to see but takes a lifetime to master, cyclic think-act-reflect approach to problem solving.  See <a href="http://mse-square-root.blogspot.com/2009/09/what-whens-decision-made.html">this article from my studio team&#8217;s reflection blog on understanding when decisions are made</a> and the complete archive of proposals <a href="http://dogbert.mse.cs.cmu.edu/MSE2009/Projects/SquareRoot/wiki/proposal_summary.html">from my team</a> and others are available from the MSE studio archive for some concrete examples of how proposals work.</p>
<p><img src="http://neverletdown.net/images/think-act-reflect-cycle.jpg" alt="think-act-reflect cycle" /></p>
<p><strong>Presentation &amp; Critique</strong> &#8211; Communication and collaboration is a powerful tool for learning.  During a presentation and critique, a team presents a proposal and that proposal is the critiqued by both mentors and peers.  The comments and questions are then taken into consideration when revising or changing proposals.  This is a powerful tool that doesn&#8217;t cost much and fosters knowledge sharing across an organization.</p>
<p><strong>Peer Collaboration</strong> &#8211; This is so obvious I shouldn&#8217;t have to say it but simply talking to peers is one of the most often overlooked sources of information and learning.  Many professional environments inadvertently create physical barriers which further prevent collaboration.  Team lunches are nice for getting to know each other, but genuine collaboration must involve asking hard questions and then collaborating with a diverse group of individuals to help answer those questions.  Presentation &amp; Critique is one way to facilitate this.  Setting up the environment to encourage collaboration is another.</p>
<p><strong>Reflection</strong> &#8211; I have come to believe that this is the single most important practice in software engineering.  If only more professionals would take the time to reflect on what they do and use that reflection to drive improvements then many of the most difficult problems we face as an industry would begin to resolve themselves.  Effective reflection is ongoing, mentally intense, and difficult to do well.  It involves both hard data and soft feelings.</p>
<p>All of this combines to create a place filled with passionate software engineers of all different levels of mastery, each learning from one another, and taking the field of software engineering to an entirely new and better plane of existence.  If you are ever in the Pittsburgh area, please stop by the Cave (the place where the studio teams do their work) for a tour!  You can contact information and further details about the program on <a href="http://mse.isri.cmu.edu/software-engineering/">the MSE Website</a>.</p>
<p>References</p>
<ul>
<li>D. Garlan , D.P. Gluch , J.E. Tomayko,<a href="http://mse.isri.cmu.edu/software-engineering/documents/agents_of_change.pdf"> Agents of Change: Educating Software Engineering Leaders</a>, Computer, v.30 n.11, November 1997, p.59-65.</li>
<li>D. Root, M. Rosso-Llopart, G. Taran, <a href="http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?reload=true&amp;isnumber=4556933&amp;arnumber=4556960&amp;count=41&amp;index=20">Proposal Based Studio Projects: How to Avoid Producing &#8220;Cookie Cutter&#8221; Software Engineers</a>, CSEE&amp;T 2008, pp. 145-151.</li>
<li>D. Root, M. Rosso-Llopart, G. Taran, <a href="http://www.computer.org/portal/web/csdl/doi/10.1109/CSEET.2007.30">Key Software Engineering Concepts for Project Success: The Use of &#8220;Boot Camp&#8221; to Establish Successful Software Projects</a>, CSEE&amp;T 2007, pp. 203-210</li>
<li>J. Tomayko. <a href="http://portal.acm.org/citation.cfm?id=107005.107070">Teaching Software Development in a Studio Environment</a>, Association for Computing Machinery, ACM 0-89791-377-9/91/0002-03000, September, 1991.</li>
<li><a href="http://alistair.cockburn.us/Foundations+for+Software+Engineering">The 9 crafts of software engineering</a> proposed by Alistair Cockburn</li>
<li><a href="http://www.amazon.com/gp/product/0465068782?ie=UTF8&amp;tag=nevletdowdotn-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0465068782">Schon, Donald, The Reflective Practitioner: How Professionals Think In Action</a></li>
<li><a href="http://dogbert.mse.cs.cmu.edu/">MSE Studio Archives</a> &#8211; a record of over 70 past studio projects since the late 1990s</li>
</ul>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/ZoUqvfqhHsk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2010/06/lessons-from-a-software-engineering-dojo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2010/06/lessons-from-a-software-engineering-dojo/</feedburner:origLink></item>
		<item>
		<title>See you at XP2010 in Trondheim, Norway!</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/jlBmeBITyGc/</link>
		<comments>http://neverletdown.net/2010/06/see-you-at-xp2010-in-trondheim-norway/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 17:30:57 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[experiment]]></category>
		<category><![CDATA[extreme programming]]></category>
		<category><![CDATA[pair programming]]></category>
		<category><![CDATA[process improvement]]></category>
		<category><![CDATA[science]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[XP]]></category>
		<category><![CDATA[xp2010]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=309</guid>
		<description><![CDATA[As I’m writing this I am making final preparations to leave for Trondheim, Norway to present an experience report at the 11th International Conference on Agile Software Development and Extreme Programming, or XP2010.  After my experience report was accepted, the conference organizers opened up a second round for lightning talk proposals, and in a [...]]]></description>
			<content:encoded><![CDATA[<p>As I’m writing this I am making final preparations to leave for Trondheim, Norway to present an experience report at the <a href="http://xp2010.org/">11th International Conference on Agile Software Development and Extreme Programming</a>, or XP2010.  After my experience report was accepted, the conference organizers opened up a second round for lightning talk proposals, and in a moment of whimsy I decided to propose another talk.  That was accepted as well.  So I’ll be giving two talks at XP210.</p>
<p>If you’re at the conference I would very much like to meet you!  This is my first time presenting at a conference and only my second conference attended (my first was OOPSLA this past October) so I’m a little nervous and unsure what to expect.  Above all I hope that I’m able to share some information that is useful, interesting, and inspirational.  I think I have some interesting insights and perspectives that can help make the way we build software just a little bit better and I want to hear your opinions, your thoughts and experiences too.  If you can’t make it to my talks, come find me, I’d be glad to discuss any ideas with you.  I plan to have a copy of the paper and slide decks available on this website along with a brief synopsis of the talks shortly after the conference.  And of course I&#8217;ll be looking for people to eat meals with and hang out while I&#8217;m here on Wednesday and Thursday.  I&#8217;m here to present, to learn, and to discuss cool ideas with other practitioners.</p>
<p>Here&#8217;s a summary of the two talks I&#8217;m giving along with some background information.  The background isn&#8217;t necessary but just interesting information and context related to the talks.</p>
<h4>Put it to the Test: Using Lightweight Experiments to Drive Process Improvement</h4>
<p>This experience report tells the story of how my team ran a lightweight experiment to figure out whether we should use pair programming or program alone and review our code with <a href="http://en.wikipedia.org/wiki/Fagan_inspection">Fagan inspection</a>.  With only a few hours of work and only a few weeks time we discovered that pair programming was instrumental to our eventual success.</p>
<p>In this talk I will discuss what we learned about setting up and running the experiment so you can run lightweight experiments of your own on whatever topics your team finds most interesting or pressing.  Experimentation doesn’t have to be this overbearing, lofty, academic thing that it has become.  My hope is that teams around the world will use this technique to discover just a little more about how software engineering works and that they’ll share what they learn in white papers, blog posts, and future experience reports.  We can help close the gap between research and industry with just a sprinkling of scientific thinking.</p>
<p>Background Information</p>
<ul>
<li><a href="http://xp2010.org/program?sid=24&#038;o=1">Paper and talk abstract</a></li>
<li><a href="http://dogbert.mse.cs.cmu.edu/MSE2009/Projects/SquareRoot/wiki/analysis_of_pair_programming.html">Pair programming experiment work plan</a> as executed by the team (archived)</li>
<li><a href="http://mse-square-root.blogspot.com/">Square Root’s team reflection blog</a></li>
<li><a href="http://mse-square-root.blogspot.com/2009/10/deciding-to-use-pair-programming.html">A brief analysis of why pair programming seemed controversial</a> to the team while we were planning.</li>
<li><a href="http://dogbert.mse.cs.cmu.edu/MSE2009/Projects/SquareRoot/">Complete Square Root project archive</a> (You’ll find data from the experiments along with tons of context information on the project.  This is a very raw archive, but there’s tons of great data if you’re willing to root around.)</li>
</ul>
<h4>Lessons from a Software Engineering Dojo:  The MSE at Carnegie Mellon University</h4>
<p>At OOPSLA in Orlando, Florida this past October I heard proclamations like this more than a few times: &#8220;The only way to teach software engineering is through experience.  What we really need is a software engineering program that uses a capstone project, a non-trivial, long term project that lets you practice what you learn.  No university programs currently have such a project in their curriculum.&#8221;  I agree.  In fact, I agree so much that I attended the only university in the world in which a long-term, realistic (in both scope and complexity), team-based capstone project is an essential part of the software engineering curriculum.</p>
<p>I have two goals with this lightning talk.  First, I aim to spread the word about the existence of the Master of Software Engineering program at Carnegie Mellon University.  Carnegie Mellon is on the forefront of software engineering education research and the Master of Software Engineering program has been teaching professional software engineers to become true masters in the field for over 20 years.  Second, since the studio component (the capstone project) of the MSE degree is so similar to an industrial setting, there’s a lot industry teams can use for training and educating software engineers as you work.  There are tons of lessons that can be taken from the MSE in the form of both research and battle tested experiences.  This second goal will be the greater emphasis of the talk.</p>
<p>Background Information</p>
<ul>
<li><a href-"http://xp2010.org/program?sid=14&#038;o=">Lightning talk abstract</a></li>
<li><a href="http://alistair.cockburn.us/Foundations+for+Software+Engineering">The 9 crafts of software engineering</a> proposed by Alistair Cockburn</li>
<li><a href="http://mse.isri.cmu.edu/software-engineering/">Master of Software Engineering homepage</a></li>
<li><a href="http://en.wikipedia.org/wiki/Carnegie_Mellon_University_Masters_in_Software_Engineering">Wikipedia entry about the MSE program</a></li>
<li><a href="http://dogbert.mse.cs.cmu.edu/">MSE studio projects archive</a>
</ul>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/jlBmeBITyGc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2010/06/see-you-at-xp2010-in-trondheim-norway/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2010/06/see-you-at-xp2010-in-trondheim-norway/</feedburner:origLink></item>
		<item>
		<title>The Reality of Risk Exposure</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/Tjg8aHEcyO8/</link>
		<comments>http://neverletdown.net/2010/05/the-reality-of-risk-exposure/#comments</comments>
		<pubDate>Sun, 16 May 2010 02:31:24 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Risk Management]]></category>
		<category><![CDATA[analysis]]></category>
		<category><![CDATA[impact]]></category>
		<category><![CDATA[Metrics]]></category>
		<category><![CDATA[probability]]></category>
		<category><![CDATA[Small team Risk Evaluation workshop]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[SRE]]></category>
		<category><![CDATA[studio]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=295</guid>
		<description><![CDATA[Over the past few weeks I’ve been thinking a lot about risk exposure in the context of managing projects.  Exposure is a technique used almost universally when managing risks, yet as I’ve already discussed, exposure can cause major problems because it’s a precise number based on mostly made-up information.  At the same time, [...]]]></description>
			<content:encoded><![CDATA[<p>Over the past few weeks <a href="http://neverletdown.net/2010/05/a-closer-look-at-risk-burndown/">I’ve been thinking a lot about risk exposure in the context of managing projects</a>.  Exposure is a technique used almost universally when managing risks, yet as I’ve already discussed, exposure can cause major problems because it’s a precise number based on mostly made-up information.  At the same time, exposure is used widely and successfully &#8211; otherwise there wouldn’t be as much literature throughout the web telling you to calculate risk exposure.</p>
<p>This begs the question: is risk exposure really as meaningless as I’ve made it out to be?  I&#8217;ve collected some data that helps answer this question.</p>
<h4>Data Collection and Context</h4>
<p>Risk management is one of the basic subjects covered in the Managing Software Development course, one of the five core courses students of the Carnegie Mellon Master of Software Engineering program take in completing their degree.  Students learn about the continuous risk management paradigm from the Software Engineering Institute.  Two of the cornerstones of this technique are <a href="http://neverletdown.net/2010/01/threshold-of-success/">threshold of success</a> and <a href="http://varokas.wordpress.com/2010/04/05/condition-consequences-risk-management/">condition-consequence based risk statements</a>.</p>
<p>Having ready access to risk management experts at the SEI, nearly every team conducts a facilitated small team risk evaluation workshop in which risks are collected with the help of a <a href="http://www.sei.cmu.edu/reports/93tr006.pdf">taxonomy-based questionnaire</a> (pdf), analyzed, and prioritized using group multi-voting.  The basic workshop has been conducted the same way for close to a decade and many teams have put their risk data collected during the workshop in <a href="http://dogbert.mse.cs.cmu.edu/">the MSE’s project archive</a>.</p>
<p>I’ve gathered data from these small team risk evaluation workshops for 9 MSE Studio teams, a total of 164 identified, analyzed, prioritized risks.</p>
<h4>What’s in the Data?</h4>
<p>During a risk evaluation workshop, teams identify risks using their threshold of success as a guide.  Once identified, risks are briefly analyzed and assigned an impact, probability, and time frame value based on a rough average from the team members’ initial gut feeling on the risk.  These values are assigned simply so when a manager asks to see the probability, for example, there is a value to give him.  Each of impact, probability, and time frame can only be one of 3-4 values.  The idea is that by decreasing the precision we can increase the accuracy.  Values are assigned based on a rubric.  For the purposes of calculating a risk exposure I assigned each of the analysis categories a number.  Time frame is not used in calculating exposure.</p>
<p>Impact</p>
<ul>
<li>Catastrophic &#8211; The team will be unable to meet threshold of success. (numeric value 4)</li>
<li>Critical &#8211; The team can only meet the threshold of success with significant additional effort and stress. (numeric value 3)</li>
<li>Marginal &#8211; The team can meet the threshold of success with minimal extra effort. (numeric value 2)</li>
<li>Negligible &#8211; There is no real impact on achieve the threshold of success or little increase in effort. (numeric value 1)</li>
</ul>
<p>Probability</p>
<ul>
<li>High &#8211; Chance of becoming a problem is above about 80%. (numeric value .8)</li>
<li>Medium &#8211; Chance of becoming a problem is about 50/50. (numeric value .5)</li>
<li>Low &#8211; Chance of becoming a problem is below about 20%. (numeric value .2)</li>
</ul>
<p>Time Frame</p>
<ul>
<li>Short &#8211; May occur in about a month or less.</li>
<li>Medium &#8211; May occur in 1 to 3 months.</li>
<li>Long &#8211; May occur in more than 3 months.</li>
</ul>
<p>Instead of relying on the results from the analysis, teams perform 3 to 4 rounds of multi-voting.  The final multi-voting rank is shown.  Not all teams ranked all risks since teams generally only deal with the top few risks, usually less than 10.  This idea is captured in the priority.  A risk is either a high priority, meaning the team is actively addressing it, or a low priority meaning the team is aware of it but it was not ranked high enough to deal with yet.  Teams might choose different strategies for determining priority.  The two most popular are to only examine the top X or to rely on consensus derived from how the risks clustered as a result of multi-voting.  Usually there is strong team consensus for the top 4 to 5 risks and weak consensus after this.</p>
<h4>Analysis and Discussion</h4>
<p>My hypothesis is that teams’ rankings will generally match exposure, meaning that risks that are ranked highly will also have a high exposure.  As the data shows, this is generally the case.  On average nearly every team’s high priority risks were also the ones with the highest exposure.</p>
<p><img title="Teams' Average Risk Exposure by Priority" src="http://neverletdown.net/images/average-risk-exposure-by-priority.png" alt="Graph showing Teams' Average Risk Exposure by Priority." /></p>
<p>Examining the risks rank and exposure tells a similar story but not convincingly.  There is a relatively weak negative correlation (correlation coefficient of -0.22) between exposure and team assigned rank.  Basically the best that can be said is that there is a general downward trend in exposure as the rank increases but there is enough variation that I can’t really say anything for certain.</p>
<p><img title="All Teams Risk Data" src="http://neverletdown.net/images/risk-exposure-by-rank-all-teams.png" alt="Graph showing risk data for all teams." /></p>
<p>I have two possible explanations for this.  First, traditional risk exposure does not take into account time frame while teams evaluating risks in this data set do.  So, all things equal from an exposure perspective, a long term risk might be ranked very low while a short term risk will be ranked much higher.  If this were the case, we’d see more short-term risks assigned high ranks than long-term risks and this is indeed the case.  In fact, the majority of risks identified are short-term risks with nearly three times more short-term risks being identified than long term risks.  Mid-term risks are, unsurprisingly in the middle.  A better exposure number might be had by taking into account risks’ time frame values.</p>
<p><img title="Count of Risks per Time Frame by Rank" src="http://neverletdown.net/images/count-of-risks-by-time-frame.png" alt="Graph showing the count of risks per time frame by rank" /></p>
<p>The second possible explanation I have is that 3 &#8211; 4 buckets isn’t sufficient to allow for enough variation to form a strong correlation between rank and exposure.  Indeed this is one of the greatest differences between this data set and traditional risk exposure calculations in which impact might take on nearly any number and exposure is usually a percentage from 10 &#8211; 100%.  That said there still is a general trend which shows that most of the time, multi-vote ranking very roughly corresponds to exposure.</p>
<p>There is one more catch about this data and it’s a subtle but important one.  Values for probability, impact, and time frame were determined as a team using a sort of rough average approach where team members vote and the approximate averages are rounded to the nearest bucket.  Since all the values and rankings were determined through a group effort, it would make sense that they should roughly correspond.</p>
<h4>Conclusions</h4>
<p>As it turns out, risk exposure is a rough and somewhat accurate indicator for relative risk priority, at least when calculating exposure or rank using group-driven techniques.  Teams relying only on exposure are likely to rank some risks higher than they otherwise might.  Part of this is due to exclusion of the concept of time from traditional exposure, part of it might be differences of opinion within the group as far as impact or probability are concerned.</p>
<p>Talking with other MSE alumni, and I mostly agree with them, the most important thing about risk management is bringing up concerns and talking about them.  Delphi mutli-voting is an easy way to encourage conversation since differences of opinion are addressed as part of the multi-voting process.  No matter what technique you use, exposure (with time somehow included), multi-voting, or some combination, do not reduce risk management to simple numbers.  It’s really all about communication.  Encourage this communication using whatever techniques work for your team.</p>
<p><a href="http://neverletdown.net/papers/mse-consolidated-risk-analysis.csv">Raw data used for analysis in CSV format.</a></p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/Tjg8aHEcyO8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2010/05/the-reality-of-risk-exposure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2010/05/the-reality-of-risk-exposure/</feedburner:origLink></item>
		<item>
		<title>A Closer Look at Risk Burndown</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/KuU0JuUfyrc/</link>
		<comments>http://neverletdown.net/2010/05/a-closer-look-at-risk-burndown/#comments</comments>
		<pubDate>Sun, 02 May 2010 02:17:34 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Metrics]]></category>
		<category><![CDATA[Risk Management]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[burndown]]></category>
		<category><![CDATA[measurement]]></category>
		<category><![CDATA[measures]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[tracking]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=265</guid>
		<description><![CDATA[I like the idea of the risk burndown chart.  Burndown is an effective and satisfying visual indicator of progress and it’s relatively easy to calculate to boot.  But does looking at a project’s risks through the lens of a burndown chart make sense?
I see several problems with thinking about risk in this way.
Numbers [...]]]></description>
			<content:encoded><![CDATA[<p>I like <a href="http://blog.mountaingoatsoftware.com/managing-risk-on-agile-projects-with-the-risk-burndown-chart">the idea of the risk burndown chart</a>.  Burndown is an effective and satisfying visual indicator of progress and it’s relatively easy to calculate to boot.  But does looking at a project’s risks through the lens of a burndown chart make sense?</p>
<p>I see several problems with thinking about risk in this way.</p>
<h4>Numbers can be Misleading</h4>
<p>The first key to effective risk management is to value accuracy over precision.  This means that it’s better to be right in your predictions than it is to be spot on correct.  Remember, <a href="http://neverletdown.net/2010/02/swot-vs-risk-management/">risk is about assessing your likelihood for project success</a>.  It doesn’t matter if you miss your threshold of success by a little or a lot; either way you still fail the project!</p>
<p>Pop quiz.  Say there are two risks in your project.  There’s a 25% probability that Risk A will become a problem while Risk B only has a 20% probability.  For now, assume the impact is the same for both risks.  Which risk is a greater threat to the project?</p>
<p>That one’s easy.  Risk A is a greater threat because, impacts aside, Risk A has a 5% greater probability of turning into a problem.  Ok.  What if I told you that I made up probabilities based on my gut feelings so I could easily rank risks?  Now which risk is a greater threat to the project?</p>
<p>The real question I’m asking you is this.  Are you willing to bet the success of your project on those numbers?  Because if my best guess, gut feeling probabilities are off by more than 5%, the project could be in serious trouble depending on the risks’ impacts.</p>
<p>I know, I know.  That was a trick question.  Nobody on <em>your</em> team would make up numbers on one of <em>your</em> software projects.  In all fairness, nobody goes out of their way to fabricate false values.  Use your logics.  If you were any good at guessing the probability of futures events occurring, you would not be reading this post right now.  You would be a multi-millionaire, off enjoying your gambling winnings from the ponies.  <strong>Too much precision gives folks too much confidence in the correctness of your assessment when the reality is that probability and impact are based on best guesses and gut feelings. </strong> Probability and impact numbers just make it easier to calculate exposure so risks can be ranked automatically.  Burndown is a fairly precise metric.</p>
<h4>Not all Risks are Created Equal</h4>
<p>If you are monitoring project risk with a risk burndown chart, how do you know whether the right risks are being reduced?  Let&#8217;s take a look at an example.  Which of these sets of risks should be addressed?</p>
<p>Set 1 with a total exposure of 7 days made up of the following risks:</p>
<ul>
<li>Risk A has a probability of 20% and an impact of 15 for an exposure of 3 days.</li>
<li>Risk B has a probability of 25% and an impact of 10 days for an exposure of 2.5 days.</li>
<li>Risk C has a probability of 30% and an impact of 5 days for an exposure of 1.5 days.</li>
</ul>
<p>Or Set 2 with a total exposure of 7 days (6.7 rounded up) made of the the following risk:</p>
<ul>
<li>Risk D has a probability of 95% and an impact of  7 days for an exposure of 6.7 days.</li>
</ul>
<p>In the first set, I can mitigate 3 risks, each with very low probability of becoming problems.  In the second set I mitigate only 1 risk that is almost certainly going to become a problem.  Reducing the imminent risk seems to make the most sense but this choice is not reflected in a risk burndown chart.  Simply reducing risk over time is not enough.  You have to reduce the right risks.</p>
<h4>Impact Isn’t Really About Money or Effort</h4>
<p>The only way for a visual chart such as risk burndown to work is if we’re able to quantify risks.  This is generally done with exposure.  Exposure = probability x impact.  Impact is a funny thing.  Impact is an assessment of how much the consequence of a risk will affect the project if the risk becomes a problem.  Traditionalists like to think about this from a money perspective (which makes sense since software engineers stole most of our risk management practices from the finance world, originally anyway).  For small teams, effort is a better measure as in the number of person days a risk that becomes a problem will cost to fix.  This is a quantifiable loss.</p>
<p>There’s a problem with thinking about impact in terms days of loss.  Since not all risks are created equal, not all loss is truly equal either.  Some kinds of loss can’t be measured in terms of effort.  It really all depends on your project’s threshold of success.  Some example risks (which don’t rely on ye olde life-critical system standby) from which you might never recover if they became problems include:</p>
<ul>
<li>We don’t have a reliable backup solution; might lose all of our project data. (Lost yer data?  You’re up a creek, son!)</li>
<li>We don’t have backup power for our data center; data centers might go offline for more than a few hours. (How many days will it take you to get <em>those </em>customers back?)</li>
<li>The demo has bugs and our contract renewal is based exclusively on how much the client likes our demo; a bug might occur during the demo. (HA! HA! You don&#8217;t have a job!)</li>
</ul>
<p>In all of these cases you would reduce the risk by working on attributes other than impact (e.g. reduce probability, eliminate the condition, extend the time frame).  Enough said.  When it comes to calculating exposure, each of these risks has a <em>catastrophic</em> impact.  That’s catastrophic, short for epic failure.  No amount of days can really capture the essence of complete catastrophe.  Impact works best when considered in terms of success, not days or dollars lost.</p>
<h4>Forget Risk Burndown</h4>
<p>I want risk burndown to make sense, but given the problems I can&#8217;t help but think of it as a meaningless metric.  Sure, some risks will be reduced and some will go away by converting into problems or being overcome by events.  And a chart showing this would be really neat.  But you’ll also uncover new risks as the project goes on.  And some risks are just not worth caring about while others deserve a lot of attention.  Risk management is about identifying the things that are most likely to kill your project so you can deal with them before it becomes too expensive (or impossible).  A burndown chart doesn&#8217;t reflect any of these things directly.</p>
<p>Burndown masks project risks too much and gives teams a false sense of confidence.   <strong>To put it another way, there’s a risk with using risk burndown:</strong></p>
<blockquote><p>Our new risk management strategy assumes our estimation precision is better than it is; we may not mitigate the right risks.</p></blockquote>
<p>Exposure is a ruse.  And risk burndown is a metric for showing a reduction in exposure over time.  To wax poetic, perception is reality and risk burndown provides a false perception.</p>
<p>That said, any risk management is better than none at all.  If a risk burndown chart helps to get your team thinking about risk, then so be it.  But there are other ways (might not be as fancy) to manage risk which are easier and more effective.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/KuU0JuUfyrc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2010/05/a-closer-look-at-risk-burndown/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2010/05/a-closer-look-at-risk-burndown/</feedburner:origLink></item>
		<item>
		<title>Is Better the Enemy of Good Enough?</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/Scpzx1JJH5o/</link>
		<comments>http://neverletdown.net/2010/04/is-better-the-enemy-of-good-enough/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 14:19:45 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[process improvement]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=254</guid>
		<description><![CDATA[&#8220;Better is the enemy of good enough&#8221; is a phrase often held up as the reason for not making changes on a team. If everything seems &#8220;good enough,&#8221; the effort to make something better is regarded as waste.  A lot of times, &#8220;good enough&#8221; is defied in terms of &#8220;providing value to the customer,&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Better is the enemy of good enough&#8221; is a phrase often held up as the reason for not making changes on a team. If everything seems &#8220;good enough,&#8221; the effort to make something better is regarded as waste.  A lot of times, &#8220;good enough&#8221; is defied in terms of &#8220;providing value to the customer,&#8221; often stated as <a href="http://www.skorks.com/2008/09/the-real-measure-of-code-quality/">the &#8220;shipping working software&#8221; metric</a>.  So if you are shipping working software and receiving generally positive feedback from your customers, then what you&#8217;re doing is good enough and there is no need to do things differently.</p>
<p>But if good enough is really all you need, why is it so dissatisfying?</p>
<p>I&#8217;ve mentioned before that <a href="http://neverletdown.net/2010/01/threshold-of-success/">it&#8217;s a good idea to have a project threshold of success</a>, a set of minimum goals that must be completed for a project to be considered successful.  Failure to meet <em>all</em> goals in the threshold of success means you&#8217;ve failed the project.  <strong>So while you will succeed if you meet your threshold goals, only meeting the goals means you&#8217;ve done the absolute minimum amount of work necessary to be successful.</strong> Satisfying the threshold of success for a project is like getting a C in school.  It&#8217;s certainly good enough, but it isn&#8217;t exactly awesome.</p>
<p>While &#8220;good enough&#8221; is perfectly acceptable (You didn&#8217;t fail!), it always feels nice to achieve more.  It feels good when I&#8217;m able to <a href="http://www.pragprog.com/the-pragmatic-programmer/extracts/tips">gently exceed my client&#8217;s expectations</a>.  It also feels good to do things right and not merely get things done.  This is why merely shipping software, the minimum requirement for succeeding on a project, is not enough for me.</p>
<p>Equally important to me is <em>how</em> the work is done, not just that the work gets done.  Is overtime or heroic effort necessary?  Are we reflecting on our work and attempting to improve?  Does my team work together well, take risks, and innovate in many different areas of the project?  Do we try to use data to understand what is happening in the project?  Are teammates given the support they need to grow as professionals?  Am I having fun, looking forward to work every day, and happy with my contributions on the team?  Is the software something I am proud of and actually useful to people?  Is the product well supported by documentation?  Is my code beautiful and maintainable?  And most importantly, did I either learn something new or achieve something great while working on this project?</p>
<p>This is actually a lesson in understanding what &#8220;good enough&#8221; really means and why tools such as Threshold of Success are so important.  Only when everyone agrees at a conceptual level that what the team is doing is &#8220;good enough&#8221; can everyone on the team move forward and be happy.  Sometimes this will mean getting working software out the door no matter the cost.  For most teams &#8220;good enough&#8221; will be a mix between a working software product, a happy and healthy team, and laying foundation for future work.</p>
<p>Making improvements in how my team operates or to the software itself just feels good.  It&#8217;s fun.  So while &#8220;better is the enemy of good enough,&#8221; avoiding change is paramount to avoiding the very things that makes me happy.  The trick is making sure that I&#8217;m not making changes just for the sake of change.  Sound engineering and a good understanding of the project&#8217;s threshold of success can help to avoid this fate.  Once you&#8217;ve met your threshold, earn some extra credit by improving your code base or making process improvements.  Or, better still, choose a threshold of success which requires you to do <em>just a little more</em> than the bare minimum.  Because no one should settle for good enough when awesome is within reach.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/Scpzx1JJH5o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2010/04/is-better-the-enemy-of-good-enough/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2010/04/is-better-the-enemy-of-good-enough/</feedburner:origLink></item>
		<item>
		<title>Book Review: The Design of Design by Fred Brooks</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/UnirsyxAf9g/</link>
		<comments>http://neverletdown.net/2010/04/book-review-the-design-of-design-by-fred-brooks/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 14:15:31 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Book Review]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Fred Brooks]]></category>
		<category><![CDATA[science of the artificial]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[waterfall]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=242</guid>
		<description><![CDATA[During one of the last discussions in my great papers in software engineering reading course Mary Shaw, our discussion moderator, casually alluded to a follow-up class in the next fall semester, &#8220;Fred sent me an early draft manuscript of a book he’s been working on about design.  It’s shaping up really well and I [...]]]></description>
			<content:encoded><![CDATA[<p>During one of the last discussions in my great papers in software engineering reading course Mary Shaw, our discussion moderator, casually alluded to a follow-up class in the next fall semester, &#8220;Fred sent me an early draft manuscript of a book he’s been working on about design.  It’s shaping up really well and I might be able to convince him to let us use it as the centerpiece for another discussion course.  I’d be willing to put a class together if anyone is interested.  Let me know.&#8221;  Being a huge Fred Brooks fan I was one of the first people to sign up for the course.  Throughout the fall of 2009 a group of professors, software professionals, and students met Wednesdays during lunch to talk about design and software engineering while reading Fred Brook&#8217;s new book, <em>The Design of Design</em>, in addition to a few other design classics.</p>
<p><img title="The Design of Design by Fred Brooks in final book and special draft form." alt="The Design of Design by Fred Brooks in final book and special draft form." src="http://neverletdown.net/images/design-of-design-book-and-draft.jpg" alt="" /></p>
<p>Putting software aside for a moment, designing anything is challenging even for experienced professionals.  Simply understanding the problem that needs to be solved requires a great deal of effort.  It’s rare that all the requirements for a project are known up front &#8211; so rare that I haven’t seen such a project since my sophomore year of college!  Design is as much about understanding the problem as it is about finding a solution to that problem.  As you’ve probably experienced many times, your boss always wants changes made to the software after you’ve shown him something that works.</p>
<p>Throughout <em>The Design of Design</em> Brooks wrestles with the idea that design is an iterative exploration of both the solutions and problems.  The notion that everything can be known up front about a problem is absurd yet that’s the way people tend to want to build software.  As Brooks writes, &#8220;The waterfall model is wrong and harmful; we must outgrow it.&#8221;  Amen, brother.</p>
<p>Design is not rational.  Problems do not simply present themselves and from this, solutions flow forth.  Instead, designs are born iteratively, initial problems beget partial solutions which lead to further insights concerning the problem and so on until a satisficing solution is reached – one that is, essentially, good enough for all intents and purposes.  Of course, that assumes that the right intents and purposes were correctly understood and articulated.</p>
<p>Throughout the book, Brooks draws on examples from his own experience, some odd, such as the design of his dream home in Chapel Hill, others classic, such as the design of the O/S 360 Architecture.  While Brooks&#8217; sudden realization that entertaining guests would be awkward in his newly designed home since there was nowhere &#8220;to put the coats&#8221; seemed out of place, stories like these made the abstract verb/noun/concept of design more concrete and relatable, even when considering software design.  Besides, design is supposed to be fun.</p>
<p><em>The Design of Design</em> is one of the most important books for software engineers since <a href="http://www.amazon.com/gp/product/0201835959?ie=UTF8&amp;tag=nevletdowdotn-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0201835959"><em>The Mythical Man Month</em></a>.  Unlike <em>The Mythical Man Month</em>, however I found that I had more questions than answers by the end of the book.  <em>The Design of Design</em> made me feel more confident as a designer and software engineer but also more unsure of what to do next.  The book is full of amazing, empowering ideas but very little that can be applied practically today.  Many concepts I thought I understood suddenly revealed additional dimensions for my consideration, new ways of thinking about the world.  I love it.</p>
<p><a href="http://www.amazon.com/gp/product/0201362988?ie=UTF8&amp;tag=nevletdowdotn-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0201362988"><em>The Design of Design</em> by Frederick Brooks is available now from Amazon.com</a>.  I highly recommend it.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/UnirsyxAf9g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2010/04/book-review-the-design-of-design-by-fred-brooks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2010/04/book-review-the-design-of-design-by-fred-brooks/</feedburner:origLink></item>
		<item>
		<title>Carpool Musings on Women in Science and Engineering</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/ON0QlsAHU3U/</link>
		<comments>http://neverletdown.net/2010/03/carpool-musings-on-women-in-science-and-engineering/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 02:19:49 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Ada Lovelace Day]]></category>
		<category><![CDATA[change]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=231</guid>
		<description><![CDATA[Over the past few weeks there has been a rash of studies published discussing why there are so few women in the science and technology fields.  On a high note, one of these studies noticed that recently about the same number of women are graduating with science, technology, engineering, and math bachelor’s degrees as [...]]]></description>
			<content:encoded><![CDATA[<p>Over the past few weeks there has been a rash of studies published discussing why there are so few women in the science and technology fields.  On a high note, one of these studies noticed that recently about the same number of women are graduating with science, technology, engineering, and math bachelor’s degrees as men.  Unfortunately researchers found that a disproportionately large number of those women choose not to continue studying science, technology, engineering, and math in graduate school.  Nearly every study mentioned in the news recently concludes that women are discouraged, either directly (by peers or, worse mentors straight up telling them to avoid the fields) or indirectly (for example, through a lack of female role models) from entering an engineering, mathematically-inclined, technical, or scientific field.</p>
<p>My wife and I have been debating the results and implications of these studies based on what we learn from radio news snippets while carpooling to work.  So when <a href="http://findingada.com/">Ada Lovelace Day</a> came across my Twitter stream I asked my wife if she would like to write an article with me.  I thought it might be interesting to hear two different perspectives (one from a man, the other from a woman) on how women in science, engineering, math, or technology have influenced our thinking in some way.</p>
<h4>Interview with Marie</h4>
<p>Marie chose to discuss Dr. Martha Case.</p>
<p><i>Who is Dr. Martha Case?</i></p>
<p>Marie:  She is a professor at the College of William and Mary and was my undergraduate advisor while working toward my degree in Biology.</p>
<p><i>What about Dr. Case inspires you?</i></p>
<p>Marie: She was one of my few female professors in college.  She is well respected in her field, by students, other professors, and researchers.  She was also given leadership roles in the biology department.  What I admired most about Dr. Case is that she was able to maintain her femininity while being a woman of strength and great knowledge.  Her ability to share her knowledge and passion inspired me to become a teacher so I could inspire others to love plants too.</p>
<p><i>What can young girls learn from Dr. Case’s example?</i></p>
<p>Marie: You should find something you love, learn everything you can about it, and then get out there and tell others.  If you’re passionate then people will listen.</p>
<h4>Interview with Michael</h4>
<p>Michael chose to discuss Mary Shaw.</p>
<p><i>Who is Mary Shaw?</i></p>
<p>Michael: This is tough.  Mary Shaw is a professor at Carnegie Mellon University.  <a href="http://spoke.compose.cs.cmu.edu/shaweb/p/pubs.htm">She has written a ton of papers on software engineering</a> covering everything from software engineering education and research to architecture and design and everything in between.  While I was working toward my Masters in Software Engineering, I had the opportunity to take two discussion courses &#8211; one on great papers in software engineering and one on design.  Mary was the moderator of these discussions.  I also had an opportunity to write a paper with Mary that was published in IEEE.</p>
<p><i>What about Mary Shaw inspires you?</i></p>
<p>Michael:  She is ridiculously smart and the fact that she has put out a lot of really good ideas and is extremely influential in the software engineering world.  And she&#8217;s able to articulate her ideas extremely well.  Just being able to sit around and have these discussions with her and other PhD students was empowering.  It has nothing to do with her as a woman and everything to do with her as a software engineer.</p>
<p><i>What can young girls learn from Mary Shaw’s example?</i></p>
<p>Michael:  Carnegie Mellon isn’t run just by guys. And it doesn&#8217;t matter what gender you are &#8211; people value the ideas.</p>
<h4>Wrap-up</h4>
<p>That was much tougher than either of us thought it would be and will probably only add fuel to our carpool discussions.  Interestingly, we both chose a college professor with whom we directly interacted; people we personally know.</p>
<p>Normally I [Michael speaking] wouldn’t have thought this sort of a discussion would have been necessary.  Generally speaking, tech blogs like this are preaching to the choir &#8211; most folks reading this either already think similarly as me or have a strong desire to learn the information I’m sharing.  It would be rare for people who hate software engineering, for example, to read this blog.  So, if I&#8217;m trying to change your mind about a controversial topic, blogging isn’t the most effective way to do this.  Sadly, I’m not sure that everyone in the software industry thinks that gender equality is something that needs attention.  It’s one of those slow-change ideas and I’m happy to see inroads like Ada Lovelace Day.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/ON0QlsAHU3U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2010/03/carpool-musings-on-women-in-science-and-engineering/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2010/03/carpool-musings-on-women-in-science-and-engineering/</feedburner:origLink></item>
		<item>
		<title>Identifying Process Affordances: Nudging Toward Change</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/MUyn_Yofgv0/</link>
		<comments>http://neverletdown.net/2010/03/identifying-process-affordances-nudging-toward-change/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 03:16:26 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[Talks]]></category>
		<category><![CDATA[affordance]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Donald Norman]]></category>
		<category><![CDATA[nudge]]></category>
		<category><![CDATA[process improvement]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[studio]]></category>
		<category><![CDATA[talk]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=184</guid>
		<description><![CDATA[This post is a recap of a talk I gave this weekend at the Carnegie Mellon University Master of Software Engineering 20th Anniversary Mini-Conference.  I’ve made the paper this talk is based on (pdf) as well as the slides I used during the talk (pdf) available.  I&#8217;ve also linked to as many of [...]]]></description>
			<content:encoded><![CDATA[<p>This post is a recap of a talk I gave this weekend at the Carnegie Mellon University Master of Software Engineering 20th Anniversary Mini-Conference.  I’ve made <a href="http://neverletdown.net/papers/keeling-Process-Affordances-Nudging-Toward-Change-in-your-Organization.pdf">the paper this talk is based on</a> (pdf) as well as the <a href="http://neverletdown.net/papers/keeling-process-affordances-nudging-toward-change-talk.pdf">slides I used during the talk</a> (pdf) available.  I&#8217;ve also linked to as many of the primary sources I used in research as I could so please, check out those papers if this is something that interests you.</p>
<p>About a year ago <a href="http://neverletdown.net/2009/03/process-affordances-ignore-at-your-own-peril/">I discussed the idea of using affordances to help figure out how to make software processes work more smoothly for a team</a>.  Back then the idea spawned from a moment of crisis and self-reflection on my studio team, but having thought about it for a while and noticing the phenomena occurring on other teams I decided to revisit this idea and see if there is a way to proactively use affordances to avert problems rather than merely explaining problems as they occur.  As it turns out there is a precedent for affordance-driven design in object engineering.  With a few basic assumptions I think affordance-driven design can be extended to software processes as well.</p>
<p><a href="http://ysaito1.blogspot.com/2010/03/on-master-of-software-engineering-at.html"><img src="http://neverletdown.net/images/mse-talk-urinal-fly.jpg" alt="Michael Keeling giving a talk at the MSE mini conference" title="Me giving a talk at the MSE min-conference" /></a></p>
<p>To better explain how to proactively use affordance to pick or tailor a software process it helps to know a little about the <a href="http://courses.media.mit.edu/2004spring/mas966/Gibson%20Theory%20of%20Affordances.pdf">Theory of Affordances</a> (pdf).  If you’ve read <a href="http://www.amazon.com/gp/product/0465067107?ie=UTF8&#038;tag=nevletdowdotn-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0465067107">The Design of Everyday Things by Donald Norman</a> then you probably already have a pretty good understanding of how to use affordances in the context of object design and usability.  From an ecological psychology perspective, affordances are a way of helping explain or predict how an animal will behave in the context of their environment.  In the context of humans, our environment is influenced by our experience, culture, and background as well as our current goals within that environment.</p>
<p>A simple example is the play button on a DVD player.  A triangle to the right means play.  This is obvious to us because we know what a DVD player does (we have experience with similar devices), we turn to the device when we want to watch movies (we’re looking for the play button), and culturally, our notion of time is left to right (so a triangle pointing right means play while a triangle facing left means reverse).  But what if you come from a culture where time is generally represented as passing from down to up vice left to right?  In this case, a triangle facing up might be a better symbol on a play button than a triangle pointing right.  The value of the affordance changed based on a cultural bias and the user&#8217;s background.</p>
<p>This is all well and good, but what does it have to do with software process?  For the Theory of Affordances to apply to software processes (or any process) we have to assume that process is a part of the environment.  This is an interesting proposition since process really only exists in our minds.  Process is something that we make up, and like our understanding of an object your knowledge and experience with a process will influence your perception of that process as an environmental influence.  As long as you believe in, understand, and follow a process, the steps of that process exist as much as any other object in the real world.  Logically this seems to make sense.  Even the US patent office will grant patents for a process just as it will a physical invention.</p>
<p>Back to the core problem of identifying affordances, something I did not have an answer for in my original post a year ago.  As best as I can tell, the only way to identify affordances is to reverse engineer a process focusing on the affordances using a technique known as Affordance Driven Design.  <a href="http://the-design-works.com/pubs/abd/idrskorea2006.pdf">Affordance Driven Design has three basic steps</a> (pdf).</p>
<ol>
<li>Identify a user’s needs in terms of functions.</li>
<li>Identify the desired functional affordances necessary to achieve the previously identified user’s functions.</li>
<li>Choose affordances to design into artifacts which are mostly likely to help achieve those desired functional affordances.</li>
</ol>
<p>As an example, <a href="http://www.taskarchitect.com/(2005)_20DTM-84525.pdf">consider the task of blending a drink using a blender</a> (pdf).  Typical functions a user might want to perform are preparing the blender, blending, and cleaning up afterward.  Functional affordances might include the &#8220;countertop-ability&#8221; (the ease with which a blender can be moved to a countertop), the &#8220;clean-ability&#8221; (the ease with which a user can clean a blender), and &#8220;transportability&#8221; (the ease with which a user can move a blender around).  A person might choose any number of blenders to perform the desired functions but each blender will fulfill the functional affordances in different ways.  A hand blender is extremely portable while <a href="http://www.gasblender.com/">a gas-powered &#8220;whacker&#8221;</a> (powered by a 26cc engine, complete with motorcycle throttle &#8211; it makes the smoothest margarita you&#8217;ll eve have) isn’t really intended for indoor use.</p>
<p>To software engineers, functional affordances should look very familiar &#8211; they’re essentially quality attributes.  Thinking about affordances from this perspective gives us a huge advantage since, as software engineers, we are already extremely familiar with quality attributes and <a href="http://rhinoresearch.com/content/dilbert-quality-attributes-and-what-you-should-know-about-quality-attribute-scenarios">quality attributes scenarios</a>.  <b>Affordances, therefore either promote or inhibit desired quality attributes in your process.</b></p>
<p>Thinking about software processes, the functions will all be related to software: writing, designing, testing, and releasing are just a few possibilities.  Some process quality attributes might include:</p>
<ul>
<li>Plan-ability (How far ahead does a process help you to plan?)
<li>Predictability (How well can you see into the future?)
<li>Changeability  (When the course of a project needs to shift, how well does the process support chaging plans or direction?)
<li>Quality (The degree to which your process promotes &#8220;quality&#8221;)</li>
<li>Cost (The amount of resources you’re willing to spend on process to achieve specific functions)</li>
<li>Harmony (How well the team gets along)</li>
<li>Reliability  (How consistently the process helps you perform)</li>
<li>Performance (Could be speed of development or quantity of code &#8211; define what you mean in the quality attribute scenario.)</li>
</ul>
<p>As an example, say changeability is a desired quality on your team.  A specific changeability scenario might go something like this.  In order to meet business needs in an aggressive market, the team needs to be able to shift focus and answer competitors’ challenges within five business days.  What are the things that might get in the way of this kind of rapid change?  Heavy documentation could be one thing, as it nudges teams into keeping a single course.  Long iterations also make it difficult to shift focus since more effort is required to make longer term plans.  Going light and having short iterations, on the other hand promotes a team’s ability to change.  But like every design decision there are trade-offs.  Going light in terms of documentation might make it harder to achieve certain kinds of quality, for example.</p>
<p>The main idea here is that it’s relatively easy to identify process affordances by thinking like a designer and applying the skills we’ve already acquired as software engineers.  I propose that evaluating process affordances as I’ve discussed here is a great way to pick a process and also to tailor processes.  When tailoring simply identify affordances that are helping the team (be sure to keep those), and identify the affordances that are nudging the team in the wrong direction (replace those with affordances that help you do the right things).  And above all, remember that if things are going wrong, it isn’t always your fault.  The process is a part of the environment and if your process is giving you the wrong cues for your project or team, then it’s the wrong process for you.  So change it!</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/MUyn_Yofgv0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2010/03/identifying-process-affordances-nudging-toward-change/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2010/03/identifying-process-affordances-nudging-toward-change/</feedburner:origLink></item>
		<item>
		<title>Getting Started with Version Control</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/c8JkGvn08Zk/</link>
		<comments>http://neverletdown.net/2010/03/getting-started-with-version-control/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 04:55:19 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[communication]]></category>
		<category><![CDATA[CVS]]></category>
		<category><![CDATA[DRY]]></category>
		<category><![CDATA[pragmatic]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=179</guid>
		<description><![CDATA[I&#8217;ve had to help more than a few teams get their version control systems sorted out over the past few years, and so I thought it would be easier if I just wrote down the philosophies I use for initializing a repository and getting the whole system set up.  If you&#8217;re looking for some [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve had to help more than a few teams get their version control systems sorted out over the past few years, and so I thought it would be easier if I just wrote down the philosophies I use for initializing a repository and getting the whole system set up.  If you&#8217;re looking for some specific advice on how to set up and use a specific version control system, the Pragmatic Starter Kit Series for <a href="http://www.amazon.com/gp/product/0974514004?ie=UTF8&#038;tag=nevletdowdotn-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0974514004">CVS</a>, <a href="http://www.amazon.com/gp/product/0974514063?ie=UTF8&#038;tag=nevletdowdotn-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0974514063">Subversion</a>, or <a href="http://www.amazon.com/gp/product/1934356158?ie=UTF8&#038;tag=nevletdowdotn-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=1934356158">Git</a> is a great place to start.</p>
<h4>What should go into a source code repository?</h4>
<p>The short answer:  the repository should contain everything necessary to perform a clean build of your system.  In most cases, this includes the code, third-party binaries necessary for building, tests, and documentation.</p>
<p>It’s ok to assume that everyone has their build environment &#8220;properly configured&#8221; for building.  To make sure, make a list of everything that must be setup in the environment to build the software and put it on the team wiki.  These things don’t need to be stored in the repository but you should at least write down what the standard build environment is supposed to look like.  Depending on what the required software is, it might also be a good idea to keep a copy of it, just in case something happens to vendor in the future.  The last thing you want is for a vendor to stop supporting the version of something you need, forcing you to upgrade because your hard drive crashed and you had to setup a new environment.</p>
<p>Include at least the following in your standard build environment list:</p>
<ul>
<li>Compiler versions
<li>Team sanctioned IDEs
<li>Required frameworks, toolkits, and build tools
<li>IDE extensions that the team has decided are so critical/awesome to the project they have to be used.  Critical/awesome IDE extensions might enable a required tool-kit (such as GWT in Eclipse) or configure the IDE is specific ways (such as coding styles or static analysis settings)
</ul>
<p>Putting code and tests in the repository is fairly obvious, but third-party binaries (e.g. libraries) might not be.  Put these in version control so that it’s easy to check out a project from source control and build without monkeying around with anything.  I’ve found it best to create an &#8220;ext_lib&#8221; folder for storing all the external libraries.  This way there is no confusion over what versions to use, and all the build paths can be set so that anyone can build just by checking out the code.</p>
<p>Here’s a real life example.  Let’s say you’re writing a web application using the Google Web Toolkit and you rely on a caching library.  The caching library should go into your ext_lib folder and you should tuck a zip of the GWT version you use away in a safe place just in case you need it later.  Say your team is also using JUnit.  Put the version you use in the ext_lib folder.  This way everyone can build and use whatever GUI they want to run tests, be it the JUnit GUI or an Eclipse Plug-in.</p>
<p>Another real life example.  Let’s say you use the excellent <a href="http://csautoupdater.sourceforge.net/">Sharp AutoUpdated component</a>.  Should you version the binary or the source?  That was a trick question since it depends.  The best answer is to only keep the binary of the library, but this isn’t always possible.  One of the awesome things about open source software is that you have access to the source if you need it.  So, let’s say you find a bug in the AutoUpdater and for some reason the maintainers aren’t responding quickly enough for your immediate needs.  You can’t live with this bug so you have no choice but to fix it yourself.  Congratulations, you just took ownership over your own fork of the AutoUpdater component.  You now are responsible for maintaining the code – either in your version control library or in a public fork, and merging with the original code base may be more difficult in the future.</p>
<h4>What doesn’t go into the source code repository?</h4>
<p><a href="http://www.artima.com/intv/dry.html">Remember the DRY Principle for writing code</a> (Don’t Repeat Yourself)?  Well, that applies to your version control system too.  Anything that can be derived shouldn’t be held under version control.  Since your source code is already in the repository, storing the built binary is a violation of the DRY Principle.  The penalty?  Confusion, mistakes, and avoidable headaches.  Third party libraries in the ext_lib folder don&#8217;t violate DRY since you can&#8217;t build them &#8211; you don&#8217;t own the source.</p>
<p>Also, do your fellow developers a favor and keep your personal stuff out of the repository.  If you’re testing, nobody else wants to see your test reports.  When you run the application, keep your logging messages to yourself.  Also keep anything related to how you set up your personal environment in your personal environment.  The last thing I want is to open up my IDE and see the last tabs you had open because you committed your personal user settings.</p>
<p>The easiest way to keep these sorts of undesirables out of the repository is by <a href="http://stackoverflow.com/questions/85353/best-general-svn-ignore-pattern">setting up an ignore list</a>.  Share it among the team.</p>
<h4>How often do I commit?</h4>
<p>Generally you should commit your changes anytime you think you’ve finished something useful that doesn’t introduce problems into the system.  On the average, you should be committing changes at least once a day.</p>
<p>There’s two parts to this commit rule.  &#8220;Finished something useful&#8221; might mean many things.  This is by design.  When you’ve finished a logical chunk of code that does something, feel free to commit it.  &#8220;Doesn’t introduce problems&#8221; is a common courtesy to your fellow developers.  Make sure, at a minimum, the system builds and passes any automated tests you have.  And always update before you commit.  Depending on your team size and how important the code is, you might establish a checklist for committing.  Google has theirs automated.  Every change the system has to build, pass tests, and pass a peer review before it can be committed.</p>
<p>Remember this mantra: Commit early, commit often.</p>
<h4>But if everyone is committing all the time, isn’t that going to cause problems?</h4>
<p>When you’re working with people and coordinating effort, problems will inevitably arise.  Just remember, if you’re going to fail, fail early.  It’s better to cause a conflict today through miscommunication while there’s plenty of time to fix it than the day before it’s time to deploy.  Why?  The conflicts will be smaller since you’re incrementally growing your code base.  Also, since you made the changes recently they are fresh in your head and easier to work with.  Code more than a week old might as well have been written by someone else.</p>
<p>Taking a risk management approach makes mitigating this easy.  The risk:  &#8220;Developers use a shared repository and commit changes frequently; might cause code conflicts that break the build.&#8221;  The source of this risk is communication; therefore anything which helps facilitate communication can reduce the likelihood of this risk becoming a problem.  Daily stand-up meetings are perfect for getting the word out about what everyone is working on.  Automatically generated email updates from the version control system keep folks abreast throughout the day as changes are made.  <a href="http://neverletdown.net/2010/02/why-dont-you-use-continuous-integration/">Continuous integration acts as a smoke test for uncovering integration problems while they’re small</a>.  Good merge tools can help reduce the impact of the consequence.</p>
<p>Once everyone gets used to the update-then-commit cycle, most of these problems go away.  In my experience, big problems with code in the repository are usually a symptom of larger problems such as poor communication or failing processes.</p>
<p>What are some of your version control philosophies?  What helps you keep things organized so you can get things done?</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/c8JkGvn08Zk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2010/03/getting-started-with-version-control/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2010/03/getting-started-with-version-control/</feedburner:origLink></item>
		<item>
		<title>SWOT vs. Risk Management</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/s7lPoDqkHU4/</link>
		<comments>http://neverletdown.net/2010/02/swot-vs-risk-management/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 04:43:34 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Risk Management]]></category>
		<category><![CDATA[planning]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[swot]]></category>
		<category><![CDATA[team building]]></category>
		<category><![CDATA[threshold of success]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=174</guid>
		<description><![CDATA[I was recently asked by a coworker how software risk management is different from traditional SWOT analysis.  SWOT is a technique commonly used for strategic planning where the strengths, weaknesses, opportunities, and threats facing a group are compiled and analyzed to determine an appropriate course of action.  Software risk management (as defined using [...]]]></description>
			<content:encoded><![CDATA[<p>I was recently asked by a coworker how software risk management is different from traditional SWOT analysis.  <a href="http://www.sitepoint.com/blogs/2010/01/16/how-to-use-a-swot-analysis/">SWOT is a technique commonly used for strategic planning</a> where the strengths, weaknesses, opportunities, and threats facing a group are compiled and analyzed to determine an appropriate course of action.  Software risk management (as defined using the <a href="http://www.dtic.mil/cgi-bin/GetTRDoc?AD=ADA319533&amp;Location=U2&amp;doc=GetTRDoc.pdf">continuous risk management paradigm from the Software Engineering Institute</a>) is similar in that risk management can be used for strategic planning but risks yield much different information which is applied in a very different way.</p>
<p>The first step when performing a SWOT analysis is to define the business objectives.  This is very similar to defining a <a href="http://neverletdown.net/2010/01/threshold-of-success/">threshold of success in software risk management</a>.  The main difference is a business objective takes the form of the desired end state whereas the threshold of success is the minimum objectives necessary for the project to be successful.  For example, a perfectly valid business objective might be to deliver all 100 story points by the end of the year while the threshold of success might be to deliver the core functionality (worth only about 50 story points).  Would more stories completed be better?  Of course, but what if you end up only completing 75 story points by the end of the year?  How did you do?  You missed your goal, but you still succeeded right?  It’s difficult to tell without understanding the difference between wants and needs.</p>
<p>The main part of a SWOT analysis consists of a group session where strengths and weaknesses internal to the group and opportunities and threats external the group are identified.  People like to put SWOTs into a 4&#215;4 grid so it’s easier to look at.  <a href="http://richhorwath.wordpress.com/2010/02/05/top-5-swot-analysis-traps/">While there is some great advice out there for understanding what goes into a SWOT</a>, the analysis is largely subjective, relying on a teams’ gut feelings to know the strengths from the weaknesses, the opportunities from the threats.   Software risk management can be a much more systematic approach to understanding the potential dangers that face a project based on known facts when tools such as the <a href="http://www.sei.cmu.edu/reports/93tr006.pdf">SEI’s Taxonomy Based Questionnaire for risks</a> (pdf) are used.  Guts still come into play, but there is enough engineering in place to help people make the right decisions.</p>
<p>Risks are specifically actionable – depending on the risk you might be able to mitigate it by manipulating the timeline, impact of the consequence, probability of the risk occurring, or by addressing the condition.  You might transfer the risk to someone else or simply accept the risk.  SWOT by itself is merely a collection of statements relative to internal or external entities which may or may not actually be true.  Are you good at testing?  How do you know that?  <a href="http://searchengineland.com/hell-freezes-over-google-airs-super-bowl-a-35476">Is Bing really a threat to Google Search?</a> Should you do anything about your weaknesses?  Will they prevent you from achieving your business objectives?  Without further analysis there really is no way to know and other than prioritizing there really is no way to analyze a SWOT, nor is there any clear direction for next steps.</p>
<p>Look, when planning a project you really need <em>both</em> SWOT analysis <em>and</em> risk management.  <strong>SWOT is a tool for assessing capabilities while risk management is a tool for assessing the likelihood of success</strong>.  Each technique serves a very different purpose.  SWOT is most useful at the beginning of a project to help you figure out what you’re doing and come up with an overall strategy.  Risk management, though is an ongoing activity that makes sure you don’t fall flat on your face in trying to achieve your business objectives.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/s7lPoDqkHU4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2010/02/swot-vs-risk-management/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2010/02/swot-vs-risk-management/</feedburner:origLink></item>
		<item>
		<title>Why don’t you use Continuous Integration?</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/A3QvWttxk3c/</link>
		<comments>http://neverletdown.net/2010/02/why-dont-you-use-continuous-integration/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 04:22:15 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=165</guid>
		<description><![CDATA[Everyone has a chore they hate doing.   For me it’s cleaning the dishes.  I’m a busy guy so I usually don’t get around to cooking and eating dinner until fairly late.  Rather than cleaning anything, I stack the dishes in the sink and maybe soak a pan if something burned to [...]]]></description>
			<content:encoded><![CDATA[<p>Everyone has a chore they hate doing.   For me it’s cleaning the dishes.  I’m a busy guy so I usually don’t get around to cooking and eating dinner until fairly late.  Rather than cleaning anything, I stack the dishes in the sink and maybe soak a pan if something burned to the bottom.  If the dishwasher has space, I’ll load it and set it going but most nights I leave a big pile of dirty dishes sitting around.  After two or three nights of this, all the pots and pans are dirty and there’s no room for cooking thanks to the piles of dirty dishes.  It’s actually kind of disgusting.</p>
<p>My wife takes a slightly different tact.  After the meal is finished she immediately cleans all dishes, pots, pans, and utensils used while she was cooking.  She has the forethought to run the dishwasher beforehand so there is plenty of room to load dirty dishes after the meal.  She even wipes down the counter and stove so everything is ready for the next meal we cook.  She’s quite amazing actually and a good cook to boot (especially when she’s following a recipe).</p>
<p>Professional chefs take matters a step further still.  They clean as they cook.</p>
<p>I procrastinate doing something I hate and the result is a monumental, exhausting chore which takes an hour or more to finish.  My wife spends 10, 15 minutes tops a night &#8220;tidying up&#8221; and though she hates doing dishes just as much as I, she makes it seem effortless.  Professional chefs make miracles in the kitchen minutes at a time.</p>
<p><img title="Most husbands help with dishes" src="http://neverletdown.net/images/dishes.jpg" alt="vintage man cleaning dishes, woman watching" /></p>
<p>So it is with software.</p>
<p>Integrating software, even with a small team can be a chore.  Which would you prefer?  Approach A: write a lot of code, get everything working individually, and then do a big bang integration at the end; or Approach B: write a little code and integrate a little.  While putting off integrating might satisfy your immediate needs, much like skipping dishes and moving straight to dessert, Approach A is going to cost more than Approach B in the end.  Why?</p>
<ul>
<li>Integration problems aren’t uncovered until you integrate (profound, I know) so the longer you wait to integrate, the longer it takes to find out if there is a problem.  Of course, no one ever plans for problems&#8230;</li>
<li>Conflicts have further reaching consequences the longer you wait to fix them.  Modern version control systems usually do a pretty good job merging changes but even magic has its limits.</li>
<li>The full power of refactoring can’t be realized because the turnaround time on changes is too long.  The side effect is that you don&#8217;t refactor which means the code becomes more brittle over time.</li>
<li>More code changes means more time to bring it all together and a higher likelihood of introducing defects through integration.  Unless you’ve planned knowing that integration will take time, chances are good you’re going to ship late.</li>
</ul>
<p>Even better than big bang and nightly builds: continuous integration, cleaning as you code.  Automated build servers have made huge advancements over the past few years.  <a href="http://hudson-ci.org/">I highly recommend Hudson</a>.  It’s super easy to install and get started and has <a href="http://secretgeek.net/hudson_ci_green.asp">plug-ins for practically everything</a>.  There are even <a href="http://www.code-magazine.com/article.aspx?quickid=0906071">Hudson plug-ins for C#</a> and just about every version control system you could want (<a href="http://wiki.hudson-ci.org/display/HUDSON/Visual+SourceSafe+Plugin">and even some you don’t</a>).</p>
<p>Doing chores sucks, but don’t make it worse than it has to be by putting things off.  Continuous integration is a no brainer.  If I had a dishwashing machine that constantly washed dishes as I finished using them I would dance naked in the streets, celebrating the marvels of modern technology. (You should be thankful such a machine doesn’t exist.)</p>
<p>You really don&#8217;t have an excuse for not using continuous integration.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/A3QvWttxk3c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2010/02/why-dont-you-use-continuous-integration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2010/02/why-dont-you-use-continuous-integration/</feedburner:origLink></item>
		<item>
		<title>Threshold of Success</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/gnDlg4psGLw/</link>
		<comments>http://neverletdown.net/2010/01/threshold-of-success/#comments</comments>
		<pubDate>Sat, 16 Jan 2010 04:06:21 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Risk Management]]></category>
		<category><![CDATA[goals]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[planning]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=153</guid>
		<description><![CDATA[When I was a kid my brother and I used to play a game called Make Believe.  My favorite variant of the game was simple.  Together we would build some kind of fortress and then one person gets the fort and the other person tries to invade the fort.  In theory, the [...]]]></description>
			<content:encoded><![CDATA[<p>When I was a kid my brother and I used to play a game called Make Believe.  My favorite variant of the game was simple.  Together we would build some kind of fortress and then one person gets the fort and the other person tries to invade the fort.  In theory, the game ends when the fort has been overtaken by the invader.  What made the game fun was that as the invasion began, the rules of the game always changed.  The first thing to go was any notion of death.  If one of us was &#8220;killed&#8221; in battle then near instantaneous respawning was created.  Shortly after that we skipped respawing and simply became invincible.  Soon the fort became invisible which means the invader just has to run around trying to find it.  Sometimes someone gained super strength or the ability to force other people to move in slow motion.  We almost always created super weapons (such as a hand held Death Star) which for some reason could always be defended against.  Nearly every game ended in tragedy, someone crying or upset:  &#8220;That&#8217;s not fair!  You can&#8217;t do that!  I&#8217;m invisible!  You can&#8217;t do that!&#8221;</p>
<p>Kid&#8217;s stuff right?</p>
<p>A lot of software projects with teams made up of working adults still play this game.  The scenario goes something like this.  A team is put together to build some software.  Neither the clients nor the team talk about the objectives of the project other than building &#8220;some software&#8221;.  After a few months, something goes wrong or someone doesn&#8217;t like what&#8217;s happening so someone changes the rules.  Before too long, one side or the other is upset that they can&#8217;t win, somebody throws a fit, and goes home.  Instead of summoning invisible armor, software projects change the rules by cutting features, adding more requirements, moving due dates, wasting resources, and things like that.</p>
<p>We make believe that we&#8217;re software engineers.</p>
<p>While Make Believe was a fun game as a kid, changing the rules when there&#8217;s real money on the line isn&#8217;t as fun.  My brother and I ran into problems as kids because we got the objectives of the game wrong.  Actually, there were no common objects, which is why we could change the rules so easily.  The same thing happens on a software project when the objectives aren&#8217;t well known.</p>
<p>Defining and committing to a clear picture of success establishes the common ground rules for a project by making the basic project goals explicit.  The technique is known as Threshold of Success.</p>
<p><strong>Defining What Success Looks Like</strong></p>
<p>The Threshold of Success for a project is the <em>minimum</em> set of conditions that <em>must</em> be met for the project to be considered successful.  <strong> If the team fails to meet even one of the conditions then the project is a failure.</strong> A good Threshold of Success is made up of about 3-4 SMART goals (no more than a few bullets on a single PowerPoint slide).  <a href=" http://en.wikipedia.org/wiki/SMART_criteria">SMART is a mnemonic</a> which stands for Short/Specific, Measurable, Achievable, Relevant, and Time bound.</p>
<p>Some other pointers for defining a Threshold of Success:</p>
<ul>
<li>The Threshold of Success should be built as a team.  Since this is the measure by which you will define success or failure, everyone on the team must buy into it.  If you can include your client that&#8217;s even better.</li>
<li>Threshold of Success goals should be challenging, but it&#8217;s important that they are achievable.  If the goals are too easy, victory will be meaningless, too difficult, elusive.</li>
<li>Once the Threshold is established, don&#8217;t change it!  The only reason to modify the Threshold of Success is if the project has changed so drastically that the Threshold no longer makes sense (for example if someone leaves the project).</li>
<li>Revisit the Threshold of Success regularly (a good time is when planning iterations) so everyone remembers what success looks like.  Put it on your team wiki so that it&#8217;s readily accessible.</li>
<li>Be sure that the goals in your Threshold are SMART!  The point of defining a Threshold of Success is to take away the wiggle room for defining what it means to succeed or fail.  The goals you define should make this black and white.  The more specific the goal is the better.</li>
</ul>
<p><strong>Building a Threshold of Success</strong></p>
<p>The easiest way to create a Threshold of Success is to first create a minimum picture of failure, then convert failure into success.  Here&#8217;s an example:</p>
<p>Failure for my current project might look something like this.</p>
<ul>
<li>Essential features are not ready by the end of the second quarter.</li>
<li>Team members are dissatisfied or bored with their jobs.</li>
<li>Newly hired team members don&#8217;t feel like they&#8217;re part of the team by March 31.</li>
<li>There isn&#8217;t enough money to continue development after this fiscal year and we have to fire people.</li>
</ul>
<p>Now that I know what failure looks like, seeing success is easy.  I don&#8217;t want any of these things to happen.  The threshold of success for my current project might look something like this.</p>
<ul>
<li>By the end of the second quarter, all &#8220;Must Have&#8221; features are implemented and pass acceptance tests with no known critical defects.</li>
<li>All team members give average score of 5 or better on a job satisfaction survey taken quarterly.</li>
<li>By March 31, the team has successfully executed at least three team building activities with all team members present.</li>
<li>Funds of at least $1 million are secured by December 31 to allow for future development without a reduction in team size.</li>
</ul>
<p>Notice that only 1/4 of the success goals in this example are related to software functionality.  While goals might come from anywhere, teams traditionally focus on goals related to people and relationships, process, resources (such as budget or schedule), and product (software functionality and quality).</p>
<p><a href="http://www.sei.cmu.edu/library/assets/risk.pdf">As this technique originated with the Software Engineering Institute</a> (pdf), nearly every studio team in the Carnegie Mellon Master of Software Engineering program creates a Threshold of Success for their projects.  The <a href=" http://dogbert.mse.cs.cmu.edu/">MSE Studio Archive</a> has extensive examples of both good and bad pictures of success that teams have created.  <a href=" http://dogbert.mse.cs.cmu.edu/mse2009/projects/SquareRoot/wiki/threshold_of_success.html">The Square Root Team&#8217;s threshold</a> (my team) is a good place to start, but there are plenty of other examples.</p>
<p>There might be many goals for a project.  In the Team Software Process you actually identify at least three different kinds!  But there is only one threshold of success for a project.  Knowing what success looks like gives you a better chance of actually achieving it.  Without it, you&#8217;re just pretending that you know what&#8217;s going on.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/gnDlg4psGLw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2010/01/threshold-of-success/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2010/01/threshold-of-success/</feedburner:origLink></item>
		<item>
		<title>2010: The Year I Make Contact</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/mgNcHvgiVco/</link>
		<comments>http://neverletdown.net/2010/01/2010-the-year-i-make-contact/#comments</comments>
		<pubDate>Sat, 02 Jan 2010 02:23:39 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Leadership]]></category>
		<category><![CDATA[relationship]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=144</guid>
		<description><![CDATA[Late in the afternoon on December 25, during one of the loudest, howling winter storms I’ve ever experienced we lost power.  Normally this wouldn’t be a big deal except I was in a vacation house with 20 other people, basically my wife’s entire extended family.
After the power went out, the heat did not fire [...]]]></description>
			<content:encoded><![CDATA[<p>Late in the afternoon on December 25, during one of the loudest, howling winter storms I’ve ever experienced we lost power.  Normally this wouldn’t be a big deal except I was in a vacation house with 20 other people, basically my wife’s entire extended family.</p>
<p>After the power went out, the heat did not fire up.  The tree went dark.  So did the TV, DVD player, and Wii.</p>
<p>Using a pair of LED headlamps my wife and I received for Christmas the 20 of us took turns rolling and stuffing homemade ravioli dough for dinner.  Christmas ravioli making is extremely serious business and I had finally been promoted to “unmonitored ravioli stuffer” this year.  Luckily we had manual pasta rollers to flatten the dough.  There’s always talk of “upgrading” from the hand cranked system but this year, tradition trumped technology.</p>
<p>Once ravioli are stuffed, they have to dry for a few hours before cooking.  In the years past this was the time to play with new games or watch a new movie.  Of course, without electricity most of our new toys were rendered useless.</p>
<p>Since the heat was off and the vacation house was gigantic, the fireplace in the living room was our only option for warmth.  Lighting the room was the handful of candles we had, originally intended for dining ambiance, and the low glow from the fire.</p>
<p>To pass the time, we sang Christmas carols in the near dark.  It was all sort of surreal, a setting I am certain we would not have created on our own had we not lost electricity, had we not been so completely pushed out of our comfort zone.  Even more fantastic was that after over 20 years of putting it on my wish list, someone actually gave me a pair of <a href="http://www.amazon.com/gp/product/B0026G8SCI?ie=UTF8&amp;tag=nevletdowdotn-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B0026G8SCI">night vision goggles</a> for Christmas.  Surprisingly, this &#8220;toy&#8221; is the real deal.  I was able to wander around a completely pitch dark house with no problems.  The night vision, along with the head lamps (which single handedly saved dinner), were by far the best gifts of the day.  The electricity turned on around 1:00am that morning and by the next morning, everything went back to the way it was.</p>
<p>Sitting in the dark on Christmas night got me thinking.  This was an experience that I never would have chosen, a situation I would never have intentionally embraced, but it turned out to be pretty fun.  How many opportunities have I missed because my default attitude was to stay inside my comfort zone?  While happy accidents are great, can’t I do more to create opportunities rather than relying on happenstance?  Given the time of year it only seems appropriate to ask these sorts of questions.</p>
<p>I’m a technologist, a scientist, and an engineer at heart.  I love playing with gadgets, tinkering with software, and working on interesting and challenging problems.  Sitting in the dark with no power, my normal pursuits removed, it was easy to remember that people are important too.  Sure, when building software everyone always talks about how people are important, but when building software we call people &#8220;users&#8221; essentially reducing their humanity.  After all, there are only two industries where the customers are called &#8220;users&#8221; &#8211; software is one of them.  Is it really appropriate to use the same term to describe software clients and drug addicts?</p>
<p>My lesson from the night: the technology and gadgets and programming and processes and everything else are awesome, but they are meaningless if they fail to create a genuine relationship with people.  I do believe that <a href="http://neverletdown.net/2009/07/relationships-matter/">relationships matter and that people are important.</a> I’d like to do a better job of thinking about people first this year.  In the rush of excitement surrounding every new technological achievement, it’s sometimes easy to forget that helping people is why I build software.  It&#8217;s too bad it took a harsh winter snow storm to remind me of this.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/mgNcHvgiVco" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2010/01/2010-the-year-i-make-contact/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2010/01/2010-the-year-i-make-contact/</feedburner:origLink></item>
		<item>
		<title>The Domestication of Formal Methods</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/6HqMcLLHeFU/</link>
		<comments>http://neverletdown.net/2009/12/the-domestication-of-formal-methods/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 22:28:23 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Formal Methods]]></category>
		<category><![CDATA[affordance]]></category>
		<category><![CDATA[Anthony Hall]]></category>
		<category><![CDATA[Engineering]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[Z]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=131</guid>
		<description><![CDATA[Almost a full year ago, I concluded that formal methods simply aren’t worth the effort:
For almost every project in the world, I think formal methods should be generally avoided.  Given the option of spending money and time on mathematicians or extremely smart coders I would chose the latter.  With smart coders, code inspection [...]]]></description>
			<content:encoded><![CDATA[<p>Almost a full year ago, <a title="Thoughts on Formal Methods in Software Engineering by Michael Keeling" href="http://neverletdown.net/2009/01/thoughts-on-formal-methods-in-software-engineering/">I concluded that formal methods simply aren’t worth the effort</a>:</p>
<blockquote><p>For almost every project in the world, I think formal methods should be generally avoided.  Given the option of spending money and time on mathematicians or extremely smart coders I would chose the latter.  With smart coders, code inspection is a fun and effective defect filtering option.  And let’s face it.  <strong>Why would you have your amazing coders do something other than write amazing code?</strong></p></blockquote>
<p>But what if formal methods didn’t have to be so&#8230;formal?</p>
<p><a href="http://www.snorgtees.com/tuxedotshirtjesus-p-296.html"><img class="alignnone" title="I like to picture Jesus in a tuxedo T-Shirt because it says I want to be formal, but I’m here to party." src="http://neverletdown.net/images/tuxedo-tshirt-jesus.png" alt="" width="508" height="408" /></a></p>
<p>While traditional formal methods such as Z might be a little difficult to pick up if your predicate logic is rusty, applying formalisms that are close to the code doesn’t seem that outrageous in perspective.  Design-by-contract language extensions such as <a href="http://research.microsoft.com/en-us/projects/specsharp/">Spec# for C#</a> or <a href="http://code.google.com/p/pluralism/">Plural for Java</a> have been stealthily making their way into IDEs for years now without anyone really knowing the wiser, without anyone really thinking about these tools as being formal methods.  State machines in UML and even some uses of domain specific languages might be considered formal methods when these tools are used for specification and analysis purposes.</p>
<p>Creating formal methods that are close to the code is one of the best ideas to come out of the formal methods arena in the past 20 years.  Just like how adding cherry flavor makes it easier for kids to take icky tasting medicine, putting formal methods <em>in the code</em> makes it more likely that I, as a programmer, will actually use them.  Because no matter how good for me something is, if it’s difficult to use or generally unpleasant, it won’t get used.</p>
<p>This is why <a title="Software Mythbusters Explore Formal Methods (pdf)" href="http://neverletdown.net/papers/software-mythbusters-explore-formal-methods.pdf">domesticating formal methods</a> (pdf) is extremely important for formal method adoption.</p>
<p>Wild formal methods can be difficult to work with.  No matter what anyone tells you it does take time to get the hang of Z.  Formal methods such as Z have limited use when talking with customers and, though a formal specification is an excellent tool for gaining better understanding of functional requirements, the payoff for creating the specification isn’t seen for weeks or months making it difficult to justify their use in Agile development environments.</p>
<p>But is turning what was once a ferocious and unpredictable wolf into an obedient and trusted canine companion safe?  In selecting the features for our domesticated formal methods, did we accidentally breed out the most important benefits?</p>
<p><a href="http://neverletdown.net/images/wolf-and-domesitcated-dog.jpg"><img class="alignnone" title="Wolf and domesticated dog" src="http://neverletdown.net/images/wolf-and-domesitcated-dog.jpg" alt="" width="600" height="546" /></a></p>
<p>Anthony Hall outlined <a href="http://www.seas.upenn.edu/~lee/09cis480/papers/7myths1990.pdf">seven myths of formal methods</a> (pdf), ideas about formal methods erroneously taken as truth.</p>
<p><em>Myth 1: Formal methods can guarantee that software is prefect<br />
Myth 2: Formal methods are all about program proving.<br />
Myth 3: Formal methods are only useful for safety-critical systems.<br />
Myth 4: Formal methods require highly trained mathematicians.<br />
Myth 5: Formal methods increase the cost of development.<br />
Myth 6: Formal methods are unacceptable to users.<br />
Myth 7: Format methods are not used on real, large-scales software.</em></p>
<p>Any formal method worth using should not uphold any of Hall’s seven myths, but domesticated formal methods have the additional burden of usability.  Just like we expect certain behavior from our four-legged friends, I don’t think it’s too much to ask that a domesticated formal method be friendly and obedient.  Any method which bites the master’s hand obviously can’t be trusted.  Crashing, making it easy to make mistakes, <a title="Process Affordances: Ignore at your own Peril by Michael Keeling" href="http://neverletdown.net/2009/03/process-affordances-ignore-at-your-own-peril/">poor affordances</a>, difficult to read output, impossible to maintain specifications – these are all reasons for not trusting a domesticated formal method.</p>
<p>I think informal formal methods are great.  When done well, it doesn’t even feel like I’m using a formal method and I get many of the same benefits a wild formal method would give me – clarity, understanding, and maybe even a little automated verification depending on the language and method.  Domain specific languages and state charts are great for working with end users and clients.  It’s even plausible to skip other testing or verification measures such as unit testing or inspection.</p>
<p>And the best part is that since many domesticated formal methods are close to the code, I’ve already got the necessary training on how to use the methods because I already know how to program.  Domesticated formal methods are a win-win for programmers who want to do more engineering and another practical tool for your silver toolbox.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/6HqMcLLHeFU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2009/12/the-domestication-of-formal-methods/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2009/12/the-domestication-of-formal-methods/</feedburner:origLink></item>
		<item>
		<title>Groupthink Kills Big Ideas</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/AhIy4LOAl8M/</link>
		<comments>http://neverletdown.net/2009/11/groupthink-kills-big-ideas/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 02:58:00 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Leadership]]></category>
		<category><![CDATA[groupthink]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[Kathy Sierra]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=96</guid>
		<description><![CDATA[It’s easy to convince a group of people to follow you when you’ve got a great idea that you’re passionate about.  Passion is like a highly communicable virus, easily spreading from one host to another.  Something funny happens, though once enough people are on board with an idea:  new ideas become less [...]]]></description>
			<content:encoded><![CDATA[<p>It’s easy to convince a group of people to follow you when you’ve got a great idea that you’re passionate about.  Passion is like a highly communicable virus, easily spreading from one host to another.  Something funny happens, though once enough people are on board with an idea:  new ideas become less infectious over time as if the group has built up antibodies against risk.  It’s always unfortunate to see this happen since most organizations are initially brought together by an idea that was so risky and so contagious that everyone wanted to be a part of it.  Eventually, if an organization is not careful, it becomes a place where Big Ideas go to die, a sort of idea graveyard.</p>
<p><a title="Creating Passionate Users Blog: &quot;Death by Risk Aversion&quot; by Kathy Sierra" href="http://headrush.typepad.com/creating_passionate_users/2006/01/death_by_riskav.html">Kathy Sierra explains it best</a>:</p>
<p><a href="http://headrush.typepad.com/creating_passionate_users/2006/01/death_by_riskav.html"><img class="size-full wp-image-15" title="Death by Risk Aversion by Kathy Sierra" src="http://neverletdown.net/images/death-by-risk-aversion.jpg" alt="Death by Risk Aversion" width="353" height="419" /></a></p>
<p>Any time a new idea is brought to the table, especially a Big Idea, the group acts like white blood cells, attacking the Big Idea as if it were a foreign invader, reducing the idea to a benign and much less exciting version of itself.  The end result is something that no one can really get all that excited about.  It may get the job done but it certainly doesn’t inspire anyone.</p>
<p>It’s really difficult to fight off this group tendency.  It’s much, much easier to say no to something than yes, especially when there’s an established status quo.  Once a group (company, club, team, non-profit, whatever) feels safe, group risk aversion magnifies problems into insurmountable barriers.  <a title="Creating Passionate Users Blog: &quot;Incremental vs. revolutionary improvements&quot; by Kathy Sierra" href="http://headrush.typepad.com/creating_passionate_users/2005/03/incremental_vs_.html">Kathy Sierra (boy, do I miss her blog!) talked about this too</a>, avoiding risks leads to the safest route, but the safest route, ultimately will only yield incremental improvements:</p>
<p><a href="http://headrush.typepad.com/creating_passionate_users/2005/03/incremental_vs_.html"><img class="size-full wp-image-18" title="Incremental vs. Revolutionary Improvements by Kathy Sierra" src="http://neverletdown.net/images/incremental-vs-revolutionary-improvements.jpg" alt="Incremental vs. Revolutionary Improvements" width="493" height="287" /></a></p>
<p>In most cases, the barriers preventing new Big Ideas from being achieved are no bigger than the barriers overcome by the group when it formed.  The main difference is that there’re more people to get over the wall now than when it was just you and your Big Idea which brought the group together.</p>
<p>As a group it’s important to fight risk aversion which is often reinforced by <a title="Wikipedia: Groupthink" href="http://en.wikipedia.org/wiki/Groupthink">groupthink</a>.  It’s a difficult job, but if growth and innovation are goals, taking risks is an essential part of success.  Figuring out how to work with Big Ideas rather than fight against them (and in turn deal with risk as an organization) makes it easier to jump the wall as a group when and if the time comes.  Delegating is a great way to build practice taking risks  If you’re able to trust someone else to do something that you could reasonably do yourself you’re on your way to letting others run with their Big Ideas.</p>
<p>As an individual with a Big Idea, it’s important to quickly figure out whether your idea is something that has legs or whether it’s something better left to the back burner.  <a title="Seth's Blog" href="http://sethgodin.typepad.com/">Seth Godin’s</a> <a title="Amazon: The Dip by Seth Godin" href="http://www.amazon.com/gp/product/1591841666?ie=UTF8&amp;tag=nevletdowdotn-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1591841666">The Dip</a> has some simple advice but ultimately it’s up to you to determine.  If you yourself are not prepared to pull each and every member of the group over the wall that is blocking you from realizing your ultimate vision then it may not be time to unveil your idea to the group.</p>
<p>Both the group and the innovator have a part in killing a Big Idea or making it fly.  Recognizing that you have to work together is the first step toward achieving greater success.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/AhIy4LOAl8M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2009/11/groupthink-kills-big-ideas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2009/11/groupthink-kills-big-ideas/</feedburner:origLink></item>
		<item>
		<title>Exploring Archetypes of Architects</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/82AwfcNJbIM/</link>
		<comments>http://neverletdown.net/2009/10/exploring-archetypes-of-architects/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 17:56:17 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[architect]]></category>
		<category><![CDATA[OOPSLA]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=115</guid>
		<description><![CDATA[During a brainstorming session in a recent OOPSLA workshop I participated in we were discussing what qualities make for a &#8220;good&#8221; architect in an agile world.  I jotted down this list during the discussion based on the group brain dump.  Some archetypes are &#8220;good&#8221; while others are &#8220;bad&#8221; but I don&#8217;t think any [...]]]></description>
			<content:encoded><![CDATA[<p>During a brainstorming session in a <a href="http://mysite.verizon.net/dennis.mancl/oopsla09/">recent OOPSLA workshop I participated in</a> we were discussing what qualities make for a &#8220;good&#8221; architect in an agile world.  I jotted down this list during the discussion based on the group brain dump.  Some archetypes are &#8220;good&#8221; while others are &#8220;bad&#8221; but I don&#8217;t think any of them necessarily describe the perfect architect.  When you&#8217;re designing software, what kind of architect are you?  What kind do you prefer to work with?</p>
<p><strong>The Megalomaniac Architect</strong>:  &#8220;You will implement the system as I have designed it because I am the most important person on this team, the project will fail without me, and I am the only one smart enough to know everything that needs to be known!&#8221;</p>
<p><strong>The Benevolent Dictator</strong>:  &#8220;Implement the system precisely as I have designed it and I will make your work easier.&#8221; [via Dennis Mancl]</p>
<p><strong>The &#8220;Everything’s a Nail!&#8221; Architect</strong>:  All problems can be solved by a single tool, idea, or way of thinking.  He’s got a hammer…and everything he sees is a nail.</p>
<p><strong>The Diva</strong>: &#8220;I’m the architect of this system!  Are you questioning my ability to design?  If you’re not going to appreciate my talents, maybe I’ll just go to another team.&#8221;</p>
<p><strong>The Magician</strong>: Excellent at high level abstraction, vague on how the design actually achieves architectural drivers.</p>
<p><strong>The Over-Accommodating Architect</strong>: &#8220;You want that change?  No problem.&#8221;  There are no trade-offs to consider when making architectural decisions.</p>
<p><strong>The Chess Master</strong>:  To achieve victory, it is simply a matter of being able to see enough moves ahead.  Every element in the architecture can be strategically placed in a perfect position to checkmate your opponent:  requirements changes.</p>
<p><strong>The PowerPoint Architect</strong>: &#8220;Architecture is just pretty pictures!&#8221;</p>
<p><strong>The Ninja</strong>: Infiltrates a project from the outside, crafts an amazing design, then disappears into the shadows before anyone realizes he’s gone.  Ninjas do not suffer fools and their designs are technically correct, thorough, and beyond your ability to comprehend.</p>
<p><strong>The Navigator</strong>: Creates a map (with legend) and uses it to plot a course through implementation, testing, and deployment.</p>
<p><strong>The Movie Producer</strong>:  Leads the team indirectly by providing technical design support.  [<a href="http://rhinoresearch.com/blog">via George Fairbanks</a>]</p>
<p><strong>The Coach</strong>: Teaches the team about architectural practices and concepts as well as the design.</p>
<p><strong>The Puppeteer</strong>:  Able to manipulate multiple levels of abstraction simultaneously to design the architecture, the Puppeteer effortlessly manages the various threads influencing the design (commonly known as architectural drivers).</p>
<p><strong>The Seasoned Veteran</strong>:  He’s tried a lot of things and is pretty good at all of them including programming, design, processes, and management.  Thanks to his experience, having walked 10,000 miles, he understands the role of architecture across the lifecycle, has seen many different situations, and is an excellent technical practitioner. [<a href="http://www.amazon.com/gp/product/0201485672?ie=UTF8&#038;tag=nevletdowdotn-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0201485672">via Bill Opdyke</a>]</p>
<p><strong>The Long-Bearded Wise Man</strong>:  A little philosophical but always willing to share an enlightened thought that will help resolve whatever concerns are ailing the project, though somewhat indirectly.</p>
<p><strong>The Team Captain</strong>:  A bona fide member of the team, playing on the field with everyone else, leading the team from the field.</p>
<p><strong>The Design Evangelist</strong>:  Excited about the architectural drivers and architecture to the point of near fanaticism.   His enthusiasm for architecture and the system’s design is infectious and helps maintain conceptual integrity of the system.</p>
<p><strong>The Student</strong>:  Takes time to learn about the problem domain and the customer’s needs to the greatest extent possible so that he understands and solves the right problems. [<a href="http://www.instantiated.ca/">via Gail Harris</a>]</p>
<p>What other archetypes have you worked with?  Which archetypes do you think might combine to make the perfect software architect?</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/82AwfcNJbIM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2009/10/exploring-archetypes-of-architects/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2009/10/exploring-archetypes-of-architects/</feedburner:origLink></item>
		<item>
		<title>Tracking Bugs Better</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/_JJQChWpjIE/</link>
		<comments>http://neverletdown.net/2009/10/tracking-bugs-better/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 03:18:12 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[bug tracking]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[defect tracking]]></category>
		<category><![CDATA[defects]]></category>
		<category><![CDATA[process improvement]]></category>
		<category><![CDATA[process tailoring]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[Team Software Process]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[XP]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=99</guid>
		<description><![CDATA[Most software processes are light in two areas: quality assurance and process improvement.  Most processes prescribe specific techniques for ensuring the production of quality code.  XP for example advocates unit testing with TDD, continuous integration with smoke tests, pair programming, and acceptance tests written by the customer (using something like FIT so you [...]]]></description>
			<content:encoded><![CDATA[<p>Most software processes are light in two areas: quality assurance and process improvement.  Most processes prescribe specific techniques for ensuring the production of quality code.  XP for example advocates unit testing with TDD, continuous integration with smoke tests, pair programming, and acceptance tests written by the customer (using something like <a href="http://fit.c2.com/">FIT</a> so you can run automated regressions).  Process improvement in XP is accomplished in a &#8217;round the campfire, Kumbaya singing, get in touch with your feelings brainstorming session.  Assumptions abound and there is no systematic way of ensuring that either testing or process improvement is handled adequately.   As we know, <a href="http://mse-square-root.blogspot.com/2009/09/avoid-project-assumptions.html">assumptions are never good enough</a>.</p>
<p>The biggest assumption in XP (and indeed most software processes) is about bug tracking.  Common sense dictates that you will create some kind of bug database.  Hopefully it will at least be some kind of third party bug tracker such as <a href="http://www.bugzilla.org/">Bugzilla</a> or <a href="http://www.thebuggenie.com/">Bug Genie</a>.  Excel will work in a pinch but quickly becomes unsuitable for teams larger than one developer.  But how does the bug tracking actually work?  What bugs get reported?  Will you record issues from inspections in your bug tracker or only &#8220;true&#8221; bugs?  What is the process for fixing a bug?  What is the process for closing a bug?  Who has access to the bug tracker?  What information is required in your bug database and what information is optional?  How do you determine defect priorities?  Or the severity of bugs?</p>
<p>The majority of software processes provide answers for almost none of these questions.  You are largely on your own to make up whatever you think makes the most sense for your development environment based on the best practices for your software process and your understanding of &#8220;good&#8221; software quality assurance practices.</p>
<p>No matter what quality process you follow, you will need a defect control philosophy.  Once again, in absence of guidance I turn to the <a title="Amazon: Introduction to the Team Software Process" href="http://www.amazon.com/gp/product/020147719X?ie=UTF8&amp;tag=nevletdowdotn-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=020147719X">Team Software Process</a>, one of the few processes to define what it means to track defects.  In the Team Software Process, defects are treated as blight, a horrific mistake injected through the ineptitude of a developer.  To remove these blights, the TSP relies on a series of filters in the form of code reviews, code inspections, unit tests, function tests, and so on.  XP has a similar, though somewhat less rigorous set of filters in the form of pair programming, TDD, continuous integration, and acceptance tests.  Each filter is meant to remove more and more defects, until finally &#8220;all&#8221; defects are removed from the system by the time the software has passed through all the filters.  Generally each filter is intended to remove different types of defects, though it is conceivable to capture escaped defects from a previous filter in a later filter.</p>
<p>Just as water passing through layers of sand and rock will remove debris, so too will code passing through layers of unit tests and inspections sift out injected defects.</p>
<p><a href="http://neverletdown.net/images/water-filter.jpg"><img title="Multi-layered water filter" src="http://neverletdown.net/images/water-filter.jpg" alt="Water filter relying on a series of layers made of grass, sand, and charcoal to remove impurities from water." width="450" height="337" /></a></p>
<h4>Defect Data</h4>
<p>With these ideas in mind, bug tracking has three basic goals.</p>
<ol>
<li>Record defects so they can be analyzed and fixed.</li>
<li>Identify the means by which defects are injected.</li>
<li>Identify the means by which defects are removed.</li>
</ol>
<p>We write down bugs so we can go back and fix them later.  This is obvious. But bug data can be used to measure process improvement also.</p>
<p>Since many parts of a software process are dedicated to filtering out the defects we’ve injected, understanding how defects are injected is essential to preventing similar defects from being seen in the future.  The idea is that we want to learn from our mistakes.  To achieve this, record the type of defect and the reason it was injected.  The TSP gives us a good starting point for each of these, shown in the tables below.  You should feel free to modify the types and reasons so they make sense for you, your team, and your project.</p>
<p>The defect type characterizes what kind of defect is injected and captures the essence of what is needed to fix the defect.</p>
<table border="0">
<tbody>
<tr>
<th>Defect Type</th>
<th>Description</th>
</tr>
<tr>
<td>Documentation</td>
<td>Problems with documentation, documents, comments, or messages</td>
</tr>
<tr>
<td>Syntax/Static</td>
<td>This usually is a compile error.  These days, this is most applicable to dynamically interpreted languages such as JavaScript or Python since compilation is basically free.</td>
</tr>
<tr>
<td>Build/Package</td>
<td>Errors due to incompatible versions or problems with packages (e.g. Java).</td>
</tr>
<tr>
<td>Assignment</td>
<td>Incorrectly assigning a variable or method, for example an incorrect expression or object assignment, calling the wrong method, or missing an assignment or method call.</td>
</tr>
<tr>
<td>Interface</td>
<td>These are design problems, for example class interface issues or function parameter issues (e.g. order, type, or missing parameters).</td>
</tr>
<tr>
<td>Checking</td>
<td>Problems arising from incorrectly handling errors.  For example, an if-statement or loop invariant does not work as expected.</td>
</tr>
<tr>
<td>Data</td>
<td>Defects involving data representations within the software.</td>
</tr>
<tr>
<td>Function</td>
<td>Algorithmic or functional defects, usually involves more than a few lines of code.</td>
</tr>
<tr>
<td>System</td>
<td>Issues that result from outside the software, for example hardware timing issues or network problems.</td>
</tr>
<tr>
<td>Environment</td>
<td>This is development environment can is used to categorize problems in the environment such as compilers, frameworks, or support systems.</td>
</tr>
</tbody>
</table>
<p>
The defect&#8217;s reason characterizes why the defect was inject.</p>
<table border="0">
<tbody>
<tr>
<th>Reason</th>
<th>Description</th>
</tr>
<tr>
<td>Education</td>
<td>You didn’t really know how to accomplish something.</td>
</tr>
<tr>
<td>Communication</td>
<td>You were misinformed through either documentation or personal communications.</td>
</tr>
<tr>
<td>Oversight</td>
<td>You forgot to do something that you knew needed to be done.</td>
</tr>
<tr>
<td>Transcription</td>
<td>You understood what to do but you simply made a mistake.  (The Personal Software Process advocates writing down code, reviewing it, and transcribing it to the computer before compiling.  This is a bit of a throwback and I’m not sure that it really makes sense these days.  You might interpret this more loosely to be problems in translation from architecture or design to implementation).</td>
</tr>
<tr>
<td>Process</td>
<td>The process you are using led you astray by encouraging you to make a mistake.</td>
</tr>
</tbody>
</table>
<p>
Assigning the reason can be a little tricky.  I have found it is best if the person who injected the bug assigns the reason.  On small teams (or if you’re following the PSP), this is generally pretty easy.  It’s not about rubbing their nose in the problem &#8211; well, actually it is.  Ok, it’s not about embarrassing or punishing the person but creating an opportunity for learning from our mistakes.  If you can understand the reason why a defect was injected, it’s possible to prevent the defect from occurring again.  For example, if there seems to be a rash of education related defects in a particular module, perhaps some training is in order.</p>
<p>Ideally we’d also like to know when the defect was injected, as in at what phase of development.  It is possible to realize this information with additional analysis but I’ve found the return to be rather diminutive.  Basically, you’ll learn what we’ve known all along &#8211; that the longer a defect is in the system, the harder it is to get out and that the most expensive defects are injected during the earlier phases of development (e.g. design defects are costly).   Rather than track when things were injected I think it makes more sense to track when defects are detected. The point is to gain an understanding of how well the quality process filters out defects.  To accomplish this, simply write down what you were doing when you found the bug.  If you’re using XP, the list might include designing, writing new code (in a pair), writing new code (alone), refactoring, unit testing, integration, and acceptance testing.  With this information you should be able to determine how effective each activity filters defects and over time whether the quality process is having issues.  For example, I would expect interface defects to be detected during integration.  If they are being detected earlier, say during unit testing, or later, say during acceptance testing, then my continuous integration and smoke test suite might not be as robust as it should be.</p>
<h4>Better Bug Tracking</h4>
<p>The strategies I’ve outlined here are a little more sophisticated than your average bug tracker, but add a lot of punch for very little effort.  <strong>Tracking defect type, reason injected, and phase detected allow you to get a better handle not only on how defects are being injected into the software, but also how they are being detected.</strong> Both these chunks of information are necessary for understanding how defects are making their way into the system and how your process is helping you ferret them out of your system.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/_JJQChWpjIE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2009/10/tracking-bugs-better/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2009/10/tracking-bugs-better/</feedburner:origLink></item>
		<item>
		<title>Project Signaling</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/SwSyxxDs6oE/</link>
		<comments>http://neverletdown.net/2009/09/project-signaling/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 02:38:49 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Metrics]]></category>
		<category><![CDATA[binary metric]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[signal]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[trigger]]></category>
		<category><![CDATA[tripwire]]></category>
		<category><![CDATA[Van Halen]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=90</guid>
		<description><![CDATA[Van Halen may have known more about project management than most program managers.  Van Halen’s legendary &#8220;No Brown M&#38;Ms Rider&#8221; is simultaneously the greatest example of rock star excess and project signaling I’ve ever seen.  As David Lee Roth puts it:
The contract rider read like a version of the Chinese Yellow Pages because [...]]]></description>
			<content:encoded><![CDATA[<p>Van Halen may have known more about project management than most program managers.  <a href="http://www.thesmokinggun.com/archive/years/2008/1211081vanhalen1.html">Van Halen’s legendary &#8220;No Brown M&amp;Ms Rider&#8221;</a> is simultaneously the greatest example of rock star excess and project signaling I’ve ever seen.  <a href="http://www.snopes.com/music/artists/vanhalen.asp">As David Lee Roth puts it</a>:</p>
<blockquote><p>The contract rider read like a version of the Chinese Yellow Pages because there was so much equipment, and so many human beings to make it function. So just as a little test, in the technical aspect of the rider, it would say &#8220;Article 148: There will be fifteen amperage voltage sockets at twenty-foot spaces, evenly, providing nineteen amperes . . .&#8221;  This kind of thing. And article number 126, in the middle of nowhere, was: &#8220;There will be no brown M&amp;M&#8217;s in the backstage area, upon pain of forfeiture of the show, with full compensation.&#8221;</p>
<p>So, when I would walk backstage, if I saw a brown M&amp;M in that bowl . . . well, line-check the entire production. Guaranteed you&#8217;re going to arrive at a technical error.  They didn&#8217;t read the contract. Guaranteed you&#8217;d run into a problem. Sometimes it would threaten to just destroy the whole show. Something like, literally, life-threatening.</p></blockquote>
<p>In economics, <a href="http://en.wikipedia.org/wiki/Signalling_%28economics%29">signals are indicators that convey specific meaning between producers and consumers</a>.  For example, when you see THX on the side of a set of speakers, you know the speakers are going to probably be of audiophile quality. The THX logo is the speaker manufacturer&#8217;s signal to you, the consumer, that these speakers are really good.  To David Lee Roth and the Van Halen road crew, the presence of brown M&amp;Ms indicated that the hosting venue had not understood all details of the contract and had very likely made a mistake in configuring the set.  One mistake in this case could cause malfunctions during the show or even the death of a crew member.</p>
<p>As it turns out, signaling software projects isn’t that difficult.  <a href="http://www.joelonsoftware.com/articles/fog0000000043.html">The 12 step Joel Test</a> is a reasonable signal for software development companies.  While the Joel Test is nice for getting a feel for a company before you work for them, the concept is still useful once you’ve got the job and the project is in full swing.</p>
<p>Ultimately signals, also known as tripwires or triggers, are really just <a title="Never Let Down: Binary is a metric too!" href="http://neverletdown.net/2009/09/binary-is-a-metric-too/">binary metrics</a> for uncovering potential problems your project might be facing before the problems explode in your hands.  When some condition is met (the signal), you know it has specific significance and prompts certain actions to prevent a problem from occurring.  Triggers are most often used with risk management but their use should not be exclusive to that practice.  In fact, if you’re collecting real data, you have even more opportunities for identifying signals outside of risk management.</p>
<p>On past projects I’ve used signals for a variety of issues.  Here are some examples.</p>
<ul>
<li>During the past 3 iterations the team identified between 15 and 20 defects.  I expect a similar number of defects to be detected for this iteration.  If more defects are detected, there may be a disconnection in understanding between requirements, design, and implementation.  If fewer defects are detected, tests may not have been as rigorously defined as they should have been.</li>
<li>A Fagan inspection completed in less than one hour with a rate of 400 LOC/hour.  Since most inspections have covered only 250 LOC/hour it is likely that this inspection was not effective and the results not reliable since the inspection team sped through the code.</li>
<li>When evaluating potential open source libraries, Source Forge projects without a website shows a general lack of dedication to the project and indicates that the software is probably of poor quality or ill-maintained; the library is worth neither the time nor effort to use.</li>
<li>Tasks that have been estimated to require longer than 9 hours have probably not been thoroughly thought through.</li>
<li>No risks have been identified for this project or risks have not been updated for several iterations.  This implies that the team doesn’t have a realistic understanding of what problems the project faces.</li>
</ul>
<p>In each of these examples, when the signal is heard, I knew there was going to be a problem on the project.</p>
<p>Work with your team to establish signals for your project.  The best part is that once you’ve decided on the signals for your team, when triggers are tripped you can throw a Van Halen sized rock star fits in your cubicle!  Well, try to resist throwing your monitor out the window anyway.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/SwSyxxDs6oE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2009/09/project-signaling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2009/09/project-signaling/</feedburner:origLink></item>
		<item>
		<title>Binary is a Metric Too</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/zT4dOCe1b1g/</link>
		<comments>http://neverletdown.net/2009/09/binary-is-a-metric-too/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 21:07:51 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Metrics]]></category>
		<category><![CDATA[anlaysis]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[measurement]]></category>
		<category><![CDATA[measures]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[Tom DeMarco]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=76</guid>
		<description><![CDATA[Software developers are, in their heart of hearts, dataphiles &#8211; people who are absolutely in love with data.  When was the last time you had a passionate discussion about frame rates, hardware benchmarks, gadget specs, sports statistics, dungeons and dragons, the merits of high def&#8230;the list goes on.  Face it, you love data. [...]]]></description>
			<content:encoded><![CDATA[<p>Software developers are, in their heart of hearts, dataphiles &#8211; people who are absolutely in love with data.  When was the last time you had a passionate discussion about frame rates, hardware benchmarks, gadget specs, sports statistics, dungeons and dragons, the merits of high def&#8230;the list goes on.  Face it, you love data.  You love comparing things using data.  You don’t feel comfortable making decisions without a comprehensive comparison of data.</p>
<p>Why then do most software developers treat software development differently?</p>
<p>Tom DeMarco recently <a href="http://www2.computer.org/cms/Computer.org/ComputingNow/homepage/2009/0709/rW_SO_Viewpoints.pdf">brought his own famous quote into question (pdf)</a>, musing that not only is it possible to control what you can’t measure, but the most important stuff you need to control on a software project is impossible to measure.  <a href="http://neverletdown.net/2009/08/software-craftsmanship-engineering-by-coincidence/">Once again, DeMarco is wrong</a> (in my opinion anyway).  To prove his point DeMarco pointed at Wikipedia, something extremely valuable that was built without the use of metrics or formal control.  This is a romanticized view of Wikipedia.</p>
<h4>Wikipedia is one of the most controlled projects on the planet</h4>
<p>On the surface, Wikipedia is the Wild West of online content.  Not only can anyone edit any page, but content from Wikipedia is widely proliferated in the media and (sadly) school reports.  Wikipedia is the single greatest success of user generated content in the history of mankind (&#8221;The Internet,&#8221; as the medium, doesn’t count).  What started with a dozen humble articles has evolved into the most comprehensive encyclopedia ever created and includes everything from the fundamentals of science to the definitive source on Babylon 5.</p>
<p>What folks seem to forget is that even in the Wild West, there were laws and there were lawmen.  Though we love to think romantically about such brigands and gunslingers as <a href="http://en.wikipedia.org/wiki/Jesse_James">Jesse James</a>, <a href="http://en.wikipedia.org/wiki/Billy_the_Kid">Billy the Kid</a>, and <a href="http://en.wikipedia.org/wiki/Butch_Cassidy">Butch Cassidy</a>, most stories about these historic figures are greatly exaggerated.  So too is the case with Wikipedia.</p>
<p>Let’s take a closer look at the Wikipedia entry for Billy the Kid.  This article belongs to a number of internal WikiProjects, visible from the <a href="http://en.wikipedia.org/wiki/Talk:Billy_the_Kid">top of the article’s talk page</a>.  The <a href="http://en.wikipedia.org/wiki/Wikipedia:WikiProject_Biography">WikiProject Biography</a> is not unlike most projects in Wikipedia.  There are defined processes for <a href="http://en.wikipedia.org/wiki/Wikipedia:WikiProject_Biography/Assessment">assessing articles</a> and <a href="http://en.wikipedia.org/wiki/Wikipedia:WikiProject_Biography/Peer_review">conducting peer reviews</a>.  There are <a href="http://en.wikipedia.org/wiki/Wikipedia:WikiProject_Biography/Assessment#Quality_scale">rubrics defined for assessing the quality of articles</a> within the project.  People even take on specific roles and responsibilities within the project.  The collection of processes and information serves as the main means of coordination for contributors and helps the group control articles within the scope of the project.</p>
<p><a href="http://en.wikipedia.org/wiki/Wikipedia:WikiProject_Biography/Assessment#Statistics">The WikiProject Biography even collects metrics on articles</a> which it then uses to make decisions concerning the articles under the project.  The metrics are derived from quantifiable data and <a href="http://en.wikipedia.org/wiki/Wikipedia_talk:WikiProject_Biography/Assessment#What_do_you_use_the_article_class_statistics_for.3F">help control the project</a>.</p>
<p>As it turns out, Wikipedia is not the lawless territory of the internet it has been made out to be.</p>
<h4>You can measure the immeasurable</h4>
<p>Wikipedia works because people were able to figure out ways to measure things that usually can’t be measured.  The fundamental principle that many people overlook is that binary is a metric too.  Yes or no questions can be just as effective a measure as any complex metric.  Did everyone fill out their task data today?  Yes or no.  Did the estimate match the actual?  Yes or no.  Did the test pass?  Yes or no.  Is the project done?  Yes or no.  Have we identified risks? Yes or no.  Has this risk become a problem?  Yes or no.</p>
<p>At the heart of every complicated metric is really a series of yes or no, binary questions.  When considering whether the project is done, you have to define done.  One way of defining done is in terms of a checklist.  Is feature 1 done?  Is feature 2 done?  Defining done for a feature could be as simple as checking whether all the tests have passed for the feature, again a binary measure.</p>
<p>For more subjective assessments, you can rely on observation-based, experience-defined rubrics.  Does the team get along with one another?  In the simplest form, this could be a binary metric (Am I friends with everyone on the team?) but it could also be more complicated relying on gut feelings and a guiding rubric (&#8221;we never hang out together and don’t trust one another&#8221; might indicate low harmony while &#8220;we hang out often and feel comfortable sharing personal stories&#8221; could indicate high harmony).  Teachers use rubrics and experience to judge subjective assignments everyday.  The difference is that they slap a grade on it and send it home as a report card.</p>
<p>While DeMarco is correct that many of most critical things in a project are the most difficult to measure, it is possible to create measurements if you feel it is important enough to do so.  How would you assess whether you have a good architecture that solves the problem at hand?  Rubrics might play a part but so too might binary gates based on quality attribute scenarios or intricate observations concerning design trends over time.  If you think hard enough, you&#8217;ll find that it&#8217;s extremely easy to find measuring points for nearly every aspect of a software project.</p>
<h4>Whatever you do, don’t become a mindless, data-driven robot</h4>
<p>I love data and I know you do to.  While it’s tempting to inject data collection and derive metrics for every aspect of a project (because it’s fun and informative!) don’t.  Collecting data and calculating metrics can be expensive.  Not so expensive that you shouldn’t use it, but expensive enough so that you shouldn’t use it on everything.  I like to compare using metrics to eating out at restaurants.  Once or twice a week isn’t that big a deal, but it’s not something you should do every day if you’re trying to watch your budget.</p>
<p>DeMarco is right about one thing: control is not the end-all-be-all of software engineering.  Consider carefully, what are the most risky parts of my project?  What are the parts of my project that even require control?  What are the parts in which I need more insight or want to improve?  Strategically develop metrics for these areas and don&#8217;t worry about measuring the rest.  Trust me, the world won&#8217;t end.  If you don’t know what you’re doing, start with a simple binary measure.   And above all, <a href="http://neverletdown.net/2009/06/kenny-rogers-guide-to-software-process-improvement/">if something isn’t working, change it</a>.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/zT4dOCe1b1g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2009/09/binary-is-a-metric-too/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2009/09/binary-is-a-metric-too/</feedburner:origLink></item>
		<item>
		<title>Software Craftsmanship: Engineering by Coincidence</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/UF1NfLYz7es/</link>
		<comments>http://neverletdown.net/2009/08/software-craftsmanship-engineering-by-coincidence/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 00:26:50 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Jeff Atwood]]></category>
		<category><![CDATA[Metrics]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[Tom DeMarco]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=69</guid>
		<description><![CDATA[I was extremely disappointed to read a recent article on Coding Horror reflecting on an IEEE editorial written by Tom DeMarco.  If you have not already, please read Tom DeMarco’s article now.  It’s only two pages and it’s well written.
With all due respect, Tom DeMarco is wrong.
And Jeff Atwood made things worse.
According to [...]]]></description>
			<content:encoded><![CDATA[<p>I was extremely disappointed to read <a title="&quot;Software Engineering: Dead?&quot; by Jeff Atwood" href="http://www.codinghorror.com/blog/archives/001288.html">a recent article on Coding Horror</a> reflecting on an IEEE editorial written by Tom DeMarco.  If you have not already, please read <a title="&quot;Software Engineering: An Idea Whose Time has Come and Gone&quot; by Tom DeMarco" href="http://www2.computer.org/cms/Computer.org/ComputingNow/homepage/2009/0709/rW_SO_Viewpoints.pdf">Tom DeMarco’s article now</a>.  It’s only two pages and it’s well written.</p>
<p>With all due respect, Tom DeMarco is wrong.</p>
<p>And Jeff Atwood made things worse.</p>
<p>According to Atwood’s interpretation of DeMarco, since we can’t control software projects, there is no sense in trying to engineer software.</p>
<blockquote><p>What DeMarco seems to be saying &#8212; and, at least, what I am definitely saying &#8212; is that control is ultimately illusory on software development projects.  If you want to move your project forward, the only reliable way to do that is to cultivate a deep sense of software craftsmanship and professionalism around it.</p></blockquote>
<p>Atwood’s conclusion simply is not supported by DeMarco’s article.  DeMarco made two points in his piece.</p>
<ol>
<li>We don’t have as much control over software as we think we do &#8212; even when we can measure the software on which we work.</li>
<li>We should be focusing more on the upfront &#8220;conception&#8221; activities than the areas that currently receive the most attention, construction.</li>
</ol>
<p>My interpretation of &#8220;conception&#8221; activities are things like requirements, architecture, and design &#8212; details that ultimately help you figure out whether it makes sense to build the thing you think you want to build.  By framing DeMarco’s argument as &#8220;craftsmanship&#8221; vs. &#8220;engineering&#8221; Atwood misses the whole point and reopens the tired <a title="&quot;Software Engineering: Art or Engineering&quot; by Michael Keeling" href="http://neverletdown.net/2009/05/software-engineering-art-or-engineering/">art or engineering debate</a>.</p>
<p>Overlooked by Atwood, DeMarco never questioned the idea that software should be engineered.</p>
<blockquote><p>I’m gradually coming to the conclusion that software engineering is an idea whose time has come and gone.  <strong>I still believe it makes excellent sense to engineer software.</strong> But that isn’t exactly what software engineering has come to mean.  The term encompasses a specific set of disciplines including defined process, inspections and walkthroughs, requirements engineering, traceability matrices, metrics, precise quality control, rigorous planning and tracking, and coding and documentation standards.  All these strive for consistency of practice and predictability.</p></blockquote>
<p>DeMarco is really saying that the engineering part of software engineering has become overshadowed by a collection of best practices for building software.  In my mind this isn’t necessarily a bad thing.  All it means is that what has become known as &#8220;software engineering&#8221; is different than the original definition intended by the NATO Conference on Software Engineering.</p>
<p>But by discounting current software engineering practices, DeMarco dismisses the real engineering that went into advancing the field to where it is today.</p>
<p>DeMarco seems to imply that what we really want software engineering to be&#8211;<a title="IEEE Computer Society software engineering definition" href="http://www2.computer.org/portal/web/swebok/html/ch1#Ref1">the application of systematic, disciplined, quantifiable approaches to the development of software</a>&#8211;and what software engineering has become cannot coexist.  Essentially, to reach a state where metrics and measures, quantifiable approaches, are used correctly and consistently by the software development community we must stop using the term &#8220;engineering&#8221; to describe the current set of practices.</p>
<p>This is backwards thinking.</p>
<p>Engineering is more than something you do; it’s also a way of thinking about problems and solutions.  Reaching the point in software engineering that we are today required systematic, disciplined, and quantifiable thinking.  Over time results of this thinking have been codified into the set of best practices that most developers now take for granted.</p>
<p>For example, we know that there is a 100x or more difference in costs between defects discovered later in the software lifecycle than earlier.  We know that certain practices can effectively remove defects at different costs and at different times throughout the lifecycle (for example, inspection vs. prototyping vs. unit testing vs. system testing).  We also know that historical data is an excellent indicator of future performance on software projects.</p>
<p>Systematic, disciplined, quantifiable thinking was required to make these discoveries.</p>
<p>Because of these codified best practices, it is not always necessary to conduct experiments on a project to trust that they are working.  I know unit testing combined with regular system integrations will flush certain defects from my software before those defects become a problem during system testing.  I know that statistical analysis of collected task tracking data will help me better predict how long future tasks of a similar size will take.  It doesn’t matter whether I completely understand the engineering behind the practice or whether I simply follow the process or use the tool.  The benefits will be the same.</p>
<p>Does that make me less of an engineer?  I don’t think so.</p>
<p>Using best practices codified as processes, methods, or tools on a software project means you are engineering software whether you like it or not.  With many of these practices, the control mechanisms are already built in so you don’t realize that you’re already controlling your project.  As DeMarco points out, it simply isn’t necessary that every engineering detail be painstakingly scrutinized for a project to be successful.  For many projects, the essence of the project is sufficient to overcome the accidents encountered when engineering by coincidence.</p>
<p>But just because you engineer by coincidence it doesn’t make you a software craftsman.  To prove it, I’m calling Jeff Atwood out.  Jeff, I dare you and the Stack Overflow team to take the PSP Challenge.  Take a course on the <a title="CMU Distance PSP Course Information" href="https://acis.as.cmu.edu/gale2/open/Schedule/SOCServlet?CourseNo=17602&amp;SEMESTER=F09&amp;Formname=Course_Detail">Personal Software Process</a>, honestly give it a try &#8212; use actual software engineering for a few weeks &#8212;  then tell me that software engineering is dead.  But don’t knock it until you’ve tried it.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/UF1NfLYz7es" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2009/08/software-craftsmanship-engineering-by-coincidence/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2009/08/software-craftsmanship-engineering-by-coincidence/</feedburner:origLink></item>
		<item>
		<title>Relationships Matter</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/epXjdb71e34/</link>
		<comments>http://neverletdown.net/2009/07/relationships-matter/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 03:41:01 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Leadership]]></category>
		<category><![CDATA[Kathy Sierra]]></category>
		<category><![CDATA[relationship]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=61</guid>
		<description><![CDATA[Building a great software product is only half the battle.  The relationship the user builds with your software has the single greatest influence on how awesome that software is.  Sorry.  It’s not the language the software is written in.  It’s not the algorithms.  It’s not all the processes you used [...]]]></description>
			<content:encoded><![CDATA[<p>Building a great software product is only half the battle.  The relationship the user builds with your software has the single greatest influence on how awesome that software is.  Sorry.  It’s not the language the software is written in.  It’s not the algorithms.  It’s not all the processes you used behind the scenes to create it.  If the relationship sucks, your software sucks.  Period.</p>
<p>To prove this I’m going to use a tangentially-related personal experience that has absolutely nothing to do with software.  In this case, it’s ok, because realistically, this bit of reflection actually has nothing to do with software – remember it’s about relationships.  Let’s talk about two concerts I&#8217;ve seen this summer.</p>
<h4>Coldplay:  “You’re Awesome!”</h4>
<p>I’ve heard Coldplay’s radio hits but I was never really a huge fan of the band.  Had it not been for a friend’s invitation I would never have gone to this concert and I would have missed out on one of the best live shows I’ve seen.  Acceptable radio hits became handcrafted masterpieces, more amazing live than on FM.  The most interesting part of the show, and the thing that left the greatest impression on me, was the band’s absolute humble devotion toward the fans in attendance.  At one point the band walked out to mini-stages set up in the seated area under the pavilion and way out in the lawn, giving all fans an equal chance to be a part of the show, not just the diehards that purchased overpriced tickets.</p>
<p>Coldplay’s attitude created a completely positive vibe that made me want to enjoy myself.  After they had exhausted themselves for close to two hours, doing everything possible to create a positive experience for the audience, Coldplay thanked us, not for coming to see them, but for allowing them to play for us, “You’re awesome, thank you for letting us play for you tonight!”</p>
<h4>Dave Matthews Band – &#8220;We&#8217;re Awesome!&#8221;</h4>
<p>I didn’t realize that Dave Matthews Band live shows are really just one long meandering jam session.  Every one of the band members is an amazing musician, but 14+ minute songs start to wear after a while.   Dave Matthews rarely spoke (when he did it was incomprehensible) and most of the band wore sunglasses throughout the entire show.  Overall, it was a very mediocre concert that was better suited to an afternoon picnic setting than an evening at a large outdoor amphitheatre.  From a technical perspective it was amazing but overall it failed to entertain me.</p>
<p>The most interesting thing about this concert was the crowd.  In spite of the fact that the band seemed to be playing solely for their own amusement, the audience was full of absolute fanatics, complete with <a href="http://jhockey.files.wordpress.com/2008/02/douchebag.jpg">their own dress code</a> &#8211; plaid shorts and tie dyed shirts (though rarely together) with sandals &#8211; and a shared emotional connection to every song the band played.  Dave Matthews Band is here to play music &#8211; If you like it, whatever, if you don’t, whatever.  &#8220;We had a fun time tonight and I hope you did too!&#8221;</p>
<h4>It&#8217;s all About the Relationship</h4>
<p>It turns out that the relationship the bands built with the audience during the show was directly related to how much I enjoyed it.  It should be pretty obvious how this extends to software.  The relationship your software builds with your users will determine how much they enjoy using it.  Is your software helping users be amazing or does your software expect users to change their behaviors to use it?  Are you building something for yourself that others might happen to like or are you targeting a specific audience?</p>
<p>Software that is technically the best will always fall short to similar software that builds a relationship.  <a href="http://headrush.typepad.com/creating_passionate_users/2005/11/if_your_softwar.html">Kathy Seirra expressed a similar sentiment with her Dating Rules for Software</a>.  But there’s a small catch to Kathy’s rules as exhibited by the Dave Matthews Band.  Apple tends to act this way too.  Sometimes if you do your own thing and you actually are great, you can afford not to focus on the relationship.  It’s extremely difficult but sometimes it works.  Sacrificing the relationship creates a razor thin margin for error but when you get it right, you’ll breed fanatics that will love you (almost) unconditionally and critics who will absolutely hate you – there is no mediocrity.</p>
<p>Sacrifice the relationship and you <em>could</em> be the best, but only until someone almost as good comes along who thinks about others before themselves.  I think Microsoft has learned that lesson the hard way.  No matter what you do, relationships rule the day.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/epXjdb71e34" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2009/07/relationships-matter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2009/07/relationships-matter/</feedburner:origLink></item>
		<item>
		<title>Kenny Rogers’ Guide to Software Process Improvement</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/u6LGRvlQWDE/</link>
		<comments>http://neverletdown.net/2009/06/kenny-rogers-guide-to-software-process-improvement/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 00:37:26 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[CMM]]></category>
		<category><![CDATA[CMMI]]></category>
		<category><![CDATA[process improvement]]></category>
		<category><![CDATA[ROI]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=50</guid>
		<description><![CDATA[Process improvement is a tricky mistress.  Usually it’s sufficient to feel that something can be done better, but often, especially for larger organizations or folks looking for higher CMMI rankings, it’s necessary to quantify improvements in terms of measurable effects.  There is a cost to process improvement; every hour spent beefing up process is an [...]]]></description>
			<content:encoded><![CDATA[<p>Process improvement is a tricky mistress.  Usually it’s sufficient to feel that something can be done better, but often, especially for larger organizations or folks looking for higher CMMI rankings, it’s necessary to quantify improvements in terms of measurable effects.  There is a cost to process improvement; every hour spent beefing up process is an hour less spent doing &#8220;real&#8221; work.  And if you optimize out the wrong processes it could seriously damper development.  The key is to determine the most cost-effective changes and only execute those process improvements.  <a title="Measuring the ROI of Software Process Improvement by Rini van Solingen" href="http://virtual.vtt.fi/virtual/proj1/projects/moose/docs/ieeesoftware_measuring_roi%20of%20spi.pdf">Return on investment analysis is one way to understand cost-effectiveness (PDF)</a>, but I’ve found this technique conceptually difficult to apply to software.  How much is quality worth?  How do you put a dollar amount on developer happiness?  What’s a line of code worth to you?  It’s enough to make your head spin, but a good friend of mine, <a title="The Gambler video on YouTube." href="http://www.youtube.com/watch?v=wbGs8kdf1hw">Kenny</a>, once gave me some great advice that helps me keep things straight.</p>
<h4>You’ve got to know when to hold ‘em</h4>
<p>When you’ve got a process that works, keep using it.  It’s a great feeling and there isn’t much better than finding a process that works well for you and your team.  When you finally settle on a process that works it can lead to a boon of productivity.  If you’re disciplined enough to capture data, use it to prove that your processes are actually working.  If you aren’t the data type you’ll have to rely on heuristics and intuition and the best heuristic I’ve found is the KA Index.  The KA Index is a subjective measure of how much your team Kicks Ass.  The best processes are the ones that make you awesome &#8211; fewer defects discovered in the field, better predictions of when you’ll finish tasks, fewer fires to fight &#8211; all of these are &#8220;gut measurable&#8221; data points indicating that your process is probably working.</p>
<p>Your gut can get you far but eventually you’ll need data to convince your boss to make the investment.  I can highly recommend the <a title="A Discipline for Software Engineering by Watts Humphrey." href="http://www.amazon.com/gp/product/0201546108?ie=UTF8&amp;tag=nevletdowdotn-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0201546108">Personal Software Process</a> if you’re interested in learning how to use data to objectively measure your processes.</p>
<h4>Know when to fold ‘em</h4>
<p>When you’ve got a process that isn’t working, drop it.  Data can be used here too if you’re collecting it.  If you’re not, I’ve found <a title="Process Affordances: Ignore at Your own Peril" href="http://neverletdown.net/2009/03/process-affordances-ignore-at-your-own-peril/">carefully examining process affordances to be helpful</a> in uncovering bum processes but affordances can be extremely subtle.  The trick when giving up a process is to quit strategically &#8211; not too early, before you might see benefits, and not too late, after you’re experiencing severe problems.  (<a title="The Dip: A Little Book That Teaches You When to Quit (and When to Stick)" href="http://www.amazon.com/gp/product/1591841666?ie=UTF8&amp;tag=nevletdowdotn-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1591841666">The Dip</a> by Seth Godin is an excellent, short read on this subject.)  The other thing to look out for is the cost of dropping the process.  Even if your process is terrible, if worse habits fill the process vacuum you could be worse off.</p>
<h4>Know when to walk away</h4>
<p>Once you’ve decided to abandon a problem process it usually pays to gently transition to something else.  Changing processes can be expensive between learning curve, tool changes, and the requisite burn-in period when trying out something new.  If your bum process is only killing your team slowly, take a little time to read up on a replacement and avoid setting yourself up for failure.  For example, when my team switched to Scrum, we finished the iteration we were in when we decided to make the switch before making drastic changes to our operating procedures.</p>
<h4>Know when to run</h4>
<p>If your process is absolutely killing you, drop it.  Immediately.  When considering this route I recommend a thorough impact analysis including some back-of-the-envelope ROI calculations.  Changing a horse mid race will be expensive, I’ve seen it happen enough times in the DoD to know that you will pay dearly in the short term, but if the long term costs justify the change and you’re willing to go through the pain, do not hesitate to make the change.</p>
<h4>Never Count your money when you’re sitting at the table</h4>
<p>Generally I’ve found that processes out of a book need a few iterations of development before I’m able to understand how they really work and how I’m supposed to use them.  If you’re following an established process (XP, Scrum, TSP, <a title=" Architecting Software Intensive Systems: A Practitioners Guide by Anthony Lattanzi" href="http://www.amazon.com/gp/product/1420045695?ie=UTF8&amp;tag=nevletdowdotn-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1420045695">ACDM</a>, and so on), then try to follow it to the letter before tailoring it.  Most processes have built in mechanisms for changing them once you’ve gained some experience and by all means, tailor once you know something doesn’t work.</p>
<h4>There’ll be time enough for counting when the dealings done</h4>
<p><a title="Coding Horror: The Project Postmortem" href="http://www.codinghorror.com/blog/archives/000736.html">Postmortems are one of the most powerful tools in your silver toolbox</a>.  No matter how the project goes down, always take the time to reflect on what happened, why, and what you should have done so you can use that knowledge next time.  Personally, I hate the idea &#8220;lessons learned&#8221; and much prefer recommendations for next time.  &#8220;Lessons learned&#8221; implies that you’ve learned the lesson and no further action is required but this is hardly the right attitude for effective software process improvement.</p>
<h4>Every process is a winner and every process is a loser</h4>
<p>So every software engineer knows that the secret to surviving, is knowing what to throw away and knowing what to keep.  And in the right hands, the right process can be a savior while under the wrong circumstances the same process might kill a project.  I can’t offer any concrete advice other than to not be afraid of data, listen to your instincts, and look back on what you’ve done.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/u6LGRvlQWDE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2009/06/kenny-rogers-guide-to-software-process-improvement/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2009/06/kenny-rogers-guide-to-software-process-improvement/</feedburner:origLink></item>
		<item>
		<title>Software Engineering: Art or Engineering?</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/Sm-ZBHDOjxs/</link>
		<comments>http://neverletdown.net/2009/05/software-engineering-art-or-engineering/#comments</comments>
		<pubDate>Wed, 13 May 2009 22:59:02 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[art]]></category>
		<category><![CDATA[creativity]]></category>
		<category><![CDATA[education]]></category>
		<category><![CDATA[opinion]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=43</guid>
		<description><![CDATA[For some reason software engineers and others who deal with software love sitting around debating whether software engineering is more art or engineering.  Part of the problem comes from how software engineering came to be, the term assigned as more a challenge by the NATO Science Committee for the software industry to get its [...]]]></description>
			<content:encoded><![CDATA[<p>For some reason software engineers and others who deal with software love sitting around debating whether software engineering is more art or engineering.  Part of the problem comes from how software engineering came to be, the term assigned as more <a title="Downloads for the reports from the 1968, 1969 NATO Software Engineering Conferences" href="http://homepages.cs.ncl.ac.uk/brian.randell/NATO/">a challenge by the NATO Science Committee for the software industry</a> to get its act together; one great big label to talk about many things.  Software engineering covers all aspects of software development including requirements, formal modeling, estimation, planning, tracking, managing people, processes, designing, coding, testing, deploying, and maintaining just to mention the most obvious required skill sets.  Some aspects of software engineering are not heavily engineering oriented and require no mathematical or scientific reasoning such as requirements and managing people.  Many aspects can benefit greatly from a mathematical background but math is not required to “get by” such as when writing code, testing, or planning a project.  This is unfortunate.  Confusion and arguments abound among both the academic and professional software engineering communities creating holes in the professional software world where no talent amateurs defend abominable code and runaway projects under the guise of “artistic expression.”   Software engineering is an engineering discipline.</p>
<p>I’m not saying there isn’t a creative component to software engineering.  In fact, there is a huge creative component and creative problem solving is essential for building great software.  I’m also not saying that code and the resultant software can’t be aesthetically pleasing.  It absolutely can and should have good aesthetics.  I enjoy reading well written, elegant code and always do the best I can when writing software myself.  What I am saying is that art is more than just creativity and elegance and in almost all cases, software falls well short of art.  Since the vast majority of software is not art, why should the people who wrote it be considered artists?</p>
<p>My neighbor upstairs is an artist in the traditional sense.  He writes and plays music, he paints, he makes stained glass, and he’s a professor of eurhythmics (more specifically <a title="Dalcroze Society of America" href="http://www.dalcrozeusa.org/home.html">Dalcroze Eurhythmics</a>) at Carnegie Mellon University.  As you can imagine, he’s a really cool guy.  He’s actually one of a handful of eurhythmics grand masters in the world and attended the world eurhythmics conference in Tokyo this past summer.  From what I gathered from talking with him, eurhythmics is a way of studying art through the body’s motions.  The most obvious application is music and dance but it’s not too difficult to imagine a painter creating a masterpiece; moving with the flow of the painting as it is created.</p>
<p>Some have even tried applying eurhythmics to study other, non-traditional art forms such as architecture and even mathematics.  He explained it to me something like this.  A brilliant mathematician working on an elegant proof might be considered more of an artist.  But only someone truly brilliant who is in the zone, able to see all the connections of the work with unbridled clarity, tuning out the outside world (much like flow when programming), with body and mind working as one to solve a proof might be considered to be making art rather than doing math.  It’s an extreme extension of eurhythmics theory, but it seems plausible.</p>
<p>The argument for treating software engineering as an art form is similar.  Writing software could be considered art but only in the hands of truly brilliant software developers (<a title="&quot;Hackers and Painters&quot; by Paul Graham" href="http://www.paulgraham.com/hp.html">Paul Graham calls them hackers</a>) and only when those truly brilliant software developers are in the zone, building something amazing.  Everyone else is just writing code.  Much like how no one would consider multiplication tables artistic, anyone who considers churning out code without intention or understanding of what is written as art is kidding themselves.  Looking at software engineering from the perspective of eurhythmics lets us state this more as a fact than an opinion.</p>
<p>Making this distinction is important because treating software like art and software engineers like artists is damaging to the industry.  Only the greatest, most brilliant developers might ever have the ability to build software as artists.  Everyone else is just trying to get by, much like the many thousands of starving artists who are never discovered, never hit it big, or whose muse never makes it around for a visit.  Treating software like art allows developers who don’t have the artistic chops to have the excuse of creating poor quality software that is not fit for the purposes of its creation.</p>
<p>Fitness for purpose is another key distinction.  Art exists to evoke emotion but software has a utility.  In many cases, software is too important for it to not work correctly.  Approaching software development from an engineering perspective creates an environment where it is possible for the rest of us to create working software that is still fit for purpose.  Again, I’m not saying that software can’t be have good aesthetics, it should, I’m simply saying that a systematic, critical, methodical, mathematical, scientific approach to building software is required for most people to succeed – much like how architects need a solid foundation in physics and engineering to build beautiful buildings.</p>
<p>I like the idea of software as art.  Artists are cool and thinking of myself as an artist allows me to justify extravagant behavior that, as a creative knowledge worker, I know I need.  On the other hand, I rarely care about using software as a medium for creating an emotional experience for my users.  I only really care about <a title="&quot;It's the [?], stupid!&quot; by Kathy Sierra" href="http://headrush.typepad.com/creating_passionate_users/2006/02/its_the_stupid.html">creating something great that helps users kick ass</a> while accomplishing whatever it is that they want to do.  Following sound engineering principles helps me meet this goal consistently.</p>
<p>Building software is a creative endeavor and the engineering part of the field is still very young compared to other engineering disciplines.  But treating software engineering like an art form is a copout, an excuse for ignoring the sound engineering practices that do exist because they’re difficult or boring or unappealing.  There are important creative components to building software but that shouldn’t hide the fact that proven engineering practices can and should be used too.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/Sm-ZBHDOjxs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2009/05/software-engineering-art-or-engineering/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2009/05/software-engineering-art-or-engineering/</feedburner:origLink></item>
		<item>
		<title>Securing the Internet</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/dHuyTA1bmRQ/</link>
		<comments>http://neverletdown.net/2009/04/securing-the-internet/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 03:49:43 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[CERT]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[OpenId]]></category>
		<category><![CDATA[Scott Charney]]></category>
		<category><![CDATA[Vinton Cerf]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=37</guid>
		<description><![CDATA[Over Spring break I was fortunate to receive an invitation to the exclusive CERT (Computer Emergency Response Team) 2009 Technical Symposium.  The symposium was held in celebration of the twentieth anniversary of CERT but the main theme of the symposium was an examination of the internet, how the choices made just over 20 years ago [...]]]></description>
			<content:encoded><![CDATA[<p>Over Spring break I was fortunate to receive an invitation to the exclusive <a title="CERT 2009 Technical Symposium website" href="http://www.cert.org/technicalsymposium/">CERT (Computer Emergency Response Team) 2009 Technical Symposium</a>.  The symposium was held in celebration of the twentieth anniversary of CERT but the main theme of the symposium was an examination of the internet, how the choices made just over 20 years ago have resulted in a huge security mess and what we can do about it today to avert the utter destruction of our modern way of life.  I wish I was exaggerating but the internet is rapidly becoming the exclusive means for sharing and managing the world’s data.  The world’s economy is following suit which heightens the need for security even more.  Speakers at the symposium included <a title="Wikipedia entry for Vinton Cerf" href="http://en.wikipedia.org/wiki/Vint_Cerf">Vinton Cerf</a> (sometimes known as &#8220;The Father of the Internet&#8221;), <a title="Microsoft bio for Scott Charney" href="http://www.microsoft.com/presspass/exec/charney/">Scott Charney </a>(VP for Microsoft’s Trustworthy Computing Division), <a title="Wikipedai entry for Lawrence Roberts" href="http://en.wikipedia.org/wiki/Lawrence_Roberts_(scientist)">Lawrence Roberts </a>(invented packet switching), <a title="Wikiepdia entry for Steve Crocker" href="http://en.wikipedia.org/wiki/Steve_Crocker">Steve Crocker</a> (invented <a title="The first RFC" href="http://tools.ietf.org/html/rfc1">&#8220;Request for Comments&#8221;</a>), <a title="Wikipedia entry for Paul Mockapetris" href="http://en.wikipedia.org/wiki/Paul_Mockapetris">Paul Mockapetris</a> (invented DNS), and many other brilliant people who have been instrumental in creating and defining the internet.  Each speaker brought slightly different experiences to bear but everyone had the same message: if we don’t do something to secure the internet soon, something very, very bad will happen.</p>
<h4>First, a little history</h4>
<p>Security was never considered when the internet was originally conceived.  I guess that’s not entirely accurate, security was considered but quickly dismissed in favor of &#8220;the smallest set of tools that would give us the largest set of possibilities for the future,&#8221; according to Mockapetris.  Considering the original operating environment, the closed ARPANET/DARPANET, it makes sense that security was traded in favor of other quality attributes such as performance, reliability, and modifiability.  In the early 1980s, hosts numbered in the hundreds and there was an established and respected community of trust among the fraternity of hosts.</p>
<p>Once the internet became a public entity things changed.  Slowly, the community of trust that kept everything together began to unravel.  It started with news group flame wars.  Shortly after viruses started showing up.  There was even some direct hacking, albeit primarily by misled white hat hackers trying to help.  Then on November 2, 1988 the Morris Worm was released by a researcher from MIT and within 72 hours most of DARPANET was taken offline by the resulting accidental denial-of-service attack.  The community of trust that kept the internet running was permanently shattered.</p>
<p>CERT was created to deal with the problems that resulted from the world’s first denial-of-service attack.  While CERT’s mission is noble and its function critical to dealing with all the threats faced on the internet today, CERT is not the panacea required to save the world from the ever increasing internet threats coming from all angles in the form of botnet armies, distributed denial-of-service-attacks, and targeted attacks by sophisticated hackers motivated purely by profit.  The main problem is that CERT, by nature, is a reactive organization put in place to respond to emergencies as they happen.</p>
<p>As Vinton Cerf pointed out at the symposium, &#8220;the internet is always under attack.  It’s not enough to respond to each of the different incidents as they happen.  Reactivity is not enough.&#8221;  To save the world, we need to proactively address the security holes that were originally designed into the internet.</p>
<h4>Short Term Solutions</h4>
<p>Fixing the internet is an architectural problem.   It’s impossible to focus on a single layer of the protocol stack to make the internet more secure.  Each layer has different kinds of vulnerabilities and each layer can be exploited using different methods to achieve the same ends.  Unfortunately, replacing the entire protocol stack is difficult, thanks in a large part to how successful the internet has been.  But there are several short term strategies we can begin working toward today that work within the constraints of the current system.</p>
<p>One of the easiest and most significant things we can do is take humans out of the security loop.  It’s been proven time and again that people don’t follow instructions for securing systems.  Both John Gilligan and Vinton Cerf stated that improperly configured software accounted for over 80% of attacks on the internet.  Fix this problem and we’ve essentially removed 80% of cyber security threats.  Fixing the way we identify ourselves online (i.e. passwords) is another easy way to take humans out of the security loop.  A recurring theme from most speakers but most prominently discussed by Scott Charney was redefining identity online.  There are solutions that can work now to solve each of these problems.</p>
<p>It turns out that fixing the improper configuration problem is easy but it’s going to be a difficult sell.  The basic idea is that a computer or device has to start with a good configuration and then control mechanisms have to be put in place to prevent the configuration from getting hosed.  Some vendors such as Apple, Tivo, and Blackberry are already doing a great job at keeping their device configurations under control.  The trade-off for security is going to be freedom (modifiability if you prefer quality attributes).  In exchange for a usable, safe, and enjoyable internet experience that even your grandmother can handle you have to give up the ability to tweak anything you want in the system.  If iPod, iPhone, Tivo, and Blackberry sales are any indicator, people are willing to exchange freedom for something that just works.</p>
<p>Is it really fair to compare devices such as phones and PDAs with full blown computers?  Absolutely.  The key phrase is &#8220;Internet Enabled Device.&#8221;  An iPhone or Tivo can be hijacked and recruited into a botnet army just as easily as a standard desktop PC.  If even only 1% of the more than 4 billion mobile phones in use throughout the world were compromised, that would make 40 million bots ready to unleash mountains of spam and unending DDoS attacks.  The only reason this doesn’t happen is because mobile devices are effectively locked down to prevent such compromises from occurring.</p>
<p>With regards to passwords, I hate to say it but I think the Department of Defense is actually on the right track.  Every DoD employee and contractor is issued what is known as a Common Access Card (CAC), an ID card attached to a digital identification certificate issued by a third party authority that has verified that the person to whom the certificate was issued is indeed that person.  Both Vinton Cerf and Scott Charney were very clear that online identity can only be solved by combining something you know, usually a password, with something you have, a physical thing.  This something you have could be a digital identification certificate issued by an authority.</p>
<p>While it would be awesome to issue CACs to every citizen in the United States, perhaps attached to their driver’s licenses as Charney suggested, a staged success approach is possible.  <a title="Information from PayPal on their Security Key." href="https://www.paypal.com/cgi-bin/webscr?cmd=xpt/Marketing_CommandDriven/securitycenter/PayPalSecurityKey-outside">PayPal has taken the initiative with a hardware device called Security Key</a>.  Security Key is small enough to fit on a keychain and it generates a secret token (in this case a string of numbers) every thirty seconds.  When you purchase through PayPal you enter your username, password, and the token shown on the device.  Even if you accidentally gave this information to a phishing website, the token will be worthless after 30 seconds protecting your online wallet from fraud.</p>
<p>Though Vinton Cerf didn&#8217;t know the first thing about what I was talking about when I asked him about it, I see a lot of potential with OpenId.  <a title="Official infomration on OpenId." href="http://openid.net/">OpenId</a> is a protocol that provides something akin to a universal password that you can use to access thousands of websites and, with a little more work, could solve the identification problem across the internet.  First, OpenId providers would need to take on the role of verifying user’s real life identities and connecting the physical identity with the digital identity.  Second, OpenId providers have to offer some kind of physical verification when logging in, the something you have.  This could be in the form of a CAC, something biometric like a fingerprint reader, or even something as simple as PayPal’s Security Key.  In my opinion, OpenId is poised to become the third-party identification authority the world needs.</p>
<h4>The Next Step</h4>
<p>Another big theme at the symposium was trying to come up with a plan of action for moving forward, for fixing these problems.  Most speakers agreed that it would be unfortunate if it took a Pearl Harbor-like event to be the catalyst that motivated people to action.  Given the sophistication of attacks and the amount of value on the internet, the magnitude of damages could bring the United States, and in turn the world thanks to the global economy, to its knees.  The most frustrating part is that we know about the problems and I think there are a lot of smart people who know how to technically solve the problems.</p>
<p>By the end of the second day of the symposium I was left with more questions than answers and I am completely convinced that there will be a cyber security failure of a magnitude we have not yet seen in the near future.  I’m not suggesting that everyone start stocking canned goods in the cellar, but now is the time to proactively start working for change.  For as much flack as Microsoft has taken over the years, they seem to be on the forefront of effecting change both in terms of technology and public policy.  It’s difficult to know where to start, but <a title="Microsoft Trustworthy Computing resources homepage" href="http://www.microsoft.com/mscorp/twc/default.mspx">Microsoft’s Trustworthy Computing resources</a> are both comprehensive and practical.  The knowledge to fix the problems seems to be out there, the trick is motivating the world to change.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/dHuyTA1bmRQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2009/04/securing-the-internet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2009/04/securing-the-internet/</feedburner:origLink></item>
		<item>
		<title>Process Affordances: Ignore at Your own Peril</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/BYQWbqNo3m8/</link>
		<comments>http://neverletdown.net/2009/03/process-affordances-ignore-at-your-own-peril/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 21:15:07 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[affordance]]></category>
		<category><![CDATA[Carnegie Mellon]]></category>
		<category><![CDATA[Donald Norman]]></category>
		<category><![CDATA[nudge]]></category>
		<category><![CDATA[planning]]></category>
		<category><![CDATA[postmortem]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[studio]]></category>
		<category><![CDATA[tracking]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=26</guid>
		<description><![CDATA[The Amsterdam airport was able to reduce the amount of urine &#8220;spillage&#8221; that hit the men&#8217;s room floor by 80% simply by etching a life-like image of a fly near the urinals&#8217; drains.  The fly was specifically engineered into the urinals to alter gentlemen&#8217;s behavior without their having to think about it.  The [...]]]></description>
			<content:encoded><![CDATA[<p>The Amsterdam airport was able to reduce the amount of urine &#8220;spillage&#8221; that hit the men&#8217;s room floor by 80% simply by <a title="New York Times article on flys in urnials" href="http://www.nytimes.com/2009/02/08/business/08nudge.html?_r=1&amp;scp=1&amp;sq=nudge&amp;st=cse" target="_self">etching a life-like image of a fly near the urinals&#8217; drains</a>.  The fly was specifically engineered into the urinals to alter gentlemen&#8217;s behavior without their having to think about it.  <a title="The Nudge Blog by Richard Thaler and Cass Sunstein" href="http://nudges.wordpress.com/" target="_self">The concept is called nudging</a> and it&#8217;s been used in domains other than restroom sanitation to encourage desired behavior.  Other examples include the use of uncomfortable chairs in fast food restaurants to encourage people not to linger and real-time gas mileage displays in cars to encourage more economical driving.  If you&#8217;ve read <a title="Amazon: The Design of Everyday Things by Donald Normal" href="http://www.amazon.com/gp/product/0465067107?ie=UTF8&amp;tag=nevletdowdotn-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0465067107" target="_self">Donald Norman&#8217;s <em>The Design of Everyday Things</em></a> then you&#8217;ll know this as an affordance &#8211; a hint given to the user prompting them to take a specific action at a specific time.</p>
<p>Obviously the idea of affordances is directly applicable to devices as well as software usability but it wasn&#8217;t until I read about the urinal flies that I realized affordances don&#8217;t always have to have a physical representation.  For example, a well designed software process should gently nudge a team to do the right thing.  Since there is no one-size-fits-all process that works for all teams it is essential that the process complements the team and that the process&#8217;s affordances nudge team members to do what&#8217;s best for the project and the team.</p>
<p>Using a process that lacks the right affordances could have one of two possible outcomes.  In the best case, the team abandons the process because they realize subconsciously that it is telling them to do the wrong things at the wrong times.  This is bad because it sacrifices repeatability; you&#8217;ve regressed back to an ad hoc, &#8220;make it up as we go&#8221; state.  In the worst case, the team sticks with the process and it leads them astray.  This introduces risks into the project and could lead to complete project failure.</p>
<p>Software is already difficult enough to build successfully and processes are supposed to make software development easier.  Unfortunately, knowing when something isn&#8217;t working is not an exact science, but with a dash of experience and little team reflection (for example from regular postmortems) it is possible to figure out when you are working for your process instead of your process working for you.  To demonstrate this I am going to tell you a story.</p>
<h4>Our Process</h4>
<p><a title="The Square Root team wiki" href="http://msesrv4d-vm.scs.ad.cs.cmu.edu/wiki/Main_Page" target="_self">My studio team</a> in the Carnegie Mellon software engineering program is charged with building a web-based requirements elicitation tool that helps users follow the <a title="A case study on the Security Quality Requirements Engineering methodology" href="http://www.sei.cmu.edu/publications/documents/05.reports/05tr009/05tr009.html" target="_self">SQUARE process out of the SEI</a>.  About halfway through the Elaboration Phase of the project (sometime in the spring semester) the project was going downhill.  The warning signs were fairly apparent, we were missing milestones, tasking priorities were confusing, and a lot of work was stalling out at different levels of partial completion.  Though we knew there was something wrong we weren&#8217;t really sure what was causing it, what we were doing wrong in our planning and tracking process.</p>
<p>The planning process we were using was fairly simple.  At the beginning of the phase we looked at all the activities and artifacts that need to be completed by the end of that phase.  For each identified milestone we enumerate specific entry criteria, general tasking, validation procedures, and exit criteria.  This is a technique known as ETVX (entry, tasking, validation, and exit).  Next we used planning poker to estimate how long we thought each milestone would take to complete.  Finally, with this information we created a phase timeline which includes known due dates and dependencies between milestones.</p>
<p>Since we&#8217;re using an iterative approach to complete work in a phase, iterations follow largely the same planning process on a smaller scale.  As a team we identify the milestones on which we will work during the iteration.  Each milestone is assigned an owner whose job it is to ensure the milestone is completed by either delegating tasks or working on it themselves.  The planning poker estimate is used to determine the approximate workload allocation on the team.  This estimate is validated with bottom-up estimates that team members create based on their individual tasking.</p>
<p>There are several good things about this process.  First, it&#8217;s written down and the team follows it.  This is good because it means we can produce repeatable results over time.  Second, this process makes use of several practices that are generally considered &#8220;good&#8221; by software experts.  ETVX is a great way to clearly identify project milestones.  Planning poker is similar to the wide-band Delphi estimation technique.  Third, we&#8217;re using two forms of estimation to validate the plan as more information becomes known.  Finally, the engineers responsible for the work determine the specific tasking and creating the bottom-up estimates.</p>
<h4>You&#8217;re Good, but not That Good</h4>
<p>In spite of all the good things we were doing, something still wasn&#8217;t connecting.  The big aha! moment occurred about two weeks into the second iteration.  Up to that point I had been working on my tasks that had carried over from the first iteration.  The team leader noticed that almost no work had been started on the milestones I owned.  [An aside: this, to me, says that at least our tracking process works somewhat well.]  During the discussion that followed I became extremely defensive when the team leader asked me to shift priorities for the rest of the iteration.  What should have been a simple request turned into a heated debate over tasking.  I felt compelled to complete the past due work and here was this jerk trying to stop me.  &#8220;Sure,&#8221; I thought, &#8220;I&#8217;ll do what you ask, buddy, but when this whole project comes crashing down it&#8217;s on your head, not mine.&#8221;</p>
<p>Later, as I looked back at the incident, I wondered to myself, &#8220;Why was I so defensive in light of such a simple request?&#8221;  The reality was that the project wouldn&#8217;t come crashing down if I shifted priorities and I knew that.  So why defend these older tasks when it was obvious that there were more immediate needs?</p>
<p>It turns out that the affordances built into the planning process were encouraging my behavior.  There were a few simple things at play that, when combined, decreased our ability to plan effectively.</p>
<p>First, our process encouraged us to plan more work than time allowed.  This was due to there being a missing connection between day-to-day progress and the &#8220;big picture,&#8221; the overall plan.  Second, though the new team leader may have believed there was consensus, the team in fact did not wholly agree with the priorities for iterations.  This behavior was not specifically discouraged by our planning process and so allowed to persist.  Third, leftover work was not addressed during planning.  Some tasks might simply expire while others may change priority, becoming more or less important with a new iteration.  Since this wasn&#8217;t addressed it created a sense of urgency for individuals carrying over work from iteration to iteration.  Finally, assigning milestone owners had unanticipated side effects.  The goal was to ensure that someone was taking responsibility for coordinating and monitoring milestone work.  This worked so effectively that milestone owners exhausted themselves attempting to finish milestones and resisted changes to the plan that prevented them from finishing what was promised.</p>
<p>When it came time to make a necessary modification to the plan, our process encouraged us to fight against the best course of action for the team.  We didn&#8217;t have the level of flexibility needed due to our process&#8217;s affordances nudging us to do the wrong things.  Milestones were slipping and people wanted to finish what they started.  Project priorities were shifting as  the project matured but  team members were wearing blinders, ignoring the changing facts around us.  To stand a chance at success we had to change the affordances in the planning process.  We had to nudge the team in a new direction.</p>
<h4>Our Solution</h4>
<p>To try to solve this problem we decided to incorporate some of the planning principles from Scrum, specifically the product backlog, sprint backlog, and sprint planning meeting, into our planning process.  Scrum takes a more task-oriented approach when planning iterations and correlates the sprint backlog with the product backlog.  This better encourages the team to not plan more work than there is time to complete while connecting day-to-day work with the overall plan.   Scrum also requires that the team reprioritize work when planning iterations and that we agree on the resulting priorities.  This will hopefully eliminate the prioritization conflicts we experienced during iterations.  With Scrum, leftover work from iterations is saved in the product backlog.  This change decreases the anxiety team members feel when work is left undone (because the work is not forgotten) while simultaneously giving the team more flexibility to change direction as the project progresses.  Finally, the team, rather than individuals, takes ownership over the milestones held in the product backlog.  With each commitment made during iteration planning, the whole team buys in effectively shifting the passion and dedication individuals held for owned milestones to the commitments we agreed on as a team.</p>
<p>I&#8217;m not really sure how Scrum is going to turn out for us.  I think the most important thing is that we recognized that something was not working and took action to correct it.  I personally would rather see the team <a title="Coding Horror: Fail early, fail often" href="http://www.codinghorror.com/blog/archives/000576.html" target="_self">fail in a new and spectacular way rather than repeating the same mistakes again and again</a>.</p>
<h4>Add This to Your Silver Toolbox</h4>
<p>Unfortunately, I don&#8217;t think there is a trick for detecting these sorts of process failures.  Data and metrics can help but only if the process is repeatable and the team has the knowledge and discipline to collect the data in the first place.  Team postmortems can help but if individuals are afraid to raise concerns, you&#8217;ll find yourself on <a title="Wikipedia article on the Abilene Paradox" href="http://en.wikipedia.org/wiki/Abilene_paradox" target="_self">a trip to Abilene</a> before you realize it.  In many cases, if you think something isn&#8217;t going well, others are probably thinking the same thing.  Once I spoke up I found out that others thought something wasn&#8217;t working also.  I was just the first person who was able to articulate it.</p>
<p>Affordances are powerful but subtle mechanisms.  In well designed things, we aren&#8217;t supposed to be consciously aware of them.  But that doesn&#8217;t mean they always nudge us to do the right thing.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/BYQWbqNo3m8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2009/03/process-affordances-ignore-at-your-own-peril/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2009/03/process-affordances-ignore-at-your-own-peril/</feedburner:origLink></item>
		<item>
		<title>Applying Leadership Styles</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/2LEe0dj_y7g/</link>
		<comments>http://neverletdown.net/2009/02/applying-leadership-styles/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 22:56:13 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Leadership]]></category>
		<category><![CDATA[communication]]></category>
		<category><![CDATA[Daniel Goleman]]></category>
		<category><![CDATA[leadership styles]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[team building]]></category>
		<category><![CDATA[teamicide]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=14</guid>
		<description><![CDATA[The setting is a small library filled with various books on software engineering.  Five people are sitting around a single, small table, the room overcrowded with the group.  The Square Root team is reviewing the mid-semester presentation I threw together last night before we were to show it to our mentors in a [...]]]></description>
			<content:encoded><![CDATA[<p>The setting is a small library filled with various books on software engineering.  Five people are sitting around a single, small table, the room overcrowded with the group.  The Square Root team is reviewing the mid-semester presentation I threw together last night before we were to show it to our mentors in a few hours.  I was showing the team the last slide.  Up to that point everyone had pretty much agreed with the content in the presentation.</p>
<p>&#8220;Does anyone have any other risks they’d like to bring up?&#8221; I asked, confident that, as the team leader, I had a firm grasp on how the team was doing and where our current problems lay.</p>
<p>I waited a few seconds.</p>
<p>&#8220;OK, if nobody’s got anything I’ll go ahead and email this out&#8230;&#8221;</p>
<p>&#8220;Communication,&#8221; the quietest member of the team chimed in.  &#8220;We have problems with our team communication.&#8221;</p>
<p>I was in shock.  Surely this must just be an isolated problem.  &#8220;Do you mean team communication or do you mean you don’t understand some aspect of the project?&#8221;</p>
<p>&#8220;I agree.  Team communication seems to be problematic.&#8221;  Now there were two dissenters.</p>
<p>A few seconds later there were three.  Three fifths of the team felt we had team communication problems that were directly impacting the outcome of the project.  I sat there shocked for a moment.  I had just been blindsided by a team communication problem, therefore, obviously, we have a team communication problem.</p>
<p>Looking back at this incident I have decided that leadership, my leadership, was to blame.  From the beginning, I had led the way I liked to be led: hands-off with enough space to make my own decisions and get things done the way I wanted to do them, the polar opposite of micromanagement.  Of course, for me this worked out really well.  This was the way I liked to work and the way I was used to working.  Unfortunately, for a new team, a team lacking in trust, whose members didn’t know one another and had other commitments and priorities (school work) my ideal working environment and preferred leadership style was disastrous.</p>
<p>To prevent utter team destruction I changed perspectives.  From what I could tell, team members didn’t know what they were supposed to be doing.  I had assumed that this team would operate similarly to my last team where everyone would come together like a well-oiled machine to get work done.  Shortly after the incident in the library I remembered that my last team took almost a year to become that awesome.  Of course there were going to be problems in my new team.</p>
<p>Since my team seemed not to know how to take initiative in completing tasks and getting work done I thought I’d set an even better example for them.  By doing so, maybe they’d get the hint and follow suit.  The next day I kicked things into gear.  I took on more work.  I picked up all the slack I could and then some.  I took on tasking outside of work specifically assigned to my role.  I set high standards for myself and my team and we were going to meet those standards if I had anything to do with it.</p>
<p>Leadership disaster number two was prevented thanks to a timely assignment in my Managing Software Developers course.  <a title="Amazon: Leadership that gets Results, paper" href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http%3A%2F%2Fwww.amazon.com%2FLeadership-That-Results-OnPoint-Enhanced%2Fdp%2FB00005REHW&amp;amp;tag=nevletdowdotn-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325" target="_blank">Leadership that Get’s Results by Daniel Goleman</a> defines six distinct leadership styles and gives a little advice on when each style is appropriate.  Up to that point I had no knowledge of such styles and had been flying on instincts.  The following table is taken from Goleman’s paper but I encourage you to read the full paper to gain a better understanding of these ideas in a more complete context.  There’s also tons of information on the web, a search away.</p>
<table border="0">
<tbody>
<tr>
<th> Leadership Style</th>
<th> Description</th>
<th> When the style works best</th>
<th> Impact on team climate</th>
</tr>
<tr>
<td>Coercive</td>
<td>Demands immediate compliance, &#8220;Do what I tell you.&#8221;</td>
<td>Crisis, kick-start a turnaround, problem employees</td>
<td>Negative</td>
</tr>
<tr>
<td>Authoritative</td>
<td>Mobilize people toward a vision, &#8220;Come with me.&#8221;</td>
<td>When changes require a new vision or clear direction is needed</td>
<td>Most strongly positive</td>
</tr>
<tr>
<td>Affiliative</td>
<td>Creates harmony and builds emotional bonds, &#8220;People come first.&#8221;</td>
<td>Heal rifts in a team or motivate people during stressful circumstances</td>
<td>Positive</td>
</tr>
<tr>
<td>Democratic</td>
<td>Forge consensus through participation, &#8220;What do you think?&#8221;</td>
<td>Build buy in or consensus, or to get input from valuable team members</td>
<td>Positive</td>
</tr>
<tr>
<td>Pacesetting</td>
<td>Set high performance standards, &#8220;Do as I do, now.&#8221;</td>
<td>Get quick results from a highly motivated, competent team</td>
<td>Negative</td>
</tr>
<tr>
<td>Coaching</td>
<td>Develop people for the future, &#8220;Try this.&#8221;</td>
<td>Help team members improve performance or develop long-term strengths</td>
<td>Positive</td>
</tr>
</tbody>
</table>
<p>As it turns out, I started with the right idea by using an authoritative style of leadership even though I didn’t know the name for it.  I failed with this style because the team wasn’t ready for it yet.  We didn’t have a clear vision or clear goals.  We weren’t yet working well together.  There was little buy-in to my leadership or the few goals the team did have.  We were a full-fledged dysfunctional team.  Switching to a pacesetting style was just about the worst possible thing I could have done.  If I had gone on for too long I am fully confident that I would have destroyed the team and we wouldn’t have gotten anything done during our first semester.  With my new found knowledge of the different leadership styles I now had new options.  I immediately put three styles to use: affiliative, coaching, and coercive.</p>
<p>The team was clearly broken.  My hope was that affiliative leadership might help build trust and better bonds among teammates.  Being a programmer I tend to be a little more logical than emotional so trying to tune in more to how people felt was tough.  I found that affiliative leadership goes hand in hand with vulnerability and trust and that individually thanking someone for their hard work, even if it’s relatively small, and meaning it is one of the most important things you can do as a leader.</p>
<p>In addition to team harmony, it was obvious that some team members were struggling with the tasks they had been given.  Rather than taking over those tasks as I had been doing, I decided to try taking on more of a coaching role.  In some cases I would help team members directly, other times I encouraged other team members to work together on tasks.  The end result was a team better able to work together to accomplish tasks.</p>
<p>In spite of all this, I had the feeling that if we didn’t do something immediately, the entire semester would be a wash.  To prevent this from happening I used coercive leadership in an attempt to get us back on track quickly even though the overall impact could be negative in the long term.  In a sense, I was willing to be a bad guy so the team had a chance of meeting its goals.  The gamble paid off and the way the team operated turned around almost instantly.</p>
<p>About two months after I had been blindsided by unseen communication problems, my team seemed to be working together much better.  Problems were being flushed out into the open more quickly and everyone on the team seemed to enjoy working with one another on the project.  I am not going to take full credit for the change but I will take credit for being the catalyst that put the change into motion.  All because I changed how I led the team.</p>
<p>There is a small downside to the changes, but it’s only really a downside because I enjoy doing technical work.  The leadership role on my team has evolved.  By the end of the semester I found myself directly responsible for almost no work but rather, I was the go to guy for all problems the team was facing.  I had my hands in everything but I wasn’t able to really sink my teeth into anything.  If this is what management is like and I ever do become a project manager I will need to find ways to remain technically involved in something or I think I’d eventually go insane.</p>
<p>The biggest lesson I’m taking away from this experiences is that sometimes the team’s needs and my needs aren’t going to line up.  Recognizing when this is occurring and finding a balance between these conflicting needs is critical to team success.</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/2LEe0dj_y7g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2009/02/applying-leadership-styles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2009/02/applying-leadership-styles/</feedburner:origLink></item>
		<item>
		<title>Thoughts on Formal Methods in Software Engineering</title>
		<link>http://feedproxy.google.com/~r/neverletdown/~3/oPr9pw_Ik10/</link>
		<comments>http://neverletdown.net/2009/01/thoughts-on-formal-methods-in-software-engineering/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 03:30:28 +0000</pubDate>
		<dc:creator>Michael Keeling</dc:creator>
				<category><![CDATA[Formal Methods]]></category>
		<category><![CDATA[FSP]]></category>
		<category><![CDATA[OCL]]></category>
		<category><![CDATA[Petri Nets]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[Z]]></category>

		<guid isPermaLink="false">http://neverletdown.net/?p=4</guid>
		<description><![CDATA[Are formal methods in software engineering really all they are cracked up to be?
First, let me clarify what I mean by formal methods.  Formal methods use mathematical representations of software to formally prove that the software behaves as expected.  Most formal methods use predicate logic and set theory along with other mathematical notations to describe [...]]]></description>
			<content:encoded><![CDATA[<p>Are formal methods in software engineering really all they are cracked up to be?</p>
<p>First, let me clarify what I mean by formal methods.  Formal methods use mathematical representations of software to formally prove that the software behaves as expected.  Most formal methods use predicate logic and set theory along with other mathematical notations to describe software in a formal specification.  Examples include <a title="Wikipedia article on the Z notation" href="http://en.wikipedia.org/wiki/Z_notation">Z (pronounced zed)</a>, state machines (such as the finite state process algebra FSP), <a title="Wikipedia article on Petri Nets" href="http://en.wikipedia.org/wiki/Petri_net">Petri Nets</a>, the use of pre and post conditions, and the <a title="Documentation on OCL" href="http://www.klasse.nl/ocl/ocl-introduction.html">Object Constraint Language</a> used in conjunction with class diagrams in UML.  Most formal methods have some kind of automated proof capability be it by brute force or through the use of more sophisticated theorem proving programs.</p>
<p>Let&#8217;s take a quick look at Z which is probably the most widely available formal specification method in terms of books, online documentation, and automated theorem provers.  Here’s a simple example of the birthday book taken from <a title="An introduction to Z and formal specifications" href="http://spivey.oriel.ox.ac.uk/mike/zrm/index.html">&#8220;An introduction to Z and formal specifications&#8221; by Mike Spivey</a>.</p>
<p><a href="http://neverletdown.net/images/zed-birthday-book-sample.jpg"><img class="alignnone" title="Z Sample: BirthdayBook" src="http://neverletdown.net/images/zed-birthday-book-sample.jpg" alt="" width="472" height="217" /></a></p>
<p>Looks like gibberish, right?  It isn’t actually important that you understand what this means.  In fact, if you don’t understand it then I’ve already made my point.  Writing formal specifications using a formal modeling language is time consuming, costly, and in the end, not effective since it is too difficult to understand what the specification is actually telling me, the programmer, even if I’m trained in Z.</p>
<p>Formal methods get a lot of traction from the ridiculously high cost of defect injection early in the software lifecycle and the unacceptably high cost of defects in safety critical systems.  Injecting a bug in the requirements phase that is not caught and fixed until testing has been estimated to cost upwards of 100 times the cost of finding and fixing the same bug while the requirements are being written.  In safety critical systems, where human life is literally in the hands of software, deployed defects could result in injury or death (the <a title="IEEE paper: &quot;An Investigation of the Therac-25 Accidents&quot;" href="http://courses.cs.vt.edu/~cs3604/lib/Therac_25/Therac_1.html">Therac-25 accidents</a> being some of the most famous).</p>
<p>Formal methods folks argue that a clear, precise, unambiguous, and proven formal specification can prevent many of these early defects from making their way into the software and thus prevent these problems.  Economic claims aside, formal methods fail because they still ignore the weakest link in building software: the human programmers.</p>
<p>Mathematics tells us that it is possible to create functions that map one representation of a set to another equivalent set.  For example, given a cube in three-dimensional space, a rotation function will maintain the dimensions of the cube while rotating the shape about a desired axis.  A similar principle is applied when considering Z and other formal methods.  Mapping functions are used to transform a high-level Z specification into a more concrete representation of the same specification.  Eventually the specification reaches a level of detail that is easily translated to code.  In practices this might mean that a set, such as <em>birthday</em> in the <em>BirthdayBook</em> schema above might be represented by a pair of arrays in a more concrete version of the schema.</p>
<p>While theoretically this sounds great, the problem is that the mapping cannot be automated in most cases so we’re essentially back to square one in terms of what we can say about the more concrete version of the specification.  This is thanks to the inevitable mistakes injected during the transformation process.  Kennedy-Carter’s iUML from the Model Driven Architecture camp is the closest thing to an automated transformation tool I’ve yet seen and even that did not include OCL or any sort of pre and post condition analysis.</p>
<p>So formal methods are difficult to write, difficult to understand, few people know them, and they don’t translate easily into code.  Is there a silver lining?  After all, a lot of time and research has gone into devising formal methods and some of the greatest minds in software engineering are behind them.</p>
<p>I think the answer is a big fat maybe.</p>
<p>Formal methods, in the right hands on the right project can make it easier to understand the system being specified.  A Navy track manager might be one good example.  Rules for how ships assume reporting responsibility might be easily recorded as a predicate.  Safety is certainly a concern and though the validation process will have to begin anew once code is written at least the basic algorithms will be clear and unambiguous.  That is of course assuming the right people are working on the project.  Then again, in the case of the IABM, any specification would have been better than the big plate of nothing the developers had to work with.</p>
<p>For almost every project in the world, I think formal methods should be generally avoided.  Given the option of spending money and time on mathematicians or extremely smart coders I would chose the latter.  With smart coders, code inspection is a fun and effective defect filtering option.  And let’s face it.  Why would you have your amazing coders do something other than write amazing code?</p>
<img src="http://feeds.feedburner.com/~r/neverletdown/~4/oPr9pw_Ik10" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://neverletdown.net/2009/01/thoughts-on-formal-methods-in-software-engineering/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://neverletdown.net/2009/01/thoughts-on-formal-methods-in-software-engineering/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 1.327 seconds. --><!-- Cached page generated by WP-Super-Cache on 2010-07-15 23:54:03 -->
