Imagine a painter having to first plan all her strokes, brushes and color mixes in an abstract list and then “execute” a batch of those moves on the canvas and see where that got her. That is obviously an inefficient way to work and would probably not yield the high quality that would be possible if feedback where given after each stroke as is in the real world. But in our craft of software development we are in the habit of creating those batches of work and then see where that get us.
Are there any first principles of programming? I am at least going to entertain that hypothesis and try to put forward what I think are the first principles when designing quality software systems and when selecting the tools to use.
The first principle I will discuss is immutability.