Ask HN: CS grad who barely knows any CS

128 points by nevillain ↗ HN
I (m, 23) will be graduating from a university in Kenya with a CS degree at the end of the year. However, I feel like I barely know anything. I hardly attended classes in my first and second year. I upped my grades in my third year and was even among the top in the class (anecdotally). To be honest, I’ve always felt like our CS course was inferior. For example, I did a Computer Graphics course, but we didn’t even implement line drawing algorithms. My favorite courses were compiler construction (we actually built a compiler) and distributed systems.

I started checking the sources of web pages in high school, and even learnt rudimentary JavaScript and PHP. After high school, I was hoping to join a good uni in the US. I got a relatively decent 1490 in my SATs then bungled up the rest of the application process. I hesitantly joined my current uni. I’ve been coding on and off since then. For school, I wrote introductory assembly, C, and C++: most of which I can’t recall now. Outside of school I learnt Node.JS, Python and Go. I haven’t built any large project: my biggest code base is probably my FYP React Native app or the Vue/Flask web app for my internship.

On paper, it appears I know quite a few technologies. But contrary to that, most of it has been surface level knowledge. To use a friend’s words, I’ve been turning buttons from red to green (doing CRUD). I don't know how databases work, I don't know what exactly ray tracing is, et al. I started applying for jobs last week. To my surprise (or not), I do not fit cleanly into the requirements of any of the junior listings. I can't solve the "easy" problems on LeetCode and my score for the AngelList Fullstack assessment [1] was 18/30. I rather objectively believe I have some gaps in my CS knowledge. I am even considering a boot camp—if one exists for people who already know what a variable is. My tentative plan is to get a part time job, and then spend 6 months reading books, learning tech I’ve always wanted to learn, and hacking on at least one build-your-own [2] type project.

So, how can one effectively fill gaps in their CS knowledge? It’s worth noting that I am overwhelmed, and even procrastinate when I don't have an overarching framework (like school). So it’s not as simple as just sitting alone and studying/coding. I am the "smart" kid who didn’t have to study throughout most of school, but who's "discovered" you have to sit long hours now to be competitive. Is my situation more common than I suppose? Should I suck it up, get a technical support role and build up from there?

[1] https://angel.co/assessments/full-stack-web [2] https://github.com/codecrafters-io/build-your-own-x

108 comments

[ 3.0 ms ] story [ 171 ms ] thread
I have a bachelor and master degree in computer science. I have worked for over 10 years in the industry. I keep learning (and re-learning) every week.

> My tentative plan is to get a part time job, and then spend 6 months reading books, learning tech I’ve always wanted to learn, and hacking on at least one build-your-own [2] type project.

Sounds good. Get a job, earn some money and focus on your long-term career. Start with the fundamental concepts (e.g., operating systems/networking) and complement it with more modern applications of such concepts (e.g., containers, distributed systems) at work if possible otherwise at home.

I can only tell here from Germany: Computer Science at universities don't teach you how to code. They teach you theoretical concepts. Depending on the curriculum, your milage will greatly vary. For instance, database design was not a compulsory course in my studies, where however formal languages (such as the relational first order logic) was.

In Germany, if you want to learn how to code, you should study at a university of applied sciences. This where they teach you skills.

+1 on this. Background: I did attend two universities (not applied sciences aka "FH") in Germany and have/had friends who went to others (including applied sciences and abroad). I took a long time to finish my studies, was a low-level TA ("HiWi" - teaching an exercise groups of 10-15 students, grading my students hand-ins and the final exams), and was on the students council (both for the department and general council). So met a lot of people.

A lot of students were surprised when they realized that, at our universities, it's less about the latest fad like learning to program websites using some specific framework, but more about theoretical stuff and "general knowledge". Sometimes that demands programming, but besides one or two introductory courses, learning how to program isn't part of the curriculum. E.g. for our advanced Database lecture we learnt a lot about how a high performance DBMS works and a lot of tricks those pull. But it was just assumed that we could write decent high performance Java to implement a really fast SQL engine; they removed C++ as an alternative when the project started a few weeks into the semester, so our group was trapped and had to quickly improve from "being able to write small programs in Java" to "write performance critical code moving gigabytes of data around" (needless to say we struggled with the early benchmarks, which were graded). Same for compiler construction (high-five, I tremendously enjoyed that as well!), for which the lectures focused on the concepts while the mandatory project (a subset-of-C compiler) just assumed that you could program C++ good enough to implement the principles and achieve the performance goals. Though I think the teaching assistants tried to help students with becoming better C++ programmers (unlike my Java, my C++ is pretty good and I was working on topically close software during that time, so I skipped the most of these exercise lessons).

But at a university of applied science it is much more to focus on the actual problem solving and building things, and it sounds a lot like that's what you were expecting to do instead. I know some who preferred one or the other, so they changed tracks during or after finishing their B.Sc. And I really have nothing bad to say about either kind of university; the goals just differ, and while some perceive the applied universities to be "easier" I suppose that's mostly because practical stuff is more aligned with their interests.

A few friends choose to cancel university altogether and instead choose to do a "Ausbildung" (apprenticeship/on-the-job-training, some part is formal education, including related topics like business courses, a huge part is working at a company). Also not bad, but nothing I personally would have liked to do.

tl;dr: If you want to learn more applied CS, consider doing a B.Sc./M.Sc. at a university of applied sciences instead. Here in Germany we call them FH = Fachhochschule, but I think other countries have something like that as well.

You said something about your Kenyan education; while I can't say anything objectively about Kenyan education, as grading didn't involve asking for a students country/region of origin or what school they previously attended ;-), here is one thing that I feel is important: Obviously you want to be as proficient as possible in the course language, both written and spoken. Especially international lecturers are often hired for the quality of their research, not for their mastery of the English language.

You are very young and at the start of your career. I know you might feel like you should've "finished learning" by now, but finishing university is actually just an arbitrary milestone. The learning never stops. At worst, you maybe have some catching up to do, but drawing any conclusions at 23 is premature to say the least.

I don't think I learned much in uni and I did it in the UK. There was no algorithms course and I actually don't feel I learned much despite being at the top of my class. I don't even think I had anything as interesting as building a compiler. I am now less than 10 years into my career and roughly at the top of the payscale in Europe.

You are aware that you are not where you want to be and that is the most important thing. If you want to become good at LeetCode, you can easily do that, I've helped a few of my peers do that. Just set yourself some sort of achievable daily goal and stick to it. Do one "easy" problem per day and in a few weeks you'll be doing them in your head and think of them as boring.

I can remember a lot of discussion at that stage about linux vs. windows, open source vs. closed source, or which programming language is best. It all seems rather cute and quaint now.
> I don't even think I had anything as interesting as building a compiler. I am now less than 10 years into my career and roughly at the top of the payscale in Europe.

This is quite encouraging, thanks!

You could have gotten a job 10 years ago. Nobody cares about your academic knowledge past the cv check for your junior position.
Don't put too much importance on these self-described "Assessment" tests. They have nothing to do with reality.

As an example, I just took the angel.co "full-stack-web" assessment, and scored 13/30 after doing it for ~10 minutes. Some answers I skipped, but most of them were "easy" to solve, but somehow I answered wrong. But since I cannot see what I got wrong, I'm not sure I trust the results at all.

But even with that, I have 10+ years experience working in software development, in roles everything from junior developer to CTO and roles in-between, at multiple companies. But tests like these don't describe reality. Reality is also not time-bound, and you can usually try different options until you find what's right.

My tip would be to start working/interning professionally as soon as possible. School nowadays doesn't represent (or ever did, I don't know) the professional sector, so the faster you get into a real company, you can gain real experience, which is what will make you actually better at your job.

Don't try to make yourself perfect, instead figure out what you'd like to do.
The only thing I actually had in school I still found useful (even though I only use the theory of it) was networking. All other stuff I learned in school I never or barely used. What you actually learned in school (unknowingly) that is the most important part (something I found out later) is learning to learn. Knowing to ask the right question at the right person to the right person (or medium). Most stuff I do in my job (and I am a senior) I still need to look up because the amount of stuff you need to work efficiently you can not all remember.. I learn every day... and you will too, and it is still fun! Even after 39 years.

So get a job as a junior and start hacking. Your basis will be fine to quickly understand everything.

Second this, go deep on networking and platform tools. it's the plumbing of the future and all the plumbers I know are rich.
What do you mean by "platform" tools? (I'm just a hobbyist coder.)
You can do networking by getting on a server and opening ports, or your can do software defined networking via things like terraform or other solutions which includes defining lots of other stuff in a technology stack. The platform tools answer the question of, how do you get the servers? how do you get the code on them? and how do you manage changes in those environments?

Devops CI/CD, SRE and the cloudy stuff all sort of fall into the bucket of platform tools and have jobs attached at the end of the day. Whilst it's not the most exciting work (to me at least) there's a lot of it out there.

Computer science isn't about coding or specific technologies, it's theory and math mostly.

I didn't do a CS degree at all, I have just been coding since I was young. I also learned most of what CS degrees teach over the years, as I find it all fascinating. Curiosity goes a long way.

In any case, you are young. Keep learning and figuring out what interests you, and you will be fine.

You should look up imposter syndrome. It sounds like most of your programming skills would make you a useful developer at many programming companies, even regardless of a university degree, but hey you have one which is better than none (like me).
Not sure the gap here is computer science. If you've done a decent computer science course even just scraped past all the exams you should be able to easily do the easy problems on leetcode. Maybe the problem was that the course you have done just had a simple learn a, do exam on a move on to the next thing. In your case you never really learned a you just learned how to pass the exams for a.

To me it maybe sounds like more that you didn't apply the learning so the course was a mechanical pass exam get piece of paper with degree on it. Now that you've looked at jobs they want you to use all that knowledge to perform. This isn't an uncommon scenario which is why companies use things like leetcode as they don't want employees who will take another X years to re-learn everything they should have in their degree / course / bootcamp. It's also why companies often pass on self taught programmers. There is a risk that they are just aping what they have been told and not really learning anything.

> It’s worth noting that I am overwhelmed, and even procrastinate when I don't have an overarching framework (like school)

Yes this is again very common. Education systems will spoon feed you such that it's very had to actually fail the exams. The reason being that as an organisation they are measured against those pass marks and so don't want 75% of the people failing. Same thing with bootcamps if they said on their website only 10% of people manage to pass this test you probably wouldn't pay their fees.

So yes sure work part time and start to relearn but I think the problem is about the approach here. You need to learn how to learn properly. I would look up this talk for a starter:

https://www.youtube.com/watch?v=vd2dtkMINIw

Lots of info in that to help I think.

So my advice is learn how to learn properly first. Then re-learn the stuff you missed in your courses. Then try to use that in your own side project / portfolio pieces. You might have to go back and forward through that journey.

Good luck and it's a really good sign you have noticed this as some devs managed to actually get the jobs even when they have these serious gaps in knowledge by using something like Cracking the Coding Interview and cramming all the solutions.

I did the "Learning How to Learn" course on Coursera [1] some years back. Granted, I might not have applied the teachings I got. I will be sure to review the video/course and/or Barbara Oakley's book "A Mind for Numbers." [2]

I cannot say why I can't solve the easy problems on LeetCode. But I should point out I only recently started attempting them, and it sure is getting easier.

Despite the downsides of schools/boot-camps, I believe they give you an okay outline of a specific field.

[1] https://www.coursera.org/learn/learning-how-to-learn [2] https://barbaraoakley.com/books/a-mind-for-numbers/

Yes, that is mostly because your education happened in a 3rd world country, where education standards are quite low. People will be upset by me saying this, but that's how it is and everybody knows it.

However, you already have very good base knowledge and you know how to adapt to new technologies. You don't need more programming experience, but as you have already noticed, you need in-depth computer science knowledge.

A bootcamp is definitely an excellent choice and will teach you more than your degree. You should try to find a camp nearby, so that you are there physically and get to know other coders. Being able to solve problems with peers is invaluable. If you don't have a good offering nearby, definitely do online courses like on Khanacademy.

If you spend a year on CS principles it will be very, very helpful.

I get your point but I think what’s going on with OP would happen anywhere in the world. CS degrees are not hands-on and so if you are not already working on mastering a certain area of IT you will find yourself just as useful as a philosopher at the end of the program.

The advice on the thread is very good, keep at it, this career path, like many others is a lifetime learning experience.

> Yes, that is mostly because your education happened in a 3rd world country

I couldn't disagree more with this sentiment. I live in Canada and by way of both running a tech company and working with colleges/universities here I can tell you that none of them have curriculum that's adequately connected to industry skills.

The only exception, and it's a small one, is the University of Waterloo. By way of their reputation they've built a robust internship network for the engineering students. Although they still have gaps on the curriculum side, albeit smaller gaps than other schools, students complete up to 4 internships before graduating giving them a big advantage.

Since when has Canada ever been a "3rd world country"? The OP is talking about schools in poor emerging economy nations, not schools in industrialized economies.
Canada is a regarded as a first world country.

No, OP is not talking about schools in "poor emerging economies." OP is talking about their experience doing a CS degree in Kenya. The COMMENTER (telomero22) is generalizing this to be a common experience in "3rd world countries."

I'm disagreeing with the commenter, telomero22, who believes OP's experience is due to studying CS in a "3rd world country." As others have confirmed in this thread, I'm suggesting that these sentiments are extremely common with CS grade in 1st world countries such as Canada.

> students complete up to 4 internships before graduating giving them a big advantage.

It's up to 6. For most programs, 4 is the minimum.

> Yes, that is mostly because your education happened in a 3rd world country, where education standards are quite low.

I mean, based on the description this sounds like a pretty normal theoretical computer science degree, such as you might get in any university basically anywhere in the world. (There are CS courses which are deliberately practical, but they're very much the exception.)

>your education happened in a 3rd world country

the world is bit more heterogeneous than that

You have a rare and valuable skill, which is a great deal of self-awareness and the ability to see where you need to improve. An rocgf rightly said, you are young and have a lot of time to learn, and the learning never stops, and takes a long time. Relatively few people your age have the advantage of not thinking they already know everything, or appreciating how infinitely much there is to learn! ;)

Peter Norvig wrote a great paper called "Teach Yourself Programming in Ten Years", which asks "Why is everyone in such a rush?"

https://norvig.com/21-days.html

You can't learn everything, so it's good to choose something interesting to focus on. It might be useful for you to find some specific application areas you're interested in to motivate you to learn programming, like 3d graphics, which is very fun, satisfying, and in demand.

For example, I've embarked on an at-least-10-year journey to learn the 3d graphics tool Blender, which is programmed in Python, and has its own visual programming languages (node graphs) for image processing, generating 3d geometry, animations, and all kinds of other stuff. There is no ceiling on how much you can learn about it, and there are lots of great free examples and tutorials.

If any of that kind of stuff interests you, then programming Python and node graphs will super-charge your abilities and be extremely fun, too.

This is a great tutorial I just went through, and you can find many more on youtube, but this guy has such a deep understanding of what you can do, it's one of the best. The full course requires a Blender Studio subscription, but if you're interested in that topic, it's well worth it, has a lot of other benefits, and is for a good cause (Blender is an open source project, one of the most successful in the world):

https://studio.blender.org/training/geometry-nodes-from-scra...

There is a huge demand for Blender programmers in many different roles and abilities, including node graphs and Python too! It doesn't hurt that Python is the lingua franca of machine learning, and also very useful for web programming, and there is a huge rich ecosystem of modules you can use that plug right into Blender. So everything you learn about Python will be useful outside of Blender, too. (Although Blender's node graphs are quite unique and specific to Blender.)

Another fantastic and powerful visual programming language for learning computer science and programming is "Snap!", developed by professor Brian Harvey at Berkeley. It's easy for both kids and adults to use, but it's not "dumbed down" like some visual programming languages, and it teaches many powerful high level concepts. It's essentially a visual interface to the Scheme programming language, including all the hard core computer science magic like recursion, closures, continuations, Y combinators, etc.

https://snap.berkeley.edu/

There is a lot of educational computer science courseware around it, too, like The Beauty and Joy of Computing:

https://snap.berkeley.edu/bjc

The Beauty and Joy of Computing

The Beauty and Joy of Computing (BJC) is an introductory computer science curriculum using Snap!, developed at the University of California, Berkeley and Education Development Center, Inc., intended for non-CS majors at the high school junior through undergraduate freshman level. It is a College Board-endorsed AP CS Principles course. It is offered as CS10 at Berkeley.

The curriculum: BJC is available online at https://bjc.edc.org

Resources: Yo...

Welcome to being me decades ago - except I was even crapper.

1st off, don't fret too much. Some people learn x and think they know it all. You and I learn x and realise we don't know a, b, c, d... and lose confidence. Don't.

> I don't know how databases work,

Many DB/SQL programmers don't either, and they may have worled for years. I worked on several projects where it was clear the other DBs didn't understand the tech, and didn't even understand SQL that well (like not knowing transaction isolation levels and releasing code with race conditions in thereby).

> I don't know what exactly ray tracing is

Who cares.

> So, how can one effectively fill gaps in their CS knowledge?

You're confusing computer science with programming/development. They are different. My advice, you can't know everything (I tried and failed) so go for a broad niche (web dev + UIs, or back-end dev + databases). BTW for learning there are huge resources now that never existed when I started. Just hit DDG a few phrases ("how do databases work") and go from there.

Relax a bit, and good luck!

> Some people learn x and think they know it all. You and I learn x and realise we don't know a, b, c, d

The latter is evidence you know what you are doing. And evidence of above average intelligence. Stupid people think they know entire breadths of knowledge - call Peter Principle or Dunning–Kruger: overconfidence is more dangerous to yourself and everyone around you than knowing your limits.

You can NEVER know everything so a heavy awareness of your limits and gaps is critical to being the best you can be. It means you have the _potential_ of operating around the edge of your limits. Realizing your limits (as they exist in the moment) is essential to pushing those limits.

People suffering from Dunning–Kruger have no clue how far over or under those limits they are operating.

This is also related to why you must have grades from A to F in school - you can't know where your knowledge boundary is without breaking it and sometimes failing. You aren't really trying or you are operating in dangerous ignorance.

Another analogy is you can't know the strength of a material without breaking it or reaching its strength limit.

Years of learning the above are why I now leave all decisions to PHBs. They say they know nothing, but are then willing to decide everything. So I just do what they say. Products take longer to deliver and are less what the customer wanted and have zero innovation, BUT the PHBs seem to have the influence to keep the gravy line open longer than me.

(I can’t decide whether to tag this satire or not)

> Stupid people think they know entire breadths of knowledge - call Peter Principle or Dunning–Kruger:

Just to add: Dunning-Kruger is not a problem of "stupid people". We're all susceptible to it, and we all fall victim to it from time to time in different areas. If anything, people with self-perceived "high intelligence", or people that are genuine experts in one field, can sometimes be the most susceptible because they overestimate how much their knowledge transfers.

Absolutely this, the more you know the more you realise you don't know. I think the best kind of knowledge is T-shaped - a niche, narrow pillar of a subject you know inside out, and a broad and shallow range of technologies you are at least on Christmas-card terms with, if not competent.

Also, most things correspond to patterns and the more experiences you have (and/or the older you get), the more enriched your mental models become, and the more areas you can apply those patterns to. E.g. there are a thousand syntactic variations of IF-THEN-ELSE but once you know the pattern, you can apply it to anything.

(comment deleted)
> I haven’t built any large project

I think one of the best ways to fill in your knowledge is to find a project you're passionate about and learn what you need along the way. Passion projects are also great to showcase to potential employers. A good hiring manager will jump at the chance for you to showcase something you've put a lot of time and effort into, as it gives insight into how you work and your thought process.

For what it's worth, computer science programs are not software engineering programs. Sure, in a good CS program you'll have programming lectures/exercises, lectures on SWE, maybe software projects here and there. But make no mistake; a good CS program is not primarily about coding stuff.

Unfortunately it sounds like the CS program you went through had essentially neither CS, nor SWE, making it quite useless as you've noticed. The easiest thing is probably to learn coding by making real projects and contributing to open source.

(comment deleted)
I think you have are ahead of a lot of, possibly most, others who are similarly graduating in that you are aware of what your strengths are (or not). Learning or completing those gaps, whether real or perceived, is far easier than realizing that the gaps exist. Kudos for your awareness and willingness to put in effort to bridge them.
This describes me of 20 years ago. Since there wasn’t social media back then I didn’t have a wider reference point to compare myself with so I didn’t fret about it. Much of what I learned about CS is on the job and following random rabbit holes. Don’t worry too much practice coding and it’ll work out just fine.
Don't worry too much about it. Start coding (or whatever other CS related thing it is that interests you), does not matter what it is as long as it's engaging enough to keep doing.. Don't do it for others, just for yourself, and do the deep-dives you encounter along the way.. This builds strong skill.

As for jobs, I don't know how tough it is right now, but if you can get your foot in the door, actual experience is way less important than the ability to learn..

Get foot in the door, do work, people see that you're capable, develop your skill while working.

Nairobi should be full of programming jobs. There should be many that will hire you. Try to find one in an industry you are interested in, and where your colleagues are good so you can learn from them.

Then everything will be fine. I am jealous; Kenya/Nairobi is a phenomenal location to be in. When I was 23 I knew nothing. I started at 26, and now at 33 I can say I am a happy and pretty decent (maybe above average) programmer who can really add value to businesses.

Visit meetups regularly maybe if that's something you enjoy?

As a professor of none-software engineering, I can tell you that most engineering students that graduate have similar feelings. You have just been exposed to a bunch of topics in CS at various depths. You now know what you know (not much) and what you don't. You are well prepared to learn.
I'm an advanced beginner myself, but what I can see is that you're very self-aware and an objective thinker - you'll do fine.