Ask HN: How can I become a self-taught software engineer?

119 points by examcoffee ↗ HN
I don't know where to exactly start. I was thinking of first learning Python by studying from the book "Automate the Boring Stuff." Then for the actual CS stuff, maybe taking the online course CS50 offered by Harvard, then moving on from there.

But after learning Python then what? I'm not exactly sure where my interest lies or what I actually feel like building. Thus, I'm not sure if I want to go the web route, which seems common to many, or going some different area?

I looked at the Google Software Engineer minimum qualifications, just to get an idea of areas to pursue. It reads: "Experience working with two or more from the following: web application development, Unix/Linux environments, mobile application development, distributed and parallel systems, machine learning, information retrieval, natural language processing, networking, developing large software systems, and/or security software development."

I'm not so fond of mobile development, and web I'm unsure of. From those areas which are most accessible to a non-CS/Math/Engineering degree holder (bachelors in biology)? I believe Machine learning and NLP are more suited to Masters/PhDs? So maybe they are out of the question.

Any advice on how to tackle my journey in becoming a Software Engineer? Maybe an outline on how to approach my learning in steps?

99 comments

[ 7.1 ms ] story [ 210 ms ] thread
If you don't know what you want to build then I would stop everything you're doing and figure that out because without a clear goal in mind, then you're just going to fizzle out very quickly.

I've been a self taught programmer for the last 20 years (and by self taught I mean no formal education and just learned everything from experience, books and documentation).

One thing that stands out to me is nearly everything I've ever learned came from not thinking "I should learn Python" but instead "I want to write this app because I need it".

You might want to read this post: https://nickjanetakis.com/blog/how-to-quickly-learn-a-new-pr...

You need some level of technical understanding to be able to determine what is possible. The complexity from a Sunday afternoon project to full time job jumps very quickly. Build a spell checker? Dictionary lookup. Build a context aware spell checker? Learn NLP.
You should always start with something basic and only start using advanced techniques like NLP when the need is apparent. They require a more thorough understanding of the problem to be put to good use anyway.
Software development is a vast field, without countless options to explore later, far too many to give a good long-term plan at this early stage. As you say, what you need is a place to start.

There are many languages, each with their own pros and cons, but Python is a safe bet for your first one. It’s useful in its own right, and it’s also reasonably mainstream in its ideas and techniques, so you can learn a lot of transferrable programming skills. There are plenty of decent tutorials around both online or in book form.

If you’re planning to follow the self-teaching route, I suggest that the single most important thing in the early days is to just keep writing code. The theoretical foundations are useful, and important for a lot of professional work, but IMHO there is no faster or more reliable way to kill a new developer’s interest in the field than to bog them down with “doing things properly”. You have to make stuff, to experience to joy of programming and dispel the illusions about it being some sort of black magic. Everything else can wait, and this way when you do get to more advanced theory and more sophisticated tools and more carefully structured processes, you’ll have enough experience to understand why those things are helpful (or, in some cases, why they aren’t and you don’t need to get bogged down with them).

You have to start with the “Hello, world” stuff. This is trivial, but it takes the important step of writing and running real code on a real system, and therefore knowing that you have the tools you need available. Any tutorial is going to begin at that kind of level in the first hour. But then over the next few weeks and months, my recommendation is to try a few more substantial projects in different areas to see what you enjoy, and for a while, just learn by doing.

If you enjoy things like computer graphics and pretty pictures, and you’re comfortable with math, you could try something like rendering the famous Mandelbrot set, or generating a 3D landscape with mountains and lakes. As a novice, you can probably still write a program to do either of those things within a weekend with the help of online tutorials. This sort of exercise will give you a chance to exercise your basic programming skills, but it will also introduce you to essential ideas like how to use libraries of code that other people have written to do things like drawing on screen or reading data from a file or fetching data from an online source or countless other useful things.

If you’re interested in gaming, you could try something more interactive. Try implementing simple games like snake, 2048 or Tetris. Again, these are projects you can complete within a few days, following a path many have walked before so there are plenty of hints available with a bit of searching if you need an idea of how to get going. These will further exercise your basic skills and use of libraries to avoid reinventing the wheel, and in addition you’ll have to think about how to structure a non-trivial program that has some interactive input and output to deal with.

If you want to try some web development, you can write a simple database application. An address book is probably the classic exercise. You’ll need to learn about a few other tools in addition to the pure programming aspect in this case: you’ll need a server (even if it’s just your own development PC) running both web and database server software, you’ll need to figure out how your Python code fits in with those other programs, and of course you’ll need to know enough basic HTML and CSS to build a simple front-end. That’s quite a bit of non-programming knowledge, but on the other hand, again it’s something you can find your way around within a few days and the experience will be valuable if you ever wind up writing almost any sort of server software, whether it’s sitting behind a web site or not.

If you prefer native software rather than the web but want to try something more substantial, another classic exercise is to write you...

My first question would be - why do you want to become a software engineer?

Back when I went to Polytechnic (around 1981) things were a lot easier. If you were into business type computing you did some kind of computer studies degree, which covered things like COBOL and business systems (banks, insurance companies etc). If you weren't into that scene you ended up like me in Electronic Engineering. I was fascinated by electronics to the point where I knew I had to study it. Then if you were into microcomputers you bought yourself a Z80 and a few TTL chips and built one. Now there are a multitude of things to go into to the point where your options are almost endless - which probably leads to "analysis paralysis" in many cases...

Which brings me back to - why do you want to become a software engineer?

I would start by taking a long hard look at your interests and aptitudes. Software engineering can be merciless if you don't have the aptitude for it and interest in it.

You could dip a toe in by learning Python. Actually the book you mentioned is very good as it shows you how to do practical things in Python - I have found it a useful source of reference. You wouldn't have to work through all of it. You could maybe use it to whip up a simple web scraper or process some data from Excel and just see how it feels. In some ways when you are starting out it doesn't matter too much what you do as long as you do something.

One final thing - you didn't say where you were starting from. Did you imply you had a degree in Biology? It's not fashionable to say it these days but by far the majority of software engineers I meet today have what you my call "traditional" backgrounds in that they came in through getting a degree in some kind of software/comp sci subject, and possibly a masters. Sure there are a few hot shot self-taught programmers around but in my experience they are the minority.

p.s. I shifted out of electronics and into software development by teaching myself TurboBASIC and then C and assembly language, and then went to work as a software trainer and later engineer, so it can be done.

See if you can get anywhere with Python first. Making a 5 year plan before you even get started isn't going to help you do anything except stall.
^^ what he said. You need to get your feet wet and see if you even like programming before deciding on it as a career. And know that programming as a hobby is something entirely different from career software engineering, meetings, JIRA, and all that (sometimes) nonsense.
Get a Raspberry Pi computer and start working with the educational tools, projects, and languages they support and those built and documented by their community.

You don't need to learn a specific language as much as you need to learn basic concepts to begin with and the Raspberry Pi project offers great resources for that along with language specific resources to play and learn with.

And don't let the "it's for kids" angle put you off. Yes, the project does focus on teaching kids to program and integrate hardware but most of those computers are sold to adults who use them to "hack" and learn and develop on, and yes, we adults use and learn with the same resources "kids" do.

https://www.raspberrypi.org

How good is Raspberry Pi for understanding systems at a deeper level? I'm a mid-level dev and I've taken computer hardware/systems classes (including the Nand To Tetris course), and have considered diving into Raspberry/Arduino to practice deeper systems level concepts. Can you speak to that at all?
I've not got into system level concepts myself but there's a lot of others who have worked on that. You'll find a lot more info at the Raspberry Pi forums but here is a bit to get you going.

This book is co-written by Eben Upton, founder of the Raspberry Pi Foundation:

Learning Computer Architecture with Raspberry Pi: https://play.google.com/store/books/details?id=9aTkDAAAQBAJ&...

Mastering the Raspberry Pi:

https://books.google.com/books?id=1FUnCgAAQBAJ&printsec=fron...

This is a post in their user forums with links to additional resources:

https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=7226...

This is awesome. I'm excited to dive into these. Thanks very much!
First essential step: learn how to Google. This has been posted here countless times: https://www.google.com/search?q=site%3Anews.ycombinator.com+...
This post is needlessly demeaning. There's nothing wrong with posting this. Especially if you are looking for both directions and encouragement.

Your link will give the direction but not the encouragement.

I do think it's wrong to post the same question dozens of times and expect a different result. I also believe that googling is an essential skill to be a decent SWE.
If you won't have credentials, you'll need to build standard real world stuff, with conventional languages. You aren't likely to do interesting stuff for the next couple decades. Is that what you want? Head to (an interesting) University, if not.
(comment deleted)
Read books and articles. Read and write a lot of code by trying to solve a problem. When you have a problem, study to solve it in the best way possible (that even means rewriting from scratch if you think so). Try to deploy a complete product online in some way, even the simplest one. This should help finding the spot that fits better for you. For example, working on frontend or backend, focusing on security or UX... there are a lot of specific topics you might want to dive into based on your tastes. After some time, you’ll be able to drive your knowledge by your own. Asking now will not help that much.

Good luck ;-)

Mostly-joking-but-I-would-absolutely-make-good-on-it Offer: I will ask you one obnoxious* question at a time, with no deadlines, until you are a self-taught software engineer.

The first question is: What is the sum of the numbers from 1 to 1024. Please use Python, not the Gauss/two-triangles-make-a-rectangle mathematical method.

* - “obnoxious” means it's a leading question: it's simple to state, but you might have to learn a bunch of crap to even really fully understand the question.

Sample far-future questions: - Does it seem magical that you can turn an NFA into a DFA? - How does a shell pass stdout from one process to the stdin of the next? - Why is the Frame Pointer technically unnecessary, but useful? - Why do people complain about Go's nil pointers? What's wrong with them?

Alternatively, watch all of Casey Muratori's “Handmade Hero” stuff, and code along, and you'll probably be a better programmer than most of us here.
Please make this an app
How? I think the value would be in the real-life back-and-forth involved with really trying to understand and answer the questions, and in tailoring the questions to where you know the person answering needs to go next.
There might be some branching, but mostly it'd be a straight line from "you are here" to "now you know enough". The back-and-forth shouldn't be with the person asking the questions, because then that's called teaching, not self-taught.

What they're asking for is a syllabus.

I've had the idea-man work done for a wildly expansive version of this for a few years now. I should spend some time on that.
Why doesn't the OP just make this an app?
(comment deleted)
That is a kind offer and probably a good way to go, but I have a small objection: I think at the end of it, OP would be a zellyn-taught software engineer, not a self-taught software engineer.
In that line of thinking this askhn basically makes it impossible for op. Like going and buying a self-help book is getting help (thanks George C.)
Software engineers cannot be self taught, at least not in any of the countries where engineer means something.
Lower "e" engineer. In Canada, like many places, the title is protected. But in reality, it's not often necessary for software. A significant number of the roboticists where I work do not have an engineering degree.
If the title is protected, it's not possible to be an engineer without having the degree.

Anyway, the author was posting google requirements. More than 80% of google developers have a master or more.

Uh, that's not true at all - most Googlers don't have a masters. Do you have a source?
I can't find the source again.

Instead, here some numbers showing that 76% of ALL Google employees have a degree. https://www.cnbc.com/2017/07/28/this-tech-company-has-the-mo...

The saying that one doesn't need a degree to get a tech job is nonsense. Do the test: Ask one guy working in one of the major tech company how many of his direct neighbors have a degree, most likely it's all of them.

> 76% of ALL Google employees have a degree.

> The saying that one doesn't need a degree to get a tech job is nonsense.

These statements directly contradict. 24% of ALL Google employees don't have a degree.

> Ask one guy working in one of the major tech company how many of his direct neighbors have a degree

I know that I was hired into my current role without having a CS degree at the time [1}, based solely on my open-source portfolio.

[1] I now have a BSc in CS because I work part-time and attended university in parallel.

The statements don't contradict. Read the source, the other 24% are marked as "unknown" status, not as not having a degree.

Furthermore, that's the statistics for the whole company. It's higher for tech jobs. It's higher for younger folks. It's higher in countries where degrees are affordable.

My point is that it's possible to effectively be one without. It's not like people without the degree can't do all the things an engineer does. It just becomes troublesome when there's safety certifications and such required.

There's definitely value, meaning, and importance in the engineering degree and certifications.

> Gauss/two-triangles-make-a-rectangle mathematical method.

I... I never thought of that geometrically. but your way...

    __  __     __
   |  || /    |  |
   |  ||/     |  |
   | /        | /  /|
   |/         |/  /_|
   
that makes so much sense!
(comment deleted)
I searched for it and it would be more something like this:

  .
  ..
  ...
  ....
That's 1 + 2 + 3 + 4. To sum, double the triangle, you'll get a rectangle:

  .oooo
  ..ooo
  ...oo
  ....o
1 + 2 + 3 + 4 = area ÷ 2 = (4 * 5) ÷ 2 = 10.

So, the sum of 1..1024 is: 1024 * 1025 ÷ 2 = 524800.

Ah, that's a much more direct interpretation. I'd always considered the /2 to mean find the middle element. take the biggest and the smallest, add them, and multiply by the middle. Which is a little closer to my drawing. My interpretation is bad, because i'd always have to mentally special case odd length sequences.

Your way, the doubling is obvious, so you see why you can always /2 at the end.

Hmm. Haven't thought about this stuff in years. This was a pretty pleasing thing to revisit.

See, my obnoxious questions are awesome :-p

Actually, I came here to post the correction rodorgas beat me to posting. But your diagram works too: 1/2 base * height… nice.

This seems like a good idea but could be a lot of work. It would be easier to distribute to more people if you had a mailing list/website and open-sourced at least the guiding questions. You could then track user submissions to see how many people complete your questions.
I would add the most important thing is to start getting paid to learn programming. This doesn’t necessarily mean getting a full time job as a software engineer (yet) but smaller more manageable things. For example, take a boring task you already do in work or daily life and try and figure out how you could make it more automatic.

This will be slow, painful and frustrating at first, but if you spend the time banging your head against the wall now, and are truest motivated, it will take you where you want to go.

Do fun projects! After my freshman year of college I switched from biology to self-taught programming, and I tried to find projects that were the intersection of those two interests. Genetic algorithms, neural nets, and Boids took me a couple weeks to implement each, but the internet is full of good tutorials and the end results are quite nice to look at. Anyway, yeah after self-teaching for two years, I realized there's a level of competence that I probably wouldn't reach if not for school, so I transferred to UC Berkeley to get a degree.

Best of luck! It will be hard, but if you program every day for a couple months you will absolutely be on your way to becoming an engineer!

Genetic algs: https://blog.sicara.com/getting-started-genetic-algorithms-p...

Boids: https://processing.org/examples/flocking.html

Neural nets and deep learning: http://neuralnetworksanddeeplearning.com/chap1.html

First, why do you want to be a Software Engineer? Higher pay? Do you like coding? Interested in puzzles?

Second, I would just start small. Automate the boring stuff will get you in the right mindset for being able to factor out repetitive tasks by thinking about them as algorithms. In my opinion, algorithms are the original essence of what makes computer science a science: it's what Church and Turing (two google-worthy figures in our fields history) first formalized on their pursuit to define what it means for something to be computable.

Once you can break a problem down into an algorithm, you can write a computer program to solve that problem. That is the power of writing code: if you can understand it algorithmically, you can delegate the task to a machine. This takes time and lots of practice!!! I would focus on trying to do this over and over until it's natural. Once you feel comfortable in Python, try learning another language and see how much easier/harder writing programs in that new language becomes.

Third, you shouldn't feel like Machine Learing is out of the question. http://course.fast.ai is a MOOC specifically designed to prove that ML is indeed something anyone can play around with. (I'm just beginning the course, and I'd recommend it after a year of coding under your belt and have a good comfort with using a unix-like terminal).

Good luck, and keep practicing!

I forgot to mention, let your learning process be organic. Let yourself break off into tangents as you learn new things. Pretty soon you'll have 25 tabs open as you're clicking through Wikipedia, github, and youtube. This is good because you'll be able to get a breadth of knowledge as you deepen it in a specific area. Just be sure to know when you need to go back and resume the original thing you started with (which usually can be determined by you're level of excitement and interest as you toggle through the many tabs you have open with ctrl-tab or ctrl-alt-tab).

You'll learn faster if you follow things that are interesting to you. Don't learn something just because you think you have to (in less you absolutely cannot progress without getting past that obstacle in your understanding). This way you'll end up with a body of knowledge that relates to your interests and experiences. Use that to branch out more tendrils of knowledge. Its a very fractal-like growth process.

An area you may want to check out since you've got a bachelor's in biology is bioinformatics. For a guide of what to learn, I like teachyourselfcs.com after one learns some basic programming.
I am. Been in the industry since 1998. However, if Google is your standard you're trying to attain, I suspect you won't have much chance without a degree. And that is ok. Most programmers DON'T work at Google, FB, Uber, etc.
My advice: Do. As in make shit. Pick something you think should exist then figure out how to make it. Pick a reasonable goal; ie don't attempt to build a self driving car, at least not straight way :).

I follow what i call Just in Time Learning, I learn what I need to get the job done. I started with graphic design transitioned to web and application development, and currently an cloud infrastructure engineer. Leverage expertise you develop in one field to move to an adjoining field. Currently playing with cryptocurrencies and ML.

Leaning for the sake of learning is boring and imo; at least for me, not very effective.

I was mostly self-taught when I entered the industry. Years later, I now work for one of the bigger companies in Silicon Valley.

I want to preface this by saying that you do not need to be a CS expert to get started in software engineering. Do not buy into the hype. Sure, you'll need to know a few basics, but there are plenty of successful engineers out there who majored in quantitative / logical fields, who definitely do not know the equivalent of a CS degree's curriculum, and they're doing just fine. Indeed, there are a few successful engineers who didn't even go to college.

So the deep CS background is optional, but the following is not: are you the kind of person who enjoys and is good at solving puzzles? Will you persist after hours of bashing your head against the wall? You must have this character trait to succeed as a software engineer.

Assuming you have it, you should start with web development in Python / Django:

- The ecosystem is mature and beginner-friendly, meaning you can dip your toes in the water by using well-built, well-documented libraries that the community has put together over thousands of man-hours.

- The results of your programming will be concrete -- you can interact with the product, and find bugs, as a layperson.

- You can program something basic without any CS training. The libraries you will use to build your web apps will be leveraging plenty of CS concepts, but these concepts will be hidden away from you.

To learn Python syntax, there are a lot of different ways a beginner can go. I would recommend Code Combat for a complete newbie: https://codecombat.com/.

Once you have the basics of Python down, look for tutorials on the internet for building web apps in Django. Build simple web apps until you:

- Know how to think in Python.

- Understand the basics of relational databases and SQL.

- Understand the basics of HTTP / HTML / CSS.

Then, read a book on code craftsmanship, like "Clean Code," and reflect on how ugly the code is in your first few web apps. In the professional world, you'll be expected to adhere to standards of cleanliness and code organization, so refactor at least one of your web apps using the principles that you've learned from the book.

Only after you've determined that you can handle the above, you can start exploring the basics of CS. Harvard's CS50 is a lovely course, but there are more practical courses, for your purposes, on Coursera - namely Algorithms courses. I would recommend Princeton's Algorithms courses by Wayne and Sedgewick. Their courses are a bit less theoretical than the equivalent Coursera courses from Stanford, which is a good thing for someone in your position. I remember Sedgewick's instruction being very clear, yet rigorous. I believe the course requires you to learn basic Java, but given the programming experience you've built up to this point, you should be ready to dip your toes into compiled languages.

---

This entire process can take as little as a few months depending on how sharp and motivated you are, and it's only a first step. At this point, you can continue your CS education if you're really interested in the field. But if you're looking to land a job ASAP, you're better off building up your portfolio, and making sure you really understand the basics of data structures and algorithms.

Furthermore, you should network at coding meetups. Look for a potential manager who is willing to work with a relative newbie such as yourself. I was lucky enough to find one early in my career, and it helped me immensely.

When I started teaching myself I never thought it would take me so long. I made two mistakes: I didn't have direction (which you solved by asking a question) and I didn't build stuff.

From this point forward you ought to pick one thing and build stuff. When I say pick one thing, I mean one learning resource at a time. Whether it is "automate the boring stuff" (which is a great resource I haven't read) or one of the resources that I'm linking to (they are different resources that have been suggested on HN in the past), or a suggestion from another comment. Pick one and work on it. It's all about making a decision and sticking to it until you have enough information to make a better decision.

Find someone you can talk with about this stuff. It can get lonely if you don't know anyone who knows about this stuff. I'm available and would even work on some of the material or courses with you, especially the last two links.

As another user mentioned somewhere below, you will feel like bashing your head against the wall. He/she wasn't kidding. Once you get past that feeling, which will take a very, very long time, you will have overcome the hardest hurdle.

https://github.com/MichielDerhaeg/build-linux/blob/master/RE...

http://exercism.io/

https://mitpress.mit.edu/sicp/full-text/book/book.html

https://github.com/ossu/computer-science/blob/master/README....

Edit: for anyone else in OP's shoes, feel free to contact me as well.

How do you start a new/big project? Lets say I want to read a codebase on github which is written in js. How doI go through it, given that I don’t know much js yet?
For B4tman. I don't quite understand why you got down-voted, besides maybe because your question has two opposing thoughts, which may or may not be self evident to your self.

Let's break your sentence down.

"How do you start a new/big project? Lets say I want to read a codebase on github which is written in js. How doI go through it, given that I don’t know much js yet?"

The first part about how to start a new big project has nothing to do with reading a codebase. And the part not knowing much js yet means you shouldn't be starting a big project. You could, if you wanted to. Heck, I've done it but nothing good has come out of it besides learning that, baby steps are sane steps.

So, we have two questions. 1- How to start a big project? (whatever big may mean to you). 2- How to read a codebase.

Reading a codebase will help you understand project structure. It will also help you, that is, if you find a line of code you don't understand, break it down, research what it does and continue reading, improve your coding abilities. In short, how everything ties together. That practice will help you understand how to start a new project.

But the first step you ought to take is, if you are going to go down this road, is to learn how to ask questions: https://stackoverflow.com/help/how-to-ask http://www.catb.org/esr/faqs/smart-questions.html

As as self-taught engineer who's now working for one of the big 4(or is it 5 now?) let me suggest a couple things:

1. Side-projects are your route into the industry. You're looking for a company that's willing to take a risk on a non-traditional candidate and showing that you can deliver something is huge. Find a problem that you enjoy and solve it to a high level of quality. A lot of software engineering is being able to put in the effort to actually get something to a shippable quality.

2. If you're near a metro area, network. There's tons of meet-ups for various technologies, find one that interests you and attend. Your biggest barrier to getting through HR is the lack of a degree, having a direct connection to someone gives you a very good chance to bypass it.

i'm self-taught, ph.d. dropout in math. i work for a unicorn in silicon valley; i've done full-stack development and lately devops and cloud infrastructure. learn enough python/java to go through the entirety of http://nand2tetris.org/; this will help you understand basic computer architecture. from there, you can pick and choose from among the courses in https://teachyourselfcs.com, but i'd recommend taking at least computer networking and operating systems. ds&a is good and a prerequisite for interviewing at most companies.

it would help to do this in parallel with some form of employment, as working will teach you practical software engineering skills that you'll never get from reading books. but you'll be more time-constrained, so you'll have to have really good time-management skills.

also, being around good engineers is a form of education. good co-workers can help expose gaps in your knowledge and skills, which you should strive to amend.

Would also suggest this route if you're the type of person who prefers a "bottom-up" style of learning, as in, starting from the absolute primitives and incrementally increasing your toolbox of knowledge with a combination of learning more primitives, and learning how to compose those primitives.

Learning basic computer organization (through nand2tetris - highly recommend this project!), while cultivating your intuition for what's possible in the world of data processing/manipulation (by learning algorithms and data structures, and the formal language of how to reason about complexity in this domain) will give you a huge advantage over the school of people who refuse to ever delve into the "implementation details" and just abstract everything away.

Learning the fundamentals of operating systems, networking, and database theory, IMO, also pays off immensely. I can't tell you how many thousands of engineering hours I've seen wasted because of engineers I've worked with who haven't taken the time to learn these primitives making horrible decisions in either "using the wrong tool for the job" or not even having the knowledge to reason about the feasibility of a proposed solution... and this is at a "big 4" company.

It's a lot harder to buy into "hype", or be sold on bullshit in this industry when you're able to decompose a system into its most fundamental elements and have the tools to reason about them.

Thanks a lot for this comment. Very useful resources! I was looking for something like this and these pages didn't come up in my search results.
Start doing it.

Pick a project. Don't spend time agonizing over what sort of project it should be, you'll find out if you like it or not once you've started doing it, and if you picked the wrong project or language you'll better internalize the reasons why by actually ramming your head against those things yourself.

I'm going to disagree with the majority here and say don't pick a small and manageable project. Pick a project that inspires you. As long as you can maintain the motivation and actually put fingers to keyboard over and over again, that's all that really matters because even when you fail you'll learn. More importantly, you'll be forced to realize how large projects must be broken down into smaller projects and tackled piece by piece, and you'll gain a much deeper appreciation for the sheer amount of work the things you want to do really take. If you're anything like me, you're going to fail your first project, and your second, and many after that, but you will learn something invaluable every time.

Consume the opinions of programmers voraciously. Not just one programmer, read as many conflicting opinions and ways of tackling problems as possible. Read HN. Read stackoverflow. Read github comments. Programmers are deeply passionate about various aspects of programming, and understanding why is an important part of growing as a programmer.

Realize that everything you could possibly seek to understand is publicly available on the internet, if you know where to look and who to ask. Everything.

I have more opinions on this, but since it seems we all do I think I'll cut my advice short there :P.

> Pick a project that inspires you

That's all very well, but until you have experience of languages and associated tool chains, libraries etc plus knowledge of OS stacks, networking and so on its difficult to know what is possible and how you'd go about achieving your goal

The point is that you don’t. You’ll only know after you’ve done the legwork and rammed your head against the problem. Maybe your first project is impossible; mine definitely was, but that’s not the point. The point is to learn.
Yeah, that’s what worked for me. Just like that awesome toy that made you curious... what did you do ? Brake it, let’s see how it works !
I'm on my fourth or fifth personal project, first four or so failed. Now as I'm learning design patterns it gets a little easier each time. Just keep writing bad code every day, and each time learn why it was bad lol.
> its difficult to know what is possible

I'll save everyone some time. Everything software related is possible.

> how you'd go about achieving your goal

Find some code where someone did something similar, look at it, write your own implementation that does what you want.

The way I got into this field was by writing mods for games. Very narrow scope you can play with so it keeps things simple for beginners.

> read as many conflicting opinions

Not at this point for OP. These conflicts can also cause a lot of confusion

Temporary confusion is better than repeating the same mistakes over and over again because you followed a wrong trail.
> Pick a project that inspires you.

As an inspirational story, I built my first programming language at age 12. It was closer to Brainfuck than to C, but I built a compiler (in Visual Basic) that transpiled to 16-bit x86 assembler (I learned just enough from assembler tutorials on the internet) and ran that through NASM.

I remember that I worked an entire afternoon (possibly longer) on a program that was the equivalent of

  if (getchar() == 't') {
    puts("you typed 't'");
  }
because the language was so ridiculously limited, but getting it to work (and an actual .exe file to show for it) was immensely gratifying.

Thinking about it, that language was actually the only one that I ever finished. As I learned more about language design etc., my designs grew much more grandiose than my freetime permitted.

Twenty years ago this was doable, but today most coveted jobs require a four year degree. You’ll hit a ceiling going this route.
This might be true in law, medicine etc, not necessarily software. Sure, there are some big companies that will filter resumes based on degrees, but there are tons of companies that will hire based on skill set and expertise. Software development is still one of those jobs where one can go pretty far with skills alone (both technical and soft skills).

Also, "most coveted" in this case may be big companies

> I believe Machine learning and NLP are more suited to Masters/PhDs? So maybe they are out of the question.

Don't exclude yourself based on preconceptions. Here's a great resource: http://datasciencemasters.org/

For hiring managers here, is a portfolio a good enough substitute for having no formal credentials?