Ask HN: Why do many CS graduates lack foundational knowledge?
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 ] threadThe "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.
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.
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.
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 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.
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.
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.
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?
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.
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 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.
Look for competency, not knowledge
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.
I'm sure it's needed by a large percentage of programmers, but maybe that's my bias speaking.
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.
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.
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
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.
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.
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.
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.
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).
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.