

Ask HN: So I do want to be a programmer, where do I start? - whatistheanswer

I was dumb and didn't study CS in school, even though now I realize that I really like programming and everything that comes along with it. What's the best way to correct my mistake and get to a point where I can start coding for a living?<p>Is it books? MIT and Stanford online classes? Code School and Codecademy? Some combination of all of those?
======
tferris
I'd start with a website. Important is that you give yourself small tasks,
just learning from books and doing exercises is boring and you learn often too
much which isn't relevant. I wouldn't do mobile development either: the
learning curve is too steep and you face a fragmented landscape.

An example path:

1\. Build a plain web page without anything (and learn HTML, CSS)

2\. Build more: a web site with multiple pages and little dynamics (and learn
a backend language/system like Python or Node.js with Javascript)

3\. Build a blog with more dynamic content (and learn a web framework like
Django for Python or Express for Node.js and how to use them with a database
like MongoDB or MySQL)

I would start with plain HTML, CSS and later learn Javscript, then a little
Node.js and then Express and MongoDB as database => that's the quickest way
how to get things quickly done and to learn _why and how_ things work. And you
have basically to just learn three languages: HTML, CSS, JS and if you like
some simple dialects (like Stylus instead of CSS and Jade instead of HTML). Or
if you have some basic dev skills already just jump into Node and Express, you
will have very soon first results.

I wouldn't start with something too much 'magic' involved. Magic = abstraction
that you do not understand anymore. Ruby on Rails is an example: you learn
tons of conventions, see magic everywhere but won't have a clue for a very
long time why and how things work and thus, you just learn conventions and
won't learn really to code. Ruby on Rails can be very frustrating: you do
Rails for three months and are still not quick or productive and then you
think it's your fault or you can't code (but it's Rails with its magic,
conventions and increased complexity where actual coding is a very small
part). Don't get me wrong: setting up a site with Rails can be done in few
minutes but customizing it without knowing how Rails works (and even if you
know how Rails work) can be a real pain. With Rails you learn how to
effectively glue things together, Rails ecosystems provides thousands of great
and mature gems waiting to be glued together.

~~~
briandear
Your bias against ruby is astounding. You recommend node and Django but
recommend against rails? Rails isn't magic. The Michael Hartl book is a great
place to start after Chris Pine's 'Learn to Program.' Of course the Pine and
Hartl books might be a little too magical for an avowed Pythonista.

As far as MySQL, you've lost your damned mind. For relational databases, why
not build a heroku site and use PG? Who the hell still uses MySQL?

My suggested 'Learn to Program' path would start with Kids Ruby, then followed
by the Chris Pine 'Learn to Program' book followed by the Michael Hartl
tutorial followed by the Big Nerd Ranch Objective C book. The Nerd Ranch book
starts with an intro to C before getting into OOP concepts.

~~~
tferris
> bias against ruby is astounding.

There was no bias. Ruby on Rails is a mature production-level framework which
gets things done. I've just said that it may not be the right tool for getting
into programming. With Ruby on Rails too much is automated providing a DSL
with a high abstraction layer and finally as one big monolithic piece.

This setup might be good for an experienced programmer but I doubt it's
perfect for an beginner. That's all I said and it's not bias, rather your post
feels biased and very emotional-calm down.

> Rails isn't magic

You are the first who's saying this. I repeat myself but here again: magic is
when the user doesn't understand the abstraction level anymore, when it's too
far away from the implementation pattern, when the original desgin pattern
isn't clear anymore and Rails definitely is.

> You recommend node and Django but recommend against rails?

Did you ever try Node, Sinatra or Django? Maybe you should before giving such
strong opinions. All of them, espeically first two are more expressive and
force you to think yourself. With Rails you have to learn the convetions, use
them and still are clueluss what to do in exceptional situations because the
RoR setup won't strengthen your real coding skills (I am just talking about
newcomers!). With Node.js and Express, you have to think because there are
much less conventions, it;s more modular and thus, you'll be forced to code
more and decide which path to go, with Rails everything is given and often the
choices are opinionated (SCSS, Coffeescript). Or you wonder which directory to
use for which file in Rails all the time according to the convetions, that no
coding! For the classic CRUD app Rails might be good. With Python/Django you
have more abstraction but those are more related to the actual design pattern
and thus more expressive than Rails—but do not startt a flamewar here, Django
and Rails are very similar at the end of the day.

> s far as MySQL, you've lost your damned mind.

This is a really bad style and intolerant—this is not HN style. Instead of
coming with arguments you get abusive without knowing the big picture. RDBMS
are very mature systems, I wouldn't go with MySQL, rather with Postgres and
for lots of systems they are the way to go. NoSQLs are young and there's some
reasons they should be used by newcomers, especially Mongo:

\- No need for an ORM/ODM (for Mongo because of the good native JS interface,
you can still use one and it makes sense but you do not need reallly) \- No
migrations, no scheme

You still can do both with NoSQL/Mongo but to get started to get out of the
door, just to understand what a datastore does the complexity level is just
right. An SQL with all its migrations, schemes, ORMs, join tables is too much
for a beginner. We know this stuff for years but a beginner?? A beginner has
to get quickly some positive experiences _which he understands_ and then Node
with Mongo is perfect. Of course Rails + ActiveRecord is great to get started
quickly but it's abstract and the beginner would not dare to leave the given
path because he doesn't know how to directly access the DB. Later he can
always switch to a SQL and a ORM (also in Node and with NoSQL) if he likes.

BTW, this is not just for beginners, for many projects this setup makes sense,
it's just a new way. Rails is now 7 years old and lot of people like to stick
to old paradigms. And ORMs in particular ActiveRecord are debatable,
ActiveRecord is slow and clumsy and often not the right choice for scalable
high traffic use cases.

Finally, your recommended way is a muddled and confusing way with too much
theory. First he should start with some high level Ruby, then some theory,
finally some Objective C and then C?? Which logic does this follow?

Most important when learning something is to have steadily successes in order
to stay motivated. Small tasks are important to stay interactive to get self-
confidence, just learning theory for days doesn't work without having any good
use case at all and following some dull examples from Hartls tutorial won't
help either. I know that a proper way would include C, OOP and so on but the
way would be too long for startes.

------
chriszf
Repeat after me: programming is not computer science.

Got it? Good. Now, for actual advice.

Contrary to the prevailing sentiment, there actually is a career path in
engineering that starts at the bottom and takes you to the top, all classical-
like.

It goes something like this: Customer Support/QA -> QA Engineer -> Support
Engineer -> Junior Developer

QA is very easy to get into. If you play your cards right, you can get into QA
at a place that encourages automation and whitebox testing, which will expose
you to a lot of the fundamental skills.

From there, it's a short hop to QA Engineer, which is exactly the same as what
I just said, except they expect you to be more than a warm body clicking on
things till they break. You'll be required to write code here.

A support engineer is someone who's midway between dev, QA, and customer
support. Here, your customers are developers, so the discourse is a little bit
more elevated than a normal customer support role. Support engineers are often
asked to produce sample code for customers learning to use the product. Take
this opportunity to write it yourself rather than sending canned samples.

(Optional) Dev Evangelist: This is much like the previous role, except you
spend all your time at hackathons being cool and showing off how cool your API
is.

Do well at these, and it'll be a little more straightforward landing that
junior dev job. Congratulations, you're a programmer.

~~~
mb_72
Allow me to offer an opposing position.

If you want to program, start doing that and don't accept a job doing anything
else. Doctors don't accept nursing jobs and civil engineers don't dig holes. I
have never employed people who have been 'happy' to start in QA or whatever
other role. Why would you accept anything else other than what you really want
to do, and are capable of? If you can't land a job as a junior developer, then
perhaps you are not cut out to be a programmer?

Also, being a good QA person or customer support person is valuable in itself,
and isn't just a 'starting point' for a programming career. I have several
friends who have been dedicated QA people for their entire careers, and
definitely do not see their role as being 'less' than being a developer.

------
lumberjack
Start with these simple lessons that many don't get:

1\. Programming is essentially about you (!) problem solving.

2\. Programming requires initiative and independence.

3\. Programming requires self motivation and self learning.

1\. is really the only lesson needed here. 2. and 3. are important
implications. I'm not saying, programming classes don't help, but if you call
yourself a programmer and you need to learn a new API you must have the
initiative to try to figure it out for yourself. It's OK to ask questions.
It's OK to expect to be briefed or even taught some complicated concepts. It's
NOT OK to expect to go back to school to learn every single new thing you come
across.

\-----------------------------------------------------------------------------

Programming is a vast field. What do you want to learn programming for?
Nowadays you will find an introduction to programming for every major sub-
field of programming. You'll find programming introductions for game
development, front-end programming, back-end programming, statistical
computation, mobile apps and everything else in between. Personally I find
that this is the quickest and easiest way to introduce yourself. I don't like
the approach that some take i.e. first learning a really general programming
language and programming concepts and only afterwards learning what they
actually need.

So do some research and come up with a list of resources.

\-----------------------------------------------------------------------------

It takes time. How much time varies depending on you personally and the field
of programming you want to work in.

\-----------------------------------------------------------------------------

Landing a programming job may or may not be straightforward. In some cases
it's damn right impossible. It depends a lot on you, your location and what
standards companies expect out of their developers. I've met good developers
who were stranded and bad developers who got into a junior developer position
after a year of training at a technical school. Why am I say all this? Prepare
yourself and research so that you can find a way to make it. Most if not all
job applications you meet will have a requirement for an CS/AI/SE degree.
Ignore that but be prepared to show off your skills.

\-----------------------------------------------------------------------------

Finally, you probably want a to-learn list but again, you must first provide a
programming field. I'll be glad to help if you reply with a specific
programming field.

------
jmonegro
It's fine if you didn't study CS in school, so don't be bummed about it. If
you're really passionate you can get really far on your own, so don't fret
over the "dumb" decision, it'll do more harm than good.

Now, first things you have to learn are fundamental programming theories and
methodologies. You'll also need to learn these in tandem with a language.
There are a ton of programming languages out there - so many, in fact, that
picking the one might seem like a daunting task.

I'm a Rubyist - it's pretty, it's fun, it's awesome on the web, and I think
great for beginners. However, I think it might be best you learn programming
with something like C/C++. Python is great for beginners too. If it were me,
I'd learn with one of those languages. Which ever you pick, I'd recommend
either Learn Ruby the Hard Way (<http://ruby.learncodethehardway.org/>) or
Learn Python the Hard Way (<http://learnpythonthehardway.org/>), both by Zed
Shaw. They're also extremely cheap at $2.99 for the PDF, or free if you want
to read it online, and the Python version has a video course for $29.

After you're done with that, you can start making stuff. At this point, what
you learn next depends on what kind of software you want to make. Research and
figure out what you want. Remember you never stop learning programming, so I'd
advise you to gradually pick more advanced books, preferably covering more
theory than practice. Maybe branch off to different languages and paradigms.

If I had to give one key piece of advice, it's that you learn by doing. It
will be daunting, and it will take time, but I promise you - you'll get
better. Here's a good piece that will inspire you:
[http://37signals.com/svn/posts/3179-you-only-get-one-
chance-...](http://37signals.com/svn/posts/3179-you-only-get-one-chance-to-be-
a-beginner)

------
stephengillie
I'm in your shoes - I majored in Business, and I'm trying to break into
software development after getting bored of IT at 30. Luckily my business
degree had a couple VB classes, so I'm not starting with zero.

What I'm doing:

1\. Codecademy will teach you the basic concepts of programming. Codecademy
expands into HTML, Javascript, CSS, and other technologies that can be used to
make websites and mobile apps. (You can stick a website inside a wrapper and
call it an app.)

2\. If you like Windows, get the Visual Studio 11 beta while it's free and
start making a windows form in VB or C#. If you don't, either install Cygwin
or a distro and learn about the tools for Linux. (sorry I'm not more help
here)

3\. Find projects to do - find a small problem at work that you can solve. I
made a program that makes an email template , so filling out an internal form
is just a couple clicks. Also check out coding challenges.

4\. Look for software internships, open source projects, and other places
where you can build your burgeoning skills while gaining experience in working
with large projects.

I don't know if I'm going about this the right way either, and I've been
thinking about making this same Ask HN post too.

------
venturebros
What is it that you want to do exactly? It seems like a lot of people lump
"coding" and "programming" into being a Software Engineer or a Software
Developer. I am a Front End Web Dev and I can guarantee having a CS degree
would be beyond overkill.

~~~
pikseli
...until your javascript needs an anonymous closure using first class
functions as an argument, or some other lispy-schemey scheme

~~~
lumberjack
You don't need a CS degree to understand closures or functional programming
for that matter. Heck, you don't need a CS degree to understand all of CS
theory.

------
bwh2
My degree is in accounting. But now I'm a developer. I made a career switch 5
year ago and never looked back. Here's the key - build something A to Z.

------
jdale27
<http://mitpress.mit.edu/sicp/full-text/book/book.html>

------
lsiebert
You mention several online options for learning basic coding, but I'd point
out that depending on your style of learning, you may benefit from a classroom
setting, which is easily found at a local community college

------
raghav305
All that you need is right here..

<http://programming-motherfucker.com/>

------
brudgers
Option A: Purchase a domain name, get a hosting plan, build a website.

Option B: Fire up a command shell, write some scripts.

Option C: Download a tool set, start making a program.

Option D: Get a book, download a tool set, start working through exercises.

Option E: Start with an online course - requires Option D.

In any event, you cannot become a programmer until you start to program.

Pick an interesting problem, and plug away at it.

