The problem with software
Software does not wear and tear. It does not break. It does not fade, evaporate or oxidate. Software is not affected by its environment. To update software to its changing environment code needs to be changed, by humans.
Another challenge is we can not proof that the software is programmed correctly. Testing helps, but: program testing can be used to show the presence of bugs, but never to show their absence (Dijkstra, EWD 249).
Software has become complex beyond comprehension. It resembles a dynamic system. Small changes in input can give major changes in output. Code is built on code and turns from structured material into amorphous mass. And we constantly change the input as well as the code.
So we must move to a different model for creating and maintaining software.
What we do today is gather requirements. From the requirements we build the software.
Then we test the software by translating the requirements into test cases (ideally – linking requirements to test cases is not such a generally adopted practice even).
Why not turn requirements in code, automatically? Instead of teaching programmers to create code, we should teach them to generate code. Then we can change the requirements, and regenerate the code. Or it can change/regenerate itself.
A recent article in The Atlantic discusses a coming software crisis. The remediation that is described in this article is to apply formal methods. This basically means we do not code but create a formal, mathematical model of the problem space. This model can then be turned into code. This code can be proven to be correct. The article explains how the existing formal methods, like TLA+, are still immature and there is still a lot of skepticism in the market on its applicability.
Formal methods have been around for a long time, but they never developed beyond an academic context. Translating more complex problems into formal models has proven to be very difficult.
For now, we will have to do with the current discipline. Which could do with more discipline.
Programmers often (must) start coding before understanding the problem, and having a comprehensive idea about the solution. They are caught up in the detail of programming. And modern languages (Java or JavaScript) do not make that easier. These nitty-gritty programming languages leave a lot of detail to be handled by the programmer – making it even more difficult to oversee a program’s complexity.
Also, a higher level of reuse should be encouraged. Every day in software you see programmers solving problems that have been solved for decades. Time pressures, and inaccessibility of existing code make programmers build yet another sort routine, search algorithm or data access mechanism. The building libraries of abstract, generalized libraries should become a common discipline among development teams.
Adopting a microservices approach (not necessarily the technology) will further help separating functionality, making the software system more flexible and therefore change-able.
I am a big proponent of coding for longevity but that is a very controversial opinion these days. But delivery speed is more important than delivery quality. Because things change so fast. Yes, this is true, but we oftentimes can not tell which code will last for decades and which code is quickly obsolete. So we’d better increase the quality of what’s delivered. And invest in methods and technologies that can help improve quality.






Excellent book by the way, a must read for (computer) engineers and other Betas. You will get your soldering iron out.
Christensen makes a similar claim. Organizations fail at innovation because they manage innovation the same way as they do there mature business units. This inherently fails. There is a lot of similarity between the thinking of Christensen and Hwang here. These guys should talk. And invite Fried and Heinemeier to the party.