The Missing Piece of the Computer Science Curriculum

Allen Center

Despite the increasing availability of alternative options such as online learning sites and coding boot camps, many students who are interested in programming still pick the traditional approach: getting a Computer Science degree. If you plan to do academic research, a degree is really the only option. But for someone who wants to get a job as a programmer, there are both advantages and disadvantages to a traditional degree.

Advantages

  • A CS degree provides a theoretical basis for programming work. Students learn the math required for rigorous analysis of algorithm performance, the limits of what computers can do (theory of computation), the nature of programming languages (not just how to use specific languages), and the fundamentals of applied areas such as networks and operating systems. This background can help a future professional programmer make better decisions than one who has only learned how to code.
  • The college process is designed to guide students through learning milestones. Classes and exams happen at scheduled times. Other students are doing the same work. Instructors are available to provide guidance. This structure makes it easier to work through the process of learning.
  • It’s a chance to build relationships with other people who are pursuing the same goals. This can be useful later in life when it’s time to find a first job or switch to a new one.
  • Interdisciplinary work is more likely, since people working in many academic areas are gathered together in one place. CS students can find collaborators in areas like biology or finance, or even switch majors if their interests change.
  • Colleges require courses in subjects other than CS, which provides a well-rounded background. A programming job is not just about programming, especially for more senior programmers.

Disadvantages

  • A traditional college degree is intended to provide students with the foundational knowledge for an academic discipline, not prepare them for a specific job. This can present a challenge when a graduate arrives at their first job. Not every company is prepared to turn fresh graduates into productive programmers.
  • Technology changes faster than academic curricula, which means that the specific skills that students graduate with are generally out of date.
  • A degree requires four years and a lot of money. For a motivated and prepared student, these are four years that could instead be spent starting a company or gaining other real-world experience.
  • College work involves programming alone or with groups of students at approximately the same level. Assignments are designed by someone whose main experience is computer science teaching and research. In contrast, learning in a work environment involves interacting with more senior programmers on problems that are selected based on their economic value for a company.

Picking One

There isn’t a right answer to the degree question. Each person has to decide what their priorities are and which option will work best for them. In my case, I decided to go with the college plan, and even returned later for a Master’s degree in Computer Science. (Classes were held in the building pictured at the top of this post). I was interested in learning the fundamentals of the subject, and in the time before widespread availability of online classes, college seemed like the best way to do that. Thinking back on the experience, one highlight is that I was able to work on a much wider variety of problems than I have encountered as a professional programmer. I wrote a disassembler (in assembly language), a Java compiler, low-level networking and CPU scheduling components, and DNA sequence analysis routines. I could have done any of these as side projects, but the structure of college made it happen.

Another Advantage (Maybe)

Here’s a potential advantage of the traditional college education that I didn’t include in the list:

  • By studying algorithms and math, and completing numerous problem sets, you’ll learn how to quickly implement solutions to well-defined programming problems.

It seems like this would be a basic outcome of CS education, and therefore that all CS graduates with good grades would do well on coding interviews. People even complain that those interviews focus on college-level algorithms questions rather than the real-world programming problems faced by professional programmers. But in my experience interviewing both types of candidates, college students don’t seem to have any advantage. And I don’t think I’m the only one with that experience. If top students always did well in traditional coding interviews, it would be a lot easier to screen candidates. Companies could invite candidates to interview based only on their school reputation and grades, and most would pass the in-person interview process. But that doesn’t happen. College success isn’t a reliable predictor of interview success.

What’s Missing?

There’s something missing from the standard CS graduation requirements, and it has to do with coding skills. Some people argue that because computer science is not programming, students are on their own when it comes to learning those skills. It’s certainly true that CS is not about programming (and astronomy is not about telescopes). However, in the real world, companies expect CS graduates to have reasonable programming skills. It shouldn’t be necessary to get some other degree without “science” in the name in order to meet this expectation.

Some CS students solve this problem by joining an ACM-ICPC team. While there are many benefits to this approach, it’s overkill for students who aren’t interested in competitive programming. However, that doesn’t mean that a subset of ICPC preparation isn’t a good idea.

Gone in Four Years

Lack of programming skill upon graduation is one manifestation of a more general truth about undergraduate education. It has to do with the time limit. Students expect to spend some fixed period of time on their first degree — for example, four years for a bachelor’s degree in the US. The farther along a student gets in their education, the more likely it is that they will be able to get their degree simply by showing up and putting in the hours. As soon as a university admits a student, they are making a bet that the student will succeed. If a student successfully gets through the first few classes in a major (the ones designed to filter out insufficiently dedicated students), then it’s very likely that they will complete their studies in four years.

The nature of undergraduate education is that it is predictable. It’s different from getting a PhD, where you are done only when a committee of academics says you are. While a fixed completion date makes sense for undergraduates, non-PhDs can still get something useful out of the PhD approach. First, acknowledge that successfully completing a college class doesn’t indicate expertise in a subject. It’s more like a minimum bar of familiarity, with some adjustment for the grade received. Therefore, students who are interested mastery of a topic need to take matters into their own hands.

Coding Mastery

The relationship between programming and the computer science curriculum works something like this. Prospective CS students often enter college with some programming experience. If we’re talking about a member of the Class of 201X, maybe they have worked on a mobile app. In their first term, they start with (or place out of) a beginning programming class that uses C/C++, Java, or Python. That class is followed by an algorithms and data structures class, which is a combination of programming and math. Finally, there there are a series of classes (operating systems, networking, graphics, etc.) that have programming assignments, but where programming is not the primary focus.

Based on the typical CS curriculum, a student who wants to be good at coding by the time they graduate won’t accomplish that just by doing well in their classes. They’ll have to do something more. A coding-heavy side project or independent study topic might work. But getting good at quickly implementing the solution to a short problem generally requires the kind of practice that specifically targets that skill. Considering that this skill often serves as evidence of the rest of your hard-earned CS skills, it’s worth spending time on, whether you’re in college now or graduated long ago.

(Image credit: Wonderlane)