Since I’m starting my PhD this year, I have been reflecting on how I would be different if I went back in time and started my degree all over again. I am also continuing tutoring, in my 4th year, and I have been occasionally approached by students and asked for general advice with their studies.
I repeat the same advice to most students, so I’ll attempt to distill it into the points below. Bear in mind that I am writing from a Computer Science perspective, although some of the advice can be applied to any field.
I didn’t do most of this stuff during my undergrad years. I still did well, but I think I would have had more fun if I followed this advice. If you’re not doing all the stuff on this list, that’s okay. Come back and try again later.
Here’s the advice in no particular order:
Decide to get Good. I know a lot of students who aren’t sure if they are in the right degree. Computer Science isn’t for everyone, but if you are far enough in (> 1 year) I recommend riding it out. I even had my own doubts; While programming was a hobby for me prior to uni, most subjects at uni left me disappointed. When I started searching for parts of it that interested me, I found it much more creative and fun.
After your degree, you can do Masters in something else, and it will only take 1.5 or 2 years. Or you can study other things in your spare time. Don’t bite off too much though…
Supposedly it takes 10,000 hours to become an expert at anything, but after that I bet it is faster to become an expert at other things; many of the 10,000 hours you spend will be self-learning that can be applied to the next.
Learn More Languages. Everyone gives this advice, but they usually suggest it because it will give you a perspective on different ways to do things. I think you should learn Python (or Ruby) in order to remove the friction from learning (try the book Learn Python The Hard Way by Zed Shaw).
Python has been dubbed “executable pseudocode”, so this will help you when reading algorithm books. They are both dynamically typed, which means you don’t have to tell the computer when you are talking about a number vs a string. They also come with an interactive shell where you can test ideas and easily enter/modify examples from books.
Since their syntaxes are C-like, you can start your assignments in one of these languages, and easily translate it by hand to Java or C. Build one to throw away (thanks, Fred Brooks) so you can learn about the pitfalls of the problem before you have to deal with pointers or boiler-plate code.
Lisp is also recommended. It can be daunting to choose a dialect when you know nothing about it… Just learn Scheme (you can learn Common Lisp or Clojure later). There is really amazing free material that you’ll probably want to read or watch at some point anyway. It will be less practical for your uni years, but will give you a depth of knowledge that will carry you through your entire career.
Oh yeah, and learn and use regular expressions the next time you need to process text.
Manage Your Time. Okay, this is a no-brainer, but I still didn’t do it that well. The day you get an assignment, put it on your calendar and set a reminder. After you’ve done that, start working on it right away.
Remember, you aren’t committed to whatever you write down, until you hand it in; once again, build one to throw away. Even a mind-map or just writing headings can help a lot. Inevitably you’ll rush it at the last minute, but having previous work to reference rather than a blank page is so much more comforting. I’ll write more productivity advice in a later post, so keep checking back.
Read! I don’t mean the prescribed text-book – I only read a few of those, and sometimes they are only recommended because the lecturer is somehow invested in it (don’t get me wrong, some are great, but you’ll find out about those books anyway).
I recommend starting with The Pragmatic Programmer; It’s nice and small, very practical, acclaimed, and it will point you in the direction of other good books to read when you’ve finished.
Sharpen Your Tools. Here are some tools that will help you make learning an enjoyable process:
- Get a laptop. I feel bad saying that coz it will cost you money, but it really helps to have your coding environment ready to go.
- Use Unix. I only did this after I switched to Mac OS X, but there are free alternatives. It’s just a nicer environment for coding. It will also reduce the amount of time you spend on games.
- Use Git and GitHub. Often, I would try to fix a bug in an assignment only to introduce more. Sometimes I would make backups of the project folder, but this was usually confusing and has led to me losing major chunks of work. Every project you do should be on GitHub to help you manage this, enable you to have pride in your work (by displaying it publicly), and having an off-site backup.
- Start learning Vim during a break. It has a steep learning curve, but will make you faster in the end.
Start Your Career Early. Another thing I didn’t do. Here are some things you can do to help you hit the ground running when you finish uni:
- Contribute to open source. It looks good on your resume, and (as japerk commented) will help you learn about real world programming and software in the wild. You can find beginner-level bugs on openhatch.
- Maintain a resume and apply for jobs (even if they are out of your league). Worst-case, you don’t get it, but it will may help you spot holes in your knowledge and experience (failing a Google interview was a big reality check for me). Best-case, you get relevant work while at uni.
- Tutor people. Studies have shown that we learn best when we are teaching.
Don’t Forget: People Matter! It’s easy for a geek to forget this, but I think it’s the lynchpin to good education.
The friends you make, even if less intelligent, will drive you to do Computer Science for fun. They will either show you the cool stuff they learn, or challenge you to do better than them. But it doesn’t stop with your classmates.
- Write a blog. This will refine your communication skills, but I still get emails from people thanking me for my (simple) nanosecond time wrapper. It’s fun and rewarding. If you are having trouble maintaining it persistently, email me and I’ll tell you about a relevant project of mine that might help…
- Tweet about your programming interests. This will build a network outside of uni, that will remind you why you like doing this. Follow me on twitter: @alexbowe :)
- Email your idols. It can be really helpful and exciting to get a response from someone whose blog you read, or who has written a book or paper you read. This really helped me with my thesis last year. It might also give you something to blog about ;)
To me, these are the most important pieces of advice to take while studying (or as soon as you are ready). Criticism, suggestions, and comments of any other type are welcome, as always. It’d also be cool to hear about things you think paint CS in a cool light for students (The game of life is one example).
For more blog posts on similar matters by much better writers and programmers than me, check out:
- Eric Raymond – How To Become A Hacker
- Paul Graham – Undergraduation
- Paul Graham – More Advice for Undergrads
- Joel Spolsky – Advice for Computer Science College Students
- Quesiton on Stack Overflow: What is the single most effective thing you did to improve your programming skills?
- After The Pragmatic Programmer, try The Passionate Programmer. If you want a good book to help you with your people skills, try How To Win Friends And Influence People. Coding Horror and Stack Overflow have great book recommendations too. And a list of FREE books. ↩
- Too many great blogs to list. Start at Hacker News and you’ll soon find some great blogs to follow. Theres also a recommendations thread there already. ↩