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.
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.
/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.
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.
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.
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.
The success found in coaches for people who are already talented at their craft often centers around motivation and challenging that person to become even better.
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.
In fact, you are only really tested to see if you have improved once in an entire bachelor degree -- at the end of it.
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.)
* The Lambda papers - http://library.readscheme.org/page1.html
* _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.
(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))
If PAIP doesn't get you into data-driven programming, _The Art of Prolog_ definitely will.
Prolog and Natural-Language Analysis, Fernando C. N. Pereira and Stuart M. Shieber
Clocksin's _Clause and Effect_ would definitely be the _Little Schemer_ of Prolog. (No elephants or PB&J, though.)
A CS degree includes math, science, a range of CS electives (e.g. database theory, networking, algorithms) and non-CS electives (e.g. writing, philosophy).
Plus, you have graded assignments, lab exercises, supplemental papers, and interaction with teachers and fellow students.
Those two areas, possibly along with linguistics (data mining again), were much more useful to me than the programming 101 type courses.
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.
Don't forget Okasaki's _Purely Functional Data Structures_, though. CLRS's coverage of persistent data structures is pretty weak.
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.
i doubt that a hospital will hire you just because you read all the "books that will substitute for an M.D."
yes, i know that programming skills can be more easily self-taught than, say, brain surgery, but as long as companies hire based on degrees, there isn't really a 'substitute'
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.
Sure, but do you really want to work at a place like that?
Yeah, but what company that's still in business has this requirement? Not Google. Not Microsoft. Not any banks (that I know of).
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.
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.)
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.
Also, does anyone else think listing TAOCP as one book is a cop-out?
Also, no K&R?? How will you make it through OS design without K&R?
#2 on the list, The Art of Computer Programming by Donald Knuth, covers those.
Those are just the project sections, there are of course formal exams for the other fundamentals of networking.
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.
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 have mixed feeling about compiler theory, and left it off of my list. Some may question including systems programming.
Add in also the benefit of exploring with one's peers in a free environment.
The idea that reading a selection of books is an effective substitute for an undergraduate education is a damning comment about the state of CS programs. As an actual effective substitute, no.
Another one that has spent time on my night table is "The Turing Omnibus: 61 excursions in computer science" by A.K. Dewdney. Varied, clever problems in dazzlingly plain language.
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.
I found the Patrick Winston text a lot nicer.
The Elements of Computing Systems: Building a Modern Computer from First Principles by Nisan and Schocken
-Algorithms & Data Structures
-State Machines & Computation Classes (NP-Complete, Turing Machines, Regular Languages, etc)
-Physical Computer Architecture / ASM
And then some other recommened topics:
-2D & 3D graphics
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?
If you're going to substitute anything for a CS degree, just get out there and build something.