Ask HN: As a self-taught developer, what are your self-directed learning tips?
35 points| mcjoken | 2 years ago
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!
[+] [-] coldpie|2 years ago|reply
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.
[+] [-] skyzyx|2 years ago|reply
I would agree for a web dev. But if you start getting more into backend, infrastructure, building distributed systems and APIs (which was the path I took), data structures and algorithms definitely start to come into play.
I started out self-taught on the web. Got a degree in design. Then learned web dev, then moved to backend, then to infrastructure, then devops, and now platform and cloud engineering. For me, I wanted to understand "the whole widget". And there are things I learned about UX that when applied to DevOps/SRE work, have elevated me as someone to listen to.
(As a fan of Avatar: The Last Airbender, I want to point to when Iroh was explaining how the 4 nations achieve balance. Same concept here. UX, engineering, infrastructure, and product need to work collaboratively together with mutual respect for the other disciplines to achieve the balance that leads to something great happening.)
I've picked up some data structures and algorithms along the way over the years, but I don't have college definitions of them. This hurt me when interviewing at Google, but I also have the ability to search the web and learn new things. So I do.
Just last week, I was working on tokenizing and building an AST for NRQL (New Relic's Query Language). As I was working through the tokenizer, I realized that this is what a linked list is.
I'm thinking about taking a single college course this upcoming semester about data structures and algorithms, just to fill in the blanks. But I've been building things for the web since 1997. For the most part, using anything beyond lists, maps, sets, queues, etc., is (relatively) rare, but again, it depends where you want to go next. Sorting large datasets efficiently, parsing things into trees, binary search, and making sure I iterate over things as few times as humanly possible will give you FAR more bang for your buck.
[+] [-] invokestatic|2 years ago|reply
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.
[+] [-] Obscurity4340|2 years ago|reply
[+] [-] strict9|2 years ago|reply
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.
[+] [-] aliyeysides|2 years ago|reply
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.
[+] [-] bkirkby|2 years ago|reply
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.
[+] [-] IKantRead|2 years ago|reply
I hear a lot of time from developers "I never use those fancy algorithms!" or "I've never needed any math beyond HS algebra!" but I find that very often it's precisely because programmers aren't familiar with those solutions that they don't see the areas they can be applied to.
One of the biggest insights from my after-self-taught CS degree was that one class in particular stands out as a the dividing line between feeling knowledgable and not: Compilers.
To anyone wanting to improve their CS background: If you can't get back to school full time, try to audit a course on compilers (this is one area where having a structured course really helps). Pretty much all aspects of Computer Science are touched on in that one area: algorithms, data structures, graph theory, theory of computation etc. Plus it's just a lot of challenging programming to be done.
But once you see a high level program that you wrote compiled to assembly by a compiler that your wrote every piece of, you really feel like you understand both CS and software.
[+] [-] andrewstuart2|2 years ago|reply
I'd also suggest going through Network+ and Security+ study guides too. IDK if the certs are worth it because I haven't actually taken the tests, but the books alone taught me a ton of the important concepts at a high level.
[+] [-] jplusequalt|2 years ago|reply
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 a 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. Both made me more well rounded as a developer. Not to mention they were extremely satisfying!!
[+] [-] marktangotango|2 years ago|reply
[+] [-] lolinder|2 years ago|reply
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.
[+] [-] mcjoken|2 years ago|reply
4 yrs at current company, flexible job with a small team. family commitments definitely affect my ability to focus beyond my day job.
If I could summarize how I feel out of my depth. When I encounter something I'm unfamiliar with I often feel like I've limited my self and played it safe. I feel I should be diving into these uncomfortable feelings and learning new things but it also seems vast and intimidating. Which often has me questioning why I want to do this work at all in the first place?
As for a new job, I applied to some new roles recently and found the interviews challenging. Which obviously is it's own thing I need to work on.
[+] [-] AnimalMuppet|2 years ago|reply
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.
[+] [-] dev_0|2 years ago|reply
[+] [-] travisgriggs|2 years ago|reply
- 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).
[+] [-] srhtftw|2 years ago|reply
[+] [-] lordnacho|2 years ago|reply
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.
[+] [-] rgrieselhuber|2 years ago|reply
[+] [-] _ea1k|2 years ago|reply
2. Learn neural networks and training them.
[+] [-] throw1234651234|2 years ago|reply
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.
[+] [-] thisisbrians|2 years ago|reply
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!
[+] [-] l__l|2 years ago|reply
[+] [-] vonwoodson|2 years ago|reply
[+] [-] vonwoodson|2 years ago|reply
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.
[+] [-] mcjoken|2 years ago|reply
"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." - This is exactly what I've been feeling recently.
[+] [-] yakobwoo|2 years ago|reply
[+] [-] elbasti|2 years ago|reply
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!
[+] [-] dgeiser13|2 years ago|reply
The Linux SIG, for example, is part of a larger network of Linux SIGs worldwide.
https://ccscmh.org/special-interest-groups/
[+] [-] mcjoken|2 years ago|reply
[+] [-] moribvndvs|2 years ago|reply
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.
[+] [-] fenomas|2 years ago|reply
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.
[+] [-] throw1234651234|2 years ago|reply
[+] [-] tomjuggler|2 years ago|reply
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.