Computer science education and the real world

Enrolments in computer science degrees (in the US and Western Europe) have fallen drastically over the past few years, although I believe there has now been an increase in applicants from the low point in 2008. Part of this was a reaction to the 2001 dot-com crash but I believe that another factor is that many if not most computer science degrees are increasingly irrelevant as far as real-world computing is concerned.

There are two major areas of real-world computing that, IMHO, don’t get enough attention in computer science degrees. One is embedded, real-time systems. We are surrounded by such systems – I counted 9 in my home office alone apart from the computers (router, scanner, printer, 3 phones, 1 ipod, 2 cameras) yet some CS degrees simply don’t cover them at all and the majority probably only offer a single optional module. The other area is my own interest of large-scale systems engineering. Current large-scale systems are not built from scratch using waterfall processes but are constructed by reusing software at different granularities from program libraries to entire systems.  Requirements are negotiated and issues such as throughput, dependability and security are critical. Most courses do include some software engineering – an essential starting point for considering large-scale systems engineering but then they stop. They don’t include courses on topics such as dependability and enterprise systems architectures.

Why have we got ourselves into this state where CS degrees are about programming rather than systems? The argument I hear from my colleagues is that programming is fundamental (true) and learning to program in Java (or perhaps a functional language) and to analyse programs for e.g. complexity is all you need. This, I think, simply is a weak justification of an untenable position – that systems are just scaled up programs.  We have arrived at this state because of two basic problems with our university system:

1. It’s very hard for people in universities to keep up with changes in the world. People who were appointed 20 years ago have spent their time scaling the academic career ladder and many of them have had little or no contact with industry since they were appointed. Essentially, they have no idea what real-world computing is like.

2. People’s career in universities depends on their research. As researchers are clever people, they have derived lots of ways to publish research and so support career development. The community itself assesses the value of the research and relevance to industry is rarely a factor in this assessment. In fact, its often harder to publish work done in industry, even in software engineering, because it doesn’t tick all the academic boxes of what constitutes a good paper. Therefore, people do ‘excellent’ research in irrelevant things. Often, they are committed teachers and the research informs their teaching – but they don’t want sordid reality to intrude and actually have to teach something useful.

Of course, both of the above reasons are  (slightly) exaggerated presentations of reality but the blunt reality is that the reason why universities don’t teach real-world computing is that many of the faculty just couldn’t do it.  There may be intellectual value in a programming-oriented CS degree (as there is in a degree in Classics or Philosophy) but I believe that we must also design our degrees so that students are better equipped to make a contribution to computing as it is, rather than computing as it was.



Filed under CS education

39 responses to “Computer science education and the real world

  1. I am not too familiar with CS at St Andrews, so the points below are based on general observations.

    First, I agree with your overall point. However, I think the issues you point out are symptoms of deeper problems of a typical CS education:

    1. A CS degree is not taught as an engineering degree, yet graduates are expected to solve engineering problems.

    2. A CS graduate is typically unable to build a system from bottom-up, starting from electronics.

    3. A CS degree does not teach students how to evaluate systems using a variety of analytical, quantitative and qualitative methods.

    Points 1-3 lead to CS graduates who are unable to properly elicit requirements and then design, build and evaluate systems that solves a real-world problems on their own. (It is my firm belief this is the key reason the software I use in my daily life is so often so disastrously badly designed.)

    Since engineering fundamentals are not taught properly, industry know-how is constantly required to ensure a half-baked engineering education remains relevant for industry. If this flow of know-how stops or slows down then the CS educational program quickly loses its relevance, as you observe. I think a way to reduce this over-reliance on industry know-how would be to incorporate more aspects of fundamental engineering principles into the degree program.

    • This is not (just) a St Andrews problem but a general problem, IMHO, for CS in the UK, US and Western Europe. You are absolutely right that we don’t teach the subject as an engineering subject – one reason being resistance to doing so from faculty who prefer to thing of CS as a mathematical discipline.

      • Fred

        But CS *is* a mathematical field.
        Software engineering, computer engineering, heck even electrical engineering, are the disciplines which addresses the challenges that you and the previous commenter point out.
        The problem is that many schools, even those that offer every option listed above, aren’t explicit about which is the right degree choice for incoming students.

      • Fred – this is sort of true. If CS was ‘sold’ as a math degree I would have no problem with this (but wouldn’t work in a CS dept). Unfortunately, we sell CS by telling students about their employability and then don’t teach them modern development techniques. I suspect if CS was presented as a mathematical discipline, there wouldn’t be too many students who were interested.

    • Would you self-identify as an electrical engineer or a software developer/programmer/whatever?

      Because while engineering principles are certainly applicable to making software and software systems, it seems you see not being able to create the underlying electronics as an immediately disqualification for higher level skills.

      I think this overlooks like you do not need to be a physicist down to the bottom of the stack to create electronics. You can encapsulate the knowledge below a certain layer and stop there.

      As biology can stop before the quantum layer, because while it plays it’s part, it is not especially useful to think about the quantum effects at the biology layer. When you move to chemistry, yes, but being able to work in a given field doesn’t mean you have to know all other fields that support it.

      Making software has many unique challenges, that are different from making hardware, and this is a valid specialty, and large enough to never master.

      • I don’t think that anyone is suggesting than an engineering approach necessarily means knowing about the hardware. Certainly software engineering has unique challenges which have evolved dramatically over the past 20 years.

        But many of these developments are simply not reflected in CS degrees AND, critically, CS degrees don’t present an engineering approach where there is some analysis before construction and where whatever is constructed is measured and refined.

      • We are digressing a bit here but I’ll try to expand point 2 above. I don’t think hardware skills need to be substantial. However, I think basic awareness of hardware mechanics, possibilities and limitations do make better programmers. As an example, think about Don Knuth’s choice of the MIX assembly language on the hypothetical MIX computer in the The Art of Computer Programming.

  2. Pingback: Tweets that mention Computer science education and the real world « Thoughts on software and systems engineering --

  3. This guy seems to think that Computer Science education is designed to prepare you to be a Software Engineer. I would’ve thought a Software Engineering degree is for that.

    • In an ideal world this would be true but there aren’t many software engineering degree programs.

      Industry looks to CS degrees to provide people who understand modern systems. A lot of CS degrees simply don’t do that.

  4. The point of a CS degree is to provide a foundation (including extensive math, logic, programming, etc) that will allow the student to adapt and continue to learn to meet the specific needs of any responsibility.

    Software engineering is a subset of CS, and while it definitely covers a lot of careers, the other parts can’t be ignored in a CS degree. If you prefer a glorified trade school, get a degree in software engineering.

    Therefore, people do ‘excellent’ research in irrelevant things. Often, they are committed teachers and the research informs their teaching – but they don’t want sordid reality to intrude and actually have to teach something useful.

    I’m not too knowledgeable of CS research fields (physicist here) and I’m sure there are a lot of stupid CS research areas that exist, but calling all research irrelevant is a bit disingenious.

    • In principle you are right that CS should provide a foundation – but it doesn’t – that’s the problem. The world has moved on and what was thought to be a foundation 20 years ago simply isn’t for modern systems.

      I was not suggesting that all research is irrelevant but that people do research that is irrelevant to real systems which is OK with me. What is not OK is to exclude topics from a course that relate to real systems (students really do need to get a job and contribute to society) in favour of irrelevant research.

  5. I see your point. Most of the faculty in my college are the same; we haven’t incorporated too much technology in our engineering classes for the same reason: faculty have not been able to keep up with the pace of advancement. Then again, since most engineering, CS and IT jobs are switching to countries like India now, maybe there isn’t really a demand for systems knowledge here..

  6. MJF

    In my mind, comparing CS with ‘real’ professions is helpful.

    One does not leave Law School as a lawyer. One (should) have understanding of the law but be missing skills to function in a real law office.

    I have been working on large system (100s to 1000s of developers) (mostly) for 20 years. When hiring a new grad, I expect someone who can write code and will ‘article’ to understand how to function and contribute to a ‘real’ s/w project.

    Having them spend 3 hours/week lectures + (say) 10 hours/week in a lab for 12 weeks is not going to materially impact there ability to function in a system with 300 developers & 10 years of development. And this would be a loss, taking time from learning programming skills.

    They won’t be writing a (say) compiler, but the skills development in a compiler writing course is far more useful.

    • If only we still have compiler writing courses. I would guess less that 10% of CS degrees include these.

      And lots of degrees don’t do much on programming skills (one of the fundamentals that I think is important) – because students complain it is too difficult.

      • MJF

        Maybe I have been lucky. Most of the students that cross my path have had a reasonable programming background. Certainly no excuse to not have at least forgotten a compiler or OS fundamentals course.

    • Steve Taylor

      Engineering graduates most certainly don’t leave Engineering school as “Engineers” either !

  7. Here in South Africa, CS degree’s don’t tend to teach embedded programming, but the Electronic Engineering departments do. Is that not also the case in your part of the world?

    Neither of them however teach much about systems on a larger scale, which I agree with you is a considerable problem.

    • To some extent embedded systems are taught in EE but generally not software engineering. Therefore we end up with embedded systems hackers who reinvent things that were discovered in CS 30 years ago.

  8. f0ster

    systems will always change. the point of a CS degree is to learn the ability to adapt to innovative solutions; this is why you teach how to program. Once you’re in the field all you do is learn tons of technology stacks, hopefully you’re exposed to this at the university, learning a stack or API. What is the point is developing an entire curriculum about service oriented architectures? It’s pretty trivial to grasp once you’ve written your own network stack. If you want to get into real time and or embedded systems, you should probably take some computer engineering courses.

    I’m not really sure what your post is about; I don’t agree that universities should just teach java. I would not merit any CS department that doesn’t teach c/c++.

    Teaching how to program isn’t about rewarding intellectual merit.. You don’t teach about specific stacks because it’s constantly changing. You give people the tools to understand concepts at a grasper level, so they can adapt and innovate anywhere.

  9. I think you’ll find a lot of CS courses that don’t teach C or C++. And quite a lot that don’t teach the notion of a technology stack – of course, teaching specific stacks is not too important but students have to understand the principles and why these are important.

  10. So you’ve presented the problem, but what should someone do who is looking to get a CS degree? I have a BS in EE, and am looking at MS in CS programs in my area (Chicago, IL), but have stumbled on the problem you blog about. Every program looks like it will present me with a foundation, but does not incorporate real world experiences. Where can one find these experiences in an educational environment?

    • Hard question – I don’t know specific details of courses. Its perhaps even worse at the MS level (at least in the UK) as lots of places see such courses as ways of making money by selling them to students from Asia. Giving real-world experience costs so is often excluded.

      Maybe some other reader can help.

  11. When students who are give embedded tasks turn up on internet forums asking for help, it is often painfully obvious how far out-of-touch with the state of the art the university teaching really is!!

  12. Perhaps the best solution to the two problems you identified is to have non-academics do a lot more of the teaching. Why would an academic who’s never written anything larger than a few thousand lines, whatever their other achievements, be able to teach programming well? Other professions, such as lawyers and doctors, have this built into the system.

    Here’s a data point, how many departments do you know that insist on students using version control?

  13. foo

    Computer Science at my university is an Engineering degree. It is a department in the Engineering college. As such, Computer Scientists have to take the same pre-reqs (Sciences and Math courses) as all the other engineers.

    The program had several functional programming courses which used: Scheme, Haskell, and Prolog.

    There are several courses that primarily use C and Java.

    Then there are three different courses that cover algorithms, and largely focusing on proofs, and developing efficient solutions to various problems and proving why your solution was optimal.

    Most of the courses were very theoretical and abstract. But it taught you how to think in such a way that you could really apply that knowledge to any situation.

    For instance, we did not have a class on databases… I had never touched a database before graduating. But my first job post graduation, we used databases all of the time. It was very easy to pickup and I felt like my lower level, abstract theoretical knowledge that I learned from college made learning databases trivial.

    A good computer scientist should easily be able to analyze scalability issues and develop solutions to them that are fast and efficient.

    A good computer scientist should not have any problems learning about large scale systems, or embedded systems.

    I almost feel like your post is analogous to complaining about how maybe someone was never taught how to use a certain GUI builder program in college. But that person is able to write the program without the tool.

    Would you rather higher someone who:
    -Took photoshop classes (but never took theoretical classes on drawing)

    Or higher someone who:
    -Has a deep understanding of drawing, what looks good, coloring, lighting, shadows, perspective, etc… but has never had a class where they were taught photoshop?

    The first person might know the tool, but lacks the fundamental knowledge that will make them good. They will hit a wall with their potential unless they somehow learn the fundamentals.

    The second person does not know the tool, but has the fundamental knowledge that gives them practically unlimited potential once they learn the tool.

    A good Computer Science program gives the deep fundamental knowledge… everything else should be trivial.

    • Totally disagree. Everything is not “trivial” as you say after a CS degree. If this were true, I wouldn’t spend 3 – 6 months educating new CS degree hires (from CMU mind you) on things like SQL, requirements, uml, unit testing, configuration management, and so on.

  14. Computer science education should be bended to serve real world, that is what software engineering degrees are for. Computer scientists like Mathematicians should advance science.

  15. Why is it that a CS graduate is immediately equivalent to Software Engineer?

    Are astronomers expected build their own telescopes and observatories? The answer is no, because astronomy is not fundamentally about telescopes. Similarly, Computer Science is more akin to a branch of mathematics.

  16. Van_Halen

    I didn’t read through all of the comments, so sorry if this has been covered. I was looking for a professional certificate in ECE(embedded computer engineering) some years ago and gave up when i saw how bad the university programs were. They cost a fortune and you get very little in the way of real knowledge. These schools should be investigated. I won’t mention the schools but there were many.

  17. Bookmarked*** Well! I found it the best Post that I have gone through. This is something really interesting. thanks For Sharing

  18. John Hutchinson

    There’s a lot of “The Sabre-Tooth Curriculum” ( about this. And it’s probably significant that computing has only been around for what is essentially a generation. A lot of us *do* still think that the fundamentals are relevant because it “feels right” and because in certain specialist activities, they remain important. But the vast majority of software practitioners are involved in activities that do not rely on these fundamentals but on the skills that Ian describes. I’m a great supporter of academic research – even at its most arcane – and there is a good argument that some computing research should not simply be focusing on industrial issues. However, when at software engineering conferences “academic” almost precludes “industrially relevant” as Ian suggests, then it’s probably time for people to revisit the meaning of “engineering”.

  19. I like the helpful info you provide in your articles. I will bookmark your weblog and check again here frequently. I’m quite certain I’ll learn lots of new stuff right here! Best of luck for the next!

  20. It is really sad to know that most of the colleges and schools who teach all that is advanced do not incorporate the same in their own cases. This is ridiculous. There should be a revolution and an amazing change that has to take place should recieve a warm welcome.

  21. It is time that academic research gets itself very clear with what public is demanding. They want that all the fields should be explored. It should not rely only on the industrial researches.

    • @ Bege Shoor “public is demanding … that all the fields should be explored”

      Is that actually what the general *public* is really demanding?

      I think the general public is more likely to be interested in research that gives an obvious and direct return on their tax “dollars”.

      But, of course, without “abstract” research, we will never discover totally new things.
      There are plenty of examples of reseach that was considered “abstract” at the time, but is now key to practical applications…

  22. It pains me, but what you write is correct. I love software engineering, but don’t like reading IEEE Software or the ACM Transactions on Software Engineering. The articles have almost nothing to do with what I do in practice. They usually invent some tool that they programmed (by themselves), give it some nice name, and then give “data” that it works (usually their own students that must do well with it or get a bad grade). They have no idea about economic constraints and why I might do some types of testing but not another based on time, budget, and other “non-CS” topics!!!

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 )

Google+ photo

You are commenting using your Google+ 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 )


Connecting to %s