top | item 10055309

Ask HN: Best way to learn computer/programming theory without college?

4 points| makufiru | 10 years ago | reply

Having never done well in college, I did not complete my degree when I was there.

I'm curious about the best way that other people have found to learn theory or ideas that have made them way better programmers. Especially things they have done on their own time, or at least outside of college.

I've built complex systems and user interfaces, but I couldn't tell you about quick-sort algorithms, or sieves, or the best way to build a fibonacci sequence; I wonder if my programming is objectively worse because of it.

8 comments

order
[+] duggieawesome|10 years ago|reply
There are a lot of MOOCs (Massive Open Online Courses) nowadays that offer CS theory. For example, Coursea has an algorithm class available (https://www.coursera.org/course/algs4partI).

MIT also offers classes as well (http://ocw.mit.edu/index.htm).

[+] brudgers|10 years ago|reply
Coursera, etc. offer great resources for learning CS. I think Roughgarden's sequence https://www.coursera.org/course/algo is better than Sedgewick's, because it's targeted at upper division rather than lower division students and is language neutral.

On the other hand, Coursera etc. fall into a bit of a grey area regarding "outside of college". Though I tend to think that limiting the options to outside of college doesn't get the OP much.

[+] smt88|10 years ago|reply
Computing theory is only going to make you "way better" if you're doing lower-level stuff. It'll still make you somewhat better with high-level languages, but those languages (and optimizations at the compiler level) will abstract the really complex theory away. Understanding memory is really important, though.

In general, the thing that's made me a way better programmer is seeing how highly experienced programmers explain the way they organize their code. Even though I don't practice functional programming, reading the reasoning behind it has been really helpful to me, and there are many principles from FP that make object-oriented code far better.

> I've built complex systems and user interfaces, but I couldn't tell you about quick-sort algorithms, or sieves, or the best way to build a fibonacci sequence; I wonder if my programming is objectively worse because of it.

It depends on what you're doing. For the vast majority of people, especially those in the business world, the answer would be "no". Many of those parts of programming (sorting, linked lists, random number generation, etc.) are provided by standard libraries or other programmers. You don't want to constantly reinvent the wheel if someone is paying for your time.

If it's something like cryptography, it's a lot murkier of an issue. It's really hard to evaluate a crypto package if you're not an expert, and even the "industry-standard" packages are often found to have holes in them. I'm still not suggesting you write your own, but it's always worthwhile to understand data security better.

[+] brudgers|10 years ago|reply
The Art of Computer Programming.

Knuth coined the term "computer science". I won't claim it made be a better programmer, but it couldn't have made me worse.

[+] Someone|10 years ago|reply
Knuth? https://cs.uwaterloo.ca/~shallit/Courses/134/history.html claims it was George Forsythe who coined the term, and Knuth's http://icme.stanford.edu/system/files/file-insertions/forsyt... seems to collaborate that (second page, top of left column)

Back to the subject at hand: reading TAOCP front to back isn't for everybody (reading it is way easier if you have a good understanding of combinatorics and number theory), but I enjoyed it, and learned a lot from it.

[+] valhalla|10 years ago|reply
"Learn Python the Hard Way" is what I'm using now and it's been pretty awesome at making me figure out where my scripts/programs went wrong so I can fix them myself and learn from my mistakes. They also have a bunch of other languages such as Ruby if Python isn't your thing.
[+] epalmer|10 years ago|reply
In addition to the comments others have provided. Take a reasonable complex problem and solve it. Now refactor it. Not sure what refactoring is, read Refactoring: Improving the Design of Existing Code by Martin fowler.

Show your code to others and seek feedback. Always assume that your code can be improved.