As the other answers say, you will need something specific to drive at. The field of software engineering is vast. You'll be repeatedly overwhelmed by its size and scope without getting anywhere unless you start, and develop skills on the way. Phrased differently, you don't know what you don't know. By far the best way to explore what you want to do and to gain the skills necessary is to do it on someone else's dime. Get a job.
Easiest way into a tech company in a technical role is through front end. (Let's kill a myth here: not because FE is easier—it's not, necessarily. But the risk is generally lower, since it's hard to really screw things up in javascript and your mistakes will usually be more traceable for others to clean up after you than they would be in, e.g., devops.) Give yourself 3 months to learn everything you can to pass an interview in javascript, html, and css. Then go to a non-silicon valley town with lots of tech (Austin, Boston, Chicago, LA come to mind) and go out for every front end job you can find in a mid size company.
If the company's too big, you'll get locked in the front end role without opportunities to explore other things. If it's too small, you risk (a) that it's the founder's lifestyle business without any real innovation, or (b) that it will grow so fast that you'll have responsibility piled on you and no time to learn. (I recently interviewed a guy like this. Super smart, but he joined a high-growth startup as a cheap early employee, and his expertise stayed unfortunately narrow because he had no time to grow, only to prop up his part of the system.) You're looking for a place with 30-70 engineers, whose senior technical people are over age 45.
Great advice. As someone who is on the self-taught path, and employed as of recently, I would recommend the following as well
- Start digging into data structures and algorithms early and often. Leetcode is meme status now, but it does help to practice routinely. Don't wait until 2 days before an interview to try to learn how to these things. Grokking Algorithims, the Algorithm Design Manual, and Cracking the Coding Interview all helped me out along with constant practice
- assuming you'll be front end focus to break in, get a good understand of how the internet works (and be able to describe it well). It's a go-to interview question for front end positions
- Dig deep into Javascript. Understand why it's useful, and more importantly, what the issues are with it so you can avoid those pitfalls when working with it.
- Learn React. Vue/angular/etc are all helpful and good to know, but React is getting more widespread by the day. It's pretty easy to pick up once you have a good JS foundation, and there's tons of learning materials.
- Learn about webpack and what it does. You don't need to know how to configure it from scratch or memorize its docs, but know when and why its used and how it helps your project.
- Most importantly, learn how to get stuck. Try things that are really hard, get stuck until you want to give up, then try some more. Get comfortable not knowing how to do something, but figuring it out.
- Don't get too bogged down learning the right tech stack. Pick one and go hard on it for most of your time learning. No matter where you end up, the stack will be different. Starting over is common and most places expect you to have 'ramp up' time to get used to their dev environment/stack
By the way I should mention: I didn't just make this up, I actually _am_ a "self-taught" engineer working for a unicorn. These are the basics of how I got there. I had a bit of programming background—took 2 semesters of CS in college on my way to a history degree, plus a stats class that used R. Really though, a few months of study after college then jumping into a job in the right company is what can make it happen. These days, I interview a lot of other engineers, and this also includes some stuff that makes them more or less successful / more or less attractive to us as an employer.
This is the best advice in this thread. I would also focus primarily on a frontend framework like React after you learn the basics (dont bother with vue), since many mid-sized companies are needing people with these skillsets. All sites are going to have a frontend component regardless, might as well master this early
I had to conduct studies for Code For America on the junior dev market, I would also checkout Seattle, Anaheim, San Diego, Washington DC, Atlanta, Houston among other places
In the meantime while you focus mostly on frontend you can slowly learn backend / compscience on a slow ongoing basis
You'd definitely want to narrow down what you mean by "self-taught software engineer". Once you've done that, you'll have much more clarity in regards to whether it can be done in a year.
E.g., writing crud apps WebApps in Go? Definitely possible in a year. However, building a robust compute system in C++ from scratch -- probably not so much (for someone new to the field).
So just define what "self-taught software engineer" means to you, more accurately.
It depends, is your goal to land a job? If so that is totally possible. Look in your area (somewhere like indeed.com) and see what is in demand. In most areas Java or JavaScript are both good options as both are in demand and fairly easy to pick up. Based on what language you learn you will need to lean a accompanying framework and other skills needed such as build tools, sql, general design patterns, etc.
The biggest piece of advice I can give is too just fully dive into learning. Program every day and read every day. It is going to be uncomfortable because a lot of concepts dont come easy to learn and it can be very intimidating.
Another huge help would be to find a mentor, when I started programming I had someone to give the a path to follow, read these books, learn this , learn that etc.. Which gave me a huge boost among my piers. Also, you will not get some concepts right away, and thats expected. Someone who has run into those problems can shine a light and explain it to you.
Programming and computer science are diffrent. Learn to program first then a little later pick up a computer science book. And that can be a pretty controversial thing to say especially here. The truth is that most junior level positions just want someone who is reasonably competent and will continue to learn.
If you wanted to be a master musician you would need to at the very least: try every different kind of instrument (reed, percussion, string, horn/tube, wine glass w/ water). Then you would need to focus on one until you got proficient at it. Then you would move to the next one, until you have 30% proficiency at each one. Then you need to read more theory to understand chords and intervals, phrasing, and tempo. Then, you revisit all the instruments again with your new theory.
In CS, it's similar. All the different instruments are the different kinds of languages. There is LISP-like Clojure (and others), there is Javascript (functional with declarative), there is imperative programming, assembly programming, and interface/event programming. Hard to split it into the analogous flavors to music, but maybe you can follow. Lisps work fundamentally differently than something like Python or C++. So learn one language in each of the different classes of languages, first to expand your mind to what is possible with the instruments.
Then, you must learn the theory. You must learn everything regarding graph traversal, manipulation, and big-O notation.
You also need a really strong understanding of what solutions are common for real-world problems. Get a coding book like Cracking the Coding Interview Gayle McDowell. You also need small, incrementally ambitious projects that you can put online to showcase your abilities. Then probably a gig as a software intern to get "corporate experience" and then once you are pretty savvy with the general coding interview questions, apply to your dream job and tell them how excited you are to tackle all these problems. Did I miss anything?
What do you mean by "self-taught" -- and why is that important?
Even if you can't go to a university, they remain great ways to learn software engineering. For example, https://ocw.mit.edu/index.htm has useful classes.
Finally, I agree strongly with rayvy. Choose what you mean by "software engineer" and what your goal is.
I would focus on certain fundamentals first. I would also suggest picking a single programming language to learn and learn it well.
Python is one that many people choose as it has many courses and books on learning.
Pick a text editor or IDE and practice with it, the tools you choose can help you a lot.
MIT has a great course 6.00 Introduction to Computer Science.
Udemy has a great Python 3 course Complete Python Bootcamp: Go from zero to hero in Python 3
I would learn a little about Clean Code, I started porting a PHP version to Python https://github.com/tvmaly/clean-code-python it is a work in progress. The book by the Robert Martin is a great way to go if you like books.
I would learn how to test your code, Kent Beck's Test Driven Development book is good and also covers some patterns.
Learn about Object Oriented design, Data Structures, and Algorithms
Learn about version control, git is a good choice
Learn about the command line, it is always a good skill to have
By self-taught, do you mean you don’t want to take classes, even if they’re online or get any kind of mentorship, or just that you’re not going to go back to college and getting a CS degree? Also, do you have any understanding of programming/CS basics?
What's your current knowledge your starting with, complete ground zero, some understanding of how computers work, some programming experience? What area of interest do you want to focus in software engineering? Web Dev, Embedded, etc?
Easiest way into a tech company in a technical role is through front end. (Let's kill a myth here: not because FE is easier—it's not, necessarily. But the risk is generally lower, since it's hard to really screw things up in javascript and your mistakes will usually be more traceable for others to clean up after you than they would be in, e.g., devops.) Give yourself 3 months to learn everything you can to pass an interview in javascript, html, and css. Then go to a non-silicon valley town with lots of tech (Austin, Boston, Chicago, LA come to mind) and go out for every front end job you can find in a mid size company.
If the company's too big, you'll get locked in the front end role without opportunities to explore other things. If it's too small, you risk (a) that it's the founder's lifestyle business without any real innovation, or (b) that it will grow so fast that you'll have responsibility piled on you and no time to learn. (I recently interviewed a guy like this. Super smart, but he joined a high-growth startup as a cheap early employee, and his expertise stayed unfortunately narrow because he had no time to grow, only to prop up his part of the system.) You're looking for a place with 30-70 engineers, whose senior technical people are over age 45.