HACKER Q&A
📣 mcjoken

As a self-taught developer, what are your self-directed learning tips?


I consider myself self-taught, no CS degree, took some basic web design courses in college. I've turned that into a career as a largely front-end focused developer for the past 8 years.

Now I've started a family, I'm in my 30s and I'm feeling like I need to keep my knowledge and skills updated. But also have been feeling out of my depth recently, perhaps regretting my lack of solid CS background. But, above all I feel like I haven't been challenging myself enough and I've begun to lose interest.

My question generally is for people who have followed a similar career path, But I'm open to all perspectives.

What approaches or ideas to your self-directed learning have helped you break into more invigorating work.

Thanks!


  👤 thisisbrians Accepted Answer ✓
What worked for me:

I started out chasing my curiosity: wanted to make a simple video game, so I Googled my way to one as my first real programming project. I think passion projects are the way to start, because learning programming is frustrating no matter what (but totally doable, and totally worth it).

Some folks prefer guided courses; they're great, but they just don't work for me (I get impatient and bored). There are tons of very good free ones around these days.

Stepping away or switching to different challenges when stuck have saved me countless hours.

Focus on building a foundation of understanding as you go. Copy/paste is totally fine as you learn, but try to read the code, error messages, Stack Overflow posts etc. to garner deeper insights. A lot of it won't make sense at first...that's ok. Things start to click eventually.

I strongly recommend using ChatGPT as a tutor. It's already way better than Google or Stack Overflow, and you can ask specific follow up questions so you can understand the "why" better. I'm currently using ChatGPT to learn Swift (for a new iOS project I've started).

And, reading HN helped me a lot. At first it was mostly Greek, but I read the articles that sounded interesting and can't even describe how much I've learned from reading the comments on this site.

Most importantly, have fun with it :) This is probably the most important point. The field is vast, so pick the route that draws your attention.

Best of luck!


👤 invokestatic
I’m one of those kids who have been programming since they were 10 years old. My biggest tip is to work on personal projects that you are genuinely passionate about or would use yourself. It’s a great way to experiment with new technologies with practically zero risk. For example, I’m currently working on a web app that started out as a SvelteKit SPA and with two backend “micro services”. I just recently finished rearchitecting the project into a monolith and using Hotwire for the front end. I was able to get experience using both of these technologies risk-free.

As a result of being curious and working on things that interest me, there’s practically no area of software development that I haven’t touched. I’ve written Windows device drivers, firmware for an IoT product, hacked on the LLVM source, wrote a (really basic) hypervisor, and made countless web apps. All with no CS degree.


👤 jplusequalt
I have a CS degree, but I had to teach myself the theory due to my school's sad excuse for professors.

Here are the two things I did that taught me the most about programming: learning how operating systems and programming languages work, and writing a raytracer and software rasterizer.

The former two put all my years of tinkering on computers into perspective. The latter tested my programming and problem solving skills in a novel way that I wasn't used to. Both made me more well rounded as a developer. Not to mention they were extremely satisfying!!


👤 aliyeysides
Back in 2012, I hired a dev shop overseas to build a startup idea I had. I didn't know how to code, how product development worked, and got screwed over in the end with nothing to show for it. After that ordeal, I decided I would teach myself how to code with the goal that someday when I was ready again I could build my startup without having to pay others.

Like you, I started in web development and eventually expanded into full stack because I was lucky enough to really enjoy programming and craved learning more because it made me more confident, ultimately allowing me to shed my imposter syndrome.

Fast forward to today, and I'm still learning new things all the time. I recently learned C/C++ because I wanted to understand what dynamic memory was and how that worked. Whenever I want to learn a new language, I spend some time answering the same leetcode questions in that new language if I can't find something I want to build in it in that moment. I also have a startup where I'm the CTO and have the luxury of deciding what tech we use, how things are built, and it's a great learning experience because I have to understand things on a deep level.

That's just me, but thought I would share.


👤 lolinder
> But also have been feeling out of my depth recently, perhaps regretting my lack of solid CS background. But, above all I feel like I haven't been challenging myself enough and I've begun to lose interest.

I think you need to elaborate on this a lot in order to get relevant feedback. Speaking from experience, a lot of the answers you're getting here won't work for someone who's started a family—you need to be very precise in identifying and targeting the root cause, and you don't have tons of free time for side projects and after-work learning.

In what aspects of your work have you felt out of your depth? Is this sense in comparison to others around you, or to the work itself? When do you most often feel it?

How long have you been in your current company? Are you losing interest in your job, or in web development, or in computers in general?

What you need to do will depend a lot on how you answer questions like these. It honestly might be as simple as getting a new job that stretches and engages you more than your current one.


👤 strict9
The best way to learn something is to do a deep dive and present/share it with others. Repeat this cycle. Make it a regular habit.

This could be in the form of a tech blog or giving a presentation to your team. There are also meetup groups, social media, and other outlets. Mentoring junior developers is another great way to stay current.

If you've been focused on front end for a while then try giving a talk at your company about something orm, db, or api related. In doing research you will learn, and you'll find yourself digging for more information to answer potential questions.

In short: help others learn. You'll learn a lot yourself along the way.


👤 coldpie
In my opinion (others will disagree), the vast majority of CS concepts are not very useful for most software developers. I don't think you should feel bad about that. I consider my time & money getting a CS degree to be almost entirely wasted.

If you're at a large company, look around for open positions that look interesting on other teams and talk to those team leads about what skills they would want. Maybe they'd even be willing to have you on board as a "trainee." If you're genuinely good at self-teaching, you will be an asset even without the skills built in.

If there aren't positions available at your current employer, you'll have to try to decide what skills are in demand and pick one, and you'll have to spend your personal time on it. My approach has always been to build something with the tech I want to learn. Usually just toys (a music player to learn GTK; many garbage video games and websites to learn various languages & toolkits) but sometimes useful stuff, too (a blog post demonstrating reverse-engineering a video game; many little unixy tools to make my dayjob easier; porting a Linux video game controller driver to macOS). In my opinion, just doing exercises isn't a good way to learn or demonstrate your abilities to an employer. Projects you own & and can talk about are way more interesting.

Also, consider that you might just be burning out on tech. I know I'm getting there. Ten-plus years in an industry is a long time, not everyone's built to do the same kind of work for their whole life. I'm keeping my eyes open for something in another field that grabs me.


👤 kbknapp
The generals tips I have apply equally for self-taught developers and traditionally trained, yet are interestingly enough more often easier to accept for self-taught developers. Perhaps due to a willingness to acknowledge a _potential_ gap.

1. Be curious; allow yourself to say "I don't know" and go deeper

2. It's OK to be wrong; be humble and use step 1 to correct

3. Be aware of and try to discover and shed light on the things in your field that are your unknown-unknowns [1]); and then follow step 1

Links:

1: https://en.wikipedia.org/wiki/There_are_unknown_unknowns


👤 yakobwoo
I've tried a number of approaches but the one that has worked for me: try and build a software product / company with commercial application. Even if it doesn't work out the economic incentive of finding PMF will give you all the motivation you need to keep plugging away at learning whatever languages, frameworks required to convert your idea into a functional software product.

👤 bkirkby
Ten years into my self-taught software engineer career I ran across a statement "if you aren't seeing problems in your work that can be solved by graphs (or any advanced algorithms really), then you are likely avoiding those problems."

I thought he may be right, picked up an algorithm book and started a "coding club" at the company I was working at where we'd meet and go over the details of a specific algorithm.

I became a better programmer for it.


👤 ilrwbwrkhv
Build hard things. Write a programming language, a text editor, a database. Also try and break things. For example how many requests a second can you run before things hang etc. Basically get out of web dev as I see many people just stuck there.

👤 prirun
I have an Applied Math & Computer Science degree, but was largely self-taught and working for computer manufacturers before doing the degree.

When I am learning something new or working on something difficult, it's important to keep motivation high to avoid getting bummed out, frustated, and quitting, especially if this is self-directed and not required for a job. The way I do that is to start with a working program, no matter how small, and then extending it in very small increments. After each increment you should still have a working program. You might spend a lot of time thinking about how you want to implement a feature (the design phase), but also spend time thinking about how you can get to a larger goal with baby steps. A good analogy for this is if you are contributing changes to an open source project: the maintainer doesn't want to see a 10K-line pull request that they've never heard of before. It's much more likely to be accepted as a series of smaller changes with a larger goal.

By doing these small increments, its much easier to isolate problems, because you haven't introduced much new stuff at once, and always having a working program keeps your motivation high. If you don't have a working program because of some changes, it forces you to be disciplined and fix things before continuing to add more new stuff.


👤 jsight
1. Learn data structures, but don't get overly pretentious about it. An ArrayList really is the right choice a lot of times, even though the CS mind might assume LinkedLists. :)

2. Learn neural networks and training them.


👤 elbasti
In software development, there is such a thing as "good taste."

There are ways of structuring code, of naming variables, of writing documentation, that simply are better than others even though functionality may be the same.

There is no way of acquiring this good taste except by reading code written by people with good taste.

If you're self taught, the easiest way to do this is by jumping into some code bases that have been written by people with good taste. Look at how they name things. Which private functions they define vs which things are inlined. Which bits of code merit a comment.

The best way to do this is to find some oss libraries that _you_ use, and just looking at the source code for them. You'll quite quickly realize which are easy for an outsider to understand and which are hard. You'll empathize with a 3rd party reader. And you'll learn more about how they work too!


👤 fenomas
Self-taught dev here, and I remember feeling similar things at a similar age. During a gap between jobs I wound up taking three online courses: Algos 1 and 2, and Andrew Ng's introduction to ML course (all at Coursera). This was just out of curiosity, I didn't have any particular goal or expectation for them.

At the time I didn't feel like I learned any One Big Thing, but in retrospect the courses demystified a lot of things, and I've never really felt out of my depth with development since. The other big thing I did was to tackle a much larger, more complex project than I'd tried before (a game engine). That also forced me to grow as a developer, but I don't know if I'd have managed it (or tried) without the footing I got from the courses.


👤 preommr
> But also have been feeling out of my depth recently, perhaps regretting my lack of solid CS background.

I have a CS degree, and honestly the biggest practical value I got out of it was learning things that were cultural signals that let me part of the programmer "in-group" - I can talk about misc. cs stuff that will resonate with other programmers that have had a similar background.

In terms of things that I think are actually valuable like skills that help build things and write better code, there are much better alternatives than a universty degree. Just building things in my spare time and building things the way I want has taught me so much more. Sure, looking back, there are some things that I value highly that were taught in university, but it the signal-to-noise ratio was too low, to the point of being useless.

So I think the best thing anyone can ever do to improve their knowledge in software is to just build something that other people use.

If you're worried about fundamentals, I would say just shore up on some basic data structures (linked lists, hahsmaps, trees, maybe some graphs - this pretty much covers 99% of use cases). Rather than learning these as theory, I would strongly recommend just reading wikipedia, and writing code with them in a functional language like haskell. And also maybe some leetcode questions.


👤 lordnacho
Do the DS&A stuff. Learn the common data structures and their big-O. Do some Leetcode questions. You quickly discover that there were things you could have done better, and you realize pretty fast that a huge swath of problems are actually solvable with a small number of solutions.

Other one is systems. Maybe less relevant for some people, but it's worth having a deeper model for how the OS works. How does virtual memory work, what does the scheduler do, threading, etc.

Finally perhaps programming languages and compilers. Gives you perspective on how the tools be use are constructed.


👤 yrwelikethis
When I was starting out I was then working in a different career. A lot of the work was analytical (Excel, GIS, etc.) and so I moved my work from those tools into Python.

I started small but eventually learned enough, alongside doing some online courses and personal projects, to get a job as a data scientist in a similar field.


👤 omginternets
Be open and curious about CS. There’s a strange mindset in some parts of the hacker community that considers CS to be wholly academic and divorced from the actual practice of programming. It isn’t. And it’s very rewarding.

👤 knob
Similar path for me. The book The Effective Engineer by Edmund Lau was spectacular.

Push yourself full! Yet be kind with your progress. Best of luck fellow!


👤 jimmychoozyx
-> google drive: keep journals. such as a daily dev journal. or a daily journal, where project = "learning journal" or an actual project you're building (and it might grow into a folder).

-> use chat rooms like IRC to have free Q&A sessions with experienced developers

-> check out www.roadmap.sh for ideas on which areas to grow skills in

-> ebooks at libgen.is

-> motivational speeches & music playlists (e.g. david goggins, motiversity, two steps from hell) -> video series at udemy.com (and other places, such as KodeKloud and ACloudGuru)


👤 tapanjk
Code. Every. Day.

👤 throw1234651234
I got the Google Professional Architect cert about half a decade ago and it did help me understand the cloud quite well. It feels like "a marketable skill". I got more cloud certs from Azure and AWS later, but only the first "hit" in terms of learning because it's all the same after. But the first one really helped me understand the landscape.

For me, networking or security (mostly due to the networking part) are probably next to help understand something relevant and used by senior devs sometimes.

The other route is just to grind FAANG interviews for data structure. As much hate as it gets and as much as I haven't personally done it, it might also be the more practical way to go for job security.

Honestly, a lot of great front end devs don't know any of this stuff and are just amazing with React, know all the tools (Storybook, Figma, Contentful, Netlify) etc and are good with that.

P.S. Auth - you might want to learn Auth0 or Okta and the underlying principles. Comes up on every project.

P.S.S. You are going to get a lot of biased, personalized opinions here like mine, so really try to see the rationale and decide what YOU need. For example, I see IoT just in the post below - no one cares about IoT if you aren't specializing in IoT. He also wrote a hypervisor it looks like - no one will ever have him do that irl, unless he decides to dedicate his whole life to it. Etc - nothing against that guy, just convenient example.


👤 tomlockwood
Pick a new and hot tool in an unfamiliar language or with technique requirements that are not in your comfort zone. Build something with it!

Try out a new IDE, or workflow.

Read some code in an open source project that you use a lot in your current work.

The purpose of all these is to gain a greater understanding of what is possible! This is something as a self-taught programmer I do often.


👤 worker_thread
Build stuff with your hands!

👤 AnimalMuppet
Every five years or so, my wife asks me, "What do you need to learn now for the next 10 years of your career?"

If you're self taught, you can teach yourself the next thing.

You don't have a solid CS background? You can teach yourself that. Go look at, say, the list of MIT courses for a CS degree. You don't have to take the MIT classes. But which of the things do you know, at least to some degree? The ones you don't know, do you feel the lack of any of them? Have they held you back at points in your career so far? Go learn those.

Your work isn't interesting any more? Look around at your company. What work there would be more interesting? What do you need to know to be able to do that work? Go learn that. If things line up just right, you can help out on a project in that area that is short-handed, and get experience on your company's dime. You may have to be able to say "I know a bit about that" first, though, so go learn at least a bit about that.


👤 ChatGTP
work on things that go to production somewhere...

👤 vonwoodson
I am not “self taught” in the sense that I taught myself to code when I was young, and got a CS degree, and continue to learn new technology on my own , but I feel that the feeling you have is not related to being self taught or not.

When I turned 30-ish and had a kid and a wife and a mortgage… I lost a metric ton of interest in computers and computing. It happens. The truth is that software is a terrible time-sink and life is much cooler. To that end, a job is a job, and if your job is to pet puppies: after 40 years of work, you’re going to hate puppies.

Try to think about what you’re doing as providing for the people you love. Don’t think that the grass is greener on some other project. Try to become a true master of your craft. Stay up to date on your skills, without chasing the new-and-shiney framework or language. If you are still interested in professional growth: become a mentor, get into project management, start a side project.

For me, I doubled down on “just” being a C++ developer. I just don’t want to climb the corporate ladder. And, should my skills ever find a dead end, so be it. But, I doubt it. I just churn the tasks at the best pace I can maintain and do my best to focus my energy towards things that actually matter.


👤 austin-cheney
I am self taught. Here are my personal laws of programming.

1. Own your environment. Make it yours and bend it to your will. The more you outsource that, like frameworks or state management or helpers the more you increase your tech debt and erode your pivot points.

2. Always preference durability over composition and composition over inheritance.

3. Always do more work up front than you need to if it means doing less work in the future.

4. What separates excellent developers from average developers is basic organizational skills.

5. Always select for simplicity and competence over compatibility and aesthetics. This determines capacity for critical decisions over institutional preferences.


👤 mcjoken
Just wanted to thank everyone for the responses. lots of good ideas.

As a follow up a question. Many of you said you pursue your interests and passions, exploring them in personal projects. Feels weird to ask but, how do you identify/kindle these interests? I feel like early in my career they came fast and easily, but now my interests often take me away from the computer screen.


👤 mindaslab
Follow your passion, don't listen to others. Give this advice to any other putting such question on HN.

👤 travisgriggs
Mechanical engineer who’s spent the last 30 years programming instead. First thoughts:

- Find ways to ask questions. Whether forums or slack channels or peers. Asking puts you in the learners seat.

— Find domains that excite you. A friend told me “web development rots your brain” after he tried that for a while and found that carving out some time to contribute to open source Linux drivers kept him going and engaged.

- There’s an adage: Make it Work. Make it Right. Make it Fast (or optimal). I’ve observed that most programmers have a tendency to stop after the first priority is met. It’s understandable, that’s the lowest investment with the biggest (short term) return. But it’s also where the least learning happens. Push yourself to make one of your solutions a “right” solution. Push yourself to optimize something about it (even if you don’t deploy the actual optimization, because there be lots of evil around optimization).


👤 rmshin
I never went to college at all and have had (still have) similar feelings of unstable CS foundations. Some things that have helped me:

1. I historically treated programming purely as a means to an end (for income/work, for business ideas, etc.) and this really inhibited my joy for the craft. After a bit of a burnout, I decided to finally embrace it as a "passion" and have since begun learning things I'm intrinsically interested in–3d graphics, operating systems, webgpu, and others.

2. One part of being invigorated is being around others who are invigorated. I've recently applied to a hacker retreat at Recurse Center (https://www.recurse.com/), so that I can meet and be surrounded by other hackers who pursue programming out of love for the craft itself. Even if this doesn't go through, I plan on finding other communities related to my sub-interests and learning alongside them.

3. Good online courses (whether paid or free) can be really effective at giving you a lay of the land for a given topic. Not too long ago I bought & went through a video course on 3d graphics (https://pikuma.com/courses/learn-3d-computer-graphics-progra...), which let me build a 3d renderer entirely from scratch in C (https://rmshin.github.io/3d-renderer-wasm/). Now I'm learning webgpu on my own through https://webgpufundamentals.org/, but I wouldn't be able to do so if not for the knowledge I gained through doing the video course.

4. From my experience, in order to upskill in programming (and anything else) there is no substitute for putting in the raw hours. This is why I mentioned the importance of intrinsic motivation in the first point, since it's hard to put in long hours for something that doesn't excite you. I realise you have a family (I don't) so this might really be the biggest barrier for you. If you can afford it, I'd highly recommend taking 2-3 months off to invest full-time in upskilling. Otherwise it'll be much trickier, but maybe possible if you can find a great community who you can learn alongside on a regular basis.

Lastly, I'd be more than happy to connect and chat about programming & self-learning if you don't have anyone around you–email is in profile :)

Best of luck!


👤 ezekiel68
As a self-taught, many important concepts will fly by you that you do not yet understand (even while consuming training resources). Yet we cannot stop the world and look everything up the moment it first arrives. How then to improve? My advice comes in 3 parts (for a unified whole):

1. Pay attention to which ideas, nouns, terms, abbreviations come up more often, indicating they are the "table stakes" for a particular area of tech.

2. Develop a personality trait that refuses to stay satisfied with "not knowing". Practically speaking, this means: set aside dedicated time each week for self-study of the concepts you've taken note of in the first part and skip other things, but don't skip this.

3. Take notes when reading or consuming video/podcasts that cover these concepts and I sincerely recommend the practice of writing your notes by hand. There's no magic to it, but (I imiagine) the slower process of writing aids the mind in putting what you consume into your own words (and associating it with other things you already know in the field).

Here's an example from way back -- before phone apps, before web apps were common, I used to create full stack systems (backed by databases I designed) in "thick client" GUI apps using Visual Basic. But the concept of web apps was gaining traction and I wanted to figure out the key ideas. The main thing I hadn't figured out was how the heck data fields from a web form (for example) could be reliably relayed to the "business tier" of a 3-tier web application. People threw the term "request object" around like it was some kind of obvious concept. I simply had no knowledge that all frameworks/libraries for web application development provided this common request object abstraction, so I was imagining all kinds of complicated and proprietary ways one might need to construct such an object -- especially across different web servers.

I have noticed that this kind of "getting stuck" is common to the self-taught. Following the process I mentioned above, I focused in on learning about the popular web server APIs such as CGI, NSAPI, and ISAPI and how popular frameworks (at the time) such as PHP or ASP made accessing them much more developer-friendly through already-created request objects.


👤 tomjuggler
I think that everyone has a different way they can learn effectively. For example many people find coding videos useful but they never helped me.

I learn the most when I am building something for myself. Remember, the code is just a means to get to the end product.

There are many success stories out there of programmers making cool stuff and getting noticed - but the main thing I think is finding the motivation to push through those road blocks, the times when you spend a week and get just the one line of code...

PS: having kids myself I switched over to coding at night 50% of the time - I do 4-6 hrs in the day and 2-4 hrs after bedtime. Made all the difference in productivity and family life is great.


👤 dgeiser13
In Columbus, Ohio the Columbus Computer Society has SIG's (Special Interest Groups) [https://ccscmh.org/special-interest-groups/]. I don't know where you live but if it's big enough (and especially if there's a concentration of computers professionals) there may be SIG's in your area where you can talk with others like yourself. SIG's are especially good for presenting topics [as strict9 mentions] if you want to prove to yourself that you really know your stuff.

The Linux SIG, for example, is part of a larger network of Linux SIGs worldwide.

https://ccscmh.org/special-interest-groups/


👤 moribvndvs
I’ve learned the most from 1) taking things apart 2) fucking up putting them back together.

I generally agree with other comments to find a passion project and build it. But I think a lot of people, including myself, don’t even know where to start with _that_. I’m not a crazy inventor or creative type that’s teeming with original ideas, but I am extremely curious. When I don’t have a nice project idea to use for learning something, I just take something else apart and learn how it works. Or try to reproduce something in a new language or platform.

Last but certainly not least, there will never be enough help in open source projects. Pick one you use often or that you have decent working knowledge of and ask if you can help.

Sure, a passion project is going to be more motivating and interesting, but it’s not the only way to advance your knowledge or keep your tools sharp.