This aspect is far more important than the traditional goals of reusability and extensibility. Typing is not the bottleneck. Our limitation lies with grasping complexity. However, I believe that this approach is also flawed. For one thing, there is no clear conceptual difference between design and implementation.
Design exists at all levels of code down to the granularity of algorithms.
It is important that high-quality design principles underlie all levels of code. Furthermore, this role distinction lulls us into the naive assumption that we can get away with hiring relatively uneducated and untrained coders to act as bricklayers. Not only do the bricklayers need a high level of skill and training to be effective at a more granular design level, it is highly unlikely that an elite group of architects can have adequate intellectual resources to manage complexity effectively by themselves. Every coder should be trained and educated in good design, and the complexity load should be distributed more evenly across the development team. I believe that the key to improving the software development process is to focus a lot more attention on simplifying designs and making them accessible and understandable to the team.