The last time I took a programming class in a formal school setting was 8th grade. The class was "BASIC programming". We all shared 3 Atari 800 machines.

But "self-taught" isn't really accurate. I am lucky to have found a few mentors and coaches who have directed my development in software. It's one thing to read books or articles about software. It's quite another to have people who know from experience which books and articles you need to read. And, when I have been very lucky, those coaches and mentors have also been colleagues who have taught me as we worked together solving real problems. I would not be where I am today if not for Tonya, Aaron, Remy, Ahmed and Cristina.

It's impossible to know everything, especially in software development. New technologies appear every day. There are always going to be gaps in what you know about what came before. You have to pick and choose where to spend time and effort. I've found that focusing on learning the underlying concepts of software development pays off more than learning the details of whatever technology happens to be in vogue. Knowing the fundamentals allows you to deal with nearly anything else you might come across.

You can always google something you don't know about. (And there's no shame in looking something up!) But there is a huge amount of absolute garbage to sift through. You can nearly always find a snippet of code on Stack Overflow that will kinda-sorta solve your problem. You can maybe tell how reliable the snippet is by how many upvotes or downvotes it has. But there's no substitute for having the foundational knowledge to be able to tell at a glance why a snippet is either good or bad, and to be able to tell by reading it how it solves the problem you had when you came across it. Nine times in ten, you'll find something that doesn't actually solve your problem, but gives you a pretty good lead for solving it for yourself in a way that's appropriate for your situation.

Having said that, I've also found that having a deep knowledge of one software language is also useful. Languages are similar enough that knowing one deeply gives you a great foundation for transitioning into others. I spend most of my time with PHP. But that enables me to read code written in nearly any other language. So I can follow along when someone is talking to me about how they've approached a problem, but their examples are in C++ or Java, Python or Ruby, Kotlin or Go.

Finding good mentors and guides, focusing on learning well the underlying concepts, and learning one language deeply: these will all be solid ways to make progress in software development, whether you're "self-taught" or you've got a shiny new CS degree.

But for making progress in software development, even more important than any of these, I've found, is having a mindset (call it an attitude) that no matter how far I've come, I always have something more to learn and I owe it to pay back what I've learned by becoming a mentor and coach for others.

In my current job, I'm a "senior engineer". I work with "engineers", "junior engineers" and "interns" as well as with other "seniors". The titles do imply a relative level of experience and capability. I spend most of my coding time paired with at least one colleague. When I'm with one of them, I'm nearly always the lead or coach on the particular project. But I also learn a lot from them. Even as a "senior", I do get "stuck" quite often, and I rely on what other team members know to get unstuck.

There is a stereotype of the programmer who thinks he's (yes the sterotype is "he") working alone, feverishly through the night hours hopped up on caffiene, having forgotten to take a shower in more than a week. I've come across programmers who fit that mold. Mostly, they made more problems than they solved.

At its best, software development is a social enterprise. It's done best in groups where knowledge is shared and code is developed in a coordination of effort. It doesn't matter so much the title you carry, or whether you started out as a hobbyist or a student. What matters most, and where "dancing on the digital frontier" really happens, is solving real problems for real people using technology in a human context.