Ask HN: Why do many CS graduates lack foundational knowledge?

386 points by platzhirsch ↗ HN
Recently, I have started interviewing interns in their final semester for an internship and to my surprise I frequently encounter a lack in what I would call foundational computer science knowledge. I don't mean data structures and algorithms, but for example

* Database Systems (relational algebra, SQL)

* Concurrent Programming

* Network Programming

It seems most are exposed to them partially through project work but without the base knowledge.

Is this typical for CS undergraduate degrees because you get to pick your own classes?

757 comments

[ 2.9 ms ] story [ 355 ms ] thread
Your question already hints at the answer.

The "foundation" depends on the context. Your process may be different but many companies will consider D&A as foundational knowledge as it is the closest thing we have so far to a standardized measure.

maybe you can describe specific example? topics hinted here are broad.

concurrent programming for example also not taught same always. myself in school learned about concurrency like threads and mutex theory but “really” learned first time on job.

* Database Systems (relational algebra, SQL) * Concurrent Programming * Network Programming

These are not required courses in the CS curriculum of most schools in the US. Elective yes, but at some smaller schools, these are not even options.

Have you checked out the degree map of some of the schools? (Even the most well known ones) And you will see it.

For DB systems, I had to specifically choose this as a deep course and dived into creating a database from scratch.

I would argue those are specialized areas, not base knowledge. Moreover, what kind of questions are you asking? It is more likely that you have a misaligned assessment of an undergraduates knowledge.

The answer is simple: Those are typically optional topics in a CS curriculum. You might as well ask why an undergrad doesn't know compression algorithms, compilers, robotics, software reverse-engineering, cryptography, computer vision... All of the above are optional and will only be taken by those who are interested in them.

The more important question is: Are you explicitly mentioning databases, concurrency and networks in your posting? If not, then it explains why candidates are not filtering themselves out.

(comment deleted)
This is insightful because in my degree those classes were mandatory as part of a three year degree.

To answer your question: we don't. I have no expectation around this. Primarily asking for my own curiosity in terms of differences in CS degrees.

Software is not unique in that it has a high degree of specialization that cannot be touched on in a general education. Probably 90% of skills/knowledge in my non-software engineering career was not taught in my program and generously 5-10% more may have been taught in the most rigorous programs.
(comment deleted)
Indeed, it depends on where you are studying.

At some level, we had SQL and network programming in my degree, but only for that level that we knew it exists and how to do it in very basics. We did not have concurrent programming at all as mandatory course.

The most of your deeper expertise comes from the project work here, and depending on which project you end up or choose, they might or might not include above.

Not sure where you are based, but in the US I know a lot of schools shoot for the ABET accrediting guidelines[0]. They directly call out the areas you're asking about:

  Exposure to computer architecture and organization, information management, networking and communication, operating systems, and parallel and distributed computing.
But they only require "exposure" to these concepts whereas algorithms, theory, programming languages, etc are required to be "substantial." Which matches with your perceptions:

  It seems most are exposed to them partially through project work but without the base knowledge.


[0] https://www.abet.org/accreditation/accreditation-criteria/cr...
I wouldn’t consider network programming to be foundational to all computer science, tbh. Are these interns expected to be writing their own sockets? Similarly, are the intern projects involving writing out the operational trees of your sql? I would consider these to be great if the intern knew of these things but I wouldn’t expect an intern to be functional in any of it. (I would put kernel writing, compiler programming, security, mobile development, etc. in the same category. If they know some and it applies to the intern project cool, but I brought an intern on expecting them to be worse than useless lol. The goal is to get them towards useful for when the company hires them.)
I think you're forgetting how computer science programs operate. You're listing a bunch of specialty skills that are likely covered once in a topic class and never again. You said "I don't mean data structures and algorithms," which excludes the actual foundational skill that they had to build on in every class, in addition to raw programming chops.

Why don't they know database systems? They might have taken a database course for 4 months 3 years ago and never touched a database again because it's not a trade school. School just validates that you can learn a series of related skills over a few months when necessary.

What's the last thing you started and dropped after a few months just before the pandemic? How comfortable would you be if you interviewed for a job exclusively on that skill?

The original complaint is that student aren't even getting the 4 month introduction to topics like databases and concurrency. Later on in their career they wander into them and don't even realise there exists large body of important theory and knowledge for things like databases and data modelling. They get then get into trouble and assume "Well, I guess programming is just hard". Similar story for concurrency. These people later on naively create systems which are full of concurrency problems and are then puzzled as to why sometimes it breaks for no clear reason.
This. I have 10 years experience. I might have done a successful project in Ruby in year 2 and maintained it for years 3,4,5 but haven't touched it since then.
You hit the nail on the head in your post—these are things _you_ consider foundational knowledge.

I graduated with my Bachelors in CS in 2016, and those classes were optional senior electives. You were required to take a certain number as well as some required ones (i.e., Computer Architecture, Analysis of Algorithms). I chose to take Database Systems, Data Mining & Machine Learning, Robotics, Computer Vision, etc. as electives but not Concurrent Programming or Network Programming because I already felt comfortable with those topics. Others chose classes in topics like mobile application programming or programming language theory.

Those topics may be foundational for you, but not for others.

I'd argue that knowledge about concurrency, a model of CPU threading, and race conditions/data sharing between threads is foundational.

Database transaction locks, data (form of race condition), SQL (declarative graph traversal combined with a simple projection), slightly derivative.

Compilers and SQL are technically not the foundations IMO.

Jumping/reading/evaluating/copying data, binary trees/log base 2 hierarchies, state machines, set theory, functional programming, Von Neumann model plus knowledge of multiple pipelines for integer adding are the basics.

...But, studying compilers and SQL is highly advised. Compiling code, and an understanding of database transactions locks are incredibly important practical skills.

In the US, the basic concurrency topics are covered in an OS class, which I believe is a mandatory part of the curriculum. But a course dedicated to it would definitely be an elective.
The most surprising part is ML being an elective course in 2016. ML is mandatory in my university, but DL is elective
Databases and networking were optional topics at my undergraduate institution, Cal Poly San Luis Obispo, where many of its CS grads went on to have successful software engineering careers in Silicon Valley. As for concurrency, we had a few required courses (computer architecture, systems programming, operating systems) where we learned about multi-threading and IPC. In fact, one of my assignments for my systems programming course (CSC 357 in Fall 2007) was to write two HTTP servers: one using POSIX threads and another using fork and IPC. This assignment actually helped me land an internship with Lockheed Martin, who was looking for someone with experience with writing multi-threaded code.

In general, however, fresh CS grads from even good universities need to be onboarded on software tools and certain types of systems when they have their first software engineering jobs. For example, many college students don’t know git. Basic sysadmin and more advanced Unix command line skills are also generally not taught.

for some, 'compiler construction' would count as foundational skill. But realistically nowadays it is a skill that is neither necessary, nor all that helpful in a typical day as SWE. There was a very narrow sliver of time (maybe 95-05) where this was a skill you'd be using outside of your CS class. While I do agree with your basic sentiment of 'CS doesn't teach the same things as 20 years ago', I don't think that's necessarily a bad thing. Those who like to dig to that level will do so on their own (just like not everybody likes to study analytical topology).
I agree that those are foundational topics and having graduated from a top 10 CS program can tell you that they were all optional. There were many grads who didn't have knowledge of concurrent programming at all which always struck me as a bit odd,
4 years isn't long enough for all these things + everything else you didn't list. It sounds like a long time but it just isn't enough.

Look for competency, not knowledge

Because it takes much more than an undergraduate degree to learn the field properly. If you find a graduate who is clueful that's probably because they've been hobby programming since age 12, or working in the summers somewhere they could get good experience.
Databases, network programming and concurrency (beyond basic constructs like mutexes) are not fundamental. SQL is certainly not fundamental to the major, that's a specialty only needed by a small percent of programmers.

I would suggest looking at the CS departments page from whatever university you mainly recruit from to get an idea what the core of their program looks like.

SQL is a unique case. It's important enough that you should know the basics, but it's easy enough to learn that it doesn't really deserve a whole class, unless you're teaching students to build databases, which is definitely niche.

I'm sure it's needed by a large percentage of programmers, but maybe that's my bias speaking.

I totally understand looking for graduates that know SQL for certain positions, but it is a specialty not taught in any core class. You can absolutely know CS and entire areas of programming without it.

I used SQL all the time in web dev but haven't touched it since going to college. I do embedded so it's just never been necessary.

Now if this is a web dev or data related posting and students are coming in supposedly for this specialty then this ask HN is a little more understandable. Although perhaps poorly worded.

> I do embedded so it's just never been necessary.

Oh that's cool! I've never worked on that side of things. I assumed SQLite was used in embedded stuff, but I guess not.

The relational algebra definitely fits into CS foundations, in terms of things like ACID and serializability etc.

That was a fun course where I learnt horribly bad patterns like "your data forms a key so you should use that as your key instead of having a surrogate key"

The prof was good at relational algebra, but not designing software

Composite natural keys sound cool in theory but really? Who wants to deal with that stuff?
The class I did was largely focused on relational algebra. So we learned the formal language of that (which I've largely forgotten) but did many practical exercises in SQL. I think it was valuable, since "thinking in sets" is something that people who only do linear algebra or algorithms might not be used to and so they carry a more linear problem-solving thought process with them.
The way this was handled where I went to school the DB class was basically presented as a history of database technology class where the CS fundamentals behind how each type of database works, what it's weak points and strong points are, etc..

SQL was then something that was a side thing in the class that you were supposed to pick up for one of the projects.

We had to learn to normalize schemas in that class. I have yet to come across a team in my career where normalization was understood well enough to where it could be correctly matched to the architecture of the entire system.

The other amazing takeaway was going through the historical failures of hierarchical & graph databases. Since I started working hierarchical databases have come back with tons of hype twice now (once in the late 90s, once in the late 2010s). Both times they failed exactly the same way as history would predict based on what happened in the 60s and 70s that led to the development of relational databases. Sometimes it seems like the industry hype train is completely unaware of computer science.

You don't get a CS degree from my university if you don't know relational algebra and can translate relational algebra to SQL. It is far from a speciality, if anything, knowing SQL should be the norm.
CS programs are designed with broad input from a wide assortment of interest groups -- specific industries or companies or whatever. Different universities tend to emphasize the "foundations" of the industries physically nearby. Sometimes this is done intentionally to create a pipeline of labor to large companies that need it -- more often it's subconscious osmosis.

There's a bell curve to aptitude and drive to learn. The curriculum at any university reflects the intersection of that median in the student body with a social narrative.

Those aren’t foundational computer science knowledge.
(comment deleted)
(comment deleted)
As an undergrad, my priority was learning what was most frequently on interviews and what most jobs cared about. None of this fit the bill.

SQL? Yes. Database theory? Have never discussed it beyond "what is an index"? So I never looked at that topic again.

Concurrent programming? Never dealt with it outside of courses and jobs that care about it mention it, so I self selected out. So I never looked at that topic again after the course.

Network programming? Took a course in it, but outside of a few devops use cases, I have never had any reason to recall that knowledge. I just memorized 5 versions of that test and went in to it with that.

My advice to my undergrad self would be to basically abandon anything that is not fun projects (so you get familiar with the languages themselves), hackathons (so you have culture fit), and leetcode.

I can't imagine the average ROI on learning these things is great.

A degree is not at all any basis of skills. It just is a ballpark estimate of what a person might know.

I've been doing interview of freshers since long.

Sometimes they'll know a lot of things, sometimes they can't tell a computer apart from a file cabinet.

One can't predict what a person knows based on their degree, yes it does give you a general idea but that's not the case each time.

Moreover, there are various other factors that you should consider while doing the interview, if they are freshers, like they might be nervous, they might have travelled long and came to the place, many many factors.

The typical core CS curriculum that all CS students are required to take stops around introductory computer architecture and data structures/algorithms. All of the more advanced courses are generally elective courses that students can choose to take (or maybe a requirement that you take 2 or 3 of N courses as a 'breadth' requirement).

None of the courses you listed I would expect of all CS students in an undergraduate degree, and quite frankly, databases is something I would explicitly expect few CS students to have taken (the only branch I'd expect to be less popular to take would be specialization into numerical modelling, although that's more because I expect the people taking such courses to be science majors and not CS majors).

when you say like concourrent/network programming do you expect them to be able to use async functions and make http requests, or do you expect them to have read all the works of leslie lamport XD (second is probably more like masters or specialization level i would say)
Something in-between with a slight preference on the latter. Once you understand the general concepts, you will hopefully be able to map them to concrete implementations depending on the programming language.
(comment deleted)
A lot of the comments opine that these are not fundamentals and they are right.

My impression is that the philosophy of CS curriculum at most places is to keep the barrier of entry low. That's why bootcamps are a thing, and my fellow CS grads are excited about ChatGPT being able to write code. On the other hand, there is a growing shortage of electrical engineers because the level of gatekeeping is too high.

I am an electrical engineer myself and I have working knowledge of all the things you mentioned.

(comment deleted)