Hacker News new | past | comments | ask | show | jobs | submit login
Ask HN: Best way to learn computer/programming theory without college?
4 points by makufiru on Aug 13, 2015 | hide | past | web | favorite | 8 comments
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.




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).


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.


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.


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.


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.


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.


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


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.




Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact

Search: