Outer Web Thought Log
May 05, 2004
Real Programmers

Why software projects fail: Matthew blames the Real Programmers. Not being one, but heavily surrounded by them now for many years, let me explain why I fail to find one single valid point in his reasoning. Obviously, Matthew is talking about software development inside commercial projects, so you'll have to scale his and my reasoning to your particular situation. Even more obviously, I can only speak from my own experience, which seems very different from his. There must be different types of Real Programmers, so it seems.

I'll start with collapsing his first two points:

  • Real Programmers think that specifications (written before the coding starts) are for wimps.
  • Customers and the Real Programmer both think that a murky (at best) specification to be to their advantage. In the end - the customer will win.
  • There's still some big truth in these points, in that projects often fail because of a lack of a clear vision, and the requirements contained by this vision. These requirements often never materialize because of sheer laziness: both the customer and the programmer are too lazy to descend into one another's mindset, in order to really understand enough of each other's work to come up with a set of effective requirements.
    Computers are dumb things, and it requires skill to flex them towards a resolution of your problem. By not being able (or willing) to precisely state your exact problem, in a way that it fits in the limited execution context of a computer, you will decrease the chances for a potential solution to effectively happen. Since one cannot expect the customer to have full knowledge of the execution environment, it is the task of the programmer to make him aware of enough context to be able for the customer to state the problem in a way that both parties are communicating in a common language, and are stating a precise and minute set of requirements.

    Customers are not expected to go a lot into implementation details - they should even be advised not to state many implementation requirements. What I have seen many times in my small career, were customers who wanted to hear all the fancy buzzwords, who wanted to feel part of the programming crew, yet who were not able to exactly state what they wanted, and ended up demanding immense flexibility: a recipe for disaster. "I can't make up my mind, yet I want you to do it."

    Also, programmers love precise specs. They might be frightened by the complexity of them, or become aware of inconsistencies which will make them ask annoying questions to the customer, but in the end, their job becomes much easier if they know what to do.

    In companies I used to be working for, this communication problem was often solved by some middleman: an analyst. One could expect from analysts to be able to talk to customers and make abstraction of the implementation noise the customer was trying to inject into the requirements, and also them to be able to go into enough technical detail to not come up with inconsistent problem domain models to explain the task at hand to the developers. A good analyst could make or break the project. Another recipe for disaster was putting a project manager or sales person in the role of the analyst. For obvious reasons, these roles would always walk the customer's walk, rather then trying to help the developer along. The developer would feel bad because this would simply mean an increase of the number of customers in the project to him, rather than a communication bridge to the customer. So don't staff your failing projects with more infrastructural roles, but try to hire good analysts on beforehand. I know some, but they tend to be a scarce resource.

    For larger projects, programmers also can't take up the analyst role, since their brain will simply melt because of dimensional overload: when you have to look at a problem from too many sides at once, while also worrying about minute implementation details, your perception will become heavily distorted and you'll suffer from neurological collapse. Being able to decompose large problems into composable solutions is the main skill of a developer, but you cannot add the task of defining the problem space to his job description - that would be God-like. In the end, writing down requirements should be nothing more than that: a thorough write-up of the problem space. The developer can then focus on designing the solution space.

    This is the point about estimations. When you ask for an estimate from a developer, there's a chance that he'll get back to you with something like "If you want a really good estimate, I need to analyse the problem into enough detail so that I might as well solve it right away, and tell you afterwards. In case you don't want that, I'm totally unable to come up with any timing, but I'm perfectly capable of designing to budget." That doesn't buy you a lot, of cause. I've done a fair amount of estimates in my life, and in the end, I have a few rules of thumb which help me in doing so:

    (to be continued - off to sleep now)

    Posted by stevenn at May 5, 2004 12:41 AM ()