An imperative programming language requires a human to hand encode all the steps and possible situations that the program might encounter during its lifetime.
This is micromanagement to a large degree.
The goal of software creation tools should be to move away from programming and towards:
- training the software system
- organizing/testing ontologies
- setting goals
Software creation tools should be able to auto-generate at least some of the code.
Analogy #2: Programming is like being a bad teacher
When I was young and naive, I used to think of video game consoles and computers as at least semi-intelligent. The idea of programming a computer was akin to teaching it.
As I started down the road to being a programmer, however, I quickly discovered that it was nothing of the sort. Programming is dry and cold and dead. You're creating a static maze for the CPU to spin through, turning left or right based on the flickering of a trillion memory cells.
Just recently I was struck by how programming a computer is like being a pedagogue (slave-teacher). A pedagogue commands you to do something, and you must do it! That is the only job a pedagogue has.
Teaching, on the other hand, is about guiding another entity to absorb and model the world that they're interacting with so that, ultimately, they'll be able to do what you do, independant of your commands!
This is the difference between machine learning and programming. One must give way to the other. Programming is a dead end.
Learning feeds back on itself in a harmonious way -- the more you learn, the more mental tools you acquire, and the better you become at learning!
Programming feeds back on itself in an entropic way -- the more you program, the larger and more complex the program gets, and the easier it is to make mistakes.
Of course, you could argue that as a program grows larger, it can contain learning elements. However, these are just bandaids -- the entire process has to be freed from the control of monkeys for it to truly evolve.