Hacker News new | past | comments | ask | show | jobs | submit login
Ask HN: CS grad who barely knows any CS
128 points by nevillain on June 14, 2022 | hide | past | favorite | 106 comments
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




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.


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

At one point you realize, when you remove all the boilerplate, every piece of software is fundamentally just a "tiny console C program". All IPC and networking is isomorphic to reading stuff from stdin and writing to stdout. And when you ignore IPC, all you're left with is just pure algorithms.

Leetcode (and the likes) always made sense to me. It's measuring how well you can solve the fundamental problems, not how well you can fill out vendor-specific bureaucratic forms.


I think that you're missing the linking element of software units. It can be very intimidating, particularly from an outside view.

I have been writing C for years and I can tell you in a second if you are accidentally dereffing the stack or not doing a bounds check. Yet, I still barely know my way around CMake! It's daunting, and I haven't worked on any enterprise scale C projects, hence I have no reason to learn how to properly separate, and later integrate, my software components.


I agree, but even modularity is just an implementation detail, rising from the finiteness of human work capacity and computer resources. Algorithmic solution to the problem is the same, whether it is implemented in a single implementation-specific C file or a cross-platform multi-repo project. Also, it is (IMHO) much easier to learn engineering principles, than how to solve algorithmic problems. The latter is akin to solving mathematical problems, which require finding a problem-specific needle of knowledge in the haystack of mathematics.


I still write console programs all the time. But I haven't programmed for Windows in over a decade.


It's also helpful to realize that you "stand on the shoulders of giants".


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.


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.


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)


For anyone wondering about PHB: https://en.wikipedia.org/wiki/Polyhydroxybutyrate

> PHB is produced by microorganisms [...] apparently in response to conditions of physiological stress



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


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.


Stage two sounds about right. There are a few red flags in what the author is telling us.

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

I'll be honest, it might be.

Outside of a few universities I place very little value in foreign degrees. Unless someone has any experience at a credible company or a real portfolio, I won't be interested. The reason being that the signal to noise ratio is just too low.

My best advice would be to come to the US and get a masters degree from a reputable University. It will help fill the gap.

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

These are aimed at first year CS students. I've seen people solve these after only completing the intro to programming class at their college. Not being able to complete those after completing a "degree", to me, is an indication that there were serious gaps in said degree.

Leetcode shouldn't be very hard for anyone who completed a serious algorithm and data structure class, along with a intro to discreet math.


Ouch!

Tbf: - I was towards bottom of the class for a significant chunk of the course - It's been a while since I reviewed/wrote algorithms (but having gotten a good grade in the DSA course, it raises eyebrows) - I only recently started doing LeetCode (< a week). It's getting progressively easier, and I might just be rusty. But again, it doesn't negate your point.

Now that it's been suggested twice, seeking to study in or move to the US seems like a plausible cause of action. Given my overall GPA won't be outstanding, I will be pretty limited if I am looking to join an MSc program.


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


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.


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.


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.


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


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.


This is the best advice to realize early on.


You'd suggest reading over doing ?

Seems like he is ready for the doing, just pick something you want to build and start building. You can read as you go ;).


So, here's the lesson that I learned when I was about 23 years old.

At the time, I had a CIS degree and had been programming for about 5 years, mostly Java, Perl and PHP (early 2000s).

I knew PHP really well. Used it professionally, used it in my hobbies. There was something I was trying to figure out how to do and I couldn't find a clear answer for it online anywhere so I finally ended up buying a book that had references too it. Big 600 page Wrox book I think.

Well, I opened up the book and found the answer I was looking for. Then I noticed something on the next page that I didn't realize you could do and would have made my life soooo much easier if I'd known about it earlier.

After that I sat down and read the book cover to cover despite having been working with PHP for 5 years at that point and I learned so much. Really leveled me up.

Now, anytime I want to learn anything I go straight for a book so that I can get a comprehensive picture of all of the available tools and how they work together, from an expert. Makes everything afterwards a lot easier.


There's a constant iterative feedback process. Learn -> Do -> Learn -> Do -> etc...

If something is painful and then you read about how to make it less hard, that's immensely gratifying. At that point you learn how beneficial that is, and start reading more. But if you just read and never apply that knowledge, you don't actually understand it. You need to strike the right balance.


That's fair. I think it depends on the person a little too.

For me, I prefer to gain a deeper knowledge before I dive in because I know what direction to look to solve the problems I come across if I've read about them already. I might not remember the specifics, but I know to look for it.

Works well for me though.


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


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


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


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.


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.


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.


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.


This is quite helpful as it answers the "support role or not" question. I appreciate the forthrightness. I am applying for jobs over the next few weeks, and I will consider your take when selecting opportunities.


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.


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.


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


Did that quiz too now. Not having any knowledge of Javascript or SQL I still got a 18/30. Fishy that they won't let you look at what you got wrong/right.


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


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


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


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.


https://en.wikipedia.org/wiki/Third-Worldism#/media/File:Col... Canada is first world. Switzerland is third world (an also, on of the richest countries).

Is it imperialistic to call developing countries 3rd world-countries? Then again, developing just means "more climate friendly then richer countries" I guess.


>your education happened in a 3rd world country

the world is bit more heterogeneous than that


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.


Do you have any examples of the type of work you’re talking about? I want to get into tech so bad I can’t stand it, but my education is in the humanities and while I’ve written thousands and thousands of lines of non-trivial* code in a variety of languages I taught myself, on paper, I have nothing to put on a resume (I can’t imagine anybody cares about my personal pet projects), so I’m thinking being willing to do some type of job that nobody else wants to do may be my only shot (though I’m quite possibly way off base here, as well).

* by non-trivial code I do not mean that it’s necessarily complex… just that I’ve written code to solve actual problems I’ve had and not just lab/learning exercises… I may be misusing the term “non-trivial code”, and if so I apologize.


Sharepoint management is one. Maybe that one is going away now in the age of Teams, or maybe there's conterintuitively more need than before. I know there's a lot of need for COBOL in old systems and nobody but NOBODY is picking up COBOL these days. Thing is with these type of gigs they are hard to find. It's the long tail of computer use. There isn't a job board titled "Dinosaur maintenance".


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.


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.


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.


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

Not sure if the anger is to be directed at the institutions in this case or not. Clearly, a lot of schools are deficient. But it's rare that a person can recite back what they learned the same way they heard it all on the spur of the moment. It could be the material was covered, but in a different order than you recieved it, so their education looks more scattershot. Just a possible explanation.


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.


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.


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


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.


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.


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/


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.


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!


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.


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.


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


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.


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.


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?


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.


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


I have done the Workera SWE Domain test (244/300, 95th pctl), and the algorithmic coding test (125/300, 41st pctl). Clearly, my DSA expertise atm is sh*t.


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.


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.


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


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/


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


Thanks for offering to help. I will go through the book later since I am still applying for jobs and preparing for interviews. It seems like quite a great book though, and I might finally get to learn ray tracing :D


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.


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


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.


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

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


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


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.


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


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.


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.


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


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.


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


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


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


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


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


Study algorithms and DS, and practice Leetcode.


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.


Your conjecture is quite reasonable, possibly accurate. Tracking bigger goals has definitely been a problem for me.

I love computer science and programming in general, so I am not about to give that up. I guess once in a while I need someone to consult or do stuff together with—like when I've been stuck on a bug for a while.

I will try to create that "custom" overarching framework. Hard to get right, but it might be fruitful.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: