<?xml version="1.0" encoding="windows-1252"?>
<node id="919075" title="Common Software Development Mistakes" created="2011-08-07 09:06:48" updated="2011-08-07 09:06:48">
<type id="120">
perlmeditation</type>
<author id="176576">
eyepopslikeamosquito</author>
<data>
<field name="doctext">
&lt;P&gt;
Cleaning up some old files today, I noticed some old notes I'd written on
&lt;I&gt;Classic Software Development Mistakes&lt;/I&gt;.
Rather than throw them out, I thought I'd share them here.
&lt;/P&gt;

&lt;P&gt;
&lt;blockquote&gt;

&lt;P&gt;
&lt;I&gt;
Adding manpower to a late software project makes it later
&lt;/I&gt;
&lt;/P&gt;

&lt;P align="right"&gt;
&lt;small&gt;
-- &lt;a href="http://en.wikipedia.org/wiki/Brooks's_law"&gt;Brooks' Law&lt;/a&gt;
&lt;/small&gt;
&lt;/P&gt;

&lt;/blockquote&gt;
&lt;/P&gt;

&lt;P&gt;
This is probably the most common mistake I've seen over the years.
Throwing more people at late projects seems like a reflex reaction for most managers.
While Brooks reaffirmed his law in his
&lt;a href="http://www.amazon.com/Mythical-Man-Month-Software-Engineering-Anniversary/dp/0201835959"&gt;Mythical Man-Month Anniversary Edition&lt;/a&gt;
twenty years after he first proposed it,
Steve McConnell
&lt;a href="http://www.stevemcconnell.com/ieeesoftware/eic08.htm"&gt;has argued&lt;/a&gt;,
unconvincingly in my view, that Brooks' Law no longer applies:
&lt;/P&gt;

&lt;P&gt;
&lt;blockquote&gt;

&lt;P&gt;
&lt;I&gt;
The time that existing staff spends with new staff certainly does take
productive time away from the project, and time spent training can be
frustrating to existing staff members who are already feeling pressured
to complete their own work. But the loss is nothing like the ratio
needed for Brooks’ Law to be true.
&lt;/I&gt;
&lt;/P&gt;

&lt;P align="right"&gt;
&lt;small&gt;
-- &lt;a href="http://www.stevemcconnell.com/ieeesoftware/eic08.htm"&gt;Steve McConnell&lt;/a&gt;
&lt;/small&gt;
&lt;/P&gt;

&lt;/blockquote&gt;
&lt;/P&gt;

&lt;P&gt;
While McConnell's argument sounds logical, the crucial point
here is how capable and well-trained are the new staff thrown
at the troubled, late project?
If they are capable and familiar with the domain, fair enough.
Yet in my experience, capable staff tend to already be extremely busy.
Moreover, their bosses are unlikely to release them.
That only leaves B-grade performers
(whose bosses may be only too happy to let go for a few months)
and new hires.
Now, throwing untrained and mediocre developers at a troubled project
has a devastating effect on morale. Existing project staff,
already under extreme pressure, now find themselves spending
inordinate amounts of time training and spoon-feeding their new group of
&lt;a href="http://tlb.org/telsan.html"&gt;hairdressers and telephone sanitizers&lt;/a&gt; ...
which typically leads to the better project team members resigning,
the less capable ones being unable to secure a new job.
Only the dead wood left behind.
That is a terrible long term strategy for any company.
&lt;/P&gt;

&lt;P&gt;
Sadly, I'm yet to meet
a high level manager who has actually read
&lt;a href="http://en.wikipedia.org/wiki/The_Mythical_Man-Month"&gt;The Mythical Man-Month&lt;/a&gt;.
Or who knew what &lt;a href="http://en.wikipedia.org/wiki/Brooks's_law"&gt;Brooks' Law&lt;/a&gt; is.
&lt;/P&gt;

&lt;P&gt;
Of course, blaming it all on Brooks' Law is an oversimplification.
Often the project is not really "late" at all,
but a victim of overly optimistic scheduling and poor estimation.
Poor hiring and training can also cause a project to take longer
than it would were a stronger team available.
&lt;/P&gt;

&lt;P&gt;
&lt;blockquote&gt;

&lt;P&gt;
&lt;I&gt;
I'm not the sort of engineer that Google usually looks for.
You see, I don't have a computer science degree from an elite university,
or indeed any degree at all. I don't have any pretensions toward being
a computer scientist, though I'm familiar with enough of the concepts
and terminology to be able to work with them.
I'm more the type to know and use tools -- preferably popular free and
open source tools -- that other people have built, but of course
Google's not very interested in that.
I've also spent a lot of my time in the tech field on teaching,
mentoring, encouraging software teams to adopt best practices,
building relationships with other teams and with users of our
software, advocating openness and transparency, and so forth,
none of which Google's hiring practices care about or look for.
It's all algorithm pop-quiz, and I'm crap at those.
&lt;/I&gt;
&lt;/P&gt;

&lt;P align="right"&gt;
&lt;small&gt;
-- &lt;a href="http://infotrope.net/2011/07/21/a-note-to-google-recruiters/"&gt;Skud Blog, A note to Google recruiters&lt;/a&gt;
&lt;/small&gt;
&lt;/P&gt;

&lt;/blockquote&gt;
&lt;/P&gt;

&lt;P&gt;
As illustrated by the above blog, Google's infamous hiring practices
are often criticized for being ridiculously onerous with an
over emphasis on excelling at algorithm pop-quizzes.
Certainly, Google set the hiring bar very high and must
surely reject many candidates who would have turned out
to be model employees if given the opportunity.
Yet I agree with their overall hiring philosophy: that it is
far better to reject good candidates than to hire poor ones.
&lt;/P&gt;

&lt;P&gt;
A common hiring mistake I've seen over the years is for a
non-technical manager to hire developers without asking
developers to be involved in the hiring process and
&lt;I&gt;without asking candidates to write any code&lt;/I&gt;.
If you do that, it's very easy to hire developers who can hardly code at all.
These sort of hiring mistakes are incredibly expensive and demoralizing
because working with mediocre programmers usually frustrates
the stronger developers, sometimes to the point of resignation,
while sacking new hires can be a very unpleasant and
traumatic experience for all concerned.
Not to mention the cost (time, money and opportunity) of needing to re-hire.
&lt;/P&gt;

&lt;P&gt;
&lt;blockquote&gt;

&lt;P&gt;
&lt;I&gt;
Most product managers that I have worked with
would rather ship a failure on time than risk
going late.
&lt;/I&gt;
&lt;/P&gt;

&lt;P align="right"&gt;
&lt;small&gt;
-- Alan Cooper in &lt;a href="http://www.amazon.com/Inmates-Are-Running-Asylum/dp/0672316498"&gt;The Inmates are Running the Asylum&lt;/a&gt;
&lt;/small&gt;
&lt;/P&gt;

&lt;/blockquote&gt;
&lt;/P&gt;

&lt;P&gt;
Knowing the "right" product to build is hard, very hard.
Who would have thought that twitter would be such a success?
Well, it sounded like a daft idea to me.
Actually, it still does. :)
So product managers are an easy target.
The two most common product mistakes I've seen are
shipping a failure on time (as indicated by the above
Cooper quote) and building the wrong product.
Another more subtle strategic mistake is trying to build
too many products thus spreading your resources so thinly
that none of them are any good.
&lt;/P&gt;

&lt;P&gt;
A classic example of building the wrong product,
mentioned in
&lt;a href="http://www.infoq.com/presentations/Innovation-at-Google"&gt;Patrick Copeland's innovation at Google talk&lt;/a&gt;,
was Bill Gates' unshakable belief that users wanted to see a Windows
"Start" button on their mobile device.
As you might expect, most Microsoft employees were reluctant to challenge
the company founder on what product to build.
Maybe &lt;a href="http://www.pretotyping.org/"&gt;pretotyping&lt;/a&gt;
would have helped here.
&lt;/P&gt;

&lt;P&gt;
I could rabbit on and on, but that's enough from me.
I'd love to hear about the software mistakes you've seen.
To help jog your memory, I list below a summary from
McConnell's
&lt;a href="http://www.stevemcconnell.com/rdenum.htm"&gt;Classic Mistakes Enumerated&lt;/a&gt;.
&lt;/P&gt;

&lt;P&gt;&lt;B&gt;People-related mistakes&lt;/B&gt;&lt;/P&gt;

&lt;P&gt;
 &lt;ol&gt;
  &lt;li&gt; Undermined motivation.
  &lt;li&gt; Weak personnel.
  &lt;li&gt; Uncontrolled problem employees.
  &lt;li&gt; Heroics.
  &lt;li&gt; Adding people to a late project.
  &lt;li&gt; Noisy, crowded offices.
  &lt;li&gt; Friction between developers and customers.
  &lt;li&gt; Unrealistic expectations.
  &lt;li&gt; Lack of effective project sponsorship.
  &lt;li&gt; Lack of stakeholder buy-in.
  &lt;li&gt; Lack of user input.
  &lt;li&gt; Politics placed over substance.
  &lt;li&gt; Wishful thinking.
 &lt;/ol&gt;
&lt;/P&gt;

&lt;P&gt;&lt;B&gt;Process-related mistakes&lt;/B&gt;&lt;/P&gt;

&lt;P&gt;
 &lt;ol&gt;
  &lt;li&gt; Overly optimistic schedules.
  &lt;li&gt; Insufficient risk management.
  &lt;li&gt; Contractor failure.
  &lt;li&gt; Insufficient planning.
  &lt;li&gt; Abandonment of planning under pressure.
  &lt;li&gt; Wasted time during the fuzzy front end.
  &lt;li&gt; Shortchanged upstream activities.
  &lt;li&gt; Inadequate design.
  &lt;li&gt; Shortchanged quality assurance.
  &lt;li&gt; Insufficient management controls.
  &lt;li&gt; Premature or too frequent convergence.
  &lt;li&gt; Omitting necessary tasks from estimates.
  &lt;li&gt; Planning to catch up later.
  &lt;li&gt; Code-like-hell programming.
 &lt;/ol&gt;
&lt;/P&gt;

&lt;P&gt;&lt;B&gt;Product-related mistakes&lt;/B&gt;&lt;/P&gt;

&lt;P&gt;
 &lt;ol&gt;
  &lt;li&gt; Requirements gold-plating.
  &lt;li&gt; Feature creep.
  &lt;li&gt; Developer gold-plating.
  &lt;li&gt; Push me, pull me negotiation.
  &lt;li&gt; Research-oriented development.
 &lt;/ol&gt;
&lt;/P&gt;

&lt;P&gt;&lt;B&gt;Technology-related mistakes&lt;/B&gt;&lt;/P&gt;

&lt;P&gt;
 &lt;ol&gt;
  &lt;li&gt; Silver bullet syndrome.
  &lt;li&gt; Overestimated savings from new tools or methods.
  &lt;li&gt; Switching tools in the middle of a project.
  &lt;li&gt; Lack of automated source-code control.
 &lt;/ol&gt;
&lt;/P&gt;

&lt;P&gt;&lt;B&gt;Perl Monks References&lt;/B&gt;&lt;/P&gt;

&lt;P&gt;
 &lt;ul&gt;
  &lt;li&gt; [id://116380] (2001)
  &lt;li&gt; [id://416865] (2004)
  &lt;li&gt; [id://442597] (2005)
  &lt;li&gt; [id://728569] (2008)
  &lt;li&gt; &lt;a href="http://tinita.de/docs/slides/don_t/slides.vroom"&gt;Don't slides&lt;/a&gt; by [tinita]
  &lt;li&gt; [id://486805]
 &lt;/ul&gt;
&lt;/P&gt;

&lt;P&gt;&lt;B&gt;References&lt;/B&gt;&lt;/P&gt;

&lt;P&gt;
 &lt;ul&gt;
  &lt;li&gt; &lt;a href="http://www.stevemcconnell.com/rdenum.htm"&gt;Classic Mistakes Enumerated&lt;/a&gt; by Steve McConnell
  &lt;li&gt; &lt;a href="http://www.stevemcconnell.com/rdmistak.htm"&gt;A Case Study in Classic Mistakes&lt;/a&gt; by Steve McConnell
  &lt;li&gt; &lt;a href="http://blogs.construx.com/blogs/stevemcc/archive/2007/06/15/Classic-Mistakes-Updated.aspx"&gt;Construx Classic Mistakes 2008 (Blog/Survey)&lt;/a&gt;
  &lt;li&gt; &lt;a href="http://www.construx.com/Page.aspx?cid=2537"&gt;Construx Classic Mistakes 2008 (Results/pdf)&lt;/a&gt;
  &lt;li&gt; &lt;a href="http://www.joelonsoftware.com/articles/fog0000000069.html"&gt;Things you should never do (rewriting)&lt;/a&gt; by Joel Spolsky
  &lt;li&gt; &lt;a href="http://discuss.joelonsoftware.com/default.asp?joel.3.744487.27"&gt;Joel Discussion of Classic Software Mistakes (closed)&lt;/a&gt;
  &lt;li&gt; &lt;a href="http://mindprod.com/jgloss/unmain.html"&gt;How to write unmaintainable code&lt;/a&gt; by Roedy Green
  &lt;li&gt; &lt;a href="http://www.exampler.com/testing-com/writings/classic/mistakes.html"&gt;Classic Testing Mistakes&lt;/a&gt; by Brian Marick
  &lt;li&gt; &lt;a href="http://en.wikipedia.org/wiki/The_Mythical_Man-Month"&gt;The Mythical Man-Month&lt;/a&gt;
  &lt;li&gt; &lt;a href="http://en.wikipedia.org/wiki/Brooks's_law"&gt;Brooks' Law&lt;/a&gt;
  &lt;li&gt; &lt;a href="http://www.stevemcconnell.com/ieeesoftware/eic08.htm"&gt;Brooks' Law Repealed?&lt;/a&gt; by Steve McConnell
  &lt;li&gt; &lt;a href="http://www.linuxtoday.com/infrastructure/2000060600706NWCY"&gt;Brooks' Law and Open Source: The more the merrier?&lt;/a&gt;
  &lt;li&gt; &lt;a href="http://portal.acm.org/citation.cfm?id=1367924"&gt;Brooks' versus Linus' law: an empirical test of open source projects&lt;/a&gt;
 &lt;/ul&gt;
&lt;/P&gt;
</field>
</data>
</node>
