Undergrad
I’m in the last three weeks of undergrad, which makes this the perfect time to reflect on the past few years. I am a firm believer in having regrets, because to regret is to have learned something from the past. Imagine a life with no regrets. That means you were doing everything exactly right from the start or you still have yet to learn what you have done wrong. Which one seems more likely?
Regrets
Research/Side Projects
One of biggest regrets was being too focused on classes, particularly at the expense of exploring side interests. Scott Fahlman calls this the 4.0 disease. Dave Anderson gives similar advice:
I wish I could advise entire generations of prospective Ph.D. students to spend more effort going deep into something that really interests them – research, a startup, something – and less time “doing well in” every class under the sun. The depth is where you get to shine and to differentiate yourself, and to find out if it’s something you like enough to devote 4-6 years of your life to. It’s also where you get to show that you can do things on your own, where you have to think creatively, where the answer isn’t known in advance and might not even exist.
It was very hard for me to justify working on something for the next few hours that will in all likelihood not lead anywhere, over a class assignment that was due in three days. Looking at this from an optimization perspective, I was consistently stuck in a local minimum and was not exploring the search space fully. Simulated annealing might have been a better strategy.
Required courses
I decided I was a systems guy way too early. I am still very much interested in software systems, but I wish I had more time to learn about complexity and computability. I did not look forward to doing my required complexity elective, but it has opened up a whole new world and way of thinking. There is a reason it is a required category. Professors wiser than me have made it so, and for good reason.
Courses Not Taken
I specifically regret not having taken Principles of Programming Languages. I hear of this fabled type theory, and how programming languages are type systems, but know nothing of it. Also Parallel Computing, which seems like it will only become more important.
Web Development/Being Professional
If I knew how small a part of the world of software web development actually is, I would not have spent so much time worrying about learning it outside of class when I was starting out. It is a very practical and useful skill though, but definitely not something worth stressing over. Also, in general, I would say learning fundamental things is more important than learning “professional things” (e.g. interviewing skills). All these always take up too much mindshare than they are worth, at least in software. Things might be very different though, if you are trying to transition into software, not having studied it for four years.
Non-regrets
Personal Exploration
Taking some time off to re-center and evaluate higher goals is always worthwhile. I do not regret that one semester where I dropped most my school work to explore. In the midst of the daily grind of existence, it is sometimes nice to stop, look around, and appreciate the beauty. That makes it worthwhile.
Internships
To counterweight what I said about learning fundamental things vs “professional things”, I think everyone should do at least one internship. It is always useful to have real-world perspective on things.
Not taking easy courses
I always tried to take hard classes that I was interested in. And I also tried (almost always) not to take easy classes just because they were easy. I think a better metric would be effort-to-reward ratio. Instead of looking for easy classes to balance out hard ones, better to look for classes with good effort-to-reward ratios.