Hacker News new | comments | show | ask | jobs | submit login
Ask HN: How can I become a self-taught software engineer?
119 points by examcoffee 8 months ago | hide | past | web | favorite | 94 comments
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?




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.

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.


> 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.


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.


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 !


> 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.


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.


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.


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?


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.)


lol. Fair :-)


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.


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.


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.


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?


hacker.org


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.


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

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

    __  __     __
   |  || /    |  |
   |  ||/     |  |
   | /        | /  /|
   |/         |/  /_|
   
that makes so much sense!


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.


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.


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.


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.


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.


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!


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.


You can just recreate a CS degree and build yourself a foundation from which you can build anything.

Before anything else, check out Coursera's Learning How to Learn course.

You can jump right into CS50 which will provide you with a very strong foundation.

If you wished to continue developing your C skills from CS50, you could work your way through K&R, Hanson's C Interfaces and Implementations (in conjunction or following working through material on algorithms and data structures), and learn lower level details by working your way through Bryant and O'Halloron's Computer Systems: A Programmer's Perspective.

You can learn proofs from Hammack's Book of Proof, freely available online. From there, you can learn algorithms and data structures from Stanford and/or Princeton's courses on Coursera.

The above would be the equivalent of a strong CS minor.

From there, you could dive into pretty much anything. The recommendations from https://teachyourselfcs.com/ are spot on. Between Coursera, edx, Stanford's Lagunita, and Udacity, you can learn pretty much everything. Be sure to check out Udacity's courses on debugging and testing, as well as anything Peter Norvig teaches. Lagunita will be helpful for CS theory, Computer Networking, Compilers, Databases, and Data Mining.

If you were to complete all of the courses I explicitly mentioned, you would have the equivalent of a CS major as long as you study discrete math (Rosen and Epps are the standard texts) and Operating Systems, too.


How do you know the suggested paths are equivalent to a CS major?


By having majored in CS, and having compared various CS undergrad curricula.


Thanks for the reply.


Are you asking how to learn how to code or how to obtain a job as a developer?

If you’re asking for the former, then looking at resources like CodeAcademy, various “The Hard Way” manuals or even Reddit (/r/dailyprogrammer) will get you there.

If you’re asking for the latter, then the answer is less technical than you might think. The only way to do that , that I know of, is to get an “in” from someone or somewhere. It will be extremely hard to apply for these sorts of jobs without experience, but you’ll need to gain the experience to start applying. You’ll need to network around and find someone that’s willing to take a chance on you.

Alternatively, you can find an opportunity within your current job to write software (is there a process that’s slow and annoying? If so, then there’s your way in; usually, the answer is “yes”) and find a recruiter willing to work with that experience after a few months on that project.

Alternatively still, you could work for a software consulting firm as a very entry-level consultant. You won’t get paid a lot and you’ll probably have to travel, but you’ll gain a lot of corporate experience in a very short amount of time. Getting in through this route is also tough, as there is a lot of competiton.

Good luck!


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.


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


Do not read a book, or tutorials. Come up with an idea... something you want to build. Pick a framework and build it. (if going the web dev route).

I did this in 2012 (php/laravel) and now earn $50/hour as a freelancer. I could probably earn $70-80 or more but I'm a little desperate for clients right now.

I started out reading/watching tutorials but they bored the shit out of me... So I just decided I was gonna build something. That's the best way of learning, sure learn the basics ifs/thens and other control structures but you don't need to know everything about programming to get started as a developer the rest will come with time.


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 ;-)


Top three courses that solidified my ability to think like a programmer: 1. Logic 2. Data structures and algorithms 3. Discrete Math

From there, you are right on that python is a good language to learn first. Also w3schools.com is a helpful place to learn enough to get by in any web languages you would likely encounter. I have found that you will be expected to know some variant of C, so probably that.

That's really it, from a 30yr old $100k/yr female software engineer's standpoint.


Being self-taught means being a self-direct learner.

The advice I give to those starting out programming is to pick something as simple, universal and quick to learn. Javascript and use it to create experiences for the web and/or mobile.

Don't dive into the deep end of Javascript (ie., React). It's perfectly OK to start on the shallow end and work your way through, or use something well documented and supported by communities that excel at creating beginners.

I'm becoming a fan of Daniel Shiffman's work, he has some great videos on learning both programming as beginners and scaling it up very quickly. His examples using tolls like p5.js will help you get productive much faster.

https://www.youtube.com/user/shiffman/videos

What's critical is to learn to complete small projects that you find interesting or help others and build some momentum. I have developed large enterprise systems for over 20 years, and they are all made up of small projects.

There is a high from finishing a project, no matter how small that fuels you to continue.

From there you'll slowly go to do more back end work, and then you'll realize all programming languages do the same things in different syntax.


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


Let's assume you want mean you want to get paid as Software Engineer, either as a temp/contractor/consoltant or an employee. You will have achieved this when you get paid for software engineering work you have done or intend to do. So how does one make that happen? As a professional software engineer who is self taught, here's what I did...

tl;dr - spent two years learning to code, working as needed to pay the bills, and then got software job by applying to software jobs

1. Accepted I have no real clue how to proceed, and commit to trying something

2. Picked a language that seems to be an essential skill for many entry level jobs

3. Studied a little bit (coded through a book or two), applied to jobs, and get no response (maybe a couple phone interviews)

4. Locked myself in a room for 1 year, coding 40+ hours per week (let's say I spent 2000 hours coding on anything I found interesting)

5. Applied to jobs, saying I have 5 years of experience in my language of choice (technically true, as I'd goofed around for 4 years prior with a bit of code here and there), getting many interviews, and no offers

6. To pay the bills, I applied for & got a job doing tech support at a software company, and continued programming at work, nights , and weekends for another year (probably putting in another 2000 hours of learning to code)

7. Applied to jobs, saying I have 6 years of experience in my language of choice & using verbiage I picked up doing tech support, getting many interviews & 2 offers

8. Took best offer, and was now professional software engineer who was self taught


As someone who is a year into obsessive self study, but who often feels dejected at the challenge and what feels like slow progress, it's reassuring to read this and see how long it took you :)


You just gotta really want it :) If you've been coding this long, I suspect you have what it takes to make it if you want to!


Thanks! I work as a Data Scientist now, but my start was heavier on the econ/data side, with the goal to push more into the data-dev world. The only thing I hate more than spending all my time writing bad code, is the idea of not spending all my time writing bad code.


I am self-taught from the age of 12. I started with Visual Basic 3.0. Then it was HTML, CSS, and JavaScript. In college, I traded in a math requirement and took Python instead, and aced it. I did love Python but not enough to program in it. A few years after college, I learned PHP and MySQL.

So.. where and how did I start? Long story short.. I dreamed about it. The longer version is that I would open up VB and just write a few lines of code.

Msgbox "Hello World!";

I would later learn how to do mathematics in programming, receiving input, then output something, and then I learned If Then statements.. and how to do loops.

Basically what I'm getting at.. make sure you grasp all the basics.

As far as what you can do with what you have learned... honestly, don't google the idea. Unless you come up with the idea to solve your own problem... you'll likely only be creating things for other people.. and that's great. If you want to do that to start.. go do it.

I got back into programming when I got hired to fix auto body shop software in Visual Basic 6.0. Although I loved the job, I hated the boss, and I would eventually leave there... best decision ever... I went straight into HTML, Javascript, and CSS, and got a job working for the media.

As for side projects... PHP all the way.

Anyways, if you're looking to eventually do your own thing with your programming knowledge, read this article I wrote that may give you some direction.

It's basically about trying to solve your own problems... and then finding other people who have that same problem rather than going and googling ideas about what you should create.

https://medium.com/@OneTruConscious/solving-a-problem-isnt-a...

My future goals? I'd love to just keep creating SaaS and pay-as-you-go projects and run those as my own business.


I did cs50 and can highly recommend it. It is a very engaging, well organized introduction to basic computer science concepts as well as several languages, and will give you exposure to a variety of different applications from implementing data structures in C to building web apps. You'll get a sense for 1) if you like programming (since it is one of the more engaging courses that actually deals with CS concepts rather than just engineering) and 2) what sort of projects you want to work on

I found that, while the first problems sets, all in C, were more challenging and not super relevant (implementing a spell checker, resizing BMP files), the later problem sets are much easier and do more useful things (building simple web apps, interfacing with APIs)


I really like https://teachyourselfcs.com

Don’t give up, I’m self-taught too. Started my journey a year and a half ago (soon after finishing art school). I’m now finishing up my first engineering internship and looking for full time.


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.


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.


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 yourself a simple text file editor. It doesn’t need to be anything flashy, but again there will be interactive elements and you’ll have to think about how to organise a slightly larger amount of code. You’ll also have to deal with things like reading and writing files, which brings with it the possibility of things going wrong and needing to recover from errors, as well as working with larger amounts of data, where the simplest and most obvious structures for that data don’t scale and you need a slightly more sophisticated approach. Again, these are all import general ideas that you’ll encounter time and again, and while of course you won’t yet know a lot of the more advanced techniques that real world software like this would use, you can start to develop an appreciation for why sometimes the simple and obvious approach isn’t effective enough and how more advanced techniques can be useful.

If you want something a bit more substantial that combines a few different ideas, you could try writing yourself a simple spreadsheet that can manage a big table, let you write some simple formulae to generate data in the cells (which introduces another important general programming skill, the ability to parse structured text input), and draw some simple charts of the data, as well as reviewing things like saving and loading data either using files if you do it as a native application or using a database if you do it as a web application.

If you try a few different projects like these then somewhere along the way you will also start to run into recurring questions about how to organise the structure of your code, how to investigate when things aren’t working properly, how to keep track of changes in your code over time, how to combine your own code with the tools provided by your programming language and/or libraries written by other people, where to find more detailed information about your languages and tools and how to navigate that information, and so on. At that point, you should be in a better place to start exploring more powerful tools and techniques on your own. Hopefully you’ll also be starting to get a feel for which areas of programming you do or don’t enjoy, and can branch out into other areas like mobile app development or machine learning or natural language processing or making big data visualisations whatever else takes your fancy.

Around that time, you might also like to experiment with additional programming languages. I would recommend trying at least one more that is quite similar to Python, so you can see how much of what you’ve learned transfers around between similar languages, and at least one that is very different, because there are vast areas of the programming landscape that Python doesn’t really address but other languages and tools do. For example, it would be hard to go wrong with learning a bit of C at that point, both because it’s also widely useful if you’re working closer to the metal (embedded software, operating systems, networking, device drivers, etc.) and because C is the lingua franca of the programming world and if you ever need to build larger systems that involve multiple programming languages then knowing C will almost always be useful for understanding the bridge between them.

Hmm... That turned out to be a much longer comment than I expected, but I guess it sums up my general advice to new, self-teaching programmers fairly well. Good luck!


> 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/


Hi, I am too learning Python using the book "Automate the Boring Stuff", aiming to become a self-taught programmer.

If you want to exchange learning material, do some pair programming and discuss programming problems, you can send me a mail at coding[dot]dahu[at]gmail[dot]com.


One side advice - if you happen to be using a Windows computer, ditch it; get any Linux one, or a Mac if you can afford it. Get used to the shell; learn the basic tools like grep, learn some coreutils; get generally familiar with all things Unix/Linux.


I find this ironic, given that as a long-term Mac user, I bought my first ever Windows machine in the process of becoming a self-taught programmer. Turns out there's quite a lot of demand out there for those able and willing to develop on Microsoft platforms.


> Turns out there's quite a lot of demand out there for those able and willing to develop on Microsoft platforms.

Can't argue with that. So, you develop for/on MS platforms if you have to/like to develop for/on MS platforms (plus there's always demand for that, especially in the enterprise).

In the meanwhile, the rest of the world will keep developing for non-Windows -- not necessarily because they have to/adore it but just because in so many cases it makes the most sense so you don't even think about it...


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.


Open Source Society University has a good list of online courses you can take to approximate a computer science degree.

https://github.com/ossu/computer-science


This is a great book for any self-taught programmer: https://bigmachine.io/products/the-imposters-handbook


I know this is old but this is what got me started: http://www.catb.org/esr/faqs/hacker-howto.html


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.


practice is the best way to learning, choose one project you are interested in, dig into it. if you find something/knowledge you missing, try to google, and some book to read, and then continue to dig, from the framework to design details. after you feel you understand this project, try to do some changes, and check the result whether it is what you expected, or not. and then, you already learn a lot.


Read. Practice. Find problems, try to solve them. Build your network, and learn from their experience. Do this every day.


Also learn the concept of state machines. Like how a vending machine or other embedded systems function.


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


What is your current background and why do you think you want to learn SWE?


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


It's good to eventually have a comprehensive plan, but the other part which is especially important to be able to motivate your learning is to have fun. The trick to that is to make things easy but not too easy as to be uninteresting.

When you are just beginning to learn programming, really simple tutorials are going to be hard enough. When I was like 8 we had a Tandy Color Computer 2 that came with an amazing friendly manual explaining in detail each key to press and walking you through entering simple BASIC programs. Then it suggested making little tweaks here and there to change the way it worked.

If you wanted, you could actually download the Getting Started With Extended Color BASIC book from Internet Archive and actually follow it by emulating a coco2 on MAME. https://www.google.com/url?sa=t&source=web&rct=j&url=http://... It really is a great book.

Anything easy like that I think is a good choice to start. There are plenty of more modern alternatives. The point is though that you have to walk before you can run and you will need to build your skills up over a number of years.

Definitely a good idea to down the line refer to actual CS and software engineering curriculum and study books. But you really don't want to rely on individual prescriptions of what to learn or content sources. You need to learn actively in a self directed way. So google is an amazing resource.

But I would say 3-8 years, depending on what your standard is and the particular person, for normal non geniuses to have a solid set of knowledge and skills for software engineering if they work on it continuously. Which is not to say you couldn't be useful in a job before then though necessarily.

The most important skills may come through practice and learning the hard way though. For example developing actual important requirements that make business sense and are feasible and selling them to the clients is critical and really tricky.

To me most software engineering falls into two broad categories: design and feedback loops. By feedback loop I mean a continuous process where there is an input and output mediated by some error detection and error correction. Feedback loops in SE have multiple layers and types. It starts with the loop between yourself and the stakeholders in the process of analyzing and negotiating the requirements. This process continues through the initial development and maintenance of the software.

Other examples of feedback loops: between you and the compiler doing static checking of your programs syntax, unit testing, integration testing, etc. Another one: improving your object-oriented/functional/reactive/modular/whatever design as it evolves through new features and testing etc. That is the design process itself is a feedback loop where you come up with an idea for a design, try it out, see where it went wrong or could be improved, and adjust it.

Feedback loops and design overlap and interact of course. You want your design to facilitate the smooth operation of your loops. For example, if you need certain types of unit or integration tests, you will need to organize your code with that in mind to some degree.


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.


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.




Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact

Search: