Hacker Newsnew | past | comments | ask | show | jobs | submitlogin
Ask HN: What if I missed the good stuff in my undergraduate education?
45 points by mcantor on Aug 16, 2010 | hide | past | favorite | 46 comments
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?




Start with "The Elements of Computing Systems" by Nisan and Schocken. It's a book built around the goal of designing and constructing a computer from the ground up, starting with hardware design and ultimately writing the compiler and virtual machine for a simple Java-like language that runs on the computer you designed. You can download all the software necessary; all the software and support material work very well, and it's ideal for self-study. I think it's a great book; you can read my full review on Amazon--it's the only book I've ever been moved to review there.


This does seem like a great book. I haven't read it, but I did enjoy the google tech talk, "From Nand to Tetris in 12 steps":

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.


I forgot to mention: the book has a web-site at http://www1.idc.ac.il/tecs/ where you can download all the projects and software and some of the chapters of the book in .pdf form.


This is a great book, although before you get started with this one, I would recommend this other one for a quick hands-on intro to compilers and interpreters: "Writing Compilers and Interpreters: A Software Engineering Approach, 3rd Edition," by Ronald Mak. If you've never had much guidance on the subject, writing a compiler for "The Elements of computing systems" could take an unnecessarily long amount of time your first time. Mak's book is in Java, which might be a plus in your case.


I am very interested in compilers / interpreters and I think this book would be ideal. Have you read this book?


I also like "First Draft of a Report on the EDVAC" which essentially goes into thinking sort of questions that we today take for granted. For instance: 1) What arithmetic operations should one put into hardware ? 2) Do we really need main memory ? 3) How should I/O look like ? Fascinating read.


Agreed, this is a great book. I'm working through this right now and finding it very rewarding. It's very information-dense, has very little fluff, and is still surprisingly easy to work through.


I second this, and it's a surprisingly inexpensive book, to boot.


Anyone knows where I can order this book in india? I checked and couldn't find it in any of the major book shops or libraries. Amazon is not an option coz I cannot pay for the shipping. Any other ideas?


This book is available in India as Easter Economy Edition. Rs. 390/-. You can order from infibeam.com


nbcindia.com has it for Rs. 1323 with free shipping in India, but it takes 20-30 days.


It's worth the wait. This is a timeless book; its contents will not become obsolete.


There's too much cool stuff in the world to be able to do all of it. You need to pick something that extends what you know and helps you to accomplish something you can't yet do.

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.


I appreciate your argument, but I feel like you missed an important motivation behind my question. You see, I'm worried about unknown unknowns. Once you know enough about a subject to choose an itch to scratch, you don't have to think about the difficult foundational subjects like compilers and AI. But before you get to that point, there are too many unknown unknowns. Like Yegge's perennially disappointing interview candidates, we can't say "grep" instead of "a 2,500-line state-machine in C++" if we don't know that grep exists. It's an unknown unknown, and while I know what grep is, I don't really know what happens under the hood when it comes to syntax trees and machine learning, and since they are foundational concepts of my field, I feel like I need to dive into them as soon as I can, to make everything else I do more informed and efficient.


In that case, read, but don't try to understand in full and complete depth, a few books. I would suggest:

* 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.


Books. Pick a topic you feel you missed, find a good (possibly "classic") book on it, and study in your free time. Work exercises. Build little test projects based on the material. There's lots of information on the web, but I still find to learn these sorts of topics deeply, you often need a good book.

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.


If the OP hasn't read Structure and Interpretation of Computer Programs yet, that would be a great one. It takes you all the way from adding numbers together to writing a compiler for a virtual machine. There's a reason it's a classic. Also, it's online:

http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-4.html


Hi! I'm actually in precisely (100%) the same situation - and actually one of my friends asked if it's not me who wrote this post (that's how i got to know about it originally). I'm not a "so-cool" programmer, but what i have noticed:

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]


I have a similar, but slightly different issue. I also have an undergraduate degree, and I did take courses in operating systems, compilers, and algorithm design. The trouble is that I don't remember anything. I remember taking the courses, but there was a huge amount of information that got shoved into my head and remained there just long enough to pass the exams and now it's gone.

This 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.


> The trouble is that I don't remember anything.

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.


Thanks for that, do you remember where you read it?

Feels a bit strange to ask you to remember a book/article about memory but sounds like a great read.


Actually, I do - had to quickly glance through the book to confirm it though.

The book is this: http://www.amazon.com/Your-Memory-How-Works-Improve/dp/15692...


"I remember taking the courses, but there was a huge amount of information that got shoved into my head and remained there just long enough to pass the exams and now it's gone."

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.


> The trouble is that I don't remember anything. ... [If I came into enough money] I'd probably repeat my undergraduate schooling.

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.


We often get great lists of books posted on Hacker News. I wonder if there is a good resource for canonical books in those subjects floating around somewhere. I don't trust Google to tell me what to spend such a potentially huge amount of my time on.


Do you have a university near you? If you can get into their library (or even their bookstore), you can take a look at the recommended books yourself and see if they suit you. You can also get the book lists from university courses that interest you.


A few days ago I saw a link to a "roadmap" for Rails (http://techiferous.com/2010/07/roadmap-for-learning-rails/). It'd be nice if someone put together something like this for a rigorous and practical computer science skill-set.


What you're asking is, basically, "How do I continue my CS education?" Consider getting a Master's in CS. If you do it full-time, it will take about two years. Since you know what you'd like to learn, you can check schools to see what kinds of graduate courses they offer. How much prior exposure you need to areas depends on the course itself - not just where you're taking it but who is teaching it.

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.


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

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...


The point of an undergraduate education isn't to learn stuff, it's to learn HOW to learn stuff. Having a knowledge base in a particular field is only a sometimes-useful side effect.

If you can't learn that stuff on your own now, then you failed at college. More college is not the answer.


I couldn't agree more. Every time I see a question like this, I have to hold back a rant. What, didn't they teach you to read at your liberal arts college? How many classes do you have to take before you see the pattern? Here's the syllabus, read the book, go to lectures that rehash the book (except for the occasional, exceptional class), do some exercises, review for a mid-term and a final? Don't know what book(s) to read? What, didn't they teach you to do any research, or use Google?

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.


> ... you see the pattern? Here's the syllabus ...

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.


The point of an undergraduate education isn't to learn stuff, it's to learn HOW to learn stuff.

In that case, what's the point of a high school education? ;-)


Why do you want to lean compiler design (or any of the other topics you mention)? Are they directly related to your job/career path or just hypothetical areas of interest?

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?


The post mentioned in the OP (http://news.ycombinator.com/item?id=1608129) mentions some cases where knowledge about how compilers work would be useful and offers a warning about what may happen to those without this understanding:

"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.


If one is dedicated enough, I think the best way to go about it is picking up textbooks (make sure to pick the good ones - reading reviews on Amazon) and powering through them.

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)


The most important thing I learned from university was learning how to learn. I'm a developer who majored in Electrical Engineering and the computer science related topics I'm picking up via courses here and there and lots of reading.

I don't know where you are but you could try taking courses over weekends as well if they offer them.


There are some great courses available on the web, in the form of video lectures. MIT's OCW courses most notably, but many other CS departments have similar offerings. They might provide a bit more structure than self-study via texts, while giving you more flexibility than night classes.


ArsDigita University has full lectures most core CS subjects. Shai Simonson's discrete math, algorithms, and theory of computation videos are great.

http://aduni.org/courses/

http://mgccl.com/2008/04/06/aduni-videos-now-on-google-video


does your employer offer any tuition benefits? maybe you could pick up a night class on their dime :)


This is always a great option, and actually I'm looking to go the other way. I studied a whole lot of computer science during undergrad and feel I missed out on other disciplines.

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.


Check out the computer science section on http://www.academicearth.org.

Most top computer science programs put these courses online for free.


You clearly missed the point of your liberal arts education. How sad.


Whoa, whoa, whoa! Slow down there, cowboy. Just because my education was deficient in one way doesn't mean it didn't make up for it in others. I'm incredibly thankful for my liberal arts education; it turned me into the happy hippy I am today. Do I have some frustrations and regrets in terms of the things I missed? Absolutely. But that in no way prevents me from appreciating the things I did learn, which were numerous and profound.


good to hear; my apologies for the negative note. contextually, far too many people consider a liberal arts education irrelevant and we are producing generations without a grounded understanding of critical or contextual thinking-- or an appreciation for beauty. easier to get that studying Spenser than code, I'd argue.


On the other hand, I found it easy enough to get that in high school and then on my own at the local book shop.




Consider applying for YC's Fall 2025 batch! Applications are open till Aug 4

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: