Ask HN: What's the best way to get a good computer science grounding?
Every time a new framework or new trendy tool is released, there's always the guy in the comments complaining that people are learning the tools, not the technology behind it.
Aside from school what's the best way currently to get a good grounding in computer science?
13 comments
[ 3.0 ms ] story [ 45.9 ms ] threadalgorithms and data structures are applicable to almost any language out there.
There, now you can call yourself a coder. Want to upgrade to "programmer" ? Check out languages that are related to the one you just learned. They'll be easy to pick up, so repeat the process. AVOID FRAMEWORKS, and just focus on the language and officially-recommended tools.
Perhaps start tinkering with a Raspberry Pi or Arduino. Learn about the differences in operating systems between Windows, Mac OS, and Linux. Get familiar with Linux -- Ubuntu is a great starting place if you're coming from a Windows background.
Make sure you understand the fundamentals of how computers WORK. In particular, experimenting with x86 assembly language will help bridge the gap between what your modern code says, and how your processor interprets the instructions. Also peek into learning things such as Discrete Mathematics (the math of logic), and State Machines and other theoretical concepts of computer science. You probably won't use this knowledge directly in the real world, but it's the backbone of all computer science... and you will have to take classes that cover this material to get a computer science degree.
I found The New Turing Omnibus[1] to give a really nice overview of a bunch of topics, some chapters were a lot harder to follow than others but I got a lot from it.
Code by Charles Petzold[2] is a book I recommend to anyone who stays still long enough; it's a brilliant explanation of how computers work.
Structure and Interpretation of Computer Programs (SICP)[3] comes up all the time when this kind of question is asked and for good reason; it's definitely my favourite CS/programming book, and it's available for free online[4].
I'm still a long way off having the kind of education someone with a CS degree would have but those are my recommendations. I'd love to hear the views of someone more knowledgable.
[1] https://www.amazon.co.uk/New-Turing-Omnibus-K-Dewdney/dp/080... [2] https://www.amazon.co.uk/Code-Language-Computer-Hardware/dp/... [3] https://www.amazon.co.uk/Structure-Interpretation-Computer-E... [4] https://mitpress.mit.edu/sicp/full-text/book/book.html
I came to realise that you only gain grounding by working with a stack/framework/set-of-tools every day. Everything else (reading a book, etc.) is just scratching the surface.
Since you can't know everything about everything, I'd say that the best way to learn is to build something. But it's one thing to build your own CRUD test-app to learn Rails and another thing to design an app that will need to stash 20 million entries per day in a DB. The choice of the DB becomes, suddenly, a complex matter. Same if you need to handle 100.000 req/s ... You can't really learn these things on your own.
The best thing IMHO to get good grounding is to never stop learning.
I would say go through a few of the algorithms there and then try coding some up yourself in your favorite language. Then, once you have a feel for the algorithm I would recommend looking for literature about the algo or whatnot and see if you are able to read the math / logic behind it.
If you want to get a really solid bottom-up grounding, you could also just read all of Feynman's book on computation. His clear and crisp lecturing style is much easier reading material than e.g. Knuth or CLRS https://www.scribd.com/doc/52657907/Feynman-Lectures-on-Comp...
This teaches "What" CS is and how to think like them. Teaches you the basics, what are Algorithms & is actually fun if you really put your effort into it. Good luck!
http://interactivepython.org/runestone/static/thinkcspy/inde...
https://www.cs.hmc.edu/csforall/index.html