Ask HN: What if I missed the good stuff in my undergraduate education?
I was reading Steve Yegge's recent post on learning about compilers, and, as I'm sure is true for many HN visitors, the post resonated with me in a couple of unsettling ways. I have my undergraduate degree already, but my education did not include AI, OS, compilers, distributed computing or algorithm design. (That's what I get for going to a hippy liberal arts college.) It wasn't as bad as what Yegge described as a "Java certification program," since I came out of it knowing a lot of real-world skills like version control and command line use. However, I still consider the lack of things like compiler construction to be unacceptable gaps in my skillset.
Two problems: I have a full-time job and student loans now. I can't really do the undergraduate schooling thing all over again.
What's the best way to pick up these skills post-undergraduate degree? Should I take night classes at a graduate school, or will those curricula assume prior familiarity with the subjects I'm trying to learn? I already purchased "The Unix Programming Environment" since it seems to have some good basic information about lex and yacc, but is just the tip of the iceberg. There's only so much one can learn through years of Googling and reading the odd Hacker News post. What are my options, really?
47 comments
[ 3.3 ms ] story [ 108 ms ] threadThis is an enormous pity, because it's only now, years later when I have a full-time job and not much time, do I realize what I missed.
If I won the lottery or somehow came into enough money ('fuck-you' money, I guess), I'd probably repeat my undergraduate schooling. However, there are a couple of options that you and I might have.
The first thing to remember is that no matter whether or not you take a formal course, you'll probably be reading some good books in the subjects that we're interested in. There are lots of lists of good, solid introductions to the subjects that we are interested in.
The second thing is that we'll have to make time for the subjects that we're interested in. As working people, we don't have the luxury of spending all our free time on a given subject, but unlike undergraduates, our attention is not necessarily divided over several subjects. In my last year of undergrad, I was taking plenty of courses and it's perhaps not surprising that I forgot so much. Now we can choose one subject (like compiler design), and focus our free time (however little) on it.
A third option is a sort of middle-ground. Is there a local university to you? Most universities allow you to take undergraduate courses as a continuing student. We have our degrees, we're more interested in the knowledge that the course can give us than the credential that the course grants us. The course would grant us the structure and discussion we'd benefit from as undergraduates, while not completely monopolizing our time.
I read somewhere that our long-term memory has unlimited capacity, and there are basically three ways of measuring your memory:
- Recall: see whether you can recall the pertinent facts.
- Relearn: measure the time it takes for you to relearn the topic.
- Recognize: see if you can recognize key points in a previously learned topic when it's presented again to you.
Most people when they claim that they "don't remember anything" only refer to the recall-metric. But I bet that if you try to learn these ideas again, it'd take you much lesser time that it'd for a complete newbie => you haven't really lost everything you learned. It's just dormant.
Feels a bit strange to ask you to remember a book/article about memory but sounds like a great read.
The book is this: http://www.amazon.com/Your-Memory-How-Works-Improve/dp/15692...
I'm sure there's a more technical term for this, and to some extent this is my personal experience, but: In general, to learn something you need a "hook", some information "nearby" that you have mastered and the new thing you are learning is just an incremental step from. It is very easy in a school environment to be pushed along at what is a bad pace for you, miss one of the "hooks", and be screwed for the entire rest of the course.
However, as long as you didn't entirely disengage, you will probably find if you go back and cover the topic again yourself, you will end up learning it faster the second time around that you would if there was no first time around. I have found in my experience that literally just re-reading the chapters I had "covered" before and combining that with the subsequent years of experience in the field would suddenly make it go "click".
In fact, when learning a new skill or field of knowledge from a book, this is deliberately how I learn now; read as much of the book as I can possibly stand, then go back to the beginning and start over. It sounds like you're wasting your time, it is actually quite time-effective, though there's a bit of art to the "as much as I can possibly stand".
If you still have your books, try just re-reading. If you don't, get some textbooks and try again. You might be surprised.
I would not recommend actually trying to go back and re-take a course; it is very likely that that will be a waste of time vs. this plan, unless you were so utterly lost that you truly learned nothing in which case somebody was negligent for letting you pass at all. At the very least try this first; it doesn't even have to take that long.
I agree with other posters that you'd relearn the material faster, and this is a kind of remembering. I'd also add that you've probably internalized concepts and skills from your undergrad that you don't consciously realize or connect to your education.
What makes you think it would be any different the second time around? (Except that you might retain more having seen it once already.) I don't mean this as a challenge. I've had similar feelings in the past (How can I hold onto this? Why am I forgetting so much?) and I've gone back to school recently and I've struggled with learning how to learn in a better way. It isn't an automatic slam dunk.
Yes, it's possible to design a language, implement a compiler, write a kick-ass AI, but it's all a long way from where you are (I assume) and while rewarding in the long run, will take ages to get there.
Instead, scratch an itch. Do you have a web site? Do you have an idea for a facility you can provide people? Can you write CGIs without a framework?
I can't tell you what to do - no one can really - but you need to think about what you might like to do.
Then do it.
* SICP
* The Dragon Book
* Programming Pearls
* The Elements of Computing Systems
There's a shed-load of good stuff, and no doubt others will suggest more.
http://video.google.com/videoplay?docid=7654043762021156507#
However, the poster already has an undergraduate degree in CS. I imagine he knows much of this material already. There is story that Kazhdan (a mathematician) would, pointing to a book, tell his graduate students: "You should know everything in this book ... but don't read it!" I haven't figured out how to do this in mathematics (yet), but here is what I would do in CS: buy a $200 Xilinx FGPA kit (or write a hardware simulator), design a CPU, build a compiler and design an operating system for it. When you get stuck or need help look up references, read tutorials, talk to mentors, go online, whatever, etc. You're going to encounter all the same challenges if you read a book like this or take a class, but this way you'll own the problems that come up, and your solutions, rather than having them spoon-fed to you by a teacher or book.
http://aduni.org/courses/
http://mgccl.com/2008/04/06/aduni-videos-now-on-google-video
I'm taking a course in creative writing on my employer's dime this fall, and hoping to try out an intro course in a couple languages over the next few years too.
If AI is your interest, one valuable resource I've found is searching the MIT Press online store for interesting-looking books (most of which are high-quality), and then searching Amazon for a decent used copy. Built up a nice AI library for dollars (or cents) per book.
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-4.html
This is not your only option, and many other commenters have presented alternatives.
Regarding student loans, my understanding is that once you're a full-time student again, payment is again deferred. This might even be true if you're a part time student - I recall a Master's student saying she didn't have to make loan payments even when she enrolled in a community college course, but check to make sure that's correct.
This is correct, at least for Federal student loans in the US (Stafford, Direct, Perkins). So long as you are attending at a half-time basis or more, your loan payments are deferred. Interest does accrue during these deferrals. However, if your undergrad loans were subsidized when they were originally taken out, the government pays the interest while you're back in school so your total indebtedness won't go up.
See the table toward the bottom of this page:
http://studentaid.ed.gov/students/publications/student_guide...
I have no college education and no formal CS training and I've done fine in the industry (12 year in it). I learned to program C at 13 from books and I learn what I need that is relevant from the internet and code samples. Stuff like compiler design which would purely be theoretical for me I don't let it bother me.
(I mean, at an abstract level I can work out how my code is converted into machine code/byte code but I couldn't write a paper on it).
Wouldn't it be worth spending the study time on learning the bleeding edge of development instead, like node.js or map-reduce if you are going to self-study?
"In fact I used to ask candidates, as a standard interview question, how they'd find phone numbers in a tree of HTML files, and many of them (up to 30%) chose to write 2500-line C++ programs as their answer."
Not that this necessarily describes you (since I don't even know what you work on), but I've heard it said (here, I think) that if CRUD is all you know, CRUD is all you'll ever do.
Most top computer science programs put these courses online for free.
I think most things I learnt in undergrad were just plain fun! pure, unadulterated stream of "Good Ideas!"
I don't know where you are but you could try taking courses over weekends as well if they offer them.
If you can't learn that stuff on your own now, then you failed at college. More college is not the answer.
In that case, what's the point of a high school education? ;-)
Worried your education is incomplete (How could it not be?) or unknown unknowns? Do some research! (Research? Again?!) Every CS program in the world has their curriculum online. See what they think you should be learning. You had to pick classes, right? Didn't you consider the options then? Find discussion of CS curricula. This post by Philip Greenspun springs to mind:
http://blogs.law.harvard.edu/philg/2004/10/02/what-would-an-...
Oh, wait. Holding back a rant. I guess I didn't this time.
I didn't mean to say that's the best way to learn. But it is certainly A way to learn, and one that should be (utterly) familiar to you.
There are quite a few resources out there though to supplement the textbooks, like course websites, old exams and opencourseware (MIT and Stanford have some amazing videos on iTunes U, Berkeley has a channel on YouTube)
1). All the things are good - till they produce something. In other words (if your job is not very special) - you won't be using tons of different algorithms. So learning only a few most common is simply PERFECT!
2). For all the "hard-times" buy a handbook with things that you think you might need in future (for me it's whole series of Graphics Gems :)
3). To get some grip on what you missed - try the MIT Video Courses. They have an "Introduction to Computer Science". The course is very cool and easy to follow, and should cover some of your gaps.
5). Yeah, five! And the most important - trust yourself and do LOTS of free-time projects. You heard me right - LOTS! When? For ex. I have 30h of classes a week and 25h of work - and I manage. Means - you will also ;) And, wish you good luck! 8]