Wille Faler is an experienced software developer, architect and agile coach with experience across a number of different industries as an independent consultant. Wille specializes in backend, integration, and Java technologies, but has more recently found a passion for Scala and text mining/analysis. Wille is a DZone MVB and is not an employee of DZone and has posted 42 posts at DZone. You can read more from them at their website. View Full User Profile

There is something rotten in the state of Computer Science education

  • submit to reddit

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.

Published at DZone with permission of Wille Faler, author and DZone MVB. (source)

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)


Aries McRae replied on Mon, 2010/07/26 - 7:50am

Computer Science leans more towards algorithms and theories.

Software Engineering emphasizes more on the practical aspects of software development.

Whether software eng conforms to the classical definition of engineering is another topic altogether.




Jonathan Fisher replied on Mon, 2010/07/26 - 9:37am in response to: Aries McRae

This argument is made thousands of times, for 'majors' outside of CS as well. It boils down to this tireless question: "When am I ever going to use this???" Chances are, never. What you are buying with your college education is:
  1. Proof you are a mature individual, in process of transitioning from a rebellious teenager to an adult.
  2. Proof you can follow directions, work in teams, and deliver on deadlines
  3. Proof you are indeed dedicated to your subject matter, and are willing to make a career out of it
  4. Learning how _you_ learn. In college you have lots of freedom, you developed a system for learning things that works best for you.
  5. An introduction to beer
  6. Lastly, a basic background knowledge in the subject area. This is most often taught in CS by having you memorize specific classic algorithms.

Alexandru Repede replied on Mon, 2010/07/26 - 10:17am

indeed a pain in the ass it is. some try to scratch the surface with some Design Patterns, but no principles behind them, just raw, out of the GoF book descriptions, that few understand (or even try bothering to) no one teaches you "the why" those patterns, the principles behind them (Object-Oriented Design like SOLID, GRASP) or other principles like "Tell, don't ask" no one teaches about the refactoring techniques, "the how" to get to those Patterns no one teaches you how to write clean code. if anyone did write clean code, the programmer coming after you, won't be cursing your hole family for the code you left for him not to mention agile methodologies... pff and, encapsulation, the hard part of OOP, that should have been level zero of knowledge for OO programmers, i think it's a mystery to most of programmers. "let's spam getters and setters, people !! never mind information hidding !", "but what about encapsulation ?" "encapsu-what ?? yea, yea..." and this out of, mainly, no one showing these things to new programmers i, for one, had a hard time even finding the books to get educated at writing good code. if i only had a refference... computer science in school has values so different from the IT business (like maintability, adaptability, etc.)... and those values are so old that something you thing you're talking to the inventor of the pc

Chad Hahn replied on Mon, 2010/07/26 - 2:04pm

If I want a 1000-line method of unreadable code that can't possibly work, I give it to the CS grads.  If I want someone that understands source control, IDEs, build tools, databases, ORM, XML, XSLT, XSD, Javascript, JSON, good coding practices, code maintainability, and the fact that great code is boring, I give it to the self-taught hacker.  I say that with tongue fully in cheek, but you need to understand; Computer science is not about programming.  The sooner you figure that out, the better.  Most software development jobs are for programmer monkeys.  Sometimes the programmer monkeys have to be really, really smart, but not in the way that CS courses teach.

Giorgio Sironi replied on Mon, 2010/07/26 - 12:58pm

At Politecnico in Italy we usually makes fun of computer science courses. That said, ours computer engineering (not science) course is pretty hard because of the various engineering things involved (calculus, physic, electronics) but it has separate exams for algorithms (three basic courses) and software engineering (one mandatory and one advanced course plus a project). Of course you have to hack in the free time if you want to be a serious programmer, but this is a start.

Matt Seil replied on Mon, 2010/07/26 - 2:57pm

I think it is a grave myth that CS schools are supposed to "prepare students for industry." The aim of colleges--even at the undergrad level--is to arm students with enough computing theory that they can think on their own; but as an aim of creating future researchers--not industry pros. The aim of college is NOT to create soldiers for industry, even if that's where most students end up. But since we're on the eve of software engineering becoming a licensed profession (as Physicians and lawyers before us), more time should be spent on design classes. But what should we cut out? Writing those basic data structures if given by a skilled programmer (vs. unskilled professor--most PhD's can't code) can be a very difficult challenge. Having worked industry for the year that I have, I can also say that almost any solution you want is available via google--so it's not like dropping data structures will fix anything. It seems to me the argument "because they can cheat, we shouldn't teach it" is the mantra here. If you as a student--approached your data structures study seriously--it teaches you to think at a level of detail that does teach good basic coding skill. In my case, my job in industry has been far easier than anything I learned in school. Most of the onus here isn't on the college, its on the student. If you want to be a professional coder, get on the ball and start reading books about good design--Uncle Bob, the classic "Design Patterns," etc, are all great places to start. "Thinking in C++" or "Thinking in Java" are great places to learn OOP. In fact, I was recommended by an instructor to get those books. College is to teach you to be a self-learner. Use that skill!

David Lim replied on Mon, 2010/07/26 - 5:57pm

Well personally, putting the entire blame on the education system is not entirely correct. My lecturers never told us to memorise algorithms, but to understand them. Yet some of my fellow students memorise them anyway, to the point where they even memorise the variable names. Usually, the curriculum itself is fine... but some lecturers fail to help students realise that they need to understand the concepts behind certain things, rather than what their definitions are.

But then, I suspect the same argument can be made for many other disciplines. It's really not just what and where you learn or who teaches you what. It's how you learn.

FY, your "where" should be "were" ;)

Kode Ninja replied on Tue, 2010/07/27 - 4:29am

There are no bad students, only bad teachers...

The problems you list with CS are also present with other branches of engineering. Students in most branches of engineering are so far removed from what's going on in their respective industries that a lot of them have to undergo another round of extensive training with their respective employers, when they get on the job. No wonder so many companies have an extensive induction-cum-training process for freshers... especially in IT!


Arturo Belano replied on Wed, 2010/07/28 - 11:37am in response to: Giorgio Sironi

Well don't laugh out too loud. Being a CS major myself, I've had the chance to work along some "engineers" in several projects who were completely unaware of the most basic principles of CS. IMHO day to day coding has to do more with craftmanship, an engineering background shouldn't hurt though.

Corneliuswheldo... replied on Thu, 2011/03/10 - 3:35am

You can "try" and of course you try. But this is not Unit Test that will give tell you what is the good output. It is not even the specification. What give you the solution is running the damn software, debug, inspect the variables, inputs and output. Insert thoses 2 or 3 lignes of code. Run again, verify. Check that you was wrong... try again. Lancaster SEO

Rehman Khan replied on Sat, 2012/02/25 - 3:58am

I think that one of the big problems with University level learning is that you don't learn the benefits of good OO design until you work on a large project. You probably learn the most in that period of the project at the end, endless bug fixes and small changes (the part where most architects are long gone!). And when doing version 2, of course.

Knight Sukn replied on Thu, 2013/07/25 - 4:42am

It`s very important to learn the basic fundamentals of software design at the University, my son is a business school applicant and he likes that in the first year they are taught the basic things that they should, after that it`s easier to think about how to implement these ideas further.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.