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.
> 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.
"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."
Headlines, including subheads, often suck. Yes, when you read the content, her actual discussion isn't exactly what the subhead suggests. That is a good reason for criticizing the subhead you quote. It's not a good reason for criticizing her recommendations, though.
Does Code Complete and it's sibling not teach the aspects of programming involved in maintenance and cleanliness? Is that not a major aspect of programming? Just because none of the books teach you at-a-basic-level "This is a function" doesn't mean that they have nothing whatsoever to do with programming. Most of the difficulty with programming is structuring code correctly such that it is within the human grasp of complexity, while ensuring that it also does the job, and is maintainable.
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.
I used CLRS at my university, but I've since found Algorithms by Dasgupta, Papadimitriou, and Vazirani far better. It's a much smaller book for one, so more people will actually read it, and while it is mathematically rigorous, the proofs and explanations are well motivated so you actually understand how the algorithm works and how someone could have come up with it in the first place.
I agree though that her recommendations are poor. I feel that way about most of these five books recommendations. It's seems that people usually pick their books to be controversial or to show off how clever they are, rather than to actually help someone understand their field. I've read half of that type theory book for example, and it is utterly impractical for any practicing programmer. You would only find it interesting if you're interested in implementing functional programming languages, and even then it's quite theory heavy and not very practical.
I read the first two chapters of Algorithm Design by Jon Kleinberg and Éva Tardos. The prose is very clear and lucid, but it has one problem: it's incredibly long-winded. A good editor could probably lop off a good 1/4 of the book without loss of info. That would make the book spectacular.
Also, if anyone is interested, these lecture notes [0] (Algorithmic Math by Soicher & Vivaldi) below introduces algos from elementary number theory/abstract algebra.
It does say Computer Science and programming. So you might not read those books while learning to program, you (arguably) would while learning computer science.
> You dont read books on software development methodologies when "learning to program".
Most people usually don't, perhaps (though my first college class in programming had The Mythical Man-Month as a required text, which is 100% methodological and 0% coding, and this was at a major engineering school) but especially given her discussion of the role of books vs. web resources in the current context, I don't think it's inappropriate. I personally would go to HtDP, which covered computational thinking, coding, and what I view as the right amount of methodology, and not Clean Code and Code Complete, but I don't see her recommendation of these as wrong or poor. Of course, HtDP is also a freely available web resource.
> Nor would you learn type theory.
Once you relegated the basic mechanical issued to web resources, the way she discussed, I think algorithms and data structures and type theory are probably the accessible-early deep-dive topics most useful, and the places where autodidacts focusing on obvious tutorial contents are most likely to miss out.
I also think it's clear that her presentation is of five, basically progressive, key milestone works as you progress, not five things to do all as a rsbk beginner.
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.
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.
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.
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.
There are so many presumptions in your comment (and your comment below) that I don't know where to start, but I find it very amusing :)
My original comment was based on the reading of the title of this thread and the first few sentences in the referenced article both of which mention the word learn. I would call all five mentioned books a poor choice to learn CS/programming from. The book by Sedgewick is an especially bad one (he has a few in this line of mixing algorithms with a programming language, and I despise all of them, and would never recommend to anyone for learning anything).
Now your comment is typically something I wouldn't respond to, but in a public forum it's different, so I am taking time to write this.
Calm down, control your emotions, and don't divine too much into the motives behind what people write when you don't take time to even read what is written.
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).
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.
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.
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.
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.
> 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.
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...
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.
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.
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.
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.
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.
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.
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. 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/. 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&.... 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/. 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.
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.
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.