

Ask YC: Study theory, or keep coding? - kyro

So, I've been learning how to program, with Python last summer, and Django up until now, and I'm actually in the process of coding my first app in Django. One thing always comes to mind, though. Being a beginner without any academic education on CS, I feel that there are many theories and facets to CS to learn other than programming languages and their syntaxes, which will ultimately make me a much more skilled programmer.<p>I want to ultimately be a proficient web app coder, and at times I think about whether my attempts at creeping closer to this goal are futile without the proper launch pad. Are there any resources I should look into to give me a stronger foothold in CS and its theoretical foundations? Am I just talking gibberish? Or will continued practice in programming be sufficient?<p>Thanks.
======
codewhisperer
Consider the Dewar & Schonberg article which has been causing so much stir
this week:
[http://www.stsc.hill.af.mil/CrossTalk/2008/01/0801DewarSchon...](http://www.stsc.hill.af.mil/CrossTalk/2008/01/0801DewarSchonberg.html)

They argue that a good theoretical grounding is indispensable for writing good
code, and that it inoculates you against future unemployment by making it
possible for you to learn any programming model, and even to apply multiple
languages to a single system when appropriate. Merely writing applications
isn't enough, or maybe it is, but it can take a decade of personal trial and
error to discover rules that can be digested in a semester with a qualified
teacher.

I take issue with some of their tone. They seem to dismiss all of the cool
things people have made using rapid development tools, only valuing the
contributions of military grade correctness provers. I think there's room for
both in our industry.

However, if you're young, and you can go without sleep, use your energy to lay
the groundwork for a lifetime of code writing. It's easier to learn theory now
than to unlearn bad habit later.

Finally, don't get tricked into thinking you have to choose one or the other
-- you will be coding regularly if you study theory.

And don't get tricked into thinking geniuses don't need to study. Those aren't
geniuses pushing that theory.

~~~
codewhisperer
Adding in some practical pointers too. If you're not in a position to enroll
in an accredited CompSci program, look at MIT's free online courses:

[http://ocw.mit.edu/OcwWeb/web/courses/courses/index.htm#Elec...](http://ocw.mit.edu/OcwWeb/web/courses/courses/index.htm#ElectricalEngineeringandComputerScience)
* Start with 6.001 * Make sure to hit one (or all three) of 6.042J. * I was
about to claim the 6.171 (Software Engineering for Web Applications) was too
out of date to bother with, being dated Fall 2003, but scanning the topic list
of the course, everything listed there is still a concern in my day to day
work. * Dewar and Schonberg would have you stress compilers. I would have you
stress analysis of algorithms.

------
mechanical_fish
You have started with Python. You are already on the right track. Don't stop
practicing -- you can't get anywhere without practice.

If you're curious about CS you should just go ahead and read SICP. I recommend
the printed version, but the whole thing is online here:

<http://mitpress.mit.edu/sicp/>

Perhaps there are people who love CS and yet hate this book, but I have yet to
meet one. It's not the easiest book in the world, but it is the real thing,
and not an imitation.

There are, of course, lots of things you could learn which are not exactly
"CS" but which will make you a better web programmer. Study SQL. Study emacs
(read Steve Yegge for inspiration) or another killer editor. Learn to use a
really decent version control system (the SVN book -- just google "SVN book"
to find it -- is easy to understand, but Linus Torvalds is right when he
claims that Git is much nicer!) Read "Mastering Regular Expressions". Read
Bruce Eckel's _Thinking in Java_ so that you know enough about the world's
most popular language to understand where it sucks, ;) and so that you can
follow the conversation of much of the rest of the software world. Read K&R.

------
amichail
Some books to read:

[http://www.amazon.com/Algorithm-Design-Jon-
Kleinberg/dp/0321...](http://www.amazon.com/Algorithm-Design-Jon-
Kleinberg/dp/0321295358)

[http://www.amazon.com/Design-Patterns-Object-Oriented-
Addiso...](http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-
Wesley-Professional/dp/0201633612/)

[http://www.amazon.com/Refactoring-Improving-Existing-
Addison...](http://www.amazon.com/Refactoring-Improving-Existing-Addison-
Wesley-Technology/dp/0201485672/)

<http://www.artima.com/shop/forsale>

------
aston
Just code towards your goal. Most of the theory of computer science that
you'll need implemented along the way will be done for you via something low-
level that you don't really need to worry about because it'll come for free
(in python or in django).

If you run into things that you find you're curious about them in a deeper
level, that's when you should look for more technical material to support
that.

------
hwork
Hey man. One thing you could try, if you're having a tough time with the sheer
amount of things to learn out there, is to try to find a project to work on
that's going to apply some external pressure on you to solve problems and
learn new things. That way, you can sort of chip away at things.

