
Ask HN: What's the best way to get a good computer science grounding? - oliverjudge
Every time a new framework or new trendy tool is released, there&#x27;s always the guy in the comments complaining that people are learning the tools, not the technology behind it.<p>Aside from school what&#x27;s the best way currently to get a good grounding in computer science?
======
yolesaber
VisuAlgo - [http://visualgo.net/](http://visualgo.net/) \- is an incredible
resource for learning data structures and algorithms. I'm a visual thinker and
it was so helpful in fostering connections between the code and the theory.

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...](https://www.scribd.com/doc/52657907/Feynman-Lectures-on-Computation)

~~~
dorfuss
visualgo.net is excellent, thank you for mentioning it.

------
cottonseed
There's no shortcut: If you want a solid grounding in CS, you need to study
CS. Go through a school curriculum without going to school. Most schools have
curricula and program requirements online. MIT OCW is a good place to start.
If you need more structure, you can find equivalent courses for free on
Coursera, edX, etc. If you want to do this but don't know how to go about it,
or want a "solid grounding" but don't quite know what that means or how to go
about getting it, start with some of the various "learning how to learn"
resources: Cal Newport's blog or books, Barbara Oakley's "Learning How to
Learn" Cousera course and book, 5 Elements of Effective Thinking, etc.

------
bshef
Pick a popular, modern programming language, and go through the official
tutorials. Then, think up a small project for yourself, one you can knock out
in a weekend or perhaps over the course of a few weekends. Then do it. Maybe
it's a little game, maybe it's a handy utility... it doesn't even have to be
something new or unique in the world, as long as it is something you haven't
done before.

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.

------
tonyonodi
I'm a programmer without a computer science degree and I'm quite aware that CS
is a bit of a blind spot for me so I've tried to read up to rectify this a
little.

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...](https://www.amazon.co.uk/New-Turing-Omnibus-K-
Dewdney/dp/0805071660) [2] [https://www.amazon.co.uk/Code-Language-Computer-
Hardware/dp/...](https://www.amazon.co.uk/Code-Language-Computer-
Hardware/dp/0735611319) [3] [https://www.amazon.co.uk/Structure-
Interpretation-Computer-E...](https://www.amazon.co.uk/Structure-
Interpretation-Computer-Electrical-Engineering/dp/0262510871) [4]
[https://mitpress.mit.edu/sicp/full-
text/book/book.html](https://mitpress.mit.edu/sicp/full-text/book/book.html)

------
SdApartmenyGuy
This helped me a lot. Both are free to use & they are the from the same
people. First link is like a class (w/ some videos) + an interactive text
book. Second is a text book where you need to download Python in order to
follow along.

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...](http://interactivepython.org/runestone/static/thinkcspy/index.html)

[https://www.cs.hmc.edu/csforall/index.html](https://www.cs.hmc.edu/csforall/index.html)

------
atmosx
I don't have formal CS knowledge so everything I say might be wrong.

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.

~~~
yolesaber
You're not necessarily wrong, but missing the point. He wants to learn about
CS fundamentals so he can discover what powers the framework / stack, not get
a grounding in the stack's capabilities itself.

~~~
atmosx
And what CS fundamentals do you need to discover Rails, Node, React or django?

~~~
yolesaber
Of course, you don't need to know any CS fundamentals to "discover" them and
start using them. But if you want to learn the CS behind them and how they
operate on a theoretical level, I'd say start with the algorithms that power
networking and the internet and then progress up to data structures used by
these frameworks to deal with databases, caching etc. I'm not too familiar
with any of them except for django so I can't get into that much detail.

------
_RPM
I know you don't want to hear about school, but this is exactly what makes
higher education so great. You can learn this stuff at a University. Have you
considered studying CS at a college?

------
tmaly
study algorithms and data structures. If you can find a good online course
take it. If your comfortable learning from a book, go that route.

algorithms and data structures are applicable to almost any language out
there.

------
samfisher83
Read clrs.

