Physics and mathematics, like other respectable disciplines, require that you think clearly to succeed in them. That’s why many successful computer people come from these fields. It’s harder to do what people do nowadays — start in computer science and stay in it — because it’s a very shallow discipline. It doesn’t really force you to exercise your intellectual capabilities enough.
..They published a ten-year plan that included a foldout showing lines of development and milestones when breakthroughs would be made. It’s all nonsense because no one knows how to do these things. Some of the problems may be solved within the next ten years — but to have a schedule! The world doesn’t work that way. If you don’t know the answers to the problems, you can’t schedule when you’re going to finish the project.
The most important goal is to define as precisely as possible the interfaces between the system and the rest of the world, as well as the interfaces between the major parts of the system itself. The biggest change in my design style over the years has been to put more and more emphasis on the problem to be solved and on finding techniques to define the interfaces precisely. That pays off tremendously, both in a better understanding of what the program really does, and in identification of the crucial parts. It also help people understand how the system is put together. That’s really the most important aspect of designing a program.
Some people are good programmers because they can handle many more details than most people. But there are a lot of disadvantages in selecting programmers for that reason — it can result in programs that no one else can maintain.
Our aspirations are contstantly increasing, so the development of better abstractions doesn’t make the task of programming much easier: It means we can do more elaborate things. We can do more because the primitives that we are using are much more powerful.