Reversible Design
When you can try ideas freely because undo always works
Programming is an incredibly creative endeavour. Like story telling, it is the industry of pure ideas, which compete with each other with reckless abandon.
One of the most important things to have a very strong grasp of as early as possible is software design. Design is difficult to define in any concrete way, even though many people are happy to supply their own definitions. I’m not going to do that, because I view design from a different lens. I think of it as a criteria for how easily reversible a design is, and which is something one can test one’s quality of work against. Good design allows the correcting of errors as easily as possible.
Now one cannot anticipate every single error that may befall one’s program, but good design allows you to make progress more than bad design. One can think of it in terms of error prevention and error correction. Badly designed software does not really prevent entire classes of errors, and the errors, when they inevitably turn up, are jolly difficult to correct. Correcting one bug will create a host of new ones. Well designed software not only prevents entire classes of errors, but the few that still do creep through are detected early and easily corrected. That correction is built into the program itself without causing other parts of the program to fall over. Now, it is very easy to make mistakes while coding, and it is even expected. But bad design results in old mistakes appearing many times, and good design results in a new mistake appearing only once.
Ultimately, design is about writing code in a way that makes it easy and cheap to make changes while keeping its functionality intact. It makes software adaptable, and it prevents one from undermining one’s ability to correct mistakes. It is said that building software is like building lots of little solutions to problems. The greater challenge lies in how to make those tiny solutions talk to each other in an effective way. And I think this is a big part of why good design, almost as a natural side effect, not only results in code that works, but also code that performs as fast as possible. It is it is intuitive, readable, reusable, explainable, and robust for performing a specific job very well, rather than attempting to handle multiple tasks with a substandard success rate.
Good design is an incredibly creative endeavour. AIs are unable to dabble in creative thought, and this is why the thinking must always be done by ourselves, even if the typing itself is done by AI.


