
Learning to Code: The Roadmap I Wish I Had Been Given - jyli7
http://jimmy-li.net/blog/?p=62
======
michaelfairley
When someone says "I learned how to ride a bike over the weekend", the
response is never "I don't see you doing tricks in a half-pipe, so you really
only 'learned how to pedal down the street'. Don't call that learning how to
ride a bike."

If "knowing how to code" means that you've built webapps, databases, embedded
systems, mobile apps, operating systems, console games, and a compiler and
mastered 19 programming languages, then very, very few people in world are
coders.

Hacker News, stop being pedantic downers, and instead applaud someone for
picking up a new skill in life (and trying to help others learn as well).

~~~
jgw
I think that depending on one's perspective, one might consider this more
analogous to claiming to ride a bike, but as it transpires, you only learned
how to ride a bike with training wheels. You can write the analogy however you
like to make it suit the point you're trying to make.

I don't think it's unreasonable for folks to suggest that "Build web apps" is
maybe a more apt title than "code" for what's described here. It would not
harm this well-intentioned and well-executed article to do so.

------
zackzackzack
"Learning to Develop Websites" would be a more apt title. Beating a dead
horse, coding is more than just learning JavaScript and Rails.

~~~
davidbalbert
Agreed, but you have to start somewhere. I think one of the things that turns
lots of people off from CS education, and programming in general, is how long
it takes to get from just starting out to making something cool.

~~~
zackzackzack
Of course, of course. All I know how to do is web development (besides some
Mathematica for research and dicking-around). This isn't like I am standing on
top of an intellectual mountain, shouting down at the ignorant masses gathered
below, "Stop worshiping your false golden Rails idols".

If I could add a stage though, it would probably be something like "Cluster 5:
Why does my website suck?" Sure it's there, it's up on the WWW, but a website
made from someone at Cluster 4 isn't something that is going to make you
money.

Cluster 5 is when all the CS comes in. You have to learn about algorithms and
data structures and regular expressions and what is actually going on behind
the scenes. Yes, you can make a website that does the basic simple "of course,
here's an exhaustive search" solution to the given problem. But can you make
it fast? Or beautiful? Or, heaven forbid, intuitive? Can you fix it after you
try and fail to make it the above three? That's the stage that never ends, the
one that doesn't take a week of hunkering down with a textbook to get through.

Cluster 5 is the stage that CS education tries to start everybody at without
any prior experience. It works for the imaginative people who can make the
leaps about why this matters, but for most it just leaves everyone behind.
With web programming, you actually have motivation to learn these weird things
about patterns of electrons.

Because, honestly, who wants to make websites that suck?

~~~
jyli7
I agree with this entirely, and I fully understand that web development
represents a tiny slice of coding generally and that what I've presented is a
tiny fraction of what you need to learn to be a good web developer.

I plan to edit the post a little to reflect what people have said. Hope the
title wasn't too misleading.

------
malingo
Finally, a "learning to code" article that actually mentions version control
and its importance.

Of course it's an extra thing to learn when all a beginner wants to do is get
something cool (often a website or game) working quickly. But what happens
when that beginner wants to experiment? "Fail fast" is meaningless if those
fast failures irreparably break that simple, cool website or game that used to
work. Fail fast means the ability to reset (or even revert) or stash or branch
and _keep moving_.

------
dustingetz
[http://webcache.googleusercontent.com/search?q=cache:kdVysoZ...](http://webcache.googleusercontent.com/search?q=cache:kdVysoZ_6XAJ:jimmy-
li.net/blog/%3Fp%3D62+&cd=1&hl=en&ct=clnk&gl=us)

~~~
jyli7
Site's back up. <http://jimmy-li.net/blog/?p=62>

~~~
BadassFractal
Down for me still.

~~~
Katelyn
still down

~~~
wyclif
Dear Jimmy Li: please up your bandwidth quota.

~~~
jyli7
Will do. In the meantime, it's back up.

------
anujkk
I agree that the title should be "Learning to develop web applications".

"Web Application Development" is only a subset of "Application Development"
which is again only a subset of "Coding/Programming".

There are many kinds of application development - web application development,
desktop application development, mobile application development, embedded
application development, games development etc. So, web application is just
the most popular kind of application development.

Also not all coding is done to develop applications. There is difference
between a program and an application. Sometimes people code to write utility
programs, e.g. shell scripts which isn't application.

I believe undergraduate courses should be designed to provide solid
fundamental knowledge of computer science and how various fields of computer
science relate to each other while postgraduate programs should provide
specialized education.

~~~
jyli7
Yeah, you're definitely right. I chose to include "coding" over "web
development" in the title only for concision/aesthetic purposes. Thanks for
clearing this up for other people. Hope it wasn't too misleading.

~~~
kpennell
Great article man. From a newbie, thank you.

------
msmorgan
There are better places than w3schools to learn HTML and CSS. See
<http://w3fools.com/>.

~~~
mixmax
W3fools is nothing but a jab at w3schools, and most certainly not a place for
a beginner to start learning css and html.

~~~
bgilroy26
Where would you recommend?

~~~
oscilloscope
For most web technologies, this is a decent source:
<https://developer.mozilla.org/>

For JavaScript: <http://eloquentjavascript.net/>

For HTML/CSS specifically, use Chrome or Firefox's Inspect Element to take a
look at web pages. It's especially instructive to examine things like 1kb
grid, where the CSS itself is designed: <http://1kbgrid.com/>

~~~
bgilroy26
Thank you so much!

------
danso
I studied programming in college...and while I liked the assembly-code +
controller projects, I wish there was more focus on web development...because
the one thing that has gotten me excited about programming is the potential to
share (i.e. brag) about my work.

Making clever paint/tic-tac-toe/sudoku programs in Java/C++ are good
exercises...but I lost interest in programming when I couldn't see it being
used for more day-to-day practical tasks.

One specific topic I wish had been taught was regular expressions. In my first
year of comsci classes, regexes were in the optional chapters of the book.
Knowing about them would've led me to do more data-processing/information-
gathering type programming, which is the track I am on now.

Plus, they're just damn plain useful in every coding context, even for project
code-search-and-replace.

~~~
brimpa
It was my understanding that most CS programs include a course covering formal
languages and grammars. At my school it was called (creatively) Theoretical
Computer Science.

Learning to break apart a regex and rebuild it as a state machine is where the
real magic happens.

~~~
jholman
Any decent CS program should contain such a course, sure, but it is probably
not in the required curriculum, and it's probably not taken by very many
students.

As for names, at SFU (my alma mater) it's called "Formal Languages and
Automata". Well, actually, there are actually about half a dozen courses
covering parts of this material, but that's the most-perfect match for what
you described.

------
thekevan
Google cache copy:

[http://webcache.googleusercontent.com/search?q=cache:kdVysoZ...](http://webcache.googleusercontent.com/search?q=cache:kdVysoZ_6XAJ:jimmy-
li.net/blog/%3Fp%3D62+http://jimmy-
li.net/blog/%3Fp%3D62&cd=1&hl=en&ct=clnk&gl=us)

------
argumentum
I actually do think the web is a good place to start, especially with a
backend in python or ruby. You get to quickly see the results of what your
doing, which will spur you to learn more.

I definitely do not think that books, tutorials or classes are the way to
learn programming at first. The thrill of discovering the concept of recursion
on my own really hooked me onto coding. I remember googling "a function
calling itself" semi-hoping that no one else knew about this yet...

I did Neuroscience and BME undergrad, so I only had taken the 1 required class
of Java (which I couldn't stand at the time, it was just too messy). I'm glad
I didn't take more CS in college, it might have turned me off for good. Yes,
once you get to where your fluent, I think classes (or books if your self-
motivated) in algorithms, data structures and other hard CS are essential. But
to get to that point, think of a creative project and try to build it, you'll
really fall in love with the language you use, and you'll understand the real
reason why people program: because it makes you feel like god.

------
ralphos
Great post and a lot of useful information. Particularly relevant for me as
I'm a noob starting out on my first project, much like described in the post.

I've followed a very similar roadmap in learning bits of html/css (highly
recommend the Head First book), javascript, version control, ruby and doing
Hartl's, 'Rails Tutorial'.

I didn't get a job at Pivotal Labs in SF like the author (which I'm guessing
would be a pretty awesome learning environment) but I've managed to convince
the 'Pivotal Labs' of the Philippines to take me in & provide mentorship ;) If
anyone is interested I've just started keeping a log of each step along the
way at <http://www.ralphy.tumblr.com>. (Will update with more posts soon).

So far, it's been tough and I'm realizing how little I know in the whole
spectrum of Rails, let alone web development. Having said that I'm already
building stuff on the web I can actually see and show my friends, which is
kinda awesome.

------
why-el
I am following exactly what this guy says, but it took me a long time, over
three years, to finally settle on whats important for this kind of career. I
revisited C so that I can keep up with git code and learn from it; I bought a
Rails book,and I am trying, although very slowly, to do anything that comes to
my mind in Ruby. This is not about Rails, its about a healthy shortcut. I was
not lucky enough to read something like this sooner. This is excellent advice,
and I commend him for saying it.

------
moadeel
I have always wondered how much of CS coding knowledge applies to web apps and
how necessary it is to take some of the killer math courses offered in
university to be able to code web apps proficiently. And if there is that big
of a difference between coding and web apps, then shouldn't universities and
students be better off learning how to code web apps since they seem to be in
dominant usage anyway?

Btw, I am not a technical person, hence the curiosity. Insights would be much
appreciated.

~~~
moadeel
Thanks for the all the replies below, they clarify quite a bit. Here is
another question, how much of the "incredibly difficult" math actually comes
in handy and serves real coding purposes other than honing your ability to
think logically? Math can be incredibly conceptual at times and as someone who
has a psychology background, I know that a person can be not very good at math
due to inability to think conceptually, but can be very downright logical on
matters that he can understand practically. what do you guys think?

~~~
shou4577
While it depends on what you mean by "incredibly difficult", I would say that
if you are doing any work with 3d modelling, it would be necessary to
understand basic linear algebra. These concepts will transfer directly - if
you are representing your model with points in 3-dimensional space, then
displaying those points on a screen is a projection map, and can be described
(and quickly calculated) with a matrix. This is a typical example.

Another common example would be a course in number theory. A common topic in
number theory is public-key encryption, much more in-depth than is sometimes
covered in other courses. In addition, the techniques that you learn in such a
course can easily be applied to any "number-crunching" you would need to do.
Here is an example:

Problem 1 from Project Euler (<http://projecteuler.net/problem=1>): Find the
sum of all the multiples of 3 or 5 below 1000. A brute-force program for this
is simple, but it is much faster if we first notice some patterns: (3 + 6 + 9
+ ... + 999) = 3 * (1 + 2 + ... + 333). But then (1 + 2 + ... + 333) = 334
_333/2 (this would be easily recognized by someone who has taken a number
theory class), and so the sum of all of the multiples of 3 below 1000 is 3_
333 * 334 / 2. Similarly, for 5, there are 199 multiples, so the sum of all of
these is 5 * 199 * 200 / 2. But then we must subtract the multiples of 15,
since we double counted them: there are floor(1000/15) = 66, with sum 15 * 66
* 67 / 2. So the answer is (3 * 333 * 334 + 5 * 199 * 200 + 15 * 66 * 67)/2 =
299498.

That was a particularly trivial example - number theory will give you a lot
more than some parlor tricks like the above. But this example took a loop
through n numbers and reduced it to a single line of simple arithmetic. And
for someone who understands number theory, this algorithm is as quick to think
of as it is for a typical CS student to think of the brute-force algorithm.

I would also venture that a course or two in "Abstract Algebra" would be both
beneficial and accessible to CS majors. This is less immediately practical
than linear algebra in the above example, but closer in its style of thought
to programming than, say, calculus, topology, or differential equations. The
abstraction (which many math majors complain about) would be fairly straight
forward for a CS major, I would think.

~~~
moadeel
Thanks. Number theory sounds very interesting. I think I am going to pick up a
book or a website on it ... really want to look into it.

------
kmfrk
I used the exact same approach, except I went with Django and DotCloud. I
think Rails people have it even easier with better guides - and possibly
documentation.

------
karlgusner
great article! I wish I had read this when I first started coding. I am
sending this to all my friends that are now asking how they can learn to build
web apps.

------
zecho
While I really like Heroku for the simplicity of use, you're not going to
learn a bunch about how a web server actually works by using it.

~~~
gunnaraasen
Agreed, but learning web server admin is a pain.

I spent all of yesterday trying to upgrade ruby/rails on my linode for the
first time. Kept running into errors and eventually decided to just start over
with a clean Ubuntu install. That kind of demoralizing experience isn't a
problem when starting with Heroku.

~~~
bad_user
RubyGems and Linux (especially Debian / Ubuntu) are like oil and water.

Don't install Ruby libraries through apt-get, and also don't install them
through RubyGems globally (i.e. never use "sudo" for installing gems).

Instead install gems for the local user only, with the help of RVM. Then to
upgrade, if everything breaks, you can just delete your RVM directory and
start from scratch again.

Of course, this brings with it a whole other can of worms, because then it's
your responsibility for upgrading your libraries with the latest security-
related fixes (which otherwise would have been updated with a simple "aptitude
safe-upgrade", which can be a cronjob or something). But then you've got the
same responsibility on Heroku.

See <http://beginrescueend.com/>

------
RobertLysik
As someone in the process of learning Rails myself I absolutely agree with
your blog post. Especially your admonition to begin working on a project of
your own much earlier than when you feel ready. That is the surest way to
reinforce what you may be learning through a tutorial.

------
jyli7
Apologies for the site's been down. It's back up now: [http://jimmy-
li.net/blog/programming/how-to-get-started-in-w...](http://jimmy-
li.net/blog/programming/how-to-get-started-in-web-development/).

------
ThueLMadsen
Sounds very interesting but I think the site is down. All I get is:

Forbidden

You don't have permission to access /blog/ on this server.

Additionally, a 404 Not Found error was encountered while trying to use an
ErrorDocument to handle the request.

~~~
chug2k
+1

------
rainboiboi
I wouldn't exactly say web development and CS have no linkage though...

------
Tycho
The thing is... you probably also need rather high aptitude to make that much
progress in 6 months. These blog posts never mention that cause the authors
are too modest.

------
toadi
Learn Javascript follow some tutorials on jquery ;)

Think it's funny most people see javascript is the same as jquery.

Learn to code is the same a learning a framework?

~~~
luriel
> Think it's funny most people see javascript is the same as jquery.

I don't think it is funny, it is rather sad.

> Learn to code is the same a learning a framework?

In this days of byzantine frameworks apparently yes.

~~~
oscilloscope
JavaScript's a byzantine language on its own.

jQuery's a great choice for beginners learning to program for the first time.
Two related frameworks, underscore and d3, both have jQuery-inspired APIs and
use higher-order functions extensively. These frameworks teach lessons in
functional programming that transfer easily to Python, Lisp, Haskell, and even
mathematics.

------
BCounsell
To bad the Roadmap didn't include being able to access your blog/article. I'm
forbidden....

------
kpennell
Thank you.

------
unicron
That is learning to build web applications. It is different to learning to
code.

~~~
moadeel
What are some of the main differences?

~~~
jgw
Well, consider all of the things that have to be in place for the web app to
get from where it is served, to where you're reading it.

The web app itself is typically going to be running on a framework, written in
another language - for example, a site might use Rails, which is written in
Ruby.

This has to be served by a webserver - Apache is a popular choice - I think
much of that is written in Java.

The webserver runs on a machine, which might be running, say, Linux, as its
operating system. The Linux kernel is written in C.

Now the page has to be transmitted across the network - hopping across the
globe from one router to the next. The hardware that does all this switching
is in microchips, which are often designed in a language called Verilog. (This
is my own little niche area)

The browser that you're using to view the page might be running on a laptop
running Windows, which is largely written in C++.

There are countless other fields of "coding", too.

So to summarize, writing web apps is a subset of a vast and complex field of
study - and to follow this roadmap (which is probably a good way to learn what
the author wanted to learn) will not teach you anything about most of the
other things one might want to code.

For what it's worth, in setting out on your journey to learn about programming
(in the broader sense), I think you could do worse than to start with C and
Scheme.

~~~
moadeel
wow .. thanks. That's quite a summary on the mechanics of how it works.

Do you mean to say, it would be a bad idea to start with C coding?

~~~
jgw
No, I'm saying that knowing C and Scheme is a _great_ foundation for future
computer scientists and engineers! They lay a solid foundation upon which much
can be built.

But probably not a good place to start if, like the original author, you're
mainly interested in developing web apps.

