
Ask HN: Best way to learn computer/programming theory without college? - makufiru
Having never done well in college, I did not complete my degree when I was there.<p>I&#x27;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.<p>I&#x27;ve built complex systems and user interfaces, but I couldn&#x27;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.
======
duggieawesome
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](https://www.coursera.org/course/algs4partI)).

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

~~~
brudgers
Coursera, etc. offer great resources for learning CS. I think Roughgarden's
sequence
[https://www.coursera.org/course/algo](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
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
_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
Knuth?
[https://cs.uwaterloo.ca/~shallit/Courses/134/history.html](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...](http://icme.stanford.edu/system/files/file-
insertions/forsythe_knuth.pdf) 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.

~~~
brudgers
I wouldn't expect anyone to read _TAoCP_ front to back either. It isn't
finished. We've only got the first part of chapter 7 and none of chapters 8
through 12. On the other hand, it's the best rabbit hole out there for the
non-layman.

------
valhalla
"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
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.

