| For three decades, people have been saying that software development should be a branch of engineering, and during that time, it seems that a majority of that group has been advocating process improvement as the route to that goal: if we can just write sufficiently detailed and comprehensive procedures, the problem will be solved. Unfortunately, there is little to show for this effort, and IT software is being written very much as it was before, even as just about everything else in computing has radically changed.
I have seen more than one process improvement initiative fail. In each case, the underlying reason was the same, and it is an issue that I believe every such initiative must deal with if it is to be successful.
Development is a human activity When software is developed without any guiding process, the project frequently degenerates into one of trial-and-error, characterized by a seemingly interminable test-and-fix cycle in which the utterly dysfunctional initial version is bludgeoned into something that the users can live with - unless it becomes one of those 1/3 of all projects that are abandoned. The problem with the failed processes is that they ended up in exactly the same state! They did so because the process could not address problems within the human dimension of software development.
Software development is not a form of manufacturing, and it cannot be reduced to some sort of painting-by-numbers exercise by applying Taylor's method of subdividing tasks until a process is composed entirely of almost trivial actions. At its core, software development is primarily a design activity, and as such, demands a significant amount of reasoning about abstract ideas. For now and in the foreseeable future, this means that it is a human activity.
Software by Design
To produce software by design, rather than by trial-and-error, demands (not necessarily in a single person) a knowledge of both the problem and the technical domain, the creativity to find possible solutions, the analytical skills to evaluate them, the judgment to choose between them, and the experience to place all of the above in context. These are not things that can be inculcated by any methodology.
Unfortunately, the training of software developers is guaranteed to predispose them towards trial-and-error development. Programming is learned through small examples that can be understood in their entirety, and trial-and-error, which is an essential part of the learning experience, works reasonably well here. Developers' first professional experience usually involves modifying code that is often not fully understood by anyone, so trial-and-error is the only way to proceed. Being a programmer on a project that descends into trial-and-error purgatory pretty much completes the conditioning. The problem with on-the-job training in the IT world is that the examples are often very bad ones, so the situation is largely self-perpetuating.
This is not an issue of iterative vs. traditional development. The former, properly applied, is an effective, and probably the only practical, means to apply design skills, not an alternative to them. Trial-and-error programming is a pathological state that any project is at risk from, in the absence of the skills I have described above.
In fact, Extreme Programming has a feature that may be of great help here, in the practice of programming in two-person teams (reminiscent of the 'surgical teams' proposed by Harlan Mills and described in Fred Brooks' 'The Mythical Man-Month'). If, in such an environment, a skilled designer can act as mentor to a junior programmer, we might begin to reverse the tide and start to develop a community of skilled software designers. When that happens, we will need well thought-out processes to efficiently harness their skills. Design cannot be taught solely in the classroom; I think we are going to need some sort of bottom-up revolution like this to really change the way software is written.
Andrew Raybould has 15 years development experience, primarily as an independent contractor, and mostly in the financial, telecommunications and computer services fields. Mr. Raybould has a Master's degree in Computer Science from the Polytechnic University of New York.
Trackback(0)
Comments 
Write comment
 |