Someone recently asked me to come up with one reason software projects failed. Although this is more generally about software development, many of the things are unrelated to platform.
Here’s what I wrote:
Un-unified vision across all participants.
In order to make something, you first have to see it in your minds-eye. Not only the developer, but everyone involved or affected by the system … so-called stakeholders. It is common that due to workloads, personality differences, inexperience, unwillingness to deep dive on what needs to be done and more, people will not cover parts of what is needed.
There is often a cultural clash between developers and business people who need the system. The developers need specific, deep details about the business process that is being implemented, and the business person is either too busy, unsure (an unwilling to say so), annoyed by the persistant questioning, or unaware of the level of detail that is needed to eliminate the ambiguity.
Generally, in this party of 2, someone has to reach over into the others’ discipline in order to understand the realities and tradeoffs necessary. If neither person steps up to that task, then communication problems will occur and the software will suffer, often fatally.
Creating software systems is about as flexible as building houses. Once the concrete is poured, the walls are up, the number of floors decided and the layout commited-to (in wood), any changes after that become hugely expensive, involve discarding previous work, compromising work that remains, confusing participants and more.
The secret to good software projects is to spend the time and energy to get to the bottom of the details. I have evolved over many years to typically spend much time with the business people to learn their business at a level of a full-staff member. Then, I can look for gaps between the two visions, articulate them to the business people, and wrestle with the discrepancies and the challenges that these open issues create within the software design. This needs to be done methodically throughout the software and business application.