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
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.
1st off, don't fret too much. Some people learn x and think they know it all. You and I learn x and realise we don't know a, b, c, d... and lose confidence. Don't.
> I don't know how databases work,
Many DB/SQL programmers don't either, and they may have worled for years. I worked on several projects where it was clear the other DBs didn't understand the tech, and didn't even understand SQL that well (like not knowing transaction isolation levels and releasing code with race conditions in thereby).
> I don't know what exactly ray tracing is
Who cares.
> So, how can one effectively fill gaps in their CS knowledge?
You're confusing computer science with programming/development. They are different. My advice, you can't know everything (I tried and failed) so go for a broad niche (web dev + UIs, or back-end dev + databases). BTW for learning there are huge resources now that never existed when I started. Just hit DDG a few phrases ("how do databases work") and go from there.
Relax a bit, and good luck!
The 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.
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.
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.
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.
> 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.
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.
> 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.)
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 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.
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.
So get a job as a junior and start hacking. Your basis will be fine to quickly understand everything.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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.
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.
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 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.
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!
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.
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.
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.
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.
As for jobs, I don't know how tough it is right now, but if you can get your foot in the door, actual experience is way less important than the ability to learn..
Get foot in the door, do work, people see that you're capable, develop your skill while working.
Then everything will be fine. I am jealous; Kenya/Nairobi is a phenomenal location to be in. When I was 23 I knew nothing. I started at 26, and now at 33 I can say I am a happy and pretty decent (maybe above average) programmer who can really add value to businesses.
Visit meetups regularly maybe if that's something you enjoy?
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.
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 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.
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.
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.
Then use your skills at Leetcode to apply for jobs, get one, and learn on the job.
Get a foot in the door, and be humble and willing to learn, and you’ll do fine.
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.
There is a lot of educational computer science courseware around it, too, like The Beauty and Joy of Computing:
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:
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.