
Ask HN: What if I missed the good stuff in my undergraduate education? - mcantor
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.<p>Two problems: I have a full-time job and student loans now.  I can't really do the undergraduate schooling thing all over again.<p>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?
======
jsyedidia
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.

~~~
rick_2047
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?

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

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

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

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

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

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

~~~
pjscott
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>

------
madmadwiz
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]

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

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

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

~~~
Arun2009
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...](http://www.amazon.com/Your-Memory-How-Works-
Improve/dp/1569246297)

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

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

~~~
ben1040
_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...](http://studentaid.ed.gov/students/publications/student_guide/2009-2010/english/postponeloanpayment.htm)

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

~~~
mian2zi3
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-...](http://blogs.law.harvard.edu/philg/2004/10/02/what-would-an-ideal-
computer-science-education-look-like/)

Oh, wait. Holding back a rant. I guess I didn't this time.

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

------
dotBen
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?

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

------
sharvil
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)

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

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

~~~
corey
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>

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

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

------
porter
Check out the computer science section on <http://www.academicearth.org>.

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

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

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

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

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

