Our approach to programming for the past 50+ years has mostly focused on specific features of a programming language. The result has been an emphasis on “general purpose” programming languages. The resulting language features, like object-orientation or static typing, must then be generally applicable. Where that generality fails, we expend enormous effort attempting to work around the difficulties, rather than avoiding them.
The next 10 million programs will not be built this way. We don’t have the time. We don’t have the money. And we can’t afford to fail as we have been. While the cost of almost everything is going down, the cost of failure is going up.