Ask HN: CS grad who barely knows any CS
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> 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.
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.
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.
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.
This is quite encouraging, thanks!
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.
So get a job as a junior and start hacking. Your basis will be fine to quickly understand everything.
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.
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.
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 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/
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.
The advice on the thread is very good, keep at it, this career path, like many others is a lifetime learning experience.
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.
Is it imperialistic to call developing countries 3rd world-countries? Then again, developing just means "more climate friendly then richer countries" I guess.
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.
It's up to 6. For most programs, 4 is the minimum.
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.)
the world is bit more heterogeneous than that
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...
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!
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.
(I can’t decide whether to tag this satire or not)
> PHB is produced by microorganisms [...] apparently in response to conditions of physiological stress
https://en.wikipedia.org/wiki/Pointy-haired_Boss
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.
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.
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.
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.
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.
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?