Software Developers: You Need Computer Science Education!

Computer science and software development are two entirely different things. The former is a science, the latter is mostly craftsmanship, still struggling to become an engineering discipline in its own right. Being a good computer scientist doesn’t make you a good software developer and vice versa, but as a software developer, you have to know your computer science basics if you want to succeed.

The IT industry is full of people from different backgrounds making their living as software developers. We have computer scientists, engineers, mathematicians, physicists, and also lots of people from strictly non-technical disciplines. Some have university degrees, others don’t, but they all develop software.

Often, You Can Get By …

You don’t need a carpenter to build a doghouse. Neither does it take a software developer to hack together a simple PHP-based web site.

Knowing each and every detail about a particular programming language, playing a lot with new technologies and also reading up on your design patterns will take you a long way.

But it doesn’t end there. For standard applications in a given field, you can pick up enough knowledge to do a decent job. Frameworks like Java EE have been built so you can ignore some of the inherent complexity. If you know your tools, frameworks and business domain well, then you will most probably outperform 90% of your colleagues, computer science background or not.

But Sometimes You Can’t

More than once I’ve seen the results of improperly trained software developers trying to solve problems without the necessary background knowledge. Among other things, I’ve seen people:

  • picking wrong algorithms and data structures because they don’t know
    about time/space complexities.
  • trying to parse a CH-2 language using regular expressions and being surprised why they "just can’t get it working".
  • introducing bugs while transforming nested if statements because they don’t know Boolean algebra.
  • implementing network protocols without knowing what a DFA is, resulting in unreadable, unverifiable code.

That’s only the tip of the iceberg. What I find disturbing is that most don’t even realize how poorly they are doing. They’ve been developing software for years and don’t even begin to think that the problem could be them and their lack of basic knowledge. If they are able to sell themselves well, management eventually gets used to the "fact" that some things "just aren’t technically feasible".

Most people know that they’re ignorant when it comes to physics, chemistry, medicine or other disciplines. You won’t let the gardener cut your hair even though he does such a beautiful job with the roses. In software development, this doesn’t seem to apply. Hand them a keyboard and send them off to the trenches. As long as the code compiles and does roughly what you want, they can’t be this bad.

How Computer Science Helps You

I’m not talking about formal degrees here. Sure, a CS degree from a good university is a great thing, but the concepts are important and they’re very hard to learn on the job from looking at existing technologies.

Computer science is about abstraction and developing concepts that you can transfer to new, yet unknown problems. Some people are brilliant and figure it out all by themselves. I couldn’t. More than 99% of people in IT couldn’t. You can probably deduce a thing or two from examples, but that’s it.

Picking up concepts on demand isn’t enough, how would you know what’s relevant? Sometimes seemingly unrelated things play nicely together (ie. functional programming and batch processing with MapReduce). Even for computer scientists it’s difficult to see connections, but for others it’s like trying to solve a puzzle while having only a fraction of the pieces. The broader your knowledge is, the higher your chances that you can connect all those bits and pieces and come up with something that solves the problem in a clean and efficient way.

The most interesting part of software development is problem solving. You have a much better chance at succeeding if you don’t start out at zero.

This entry was posted in computer science and tagged , . Bookmark the permalink.

22 Responses to Software Developers: You Need Computer Science Education!

  1. panzi says:

    I have to agree with this. I think especially learning OOP concepts is important (e.g. why subtyping != inheritance). But I have to confess I don’t remember what “CH-2” stands for and I didn’t find it on Wikipedia. Also what do you mean by DFA? Data flow analysis, Deterministic finite automaton, Differential fault analysis or Dual Factor Authentication?

  2. mafr says:

    DFA is a deterministic finite-state automaton, and with CH-2 I mean a Type-2 grammar from Chomsky’s hierarchy (aka. context-free grammar).

  3. ManTheBob says:

    “More than 99% of people in IT couldn’t.”

    Strongly doubt that.

    • mafr says:

      Hmm, decades of research are hard to catch up on for a single person, even if you’ve got nothing else to do. Figuring it all out by yourself might be even harder :)

      • bebiwani says:

        sir ,i would like to find my self with the best knowledge of software developing , ryte now am currently on computer science studying bsc ,so which is the greatest shortcut to optain software developing knowledge, am confused please sir , i dream of being a good software developer

  4. yao says:

    I agree.When I have a complex task.It is hard to talk with someone which lack the computer science background.

  5. Alex says:

    The ‘computer industry’ has never had enough programmers to fill the ever escalating use of its technology. Maybe why many languages were introduced with the ‘sales pitch’ that actual programmers would not be needed! Years back this already started creating pseudo IT practitioners.

    I propose that unlike other ‘professions’ we, well, don’t have one. In the main we have no mandatory society that accepts us, assesses our stature or expects on-going training / examinations and enforces peer review! So we will thus be surrounded by others who do not see the value of being educated nor in getting self educated!

    A solid example: I now see more and more ‘business computing’ trained software engineers cropping up in ‘safety critical’ roles! You know the kinds of programming that result in death when faulty!

    A cause? Maybe the dumbing down of our degrees and their replacement in some quarters – by 1 week “certifications”. Makes most employers treat us all like we’re “potentially incompetent” through repeated bad experience!

    Getting used to doing stupid tests for both agents and employers? Well they are rarely skilled enough to conduct this effectively let alone professionally. Did I sigh already?

    Second example: I sat my first psychometric (including technical) tests this year (I passed, sigh of relief). Well I got my MSc in ‘Computing Science’ in 1989! It had some cachet then! Now? Dime a dozen.

    Maybe I should undertake a PhD just so that employers can again recognise something of achievement!?

    Computer Science is a large body of work, and to operate in ignorance of that is a mistake, so I’m all with you on that count.

    Maybe too critical, but are we all potentially facing a future under the monicker “software trades person”?

  6. Stefano Pedone says:

    “Computer science and software development are two entirely different things”. I agree from the first line.

  7. juan de la cruz says:

    Yep I Agree!! (Scenario: Internet, Web, Cloud any new name??)

    Most of the software developers and many
    web-developers are facing difficulty of
    understanding what is SoC (circa 1974).
    Years later the “hype of MV/C” (circa 1990),
    as foreseen on the shortcomings of the OOP.

    AND It all boils down to one thing!!!
    I guess the primarily cause was mostly influenced
    by large profit based corporation, through
    advertisements on “purchasing a RAD tool
    and equip with “4GL based DataStore at the back-end”
    = will produce quality software?
    But as I see roughly 80% of this approach fail.

    Now time flew by fast and after semiconductors
    went cheap, they can sell again something? And what
    about it? Distributed System (new hype to sell),
    Middleware came out of nowhere, MPI pop-up like
    alert window on browser screen, SMP, GRID et al.

    (sigh.. are we progressing as homo-sapiens?? or did we raise the substandard among ourselves like promoting
    “Anyone can do software – Banner” and what scares me was
    BsCS are also degrading because the schools
    and universities was being pushed back by
    corporation to use their proprietary
    Programming Language / Platform or etc – by how?
    By promoting high level PL and discontinuing support
    for old PL!! I was in the assumption
    FORTRAN might be gone.. but hey! FORTRAN is still
    the best in the science computing field).

    Now we are beginning to take the hype again of
    “Event Based Systems and Async I/O”
    which pretty solves “Solving the 10k Problem”
    and others, but what the heck… this was way way back “Automaton” (if anyone of you are familiar
    with embedded you probably know this,
    even the TCP/IP stack implementers do know this)?
    END BIZ;

    Back to Computer Science,

    “Computer science and software development are two entirely different things. The former is a science, the latter is mostly craftsmanship” – I do strongly agree

  8. Dan Moore says:

    I agree with the concepts presented in this article. However, it would be stronger if you’d pointed out some actions that folks could take.

    * Take a course at your local university.
    * Work through a CS textbook by yourself or with friends.
    * Go through a course or two at MIT

    Any other suggestions?

    • mafr says:

      You’re right. I’d also suggest to take your typical entry-level CS course (the MIT ones are great).

      As a next step, I’d work through a book on algorithms because in my opinion that’s where you get the most profit as a software developer. Many recommend “Introduction to Algorithms” by Cormen et al. I was never happy with Sedgewick or Manber, so I’d go with Cormen.

      • panzi says:

        And a book about OOP, design patterns and maybe functional programming. The last not so much in order to then really use a functional language but just by understanding the concepts/motivations behind it help you understand and solve problems in other languages (e.g. why side effects are bad and what ways there are to prevent them… and when they are ok).

  9. The Moth says:

    I basically agree with you, especially since you make the distinction between having a Comp. Sci degree and actually knowing the concepts and how and when to apply them.

    But I don’t think you need a computer science “education” so much as you need to be good at abstraction and mental synthesis. You need that as a basic starting point. (And that’s not actually Comp. Sci.) But more important imho is the need for practical Software Development skill. You hint at it, but what I would call Software Development skill probably goes much further and it is also not Computer Science in the true sense.

    Most people developing software are not writing compilers or even developing commercial grade software development tools. They writing business software to solve business problems. A lot of them are doing a confused and mediocre job, i.e. writing buggy software that’s late and/or over budget. I really don’t think it’s a lack of strict Computer Science know-how that’s causing this. Like I said I think it’s a lack of deep, practical Software Development skill. I think most of the examples you sight are at the edges of “the bell curve” and are not that common. I think most deficiency in IT development come from good, practical Software Development skill, which you never really learn studying Computer Science.

    Also, mention JEE. I think the J2EE/JEE specs are a good example of possibly too much Computer Science knowledge and not enough practical Software Development know-how. Why the JEE spec writers didn’t realize they were trading one set of complexities for a different set of complexities and that the overall complexity of the problem was not reduced but only shifted, I don’t know.

    I have never trusted any of that we are going make software development easy marketing BS. Software development is complex. Period. So if you want to be good at it, you better learn how to handle complexity. Even when you succeed at reducing the complexity (like how the Spring Framework reduced the complexity of JEE development) what you’re left with is STILL complex. It’s never simple. There’s a reduction in the amount of complexity, but complexity has not been eliminated. Spring development is less complex than raw JEE, but it is not simple and easy.

    • panzi says:

      I think the J2EE/JEE specs are a good example of possibly too much Computer Science knowledge and not enough practical Software Development know-how.


    • mafr says:

      Yes, missing CS knowledge isn’t the only problem our industry has, it’s probably not even the most important one. However, if you really want to, you can learn basic software development skills at university (I realize this was different a decade ago). But you need lots of initiative and discipline to apply those skills in practice. You have to learn from books (Code Complete, Clean Code, Refactoring, GoF, etc.) and lots of code to really master your craft.

      Re. complexity and Java EE: I think Java EE keeps getting better with each spec release. In my opinion, Java EE 6 has finally caught up with Spring in the most important areas (developer usability being one of them).

      Anyway, I think the complexity of the problem you have to solve is always the same, no matter which technology you pick (my definition of complexity differs a bit from yours). If you’re lucky, your problem aligns well with the problems a framework like Java EE aims at. This is basic divide and conquer: part of your solution is encapsulated in a framework, making your job easier. Anybody can build complicated systems; the really hard part is building a system that is simple and adequate for the inherent complexity of the problem.

  10. Alex says:

    Perhaps something, anything, appears complex before a little reading and practice! My first ever coding must have been in BASIC and I recall even general computer concepts seemed complex. Of course assembly then FORTH helped to reveal the simplicity within the machine. Now that was all as a science undergrad i.e. before any CS studies. Maybe that sits well with people who code without formal CS training or qualifications?

    Hmmm, though that early coding worked, my later CS course opened my mind to so much more than just ‘it works’. It mapped theory to practice. It introduced me to theory that I had no idea even existed.
    The reality? What code came before my CS studies was, ermmm, technically CRAP! Reliable – probably, if run by me alone; maintainable – yeah by me; portable – endian who?; scaleable – in terms of big ‘O’, it was more like suck it and see, or the big d’Oh’ ;-)

    Anyway, noting some strange comments here, I’ve worked with JBoss and must point out that Java EE really is an easy ride. I’m sure many have had to write packet assembly / dis-assembly code just to enable new messages moving from network to transaction server! Java EE? Just plug in JMS, a 3rd party did all the hard work already. And like all other JEE components, it’s simplified and makes our programming lives so much easier! And before the tirade of ‘real programmers code in binary’, I also write code to handle ‘oil well’ logging data or even satellite data i.e. roll your own complexity. But somebody has to pay for that much bigger investment in time and effort. If your problem doesn’t need that, you’re the one INTRODUCING complexity to the solution!
    Hmmm, makes me think that CS studies don’t always have the desired effect. I think it was 101 for learning ‘KISS’!

    • mafr says:

      I think the Java EE stack is really overkill if all you want to do is build a small web site. In this case you’re really adding complexity to the solution. Just looking at the length of stack traces gives you an impression how much is going on underneath :)

      However, properly defined deployment artifacts, monitoring via JMX and things like that really help you in an enterprise setting. That’s where frameworks like Rails or Django (as much as I love it) fall short. Not to mention that due to tool support, larger code bases are far easier to manage in Java (or even .NET).

      But still, despite all this fancy new stuff, sometimes I really miss system-level programming in C :)

      • Alex says:

        > a small web site.

        Matthias, most certainly – for my own website I switched to using a CMS – a ‘zero’ programming solution :-)

        > Rails or Django (as much as I love it) fall
        > short

        though I have not used Grails commercially myself (just Groovy on a contract) but perhaps Grails clones the good stuff in Rails, whilst one gets to keep the JVM tooling and enterprise APIs! Not a sales pitch, just an idle observation.

        > system-level programming in C :)

        I’ve often slammed Java language for the painful and excessive verbosity it foisted upon us. Java file handling for one had oft made me wish to “reach back to C”.

        Of course I have shot myself in the foot enough with C’s potential for partial stack overwrites (a subtle bug appears in the stripped production version but of course runs OK when compiled for debug) and all the other fun (but time consuming) asides that come with the territory.

        There are now LOTS of language / platform choices potentially mapping to a project’s parameters, and it takes some reading to remain open minded (and I’m referring to myself).

  11. I agree with almost the entire post and would like to add a point:

    Know yourself.
    There is no shame in recommending someone else for a task you know you won’t do well.
    But there is shame in failing where you knew before.

    If you are a supreme expert for databases and they ask you to design a handy GUI – just tell them the result wouldn’t possibly be what they’d expect.


  12. Pingback: So Much for 2010 « Unmaintainable

  13. Coming from a business school background that taught first and second year computing science courses as well as higher level software project management or engineering skills, I really appreciate the rigor that professionals who’ve studied the full computing science program have gone through to hone their skills.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s