When I went to university, most of our programming tests and projects where evaluated based on our grasp of various algorithms for sorting, tree traversal, hashing functions and numerous other things, you know, the sort of thing that most high level languages will actually give you for free in their standard API’s.
What we didn’t get to learn, or what our teachers just glossed over, and glossed over in ways that where harmful where basic object oriented concepts like polymorphism and encapsulation. In fact, one particular programming teacher told us to do outright bad things, bad habits that took me years to scrub off as I trusted the teachers advise.
I have a sneaking suspicion I’m not the only one with a similar experience: looking at the amount of bad code in production systems today, and the sheer amount of people who write software in object oriented languages, yet do not grasp even the basics of object orientation becomes mind numbing when you consider it. More people in our industry fail to grasp simple things like polymorphism and encapsulation than those who actually understand it, to use two prime examples. They are happy to use endless if-statements, switches and enumerations rather than polymorphism, and to have systems and sub-systems where each component and class must know about all the internals of all the other parts of the system.
To me, this all exposes a fatal flaw in the current Computer Science education system at all levels (university in particular): the education prepares people well to memorize various algorithms they don’t actually need to memorize, but it leaves people ill prepared to know the basic fundamentals of software design. The flaw is so fatal that it is actually an active liability to the whole industry and a big driver of the pervasive and excessive costs and schedule overruns, as complexity grows exponentially instead of being hidden and limited.
There is something rotten in the state of Computer Science education: it puts emphasis on the wrong things, doesn’t teach at all, or teaches the wrong principles in the areas that matter and fails horribly in preparing future software professionals for the demands of software development.