What is the least understood thing in computing that if only it were understood, everything would change?
Glen Vanderburg, Countrywide Home Loans
We have a mania for abstraction, but our brains are optimized for the concrete. We are trained to abstract, to generalize. Butler Lampson famously said "All problems in Computer Science can be solved by another level of indirection." The drive for abstraction isn't wrong; it's an essential part of software development. But we generally do it so irregularly and so poorly, and one reason is that abstraction is somewhat unnatural for us.
We learn best when we can hear, taste, smell, and (especially) touch and manipulate the world. The best programmers are good at a kind of "mental modeling" that allows them to do the same with the abstract components of our field. A good spatial sense and visualization seems to accompany software skill. We need to find better ways to bring the rest of our brains?the parts that are designed for life in the real world--to bear on the problems of programming. We need to build better tools, tools that don?t lock these complex, multidimensional constructs into oversimplified, two-dimensional representations. More importantly, we need to teach and cultivate those mental mapping and modeling skills that the great programmers use instinctively, independent of their tools. We need to program with our whole selves, not just the tiny parts of our brain that are good at abstraction.