HACKER Q&A
📣 nevillain

CS grad who barely knows any CS


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


  👤 frogcoder Accepted Answer ✓
Most of newly graduates of any subject don't know much about real world jobs. You are just one of many, but you care to ask about this on HN, that's something.

And a warm welcome to this imposter syndrome help group, we are always afraid of missing out on some tech. Accept it, everyone is missing out on most of the tech.

When I was studying CS in college, I always wondered why the classes don't teach us about the hot Windows programming thing. All we did were tiny console C programs. I realized that very late, CS classes are meant to let you know about the fundamentals. You probably won't use these skills directly at work, but you will have ideas about how the languages and systems work internally. That pays in the long run.

Just go explore and make mistakes, you will be alright.


👤 zasdffaa
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!


👤 x0n
1) Unconscious incompetence

The individual does not understand or know how to do something and does not necessarily recognize the deficit. They may deny the usefulness of the skill. The individual must recognize their own incompetence, and the value of the new skill, before moving on to the next stage. The length of time an individual spends in this stage depends on the strength of the stimulus to learn.

2) Conscious incompetence

Though the individual does not understand or know how to do something, they recognize the deficit, as well as the value of a new skill in addressing the deficit. The making of mistakes can be integral to the learning process at this stage.

3) Conscious competence

The individual understands or knows how to do something. However, demonstrating the skill or knowledge requires concentration. It may be broken down into steps, and there is heavy conscious involvement in executing the new skill.

4) Unconscious competence

The individual has had so much practice with a skill that it has become "second nature" and can be performed easily. As a result, the skill can be performed while executing another task. The individual may be able to teach it to others, depending upon how and when it was learned.

----

Congratulations, you have reached stage 2. This is exactly where you need to be. Don't stress it - you will find a job and you will have a hard time at first, but this job isn't meant to be easy.


👤 rocgf
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.


👤 notakio
My answer to your question of how to fill those knowledge gaps is "experience". Whether it's work experience, fiddling around at home experience, or classroom environment experience, this is going to be your best bet. The more hands-on experience you gain with a subject, the more the rest of the subject will make sense to you.

So, provided you've got free time, use it to gain experience. Pick a subject, and dive in. Spin up virtual machines, experiment, and learn from your successes and your mistakes. So long as you let your desire to learn guide you, you'll be able to pick up experience in any number of disciplines under the CS banner. And, the more you explore these various disciplines, the more likely you will discover one or two (or three or four) that you're really interested in, which you can then focus on and turn into a career.

In a way, your current mindset (of not thinking you know enough) is an advantage, motivationally. Every single thing you feel you don't know enough about is an opportunity to learn more about that thing. You're on the right track, plan-wise, whether you go full-time or part-time. Just spend the time you don't have to spend exchanging your labor for capital, building more intellectual capital for future you.


👤 ktpsns
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.


👤 LasEspuelas
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.

👤 sdevonoes
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.


👤 jonathan-kosgei
Read books. Find good books on the things you want to learn about and read them.

It might sound dumb but really all the stuff you want to learn has likely already been written up in beginner-friendly books. There are a lot of really good beginner/intermediate targeted books in Computer Science. You can get great books on Vue/React and any specific/niche technology as well as more broad books that cover wider areas eg. systems

Outside of school I've found it's a great way to deep-dive into a new topic and HN is a great place to get book recommendations for new topics.


👤 InefficientRed
You don't need to know anything about ray tracing or database internals to have a successful software engineering career.

> To be honest, I’ve always felt like our CS course was inferior.

Let me put your mind at ease.

The difference in rigor of CS programs is fairly insane, even just in the USA. Flagship state universities and elite private universities all have rigorous curricula. Beyond that, caveat emptor. Small colleges and branch campuses of state universities are the worst in terms of variability -- some excellent, some truly terrible.

I mostly blame the fact that industry pays well and universities pay horribly. This is, again, worst at small colleges where they want to pay all faculty the same. $80K will buy you world-class philosophers/theologians/psychologists, but you simply cannot get good CS PhDs for less than $90K/year. This was true even before the current run of inflation. The floor for a half-decent CS hire these days is probably closer to $100K.

The good news is that graduates of lower-quality programs go on to have successful careers and make good money. If you are content not being in the top decile of earners in your field, the education provided by most of these schools will serve you fine.

The bad news is that those graduates really do have serious deficits that are obvious upon cursory evaluation, so breaking into the most interesting and highest paying positions can be difficult.

The good news about the bad news is that, if you know that you have big CS gaps relative to the top decile of your competition, you can adjust your strategy and still come out ahead.

My advice, if you are from one of these lower-quality institutions, is to choose one of two paths. One path is to go deep in a particular technical area through either self study or graduate school. The other path is to differentiate yourself by developing valuable non-technical skills -- communication, understanding the business, building relationships, etc.

(And before anyone accuses me of elitism: I attended a low-quality CS program.)


👤 rsynnott
> However, I feel like I barely know anything.

Entirely normal thing to feel.

> 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.

Totally normal for a new grad.

> I don't know how databases work

Few do. If you're curious, you can read about it (or even write your own database engine; it's fun!), but generally people won't expect you to know about database internals.

> I can't solve the "easy" problems on LeetCode

That's probably more down to practice with that sort of problem than anything else.

Honestly I think you're probably worrying too much about it. No-one's expecting you to be an expert on everything, or even really anything, as a new-grad; new-grads generally aren't.


👤 cameronperot
> 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.


👤 maliker
Don't worry!

I worked with a couple people right out of top 10 CS programs in the USA. One of them was way faster at writing good code than the rest, even people who went through the same program he did. I asked him how he got so good, and he told me he had to take a year off after school to care for a relative, and in his spare time he built web apps for fun. It gave him a great knowledge of operating systems, databases, networking, etc. And he said even more importantly it taught him how to just get into the code and build things.

I don't think you have to take time off to hack more. Grab a job, get paid to build things, and soon you'll see your skills getting better and better. You're already thinking hard about how to improve, and that's a critical first step that a lot of people never take.


👤 ivolimmen
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.


👤 ravenstine
What is it that you actually want to do with your CS knowledge? No one necessarily needs to simultaneously know the details behind databases and raytracing. Do you want to code apps? Because that's a very different story from knowing a bunch of CS trivia.

Pick something practical you want to achieve, like web development, or mobile development, or gaming development, and just start learning those skills. Don't try to know everything. Look up and take courses on sites like uDemy, LinkedIn Learning, Code Academy, Frontend Masters, and so on.

As far as bootcamps go, it's not necessarily a bad idea to go to one, but just know that you don't necessarily need to do a bootcamp. In terms of hard skills, all of what you are taught at a bootcamp can be learned for cheap or free online. In my experience as a bootcamp graduate, the real value of a bootcamp is immersing yourself in the subject with a bunch of other people who have the same goal as you and networking with them. I would recommend a bootcamp only if you can easily afford to go to one.

In other words, I think your tentative plan seems solid. Just make sure you're focusing on the right knowledge and less of the academic poppycock you spent 4 years on at university.

> To be honest, I’ve always felt like our CS course was inferior.

If it's inferior, it's probably not by much. Most CS courses even in America have no idea how to teach people effectively or give them direction towards an actual career.


👤 akomtu
Let me skip the psychological affirming talk that "you will be alright" and "it's just an imposter syndrome". You won't and it isn't. But unlike most people in a similar situation, you understand where you are and why you are there, and you're young, so have a few years to fix this.

Your immediate concern should be getting a software dev job. Not "support" or "tester" - that would dig you further into the hole. You need a legit job you could put on your resume, so next time you could claim "industry experience". If your experience is "customer support" you're stuck in that role for life, absent of divine intervention. When applying for a dev job, be bold and confident, because most of the devs out there are incompetent and don't know much. It's a very expensive mistake to think that you should spend another few years learning, and only then get a job. Every year halves your chances. In fact, you should use the moment to try to move to the US - 90% of outcome is determined by where you live, 9% of the rest by where you work and that remaining 1% by your skill.

While accruing that "industry experience", faking work or whatever, you should learn and you already know what to learn. Implement a basic raytracer in some popular languages and by the time you'll have completed this little project, you'll know more than 95% beginners. Implement something with databases and distributed systems: put it on AWS, document how it works, what solutions you picked and why. That would make you more competent than most devs with 10 yoe.


👤 cloudsec9
First, take a deep breath, and try to be less overwhelmed -- there IS a lot going on, but you can only do what you can do. And realize you've already put a big accomplishment on your side -- you completed a degree. You are able to take on a long term commitment and complete it -- that was a 3 or 4 year deal! Next, stop fretting about what you DON'T know. There is no one out there that knows everything about all technologies.

You said you don't know how a DB works, or ray tracing. Are you building a DB engine, or doing stuff with computer graphics? If yes, then you have some learning to do. If no, then that's okay. Find out what you WANT to do. C? Java? Python? Javascript/Node.js? ... and then look for spots where you can do more of that.

You asked whether you should "suck it up, get a tech support role" -- two things here. Financial situation is first -- can you afford to be a bit choosy, or do you need money right away? If you need cashflow, you might have to compromise. If you have more flexibility, you can look further. One thing I suggest is finding a worthy (non-profit) project and seeing if you can help them while honing a skill. For instance, if you want to be a full-stack developer, helping a project get a new or updated website online. Do it in stages; get something informational (plain html) to start, and then add dynamic stuff (events/news/signup) as you build confidence. You will get a reference and a live portfolio piece, and they get something that helps them.

Last but not least, realize this is an ever-changing field -- even if you were an expert in a tech last week, next week it might be fading from fashion. As long as you are willing to learn, I think you'll be good.


👤 capableweb
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.


👤 e12e
> I can't solve the "easy" problems on LeetCode and my score for the AngelList Fullstack assessment [1] was 18/30.

You say this as if both are equally bad - I just ran through it at ended up with 18/30 myself - but they list that as being in the 80/90th percentile! Or in their words: "You performed better than 80%-90% of 40,200+ candidates who took the same quiz."

AFAI can tell time doesn't enter into the evaluation, (ed: I did fairly rush through in 19 minutes - don't think it matters for scoring).

At any rate, I think you're conflating two things that people often conflate: suitability to get a job as a Software Developer/Software Architect - and Computer Science. If you want to do algorithmic research, you will need a good handle on CS - but for many development jobs a deep CS foundation is only a bonus, not a requirement.

Get more CS if you want to do research, get more programming experience if you want to work in this industry.

FWIW I know many great SWEs that have less of a CS background than what you already have.


👤 telomero22
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.


👤 Beltiras
Don't feel like you need to know everything when you start. A friend of mine just got hired to his first posting after uni. He will spend 9 months at least learning the ropes of the job. Reason why is that it's very esoteric and not a sought after skill. Thing is thou, it's a backend process for a product that's very old and is required by many compliance rules even if it kinda does nothing. It will still be in demand for decades still and he can comfortably trust that he will have this job for as long as he wants it. Thing is there's a ton of IT work that needs to be done and nobody wants to do it. And since nobody wants to, nobody knows how. The only way for companies to get those tasks done is hire someone that has to learn on the job.

👤 YeGoblynQueenne
Hey. My advice would be to not try to code something "useful" but something you personally want to code, like a game for example, or a compiler for your own programming language. A game is a good idea because it will give you the opportunity to learn lots of advanced techniques. A programming language also (and you have already built a compiler, which is a start) and it will also make you look properly geeky to potential recruiters.

But the important thing, now that you're not at uni anymore, is to find the time and the energy to write as much code as possible and perhaps read as much of others' code as possible.


👤 formerly_proven
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.


👤 noneeeed
Lots of other good comments here.

I just want to add that that fact you are aware that you have gaps, and have explicitly identified what some of them are is a massive step forward in sorting out the situation.

I would also say that you are not alone in graduating with a CS degree while having many of these gaps. Much of what gets taught in CS is not directly applicable to many parts of the software industry, and many causes leave out a lot of content that would be. There is remarkably little consistency between coarses. I have interviewed people at your level and seen radically different levels of understanding of even some of the most basic concepts. It's made me quite angry at the institutions on the candidate's behalf that they have graduated with so many basic gaps.

All the gaps you've identified can be rectified with practice and material available online, and you sound like someone who will pick it up. Personally I would recommend finding little projects that involve the thing you want to learn, so build something that needs a database etc. Keep them relatively simple to start with, don't try and build something that will take months.

You've shown you can learn, and you're self-aware of what the gaps are in that learning. It might be hard in the immediate future, but taking what you've written at face value you sound like the sort of person who will do really well once you've got going. Don't let the process grind you down, and don't let imposter syndrome make you feel like you can't take a shot.


👤 gardenhedge
I graduated a good but very hard CS course over 10 years ago. I didn't know much CS either to be honest. I got a job a few months after graduating in the finance sector. I improved in programming by doing it everyday and being part of a team. I had great mentors who I listened to and learned from. I was committed to work in a way that I never was to university. I learned the companies internal systems and turned out to be really good at communicating technical problems. I was always put in effort in improving any codebase I touched and improving technical & business processes.

After years of being a software engineer and being recognised and rewarded for being one of the best in my area of the company, I became more senior. Nowadays I don't do much programming (at work, I still code in my own time) and definitely don't do any CS concepts in work. Instead I mentor junior team members, architect/review software solutions and plan and help run software projects.

I am just sharing a brief snippet of my story so you have an idea of what a career path can look like.


👤 msluyter
My bachelors was in music and I was midway through a masters in music when I decided to switch to CS. Needless to say it was a huge paradigm shift, and having had very little experience prior to that, and also as a result of a program that was highly theoretical, I came out with a MS in CS but with some massive gaps. I wasn't that comfortable with basic tools, like the unix command line, vi, or even DOS (it was a while ago), for example.

So, feeling somewhat unconfident, I took a job in software testing -- SDET, doing test automation mostly in Perl. I figured it'd be a gentler learning curve during which I'd beef up my skills, and after which I'd move over to software development. It worked out fairly well for me, though due to a variety of factors, I stayed in the testing/QA side longer than planned.

I think that's not a bad path, and better than starting in tech support imho because you'll be directly involved in the development process. Just make sure that it's a technically focused role with opportunities for writing code, and not just button pushing. And don't stay there too long, or you'll find yourself in the unfortunate niche of the rare and highly sought after testing/QA person who can also code.


👤 ishjoh
Congrats on graduating with a CS degree.

I graduated a little over a decade ago and I'm very happy I work in the software field.

Now let me tell you, you have a major advantage over me when I graduated, because you have a degree in computer science instead of electrical engineering.

When I applied for jobs I had taken a total of 3 computer science classes, I had huge gaps in my knowledge. I had never taken a class in Java, and crammed for a month to have enough knowledge to pass an interview and get a job offer, and I did this all in a city which was not a major tech hub. I'm not trying to brag that I was able to do this all, instead I'm trying to let you know that you likely have a lot more training then you think.

Now the reality was that I couldn't get a job at a big tech company as I couldn't get past the resume screen, instead I had to start out at a consulting company with a lower bar to get hired, but I learned and got experience and I've had a great career since. I've worked for all kinds of companies that you've heard of.

If I could give my younger self some advice it would be this: 1) Know big O notation and complexity inside and out, interviews love asking these types of questions, for example how do you do binary sort etc 2) Have a strong grasp of common data structures, types of Maps, types of Lists 3) Practice recursion, especially if it doesn't come naturally, it doesn't for most people 4) Practice coding problems, really cram, there are lots of good resources out there 5) Apply to lots of jobs, and go to as many interviews as you can, even if you don't think it's the right opportunity, interviewing is a skill that you can get better at


👤 tauwauwau
I also feel like this sometimes. And what helps is reading books on the technologies that I want to know about. Even after watching a Youtube video tutorial or following a course on on Udemy just gives a superficial knowledge. That's why I always go back to the books.

When I wanted to learn JavaScript, I watched a few video tutorials on Youtube, but I didn't start to feel like knowing it till I read first few chapters of "JavaScript the definitive guide". Same goes for CSS, it clicked when I read "CSS the missing manual". When I wanted to learn Spring Boot finally, after working on Spring for years I read "Spring in Action" and "Spring Boot in Action".

Its guaranteed that you'll feel smarter after you read a book on any given topic. You don't have to finish the book, rarely you'll implement everything that any book covers. Just go through the foundational chapters. You'll be surprised how many of your peers in workplace don't know about the basic concepts in these books. That's all I wanted to say.


👤 radicalbyte
I didn't even get really good until I was in my early 30s, after 20 years of coding. The fact that you've been coding already means that - if you keep the humble attitude and keep learning - you'll have no problem.

The ability to learn and adapt - to be able to dig into problems and understand them, filling knowledge gaps as you go - is what you need to be a good engineer. Looks like you have that.


👤 Dave3of5
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.


👤 milad-laly
Congratulations on graduating, if you understand the basics such as DS&A, Discrete Maths/Big-O, and theory of computation you should be fine.

I wouldn't worry too much imo as in CS there is always something to learn. Many tech companies hiring grads are under the assumption you wouldn't be great at SWEing so they would teach you stuff and you would pick it up.

If you want to have more CS knowledge, I'd recommend joining a FOSS repo and just work on code and ask questions. Surprisingly a lot of people on the IRC channels actually like to help you out and answer questions. Plus code review is always something useful. Probs suggest something like memory is more efficient using this or using a map instead of a list.

Once again congratulations on graduating. It is good you are reaching out as many others just graduate and think it be the same as uni and just not expand out or anything.

P.S if you need any links to books for the things above I've mentioned just lmk and ill comment it.


👤 taylodl
You sound like a standard new CS grad. You have a smattering of experience with a bunch of technologies, you've interned, and unlike many, you seem to have a good grasp that you don't know everything. Maybe you're not going to be that fabled, leet 10x developer everyone thinks they want to be or thinks they need to hire. My advice? Avoid companies thinking everyone they hire needs to be a leet developers. My experience has been most of the people running those kinds of companies are incapable of finding their rear ends with both hands.

So what if you're an average developer? Average developers are still making a good living. Here's the thing - you want to get better! That already makes you better than 90% of the average developers I've ever worked with! I'm not even joking. Don't be too hard on yourself. Get a job in the field, and grow. With your attitude I bet in five year's time you'll be awesome!

So just get out there and start working toward awesome!


👤 explaingarlic
You're not far behind, if at all, from what your peers are. Moreover, your self consciousness - though it may cause you a lot of pain, is a good sign.

Don't go for a LV3 support role (or anything similar). Look for grad schemes - you're (going to be) a graduate!

Understand what part of what you're feeling and thinking is delusion and irrational - what parts are governed by imposter syndrome and whatever failures you've had in the past, and what parts are actual logical reasons as to why you can't or won't get to a specific place you want to be in life.

P.S. Please don't sweat at being shit at data structures and algorithms. The only reason I can write a linked list is because I had to know how drivers work in the NT kernel. I've only ever used hashmaps once in all of my projects and time in the industry.

It's not that I'm shit (or that you are) at DSA, it's that you have no reason to learn that stuff since it applies so infrequently to what you actually want to do.


👤 astatine
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.

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

Its a vast subject, you will have a lifetime of learning on the job, so having a good memory will help because some knowledge you acquired years ago, think of it like a jigsaw piece, will sit in isolation tucked away in your mind until another piece of the jigsaw presents itself and then you can join those two pieces of knowledge together, and eventually you will have built a reasonable idea (think picture for the jigsaw analogy here), of how a computer works, how the OS works, software running on one or more OS'es works, and how it connects to other devices using the internet and other forms of communication like wifi, bluetooth, Infrared, etc etc.


👤 cudgy
You are already ahead of the game because you sound humble and are willing to admit you don’t know things. Many of us (especially when starting out) act confident when we know little and coast for years gaining little knowledge.

Now that you have dabbled in a few languages and frameworks, try to focus on a cross-section of technologies that fulfill a job role. For example, understanding both ray tracing and database theory is not necessary for a single job role. Those are concepts for a graphics developer and a database analyst — two diametrically different roles. Pick a role that you want to shoot for and stick with it for awhile.


👤 yakak
This is very common and pretty much the default either directly out of a school with a weak program or after working in industry in a niche that doesn't use what you've learned.

The introduction of MOOCs like edX, Coursera and Udacity were great and most of them offer free auditing of classes. If I were fresh out of school I would take my transcript and go through the classes again in roughly the same order but dive deeper into the subjects that interested me most while perhaps only listening at double speed to subjects I don't find that interesting and don't think will come up in real life.


👤 dusted
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.


👤 kaon123
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?


👤 jonnycomputer
Computer science and programming are two different things. Job ads always have unrealistic expectations. Learning is a lifelong journey. Boldly ride forth youngling and seek Eldorado.

👤 pbronez
Check out Workera [0]. It’s an upskilling tool that adapts to individual students targeting individual solutions.

You tell it what job you want. It has a skill library for that job. Then you take a test. The test tells you what the gaps are between what you currently know and what you need to know. Then it gives you a custom curriculum designed to fill those gaps.

This is what I would use in your position.

[0] https://workera.ai/for-individuals


👤 stonemetal12
Computer Science is like the physics of information and computability. Software Engineering is the other side of that coin, just like electrical or mechanical engineering is to physics.

It is not an unusual position to be in. For some reason, we train people in the theoretical and expect them to be good at applications. Don't worry too much, focus on picking up Software Engineering concepts and know you are in the same boat as most new grads.


👤 danielvaughn
I went to art school - never even took a course related to either math or computer science. I discovered programming after college, fell in love with it, then taught myself. A couple years later, I took a job by someone who was willing to give me a chance.

I didn't know nearly enough at the time, but gradually I got the hang of it. It's definitely hard and you have to work at it, but if you're motivated, you'll do just fine.


👤 MarcellusDrum
https://teachyourselfcs.com is an amazing resource, might be worth checking out.

👤 f0e4c2f7
Just keep learning! You are young and there is quite a lot to know. Youtube can be a good source. Experience is probably the best teacher.

Books / Textbooks are also great. Here is a collection of some good ones that might round out some of the knowledge gaps you're interested in.

https://teachyourselfcs.com/


👤 MattPalmer1086
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.


👤 ggambetta
You mention Computer Graphics and raytracing, so if you want to learn more about that, I wrote a book/website that would be great for you: https://gabrielgambetta.com/computer-graphics-from-scratch Happy to help if you get stuck!

👤 germs12
CS is like learning martial arts. You'll never learn it all and you will never stop improving as long as you stay with it.

👤 nathias
You could have gotten a job 10 years ago. Nobody cares about your academic knowledge past the cv check for your junior position.

👤 vishnugupta
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.

👤 FabHK
For some perspective, check the CodingHorror blog on how many programmers apparently can't do FizzBuzz:

https://blog.codinghorror.com/why-cant-programmers-program/


👤 bayesian_horse
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).

👤 bombcar
Study Leetcode and get good at it - it may take a year or more, but in doing so you'll learn, even if it's just how to solve Leetcode.

Then use your skills at Leetcode to apply for jobs, get one, and learn on the job.


👤 erkm9
Seems like you could reap great benefits from https://github.com/ossu/computer-science

👤 mostertoaster
Eh, you probably know more about CS than me, and I’m a well paid software developer.

Get a foot in the door, and be humble and willing to learn, and you’ll do fine.


👤 turboponyy
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.

👤 DonHopkins
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: You can find information about BJC, teacher preparation, and additional resources at https://bjc.berkeley.edu

Snap is Scheme disguised as Scratch [pdf]:

https://news.ycombinator.com/item?id=28337196

Snap! 5 is here:

https://news.ycombinator.com/item?id=20309162

One of the coolest ways to learn programming I've ever seen is the Snap! visual programming language, which is written in JavaScript and runs in the browser:

https://news.ycombinator.com/item?id=20310134

Here's the elegant Snap! visual Y Combinator:

https://news.ycombinator.com/item?id=20312091


👤 hahamrfunnyguy
The best way to learn how to do something is to get to work. You'll soon find out the areas that you need to fill in.

👤 foreigner
It sounds to me like you're already more capable than 75% of CS grads I've interviewed straight out of school.

👤 prvt
I'm a recent CS graduate, and I found this post 100% relatable. Thanks HN for all the great advices and comments.

👤 tibbydudeza
Some of the ridiculous tech interviews these days expect you do be able to write a Twitter clone in an hour

👤 ungamedplayer
The fact that you know you don't know puts you ahead of others. Don't sweat it.

👤 karol
Don't try to make yourself perfect, instead figure out what you'd like to do.

👤 nso95
Study algorithms and DS, and practice Leetcode.

👤 jimsmart
There's lots of good advice in other replies re getting up to speed on various CS stuff.

But I suspect that it might be the lack of an 'overarching framework' that is perhaps more problematic here?

Lots of folk make their own framework. Learn about some productivity / personal-management systems — personally I like David Allen's "Getting Things Done" (it's a book, probably available in e-formats these days), cos its a simple system built around todo lists. I learnt it in the 90s, it's probably changed a bit since then, but probably not much.

Once one has something like that to try and help manage things, then it becomes easier to track progress through projects with bigger goals.

Then you can google-up any kind of curriculum you like (whether actually an official college/university curriculum, or any arbitrary list of stuff taken from some website), or get a decent book on a topic (books that are part of a college/uni curriculum can be good choices), and put the top level stuff into a list, and work through it, updating/changing the list(s) as your progress. With some stuff, it's ok to get bored and change direction. With other stuff, you might wanna make yourself work through the difficult bits. Depends on the goals, the reasoning behind them, and your motivation. It's also ok to edit lists to be bigger or smaller.

I've done this with heaps and heaps of areas of computing, and have learnt a lot over the years. But I accept there's always more to learn, and always folk who will be more expert/experienced in areas I'm new to. Learn from them too, if you can (and want to).

You are right that there is more to this than just sitting alone studying/coding. Project management skills, even just for larger personal projects, and the never-ending project of 'personal development', are essential. Find or invent a system that works for you. Use it to achieve whatever goals you have. Review the system weekly/regularly.

— If it's the long hours sitting alone part that bothers you, perhaps you are more of a 'people person'. I don't mind coding alone for hours myself, but that's cos I am comfortable with it, can manage myself, and can see my progress towards goals, and I've done it for a long time now (I'm now over 50). I don't have much to suggest if you think you're more of a people-person than I and many techies are, but I'm sure others might. Perhaps coding isn't for you? Perhaps you need to be part of a team?

But creating an overarching framework for oneself to learn new stuff is totally do-able, not as difficult as it might seem at first, and well worth doing.

Note that a 'full-stack' developer isn't really an easily attainable goal for a beginner, and nor should it necessarily be. It's do-able, but it takes time. Many folk that are 'full-stack' have arrived at that position because they've done databases, server-side / backend stuff, server admin, html/css/js, front-end, etc. (no particular order), on separate projects initially — that's where the true value lies in such a description. Kids who describe themselves as full-stack, probably aren't really — or likely won't have the necessary depth of experience.