Consider that the best athletes in the world have coaches. Even if it's a cooperative endeavor, it helps an athlete to have someone else to design training programs, objectively point out weaknesses, push them when the still have more to give, and pull them back when they've gone too hard.
In theory, the athletes can do this by themselves. In practice, they rely on their coaches.
In theory, you can read books on your own and hold yourself accountable so that you grind through difficult problems and projects so that you actually learn the material you read about. In practice, having a teacher to help you through this process makes you much more likely to succeed.
I majored in English and went to Clark University (http://www.clarku.edu -- a lot of people haven't heard of it), where I think I got a lot of mentorship and connected with my professors. That might be because I took a lot of time to seek them out or because Clark is a small liberal school, but I think the larger issue is that most, though not all, professors will offer mentorship/guidance to the extent the students seek it out.
Now I'm a grad student at the University of Arizona, and I tell my students the same thing most of the time: if they want to go beyond whatever is required in class, they should start by showing up in their professors' office hours, ideally with somewhat smart questions or comments. Most professors will, I think, respond well to this, and will often give recommendations on books to read and/or projects to work on. A few days ago I taught pg's essay "What You'll Wish You'd Known," and students glommed onto this paragraph (http://paulgraham.com/hs.html):
A key ingredient in many projects, almost a project on its own, is to find good books. Most books are bad. Nearly all textbooks are bad.  So don't assume a subject is to be learned from whatever book on it happens to be closest. You have to search actively for the tiny number of good books.
Very true: professors are a good place to find this. If you read whatever books they recommend and go talk to them about those books afterwords, I think that coaching and mentorship kinds of relationships will probably form, even at big state schools. Professors are often interested in you to the extent that you are interested in the subject they are interested in.
Obviously, there are exceptions, but most of the time this principle works reasonably well. But very few people follow it. If you (not the OP -- a general "you") show up in office hours say "mentor me!" you're probably not going to get much. But if you show up and ask questions x, y, and z, then read whatever the prof recommends, then come back, you'll probably have a much better shot.
This is true, but that wasn't my point. I used coaching as an analogy to point out that even people who are among the best at what they do don't do it alone. There is an attitude among technical people that "the material is out there, who needs school?" which I find too reductionist. Courses are more than just the raw material; they are infrastructure, incentives, and, yes, outside help.
I would like to hear from other HN participants if they know of examples of that.
/me raises hand
It helps to be in a small department. A friend of mine at another (larger) school once asked me for advice on how to seek out letters of recommendation. The problem was that none of the professors knew who he was, since he'd only been in large lectures and never had the same professor twice. On the other hand, there were a few professors (2 in math, 2 in CS) who had taught multiple smaller classes I was in. When I was looking for recommendations, I had a lot less trouble finding professors who knew my background (including both other classes I'd taken and areas where I'd gone wandering beyond the scope of the courses they'd taught) well enough to write them.
Most of the complaints I hear about professors/instructors being unreachable come from people who never make any serious attempt to reach them (i.e. so few try and so many complain that those who don't try must be a majority of those who complain). Beyond that, those who do contact the professor/instructor for additional mentoring typically aren't the ones who need it most.
I got my best coaching from other undergrads and occasionally other grads. Two dudes named David Kitchen and Noah Falk stood out in particular (if you guys are out there somewhere, I still think you rock!). It makes sense. The undergrad TAs and mentors all wanted to TA and they're closer to your skill level. The professors are there for when you outgrow your TA. But since I didn't seriously start learning math or programming until I entered college, I never made it that far. =(
I went to a small, well regarded liberal arts college in the Midwest. The science programs provided a lot of direct interaction with professors as well as copious lab time, projects, summer internships. Lab equipment was extensive; as it was (sometimes too frequently) put, undergrads received training on and regularly used equipment that elsewhere you might not "get to touch" until in a grad program.
It helped that the school was quite well funded/endowed. Some big name alumni had not just or even primarily given them money, but had as much or more so given them investment advice and opportunities that paid off many fold.
This is an attraction of a small (often private) college. But you have to pick carefully and ascertain that the reality there lives up to the rhetoric.
I'm not particularly pitching for this route as an education. Rather, providing a specific example, as requested by the parent.
P.S. Tuition was not as high as some schools, but it wasn't cheap. However, a majority of the population received aid (often significant) of one sort or another. If you experience "sticker shock" when shopping around, realize this and, if a school interests you, apply and see what happens. (Although it's been some time since I was there, and education costs as a percentage of income seem to have grown more and more out of scale, in general.)
Also, while that college had many excellent areas and faculty, they also had their not so good areas and some particular lemons. You can't just look things on a school level; you need to consider particular programs and departments, where you have strong interests. At the same time, often part of the liberal arts experience is figuring out just what major you actually want to pursue, so don't feel certain that your interests going in are going to remain constant.
Finally, I should mention that the college paid fairly well and was in an area with low living costs and good schools for faculty children. Faculty also had decent resources and the ability to take leave to pursue personal work/research. Thus, it was able to attract good faculty. Further, they knew coming in that the institution's primary focus is education, not research. Your research need not suffer (then again, maybe many faculty were not of the most highly obsessed research-centered nature that also produces some "super stars"), but you were there first and foremost to educate.
This depends a lot on the person, the school and the actual teacher. While I believe that a high quality school like Stanford, MIT, etc will have excellent teachers and will teach you a fair amount, I have yet to encounter such people. I also believe some people are just better at figuring stuff out on their own than others, which is fine.
The places I went to didn't really have the passionate and good people you need for teaching imo. Sure many of these people can teach the basics, but once you get to a certain point a fair part of the students is actually a lot better than these teachers. You need more hackers, more highly skilled people.
I actually remember watching some of the Stanford video seminars and those courses seemed more appealing than the stuff I was being tought.
This depends a lot on the person, the school and the actual teacher.
Of course. But I'm making a point about what works for most people, most of the time. In this analogy, it's not necessarily a direct mapping from coach to teacher. If the coach is part of a large infrastructure, such as on a football team, then the mapping is more direct.
Teachers are only one benefit of taking an actual course. An established syllabus which has gone through years of iterations is another benefit - and this is often independent of the actual teacher. Another is the motivation. Taking a course is an investment of money and ego that self-study often lacks. People tend to be more committed to something they've invested in.
You have to realize that IRC, forums, mailing lists, etc are often just as good or better than some random-circumstance professor, and that programming and computer science are especially well equipped in this area.
Yes. I never encountered someone who actually could have (a) sold me a CS degree, then (b) coached me properly, until after the Web was invented.
The other point I'd make is that I went to grad school, and frankly in the technical subjects the professors are rarely the best coaches. Most of them have not been beginners for a long time, and their primary focus is not on how to relate to beginners. (Primary focus: How to relate to funding agencies. Secondary and tertiary focuses: How to relate to the rest of the department, and how to relate to grad students. Somewhere down near the bottom of the priority queue: Relating to undergraduates. Those profs who are primarily focused on teaching are absolute godsends, but are probably also having trouble getting tenure; such is the nature of undergraduate technical education at elite universities.)
The best coaches tend to be slightly-older fellow students. Ironically, the social structure of undergraduate classes is designed to segregate students at different levels of experience; the moral of that is: You must take steps to seek out older students who are willing to offer advice.
Yes, my Uni experience overall has been kind of disappointing, but the good classes with interesting teachers have been amazing. Also the motivation of having to study has got me further than I would myself.
The kind of teacher/pupil coach/athlete relationship you are talking about is expressly not what Universities have historically aimed to provide. A University gives a student access to resources (including mentors), and time to study, it _does not_ provide someone to continuously watch over you in the way you describe.
In fact, you are only really tested to see if you have improved once in an entire bachelor degree -- at the end of it.
There are tons of other books that could be there, too. Any "top X books for field Y" list is going to be a bit arbitrary, probably telling you as much about the people who wrote the list as the field itself.
That said, I'd also suggest:
* Concepts, Techniques, and Models of Computer Programming by Peter Van-Roy and Seif Haridi ("CTM"), which covers several different programming approaches. Not about different languages, but their underlying models, and ways in which they can be combined.
* The Art of Prolog, by Sterling & Shapiro - An excellent book on logic programming, using Prolog for exercises. (CTM also touches on Prolog, but this book goes quite a bit deeper.)
* _Lisp in Small Pieces_ by Christian Queinnec ("LiSP"). On implementing Lisp, strongly skewed towards Scheme.
* Paradigms of Artificial Intelligence Programming by Peter Norvig ("PAIP"). AI, problem solving techniques, Lisp practicalities and implementation, Prolog, tons more. Extremely lucid. (I wish it was a hardcover, though.)
* C Interfaces & Implementations by David Hanson - an excellent book on how to design C library APIs, including quite a few useful libraries.
Upvoted for the PAIP mention - Any book that can totally shift your conception of what programs can do within the first three chapters has to be up there. I know plenty of CS students from university that currently work writing software (I did Maths) who still look at me like some sort of he-witch whenever I do or suggest something data-driven as a solution to a problem, but it's that book that did it for me - it's almost a shame that the only people of my age likely to have read it are the lone "I code out of interest" types that are always on the look-out for a good mind-bending.
(the greater shame, of course, is that these people are less likely to find a satisfying job in the area than their seemingly uninterested CS-grad friends (grumble grumble))
I liked this list because it includes more books that I haven't read (and a few I hadn't heard of before today) than the last several lists like this posted to HN. The books look solid (I know of some of the authors) and the topics are well chosen.
Agreed. I think you could substitute a degree if you work through most books required for it.
After dropping out of mathematics, CS and physics studies (big mistake there), I've been working as a programmer for 10 years. But I routinely check out the curriculum at Universities to update my bookshelf. The problem is that while I will gladly work my way through SICP or CLRS, stuff like math books are different.
I often intend to work through math books (meaning: solving the exercises and working through the proofs), but this is a lot more motivational when you know you need to pass an exam in the end.
No list of books is going to substitute for years of interactive study, but if there is going to be a list, CLRS should be (high) on it. You might not need it to write a Rails app in 21 days, but you'll be a more enlightened programmer if you do.
yeah for a cs degree equivalent CLRS >> TAOCP as TAOCP is more of a reference manual on algorithms whereas CLRS is a new way to think about writing programs. Both have their place in your bookshelf though.
By the time I hit the second entry, TAOCP, i realized this list is a joke and save for some really smart people, no one else will gain much from pursing that book in it's entirety. Much better off with CLRS or even the first part of Algorithm Design Manual. The list is a classic list of books-i-wish-i-read-but-never-had-time-to.
I'm only about halfway through it, but it does seem like a decent intro to the math and CS concepts that will be needed for more advanced material. A CS degree program isn't all senior-level coursework.
The biggest problem with such lists is that unlike novels, academic Books are rarely read cover to cover.
If you try to read the book cover to cover you will most likely start forgetting it after few weeks. However when you learn things slowly over few years and interact with material in multiple ways, such as lectures, reading, test, internships, labs, group/individual project you are more likely to have some hint about the material, may be you will remember a lecture or some project or some lab experience, however in case of just reading a book its harder to recall.
A good process of learning involves not just you alone but also people around you who motivate you to stay on the course and offer assessment of your capabilities. Thus formal classroom education tends to be more useful than an online one. Though it depends a lot on your school and quality of your peers/ friend circle.
Absolutely! I once hired a MSc CS grad on a project and he produced some of the worst code I've ever seen, not even just a code perspective, which to some degree is understandable, but from a conceptual point of view as well. Some seriously bad stuff.
That said I still greatly value a CS degree (even a self-study one) simply because of the fundamentals it teaches. It's not an automatic indicator of ability, but having that level of understanding makes the difference between someone that can think conceptually about and around a problem and someone that has a set number of tools to solve problems with.
I don't think that getting a CS degree is the only way to get that kind of understanding, but I do think it's one of the easier ways. If you're a hacker on your own and you've got to trawl through the glut of bad coding books out there, it's tough to get a good education.
Though I firmly believe that if you're the kind of guy that has gotten that education without any help then you're probably better than the guy that got it with help.
I'm firmly in the camp that holds that an education is to educate you and provide you with skills and tools to operate effectively, not to obtain a certificate. Holding the certificate is not an indication that you have actually received an education, the only indication is your ability, ambition and results.
For what it's worth, I think the majority of the books on the list are must-reads for anyone in programming, there may be a few better ones (I'm a Tannenbaum fan when it comes to OS's as an example) and there may be areas that aren't covered, e.g. usability and CHI (Design of everyday things would be my suggestion there) and there is suspicious lack of anything web, mobile or distributed, but if someone internalises these, they'll definitely be better for it.
Um, Google might hire the occasional star w/o a degree, but you know that you're talking about a company who wants to see your transcripts in the interview process, right? So, Google's clearly not an example of the kind of company that doesn't treat degrees as a requirement (in the overwhelming majority of cases).
BTW, I agree that it's not a good hiring filter (I know a lot of folks who can't be bothered to apply to FB or Google because of the insanely long/tedious recruiting process), but it's pretty common practise, even in pretty high-performance tech companies.
a company who wants to see your transcripts in the interview process
Sure, if you have no work experience. That's the case everywhere.
(Google is highly hype-oriented; not everyone there is Guido van Rossum. I worked at a company that Google bought. I had a coworker who started crying when my boss and I taught him what database transactions were and asked him to apply it to fix a race condition in our application. He still works at Google.)
There's a big difference between "requirement" and "taken into consideration". Some companies will refuse to hire people without degrees (so I hear at least), but Google has no such strict rule. They do consider your transcript as part of the hiring process because it does have some non-zero amount of signal in it.
I'd add a few that might be a bit dated, but I still think they're still great today:
Introduction to Algorithms - CLR(S) - other people already suggested this.
The Soul of a New Machine - feels old now, but it's still a fairly well-written glimpse into real-world (hardware) projects, or at least where we came from. Ahh, maybe it really is too old now to be that educational, but it's a good read.
Programming Pearls - I think this book still teaches as much practical knowledge about the field than you could get in 5-10 years. If you really "get" everything in here, you should be well on your way to being a super-star code hacker, if that's what you want to be.
In my opinion, this book is practically a must-read for anyone living in our increasingly computing intensive world, not just for aspiring computer scientists. It has both depth and accessibility, starting with something familiar in concept to many people (Morse code), and slowly building more and more ideas toward the final realization of a workable computing machine. Great book.
No Discrete math book either. I wouldn't call anybody a "computer scientist" that didn't have a good grasp of discrete math. Though I suppose you can't make it through TAOCP without picking up some discrete math.
Also, does anyone else think listing TAOCP as one book is a cop-out?
It's not even a cop-out, it's just ridiculous. TAOCP is basically a reference book -- no one actually reads through the entire thing like a textbook. TAOCP can be a good companion to other things but I wouldn't attempt to read it 1) in exclusion and 2) as a substitute for a CS degree.
Also, no K&R?? How will you make it through OS design without K&R?
The latter. In my experience, the fundamentals that this list covers are 'the hard parts' in terms of a certain kind of understanding and sort of intellectual challenge: most things more 'applied' beyond this point are taught poorly if at all in CS, and learned more readily in the 'real world.'
Why? That sounds like a complete waste of time to me.
PS: I have a CS degree and I have written a fair amount of low level networking code, but I have no idea how that helps someone understand networking on either a practical or theoretical level. But, if you feel it was in anyway useful I am all ears.
If you can implement it yourself, you understand it at a much deeper level than if you just read about it. This is why CS students still implement their own basic data structures (linked lists, hash tables, trees) in the freshmen and sophomore level classes.
In CS how something behaves is far more important than how it's built.
For example one of the most surprising things to me was the fact that all programs built on top of TCP/IP still need their own messaging format because a packet can be split in transport. The header information says almost nothing about the original message sent, just enough information to send a reply up the chain and rebuild the message.
As to linked lists, the speed that fragment virtual/physical memory is in no way obvious from their source code. Build one in C vs Java and they behave vary differently even if the code looks similar.
PS: I really prefer CS projects that require some thought. Quickly sort this 50GB file requires a different mindset than simply, build a linked list library. IMO, build a linked list library is really a lesson in using pointers and tells you vary little about data structures.
I don't disagree with anything you said, but most people need the "implement this data structure" project first so they can understand what they're doing. Then you can give them a more open-ended project.
Well, I did, but I helped to write a kernel networking stack. Not really common development. Still, I think it's a fundamental thing everyone should understand. Most people never really have a use for writing a kernel memory allocator but it's still important knowledge to have (especially in systems development).
My choices would have been different, with general topics: data structures, automata theory, programming languages survey, systems programming, algorithms, network programming, database/datastores, and AI ("Artificial Intelligence, a Modern Approach").
I have mixed feeling about compiler theory, and left it off of my list. Some may question including systems programming.
The Turing Omnibus leisurely covers a broad range of important and often forgotten topics. It's a great book. It will give you a good overview of CS, and then you can go deep at your choosing with other books.
I loved the first chapters in Bentley, but then I thought the novelty wore down. Maybe I'll take a new look at it too.
The list is at the same time too little and too much. Too little, because it misses on fundamental subjects like computer architecture and algorithms (modern algorithms, which are heavily graph-based). Too much because those books contain lots of in-depth information that is not required, unless you're really, really passionate about the field. And some parts are simply not very relevant - e.g., Knuth tells you at length how to implement (in assembly!) algorithms that are very specialized and you normally draw from a library (plus the fundamentals of assembly are not exactly the same on today's multi-core, speculative execution machines).
Higher education is over-rated. If you can read and write, there is no reason why you can't pick up a book and learn something new yourself. Yes, your mileage may vary in performance, but how is it any different from IRL education?
The problem is that a lot of people don't learn how to learn until fairly late in their education. Whatever clarity of thought and healthy skepticism I have developed, I give most of the credit to the great teachers who challenged me. It is misguided to tell most high school students to go and learn completely by themselves. Disregarding the motivation that school brings, someone that opts instead to study alone in their room runs the risk of fooling themselves -- the risk of not really getting the point, or not asking the right questions, or being just plain wrong (for long periods of time) without even realizing it.