Those of us who have been developing software for more years than we might care to admit, are sometimes inclined to fret about the skills that junion programmers lack -- particularly those fresh out of university or college. And as is typical with software developers, if you have N of them in the room, you'll have at least N+1 opinions about just what skills are most important and the least well prepared for by our educational institutions. Naturally I have my own opinions and I'd like to argue about why they're important not just for a computer science education, but any type of education. This dovetails with the current trend to assert that computation thinking should become part of our core cuuriculums in both K-12 and post-secondary education.
In terms of skills that I find lacking in most developer straight out of school, the ones that strike me as the most important are abstraction, and its friends encapsulation, cohesion, and coupling. I often find that junio developers have very good skills in the tactical aspects of software development, such as 'what CSS style should I use to achieve a modal type dialogue?' or 'how do I set the isolation level for a transaction?" What they often lack is the skill to consider these types of questions in the overall context of the software that they are working on. Questions such as 'Is it appropriate to set the isolation level for the transaction at this point in the code?' or 'How do I make modal style dialogues easily usable by other members of my team?'
It occurred to me today that these issues aren't really confined to software development at all. The notion of abstraction, that is the ability to construct a mental model of something, and the capability to explore the ramifications of that model, is really what thinking is all about. Or perhaps to be slightly less grandiose, its what strategic thinking is all about. As in software development, people are often quite good at tactical thinking, that is reasoning about some specific instance of a problem, but often cannot draw out of set of problems the common elements that would allow them to forge a general solution to a class of problems, or perhaps worse form false generalizations from anecdotal evidence.
I think that there is an argument to be made that the tools, techniques, and terminology that we software developers have created to help us reason about abstraction and encapsulation, could in fact be the basis for a way to teach people how to think strategically, not just about software, but about anything. As I noted above, there is some effort underway to convince the education establishment that the world has changed, and computational thinking is something that eveyone needs. But perhaps the situation is really that we need to convince the educational establishment that we have way to teach people how to think, not just about information systems, but about anything.