
MIT lecturer Ana Bell discusses books to learn CS and programming - sharjeelsayed
https://fivebooks.com/best-books/programming-computer-science-ana-bell/
======
raister
Books:

1 - _Code: The Hidden Language of Computer Hardware and Software_ by Charles
Petzold

2 - _Clean Code: A Handbook of Agile Software Craftsmanship_ by Robert C.
Martin

3 - _Code Complete: A Practical Handbook of Software Construction_ by Steve
McConnell

4 - _Algorithms_ by Robert Sedgewick & Kevin Wayne

5 - _Types and Programming Languages_ by Benjamin C. Pierce

Best to learn? Highly unlikely. Interesting? Didn't capture my attention right
away. Good practices? More or less. Advances the craft? Let's say yes.

------
110011
Her recommendations are poor. You dont read books on software development
methodologies when "learning to program". Nor would you learn type theory.
That's like suggesting to someone who wants to learn to sail, the intricacies
of weaving cloth fibers into a sail.

There's a huge tower of abstractions to deal with in learning any new
discipline, and it's important to enter at an appropriate level, ie, one that
engages the learner to continue because the relationship to the end goal is
clear (to the learner).

I would suggest CLRS to someone mathematically mature for the best
introduction to algorithms. I don't have a book suggestion for learning to
program in some language, but I do consider this a far less difficult and
important obstacle compared to learning to think algorithmically.

When the interest is piqued people will naturally dig deeper and eventually
find out for themselves, other aspects in the tower, be it silicon doping or
reinforcement learning.

~~~
fao_
> You dont read books on software development methodologies when "learning to
> program".

In the article she already states that anyone can learn to program -- by
programming. The title of the article is "The best books on Computer Science
and Programming", not "The best books to learn to Program".

    
    
        Interviewer: And then, after this introductory book
        on programming, if a reader finds they really are
        interested and want to learn programming, this would
        be a good point to choose a language. Is that right?
        
        Ana Bell: Yes, the first book tells you
        about the hardware. Then if you want to learn how to
        program, you’ll need to learn a programming language. 
        To do this, you don’t have to use a book, there are
        many tutorials online.
    

Honestly I think you missed the fact that the books are about going _further_.

Petzold's Code teaches you to look at what your instructions are doing on the
machine. It teaches you a little about architecture -- and probably all most
people will need to know about computer architecture, and let's face it -- the
rest can be gleaned from the thousands of blog posts people have done about X
unix feature, or measuring performance of Y, or otherwise from _reading the
code_.

Code Complete and Clean Code teach you how to deal with _other people 's
code_, and how to structure your own code in clean ways. This is not something
that most people will pick up on their own at the time when they actually need
it, it seems to be something mostly learned from trial and error. Important
skills for contributing to an open source projects, etc.

Types and Programming Languages teaches you more about how languages and
Correctness work on a lower, general level. And Algorithms is about looking at
the specific structures of the code you write, and learning to optimize them
and design new ones efficiently.

As she says:

    
    
        It’s not a book for beginners, but it’s a good book
        if you’re interested in the theory behind programming
        languages. In the first book you’ve learned about the
        hardware, and in the next books you’ve learned about
        good code, and then algorithms. Now you can learn about
        programming languages themselves: how to write one,
        and how they do what they’re supposed to do.
    

Honestly the only one I'd really swap out is Algorithms. I'd replace it with
The Algorithm Design Manual by Skiena.

~~~
110011
"Ana Bell, lecturer in the Electrical Engineering and Computer Science
Department at the Massachusetts Institute of Technology, chooses the best
books to learn computer science and programming."

~~~
mitchty
Is computer science not a part of programming? What exactly is your rebuttal
here?

~~~
abhishekjha
I think its the other way around. Wouldn’t programming get classified as
engineering, hence the name Computer Science and Engineering?

~~~
mitchty
Maybe? I think the intent was similar to applied mathematics compared to
mathematics.

In that computer science is ultimately behind computer programming, but most
people don't care about the theory and only use applied theories in day to day
work.

But I'm stretching a bit as I can't read minds over the internet yet.

------
harry8
There is no way known that the tone of these comments would be so negative if
the name at the top of the list was, say, John Guttag rather than Ana Bell.

Top comment "Her recommendations are poor." Really? I call bullshit on that. I
say it's a fine list put together by someone who teaches the most prominent
course on introductory programming with the reasoning behind each of the
choices. My list would be different. So would yours. That's the point. (Top
comment calling "poor" couldn't come up with 5 books!) But hey, it's a woman
so out come the idiots being wildly critical in ways they would not be other
than they seem to be unaware of how confronted they are by a, _gasp_ , woman.
Wooo... "No I'm smarter, no really, really I am, let me prooooove it." FFS
Bro, deep breath.

~~~
frontfor
People have raised valid points about their disagreements with the
recommendations -- whether you agree with their points or not.

You're being overly sensitive and attributing malice prematurely and calling
other commentators "idiots". You couldn't even come up with specific reasons
why you disagree with other comments besides "everyone's list would be
different" and that only brogrammers would criticise a woman.

HN is generally a hypercritical place. I don't know how this is any different
from the tone elsewhere where the authors/startup founders have been a man.

~~~
harry8
I'm not particularly sensitive to it, it has to be fairly pronounced before
I'd even notice. This is.

It's one thing to say, I'd do it different. I'd have this book, or that book,
or my list would have more this focus or that focus. It's a whole different
beast to claim this list is "poor." And it is stupid to do so without
countering with a list of exactly 5 books. Yes stupid.

I have read all 5 books. All 5 are excellent books. All 5 are very highly
regarded in the field of programming and computer science. The descriptions
that are attached to the list in TFA are accurate and useful to anyone reading
the list. If there's a book on that list you haven't read, I'd say read it.
This list simply isn't in the same postcode as "poor" and the descriptions of
it as poor can't back it up in a meaningful way. Maybe there's another reason
why the general mood of this thread is hypercritical? Smells a bit though,
don't it? Do you really think if Guttag submitted that list the tone here
would be the same or would the whole "this book is better" comments be rather
more respectful of the original list and author? I've stated my opinion and
why. You may of course, disagree.

Here's mine, Petzold "Code", Kernighan and Pike's "Practise of Programming",
"The Pragmatic Programmer", Abelson and Sussman "Structure and Interpretation
of Computer Programs" (with video lectures on youtube), Richard Stevens "Unix
Network Programming" or maybe "Advanced Programming in the Unix Environment"
\- Which betray my OS accent. I'm not sure it's better than Ana Bell's. You
can decide for yourself on that point.

~~~
runald
> I'm not particularly sensitive to it

Aren't you? Poor may not be a well-thought out word to describe it, but I'm
sure there are way more offensive words out there like, I don't know, maybe
stupid or idiotic? I interpret poor in this context as having a deficiency in
the quality of the list based on the opinion of the critic, just like you
having an opinion.

------
diego_moita
No, not Code Complete. It is an obsolete book, made with sloppy research, that
leads to shallow or incorrect conclusions (10x more productive programmers,
code of uncertainty, etc).

Pragmatic Programmer is a much better book.

~~~
th3byrdm4n
She's a lecturer, Code Complete fits that mold and is an important building
block. I've read it once 8 years ago and never felt a need to go back.
Pragmatic programmer on the other hand is the productive programmer's book for
professionals that need to remember that perfection is nice, but production
pays.

Pragmatic Programmer is my annual pallet cleanser any time i see my own
production tapering off due to seeking perfection / getting caught up in
theory.

~~~
gowld
What's the point of teaching wrong information first, instead of teaching
correct information first?

------
joebergeron
Huh, this is not what I expected. Ana Bell is my undergraduate advisor at MIT.
I do not think that these choices are particularly the best for someone with
no programming or computer science experience whatsoever, as others have said.
What strikes me as particularly odd is that I believe she teaches 6.0001,
which is a relatively new "very much a complete intro" half-semester course
for programming, taught in Python. I suppose I would have expected more truly
beginner-friendly material in her recommendations.

~~~
kup0
To be fair, on HN the title is "best books to learn X" but the actual article
states "best books on X" which is a subtle but significant difference in
wording. I don't think that the list was intended to be a starting place for
learning computer science and programming.

~~~
dragonwriter
She also explains that most of the basics of making code work aren't best
learned from books, and “What you can get out of programming books is the
thought process behind the ideas. Language takes a back seat to the concepts
presented, in the sense that ideas in a book should be universal to any
programming language.”

This seems to be ignored in much of the negative commentary, which criticize
her for not recommending books for the role she expressly stated books are not
needed for (without actually engaging with her statement) and object that she
is only recommending books that do what she says books are most needed for in
the context of CS/programming.

------
Myrmornis
> The first is Code: The Hidden Language of Computer Hardware and Software by
> Charles Petzold

> It’s easy to read, you can lie down on the couch and enjoy it

No, it isn’t. It’s an awesome book. But it presents diagram after diagram of
CPU internals and it would require a huge amount of stamina to get through
them. You cannot just turn the pages; the entire point of the book is
understanding how these components work in detail. It might be a good book to
keep in a nuclear bunker to help rebuild civilization though.

------
dublin
I'd argue she's flat missed the most important aspects of programming, as
shown in these two books: 1\. Fred Brooks' The Mythical Man-Month, and, 2\.
Ted Nelson's Computer Lib/Dream Machines (Really, almost anything by Nelson,
but this one is the classic.)

Neither teaches programming. Both teach the things that make good programming
good, and if you don't know these things, you're condemned to mediocrity at
best, and making furrows by plowing the sea at worst...

~~~
gowld
It's a list of 5 books, not a complete curriculum.

------
maym86
Good list for more experienced programmers but there's nothing new here except
the sales pitch for her python book. It's not a great list for beginners
learning by themselves for the first time.

It seems that the article is aimed at a complete beginner starting for the
first time given the part about learning python first.

If I had just learned python as my first language and then tried to read some
of the books in this list I would be very confused.

------
rb808
Code Complete is an interesting one to me. I loved it back when doing C++.

One of the things that initially bugged me with lots of functional programming
was that it broke many of the Code Complete rules like having one operation
per line.

Does this mean that Code Complete is not relevant for functional code or maybe
there is a new edition required I"m not sure.

~~~
gowld
Functional programming mostly eliminates "operations" so there's no need to
worry.

------
rdiddly
Q: _The word “algorithm” seems to have taken on a huge significance in the
last few years, in the media discourse about people’s fears of black boxes and
manipulation...._

A: _That’s a great point. Algorithms sound like something mysterious, but
they’re not. They’re recipes, with a series of steps to go from an input to an
output. It’s very simple, and there is nothing mysterious or malicious about
that._

True, assuming the algorithm is open-source. An algorithm you don't have
access to is inscrutable, and is every bit as mysterious and caution-worthy as
"people's fears of black boxes and manipulation" would rightly indicate.

~~~
JustSomeNobody
I read that to mean the general concept of an algorithm, not the reification
of a particular (albeit closed source) algorithm.

------
lordnacho
Always nice to have book recommendations, but you learn programming by
programming.

Download whatever you want to code in, work through "Hello World", bash your
head against walls, come out more experienced on the other side.

The CS side of it is definitely interesting, but you can get quite far without
knowing what a hash map is. The opposite is not quite true, as you won't be
able to test your fancy CS stuff without having bashed those often trivial
walls.

~~~
fao_
> Always nice to have book recommendations, but you learn programming by
> programming.

Did you read the article? That's literally what she said in the article.

~~~
lordnacho
I don't see where it literally says that?

~~~
fao_
The first quote in my other comment:
[https://news.ycombinator.com/item?id=16978395](https://news.ycombinator.com/item?id=16978395)

------
weeksie
I would have thought she'd mention Introduction to Algorithms (Rivest et al).
The Pierce book is great but hardly something that I'd include in an every-
programmer-must-learn-this list.

Code Complete is fantastic. I haven't re-read the Pragmatic Programmer in
probably a decade but I remember that giving me a very good handle on
approaching code as a young developer.

~~~
ifoundthetao
When you re-read it you'll be visited by some antiquities.

It's a great book, but I'd be very interested in a reboot.

------
alexashka
I can only imagine how Gerald Sussman and Hal Abelson (SICP) feel about the
state of computer science education.

~~~
leanthonyrn
Here is how Gerald Sussman feels at least about computer languages.
[https://youtu.be/O3tVctB_VSU](https://youtu.be/O3tVctB_VSU)

Hal Abelson on Computer Science Education
[https://youtu.be/fqtlQWmRvvk](https://youtu.be/fqtlQWmRvvk)

------
thisisananth
I read the first four books and I think they are very good. Good choices!

~~~
raister
You're a very smart person, kudos!

------
lobo_tuerto
I'd say the recommended books are not for learning per se, but for
consolidating your programming experience.

------
th3byrdm4n
Solid list for any CS theory-thirsty minds :)

My mentoring CS professor's recommendations included these 5 books as well as
the following: * Pragmatic Programmer * Gödel, Escher, Bach. * Programmer
Pearls

He also had a great deal of Computer Vision expertise/recommendations (his
specialization / side job was as doing R&D for RED Cameras). Great professor,
even better guy.

------
codetrotter
So first of all let me preface my own list of books with the following: These
book recommendations are for some books that are really really good IMO but
this list of books alone is far from all that you need. You need practice.
Lots and lots of practice. You need interesting problems to work on that are
sufficiently small in scope that they don't each take too much time, but which
still end up teaching you something. You need to know when to skip a problem
if you're banging your head and getting nowhere, and you need to know when to
persist. So the following should not be taken as a list that will "teach you
CS and/or programming", but rather a list of books to complement learning.

Also you need maths. Start with calculus. However, maths is difficult to learn
on your own. I am sure some people are able to do it on their own but I think
most would struggle to do so. At the very least follow something like
[https://www.khanacademy.org/math/calculus-
home](https://www.khanacademy.org/math/calculus-home). Personally I learned
the maths I know at university but I've heard that Khan Academy is pretty high
quality stuff.

So, like, this list is more of a "books that you should check out while/after
you've studied CS and/or programming at a university".

1\. _Dive into Python 3_. Mark Pilgrim. 2009. Apress.
[http://www.diveintopython3.net/](http://www.diveintopython3.net/). Python 3
is a great language. It's easy to get started for beginners and yet it's so
powerful that if you really learn it you will find yourself using it probably
for a lot of very advanced stuff for many many years to come.

2\. _Inside Network Perimeter Security (2nd Edition)_. Northcutt, Zeltser,
Winter and Ritchey. 2005. Sams. It's not going to make you a networking
security expert or anything but I found it to be a good intro.

3\. _Structure and Interpretation of Computer Programs_. Abelson, Sussman and
Sussman. 1984. MIT Press. The classic. If you don't know about it already have
a look at what people are saying;
[https://hn.algolia.com/?query=sicp&sort=byPopularity&prefix&...](https://hn.algolia.com/?query=sicp&sort=byPopularity&prefix&page=0&dateRange=all&type=comment).
Great book, and one that I will definitely be reading again in the future.

4\. _Understanding Computation: From Simple Machines to Impossible Programs_.
Tom Stuart. 2013. O'Reilly.
[http://computationbook.com/](http://computationbook.com/). A fun and gentle
book covering a range of computer science topics. He's using Ruby which
personally I do not use but it's close enough in syntax to Python that I
almost didn't even think about it while reading. (No disrespect against Ruby,
it's just I personally don't use it.)

5\. _WebGL: Up and Running_. Tony Parsi. 2012. O'Reilly. A short book which
manages to be concise without getting too dense. It gives a good intro to
WebGL using Threes.js and contains a lot of small but interesting examples
complete with code. WebGL has evolved quite a bit since the book was written
but I think it still holds as an intro both to WebGL and to computer graphics
in general. I don't know if I would recommend Threes.js specifically (nor do I
have anything against it -- I just haven't ended up using that library myself)
but the framework/libraries used is second to the cause of teaching anyway and
I think it makes sense that they used it to abstract away some of the
boilerplate stuff.

6\. _The Design of Design: Essays from a Computer Scientist_. Frederick P. Jr.
Brooks. 2010. Addison-Wesley Professional. I liked this one a lot. So much
that I had to include it even though we've already mentioned five books. This
one is about software architecture. Additionally it also talks a bit about
house architecture which might seem a bit odd at first but the book is well
written and the stuff about houses ends up adding to the reading experience
quite a lot IMO. You may have heard about another book of the same author;
_The Mythical Man-Month_.

7\. _The Design and Implementation of the FreeBSD Operating System (2nd
Edition)_. McKusick, Neville-Neil and Watson. 2014. Addison-Wesley
Professional. Well we've already broken the limit of five books so let's add
another one as well why not. This one is quite heavy reading material IMO. I
started reading it years ago but didn't finish it. I've read about 600 of the
almost 1000 pages. I liked the parts that I've read so far though and I am
sure I will finish this book at some point. It's very interesting to learn
about the lower level details of how an operating system is built and doubly
so when the book is about an actual production quality OS that is actually in
use. Triply so because FreeBSD is my favorite OS ;)

There are so many more books I'd like to mention as well but let's keep the
list somewhat short in the spirit of the OP link.

Also, install FreeBSD or a Linux distro and use it as your main OS.

Lastly I'd like to add that you don't necessarily need to read absolutely all
of these books, and that you don't need to read them cover to cover.

If you've never programmed, start with _Dive into Python 3_. If you have some
experience, just skim through it and see if there is anything of interest.

Also like I said, books are not enough. You need to do exercises and also I
recommend watching some talks from PyCon, DefCon, Game Developers Conference,
etc.

~~~
raister
Internet Rule #45 - "if someone made a list, produce your own list and publish
it at the same thread".

~~~
codetrotter
Well others were complaining about the quality of OP list so I figured I might
share what mine would look like :)

Also actually the 45th rule of the Internet is "when one sees a lion, one must
get into the car." :P

[http://rulesoftheinternet.com/](http://rulesoftheinternet.com/)

~~~
raister
Oh dear, I'm sorry, I meant this:
[https://www.urbandictionary.com/define.php?term=Thread%20Hij...](https://www.urbandictionary.com/define.php?term=Thread%20Hijacking)

~~~
codetrotter
Ok, but when the sentiment in the thread is that the OP list was not useful I
think it's a good idea to shift the focus of the discussion to other books
that might cover the premise of the title.

Presumably a lot of the people that click on this thread do so because they
wanted to know about good books relating to CS and programming. So let's tell
them about some good books to read.

I also don't think the idea of "thread hijacking" applies in the same way on
link aggregators like HN and Reddit. And really I don't think it applies much
even for text posts on these sites because HN and Reddit use threaded
discussion which make it possible to have a lot of simultaneous different
discussions going in a thread at the same time in a way that linear discussion
thread sites like 4chan etc etc don't make possible.

------
ronaldl93
Stackoverflow :)

