
Ask HN: How can I become a self-taught software engineer? - examcoffee
I don&#x27;t know where to exactly start. I was thinking of first learning Python by studying from the book &quot;Automate the Boring Stuff.&quot; Then for the actual CS stuff, maybe taking the online course CS50 offered by Harvard, then moving on from there.<p>But after learning Python then what? I&#x27;m not exactly sure where my interest lies or what I actually feel like building. Thus, I&#x27;m not sure if I want to go the web route, which seems common to many, or going some different area?<p>I looked at the Google Software Engineer minimum qualifications, just to get an idea of areas to pursue. It reads: &quot;Experience working with two or more from the following: web application development, Unix&#x2F;Linux environments, mobile application development, distributed and parallel systems, machine learning, information retrieval, natural language processing, networking, developing large software systems, and&#x2F;or security software development.&quot;<p>I&#x27;m not so fond of mobile development, and web I&#x27;m unsure of. From those areas which are most accessible to a non-CS&#x2F;Math&#x2F;Engineering degree holder (bachelors in biology)? I believe Machine learning and NLP are more suited to Masters&#x2F;PhDs? So maybe they are out of the question.<p>Any advice on how to tackle my journey in becoming a Software Engineer? Maybe an outline on how to approach my learning in steps?
======
aalleavitch
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.

~~~
retube
> 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

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

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

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

------
zellyn
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?

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

~~~
user5994461
Software engineers cannot be self taught, at least not in any of the countries
where engineer means something.

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

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

~~~
aoeusnth1
Uh, that's not true at all - most Googlers don't have a masters. Do you have a
source?

~~~
user5994461
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...](https://www.cnbc.com/2017/07/28/this-tech-company-has-the-most-highly-
educated-employees.html)

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.

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

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

------
nickjj
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...](https://nickjanetakis.com/blog/how-to-quickly-
learn-a-new-programming-language-or-framework)

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

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

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

------
zengid
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](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!

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

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

~~~
vonseel
^^ 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.

------
monaghanboy
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/;](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](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.

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

------
oblib
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](https://www.raspberrypi.org)

~~~
jamestimmins
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?

~~~
oblib
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&...](https://play.google.com/store/books/details?id=9aTkDAAAQBAJ&rdid=book-9aTkDAAAQBAJ&rdot=1&source=gbs_vpt_read&pcampaignid=books_booksearch_viewport)

Mastering the Raspberry Pi:

[https://books.google.com/books?id=1FUnCgAAQBAJ&printsec=fron...](https://books.google.com/books?id=1FUnCgAAQBAJ&printsec=frontcover&dq=mastering+the+raspberry+pi&hl=en&sa=X&ved=0ahUKEwj97vG1nJLYAhWL7IMKHcu2BfYQ6AEIKTAA#v=onepage&q=mastering%20the%20raspberry%20pi&f=false)

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

[https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=7226...](https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=72260&sid=bf2b38990b100853ea06f207a59eb609)

~~~
jamestimmins
This is awesome. I'm excited to dive into these. Thanks very much!

------
Teichopsia
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...](https://github.com/MichielDerhaeg/build-
linux/blob/master/README.md)

[http://exercism.io/](http://exercism.io/)

[https://mitpress.mit.edu/sicp/full-
text/book/book.html](https://mitpress.mit.edu/sicp/full-text/book/book.html)

[https://github.com/ossu/computer-
science/blob/master/README....](https://github.com/ossu/computer-
science/blob/master/README.md)

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

~~~
Teichopsia
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](https://stackoverflow.com/help/how-to-ask)
[http://www.catb.org/esr/faqs/smart-
questions.html](http://www.catb.org/esr/faqs/smart-questions.html)

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

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

------
sn9
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/](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.

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

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

~~~
monaghanboy
Thanks for the reply.

------
nunez
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!

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

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

------
j45
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](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.

------
aronowb14
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...](https://blog.sicara.com/getting-started-genetic-algorithms-
python-tutorial-81ffa1dd72f9)

Boids:
[https://processing.org/examples/flocking.html](https://processing.org/examples/flocking.html)

Neural nets and deep learning:
[http://neuralnetworksanddeeplearning.com/chap1.html](http://neuralnetworksanddeeplearning.com/chap1.html)

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

~~~
natalyarostova
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 :)

~~~
amorphid
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!

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

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

------
mattbgates
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...](https://medium.com/@OneTruConscious/solving-a-problem-isnt-always-
solving-the-problem-9299e68343aa)

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

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

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

------
Chris_Newton
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!

------
jey
> 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/](http://datasciencemasters.org/)

------
mzzter
I really like [https://teachyourselfcs.com](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.

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

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

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

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

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

------
jamestimmins
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](https://github.com/ossu/computer-
science)

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

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

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

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

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

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

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

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

------
mixmastamyk
Twenty years ago this was doable, but today most coveted jobs require a four
year degree. You’ll hit a ceiling going this route.

~~~
vijayr
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

------
ilaksh
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://...](https://www.google.com/url?sa=t&source=web&rct=j&url=http://www.colorcomputerarchive.com/coco/Documents/Manuals/Hardware/Getting%2520Started%2520With%2520Extended%2520Color%2520Basic%2520\(Tandy\).pdf&ved=2ahUKEwi3_7n59pHYAhUY9WMKHUgeAvMQFjAAegQIBxAB&usg=AOvVaw1eeoIcqr-
UD4HUMfGUwKSw) 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.

------
ken47
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/](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.

------
martin_andrino
First essential step: learn how to Google. This has been posted here countless
times:
[https://www.google.com/search?q=site%3Anews.ycombinator.com+...](https://www.google.com/search?q=site%3Anews.ycombinator.com+"can+I+become+a")

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

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

