Is Having a CS Education Useful?

Khun Yee Fung, Ph.D.
Programming is Life
9 min readApr 27, 2024

Is a computer science degree worth pursuing? Well, okay, this might be the wrong question to ask. How about, is a computer science education worth pursuing? For me, these are two different questions. The fundamental question really is: do we get anything that we can’t get out of a classroom education for getting what a computer science education is supposed to be about?

To answer that, obviously we need to ask for the definition of “computer science education”. What do we want to be able to learn? How do we know if we have achieved the goal for such an education?

Computer science is not just about programming. I hope this does not come as a surprise. In fact, it is mostly not about programming. Don’t get me wrong, without programming, there is no computer science. But the fact that it is necessary does not mean it is sufficient. Let me give you one example. When I ask you about what your life’s goal is, you don’t tend to answer that you hope to be breathing quite freely for your entire life. I mean, doh, of course that is necessary to have a quality life. But it is a given, something you’d better be having. That is the same for programming in a computer science education. It is a given; and you’d better be good at it. At least able to do it. But it is not the interesting bit of a computer science education.

Okay, I know most computer science graduates can’t program worth a damn. That of course is very unfortunate. And I will explain why that is the case later in this article. Let us take on something else right now.

So, if programming is not supposed to be the focus of a computer science education, then what is supposed to be the focus? Well, firstly, the most important aspect of a computer science education is about the study of algorithms. What is an algorithm? How do you analyse an algorithm? How do you compare two algorithms solving the same problem? What are the classes of algorithms? What are the “species” of algorithms? What is connectionism and why is it better or worse than Good Old-fashioned AI (GOFAI)? Actually, the more important question for computer science is whether these are the only two approaches for AI. Secondly, it is about the implementation of algorithms. So, what are the algorithms used and how they are implemented in an operating system? What are the algorithms used and how are they implemented in a deep-learning system? What are the algorithms used and how are they implemented in databases? So, after the understanding of algorithms, we now have to study have these algorithms can be implemented in various domains. There are some more minor objectives for a computer science education. But these two are the big ones for me.

But isn’t implementation programming? Of course it is, but it is not programming in the sense like when you are building a website. Of course building a website well is important, but the understanding of what a website is, what its components are, how the components fit together, and most importantly, why these components at all, are what should be the focus in a computer science education.

When I interviewed candidates for development jobs, I always asked the candidates about their understanding of NP problems. Every single candidate would answer that they sort of remembered them mentioned in an obscure course sometimes in the second year or the third year. And none of them remembered what NP problems are about. Some of them actively questioned why NP problems would even be useful in the real world in the first place. The thing is, you see, I build systems that optimize, in real time, operations of fleets of vehicles, for various purposes. And that problem is inherently a NP problem. So, of course it is practical for me. Of course it is important to know what it means to handle a NP problem, what can be done, what can’t be done, and what solution is acceptable and what is not.

The next question obviously is whether a computer science education provides the students with that kind of understanding. If not, why not?

I would argue that computer science education for decades now has not been able to equip computer science students with that understanding. And one of the culprits is actually the students’ expectations of what education they should be getting. Universities will provide the kind of education that the students ask for, even if that is the wrong thing to do. And I don’t blame them. Why should I, as a research professor, care that the students want to learn about “web technologies” rather than “protocol design”? Protocol design is boring and who needs to know it in the “real world”? On the other hand, tons of companies are hiring “full-stack developers”. Easy decision to provide “game programming”, “web technologies”, “data mining”, than “advanced computer graphics”, “network protocol design”, and “statistics for computer science”, right?

Worse, perhaps the students would rather learn how to use PhotoShop than to learn how to build a PhotoShop clone. In other words, they would rather become an electrician than an electrical engineer. Mind you, nothing wrong with wanting to become an electrician rather than an electrical engineer. Except that universities are really the wrong place to train electricians. The same as they are the wrong place to train programmers, versus computer scientists. It is even in the name. The department is called computer science department, not computer programming department.

Okay. Can I learn about all these things on my own? Can I learn network protocol design on my own? I would say yes, but it is much harder, as you might not know what you need to know before trying to design protocols. And nobody will tell you when you get on the wrong path or have the wrong understanding.

Now, do I think universities are doing a good job teaching computer science? Of course not. I think they are doing a very bad job. When I graduated from university, our consensus, including from some of the professors I knew, that about 95% of computer science graduates could not program. No, we were not talking about being able to program well. I think the percent has only gone down in the last three decades.

Worse, universities are not teaching the students other things well also. Their concepts are fuzzy. Ask them what “regular expression” is, and they are not sure. Ask them what is needed in finding the shortest path in a road network, and they are not sure. Ask them how GPS works, and they are not sure.

Years ago I had a co-op student from a prestigious university helping me in a bank, when I was there for a short stint. He was in his second year. One time, we were talking about compilers and what algorithms and tools are needed to write a compiler. You know, the normal stuff, like lexical analyzer, parser, abstract syntax tree, code generator, code optimizer, etc. He went back to university for one study term. We kept in touch. One day, we went back to talking about compilation again. He mentioned that he had an assignment that asked for input from the user and then did all kind of stuff. He told me proudly that I was wrong that lexical analysis was needed for input analysis at all. So, I asked him about how he handled the input. He explained his method. I basically told him that he just implemented a lexical analyzer. Except that it was not as organized as a lexical analyzer based on regular expressions would have been. Well, yes, it is quite common for universities not to explain why certain concepts are taught and where they might be used. And worse, no understanding of the computation process and the problems there that need to be solved, and what the solutions might be.

Why universities are doing a bad job teaching computer science? I think the other answer is actually the lack of time. Four years is too short to study computer science to get to a stage where the students actually know enough about computer science sufficiently to be called a computer scientist. I am thinking about six to eight years is what it takes to teach sufficient concepts and understanding. In the normal four years of computer science education, the students are either not taught some of the crucial concepts, or they were simply mentioned in passing in some obscure courses without explanation on why they are important, and where they are needed. Where do we need to consider the implications of NP problems? None of the candidates I interviewed in the last ten years could answer that question. If they knew what NP problems are in the first place.

I know this is a minority view. Most people think universities should teach job-ready things. I think that is the fundamental misunderstanding of what university is about. And it is quite peculiar to computer science. Nobody, as far as I can tell, insists that electrical engineering departments should train certified electricians. Their job is to train electrical engineers. My university actually got rid of its accounting department because it thought that training certified accountants was not one of its missions. And I agree with them on that.

Back on why most computer science graduates are usually not good at programming. Simple, programming is a skill. The more you practice it, the better you will be at it. Universities assume that you will practice programming on your own time, outside of class. And it is not the university’s place to be the coach for your programming exercises. In other words, you are on your own once you have been taught what programming is. As the result and the lack of time in the four years of most computer science programs, most students don’t have the inclination and indeed the time to practice enough to be a proficient programmer. It takes a long time to be a good programmer. And being a good programmer is somewhat orthogonal to being a good computer scientist. They are different, requiring different mindsets and different aptitude, actually. That is why it is so hard to find good programmers: being proficient in a programming language does not always mean being good at design and implementation in that programming language and indeed problem solving in the general sense.

So, is it hopeless to provide a good computer science education? Not really. But we do need a much longer time for a computer science degree. We do need the students to be proactive in practicing programming on their own time. We do need the departments to be a bit harder on the students, to have higher expectations for them. Yes, having programming questions in exams is good for the soul. But they do need to manage the fallout of students getting their exam marks in the teens and twenties, but that is also part of the education, to learn what is inadequate when the students still have a chance to rectify the problems, and not wait until them in a job situation. Feeling hopeless in a job situation is not something anybody should experience.

So, is a computer science education useful? Well, if you know what to do with it, absolutely yes.

One year, during the summer, at a time before we have Internet connection at home, three of us, two master students and me, a doctoral student, decided that we wanted to be proficient in network programming and GUI programming. So, for the whole summer, we went to the terminal room at 10:30pm, when they were empty of other students, and just wrote programs like crazy. I implemented as many protocols from reading RFCs directly. The guy who wanted to program GUI better went after low-level X11 libraries and wrote as many GUI stuff as he could. And we converged on learning Unix system libraries (libc and some such), and weird stuff like the select() function on Unix, which is in the intersection of both networking and GUI programming at the time. We would go to get some coffee and donuts around 3 am every day. And then we would go back and program until 6:30 am, when it was possible that some early students would come in to use the computers.

Did we become world-beating programmers after that summer? No. But we did learn what it took to be proficient at one or two areas of programming. Even though we were already above average programmers among our peers before the summer.

But it did not make us better computer scientists.

Becoming a good programmer and a good computer scientist at the same time is hard. Going to university to study computer science is a good way to be one. But success is not guaranteed. Indeed, most likely it is not achieved. But doing it any other way is much harder still.

--

--

Khun Yee Fung, Ph.D.
Programming is Life

I am a computer programmer. Programming is a hobby and also part of my job as a CTO. I have been doing it for more than 40 years now.