How to Make a Software Project Succeed
Sunday, March 28, 2010 at 4:03PM Software is taken for granted. Of all the things that humans can build, what else compares to software? An architect designs a house with known parameters, such as gravity, terrain, climate, plumbing specifications etc… The environment that a home is in may fluctuate, even to extremes, but a home will stand. Houses are fairly standardized—they usually have a front and back door, x number of windows and all of the other usual features we expect from a typical home.
Enter a software application—the foundation on which it stands can change weekly via software operating system updates. There may be many entry points and exit points within an application—some of them are hidden to the software user. There are usually hundreds, if not thousands, of dependent actions in a typical application. Conversly, a home has a trivial set of dependencies: you open or close a door, when it rains the water must flow into gutters, the trusses must be strong enough to support a maximum specified load etc…
There are many complexities that must be considered when architecting and managing a software application. These complexities are often not fully realized. Project managers, senior management, and potential customers underestimate the complexity of dependency—the intricate web of dependent actions and reactions that are required to enable a software application to deliver its advertised features. To further exasperate the situation, developers often underestimate the complexity and magnitude of dependencies that they must account for to deliver a feature. Let’s face it, the good developers are Creators of Software—in an almost Biblical sense. As such, the good developers are frequently overtaken by the power of creation at their fingertips and can easily underestimate the level-of-effort type metrics that managers need to estimate a project timeline.
To put it simply software projects succeed when all responsible parties understand complexity and human nature. When developers are cognizant that they may not know what they don’t know, estimates become more accurate. Managers understanding a developers code-creationist mentality, can interpret their often optimistic project estimations.
Having software project managers that are intimate with code can be a great help as well. Software cannot be created on an assembly line. Trying to pump out code faster is not as simple as turning up the “speed” knob on the assembly belt. Managers shouting down the line don’t increase productivity either with mind workers—typically this has the opposite effect. Performance anxiety is a code killer as with many other ares in life. If a developer has a manager breathing down his or her neck—guess what their not going to be thinking about—code. A management team that understands these principles will pay big dividends.
Remember the complexity/dependency discussion? This takes concerted concentration by developers in order to not “miss” anything when developing code. Anything that interferes with a developer’s thought process lowers their productivity in the same way a factory worker’s productivity would decline if you added an extra assembly line belt for them to work on simultaneously. Let the developer devote their mind exclusively to one task—writing code! To supercharge this concept, provide developers with an atmosphere that mitigates thought process interruptions. Most thought process interruptions are from co-workers or management inquiring about projects and/or adding new requirements. The other, often not considered interruptions, are loud office spaces (i.e. conference calls on speaker-phone, high foot traffic developer work spaces, and even non-coders being located with developers which can increase office cross-talk).
Lastly, complexity must be managed and reduced where at all possible. The most elegant code, is very often not the most maintainable and understandable by anyone but the person who created it ( and often this isn’t true over time). Disk space and processing power are relatively cheap—always write a few lines of extra code that lends to clarity over efficiency—if you like successful software projects. To mitigate complexity, write code that mimics life. Code can mimic life by having flow control sequences that match the order of events that must happen in real life. Objects can be created that match the real-world object (i.e. a file cabinet contains folders—folders contain documents, documents have paragraphs, paragraphs have sentences etc…). In nature many seemingly complex processes occur, but when scientists study these processes, they find pristine simplicity. To quote Albert Einstein, “Everything should be made as simple as possible, but not simpler.”
The topics mentioned in this article are general areas that lead toward the success of software projects—but areas that are commonly overlooked.

