Ported over from the original document.
The mailing list announcement that started it all (23 August 2012): Link to thread
Early into the AY12/13 academic year, Prof Tay Yong Chiang organized a supper for Computer Science freshmen at Tembusu College. The bunch of seniors who were gathered there put together a document for NUS computing freshmen. This is that document.
Feel free to create a pull request to edit or add to it, and share it with other freshmen you know.
- Intro
- Contents
- Links
- Computer scientists or Programmers that you should know
- (Informal) Checklists
- Introductions to various specializations
- Learning Stuff
- Good/Interesting Courses in SoC
- Famous Books
- Good talks
- Seriously Good CS Lectures:
- Advice from Profs
- Advice from Seniors
You’ll probably want to start with some general advice written for undergraduates/beginners in Computing. Read:
-
Alex Payne: Letter To A Young Programmer Considering A Startup
-
What advice does Thomas Cormen have for a computer science undergrad in his freshman year?
The sites from which the above articles are available are generally good places to read from. Also, follow some Computer Science blogs and sites:
-
Paul Graham's Essays - Paul Graham leans towards startups but his earlier essays on programming, technology and work are worth reading. Particularly influential: Python Paradox and Maker’s Schedule, Manager’s Schedule
-
Joel On Software - Start by reading his Reading Lists on the right
-
Stevey's Blog Rants - Mostly entertaining, but there are a few articles that are required reading. In particular, the unofficial guide to getting hired at Google - which even Googlers refer potential hires to - Get That Job at Google and his tour of programming languages Tour de Babel
-
Coding Horror - Generally good, techy posts by one of the founders of Stack Overflow
-
Scott Aaronson: Shtetl-Optimized - Theoretical Computer Science
-
Lambda the Ultimate - Group blog that tracks innovations in Programming Languages research
-
Hacker News - Hacker News; just about everyone in computing reads it.
-
80000 Hours - The one-stop shop to explore the ideas around Effective Altruism: using your career to do good. Even if you are not interested in Effective Altruism, there are a lot of resources to guide you in the process of career planning. You are likely to keep coming back to these ideas through your career journey.
-
Farnam Street Blog - A blog maintained by a former Canadian spy who has summarized the kinds of mental models involved in learning and decision making.
-
Study Hacks Blog - Cal Newport, a professor at the Georgetown University and a go-to productivity guru, provides great tips to get the most juice out of your study time. Applies to technical and non-technical courses alike.
-
Scott Young's Blog - Scott Young is famous for his MIT challenge: learning the 4-year undergrad curriculum in 1 year. Of course, the curriculum he followed is not an exact mirror of the actual curriculum and there's some scope for doubt with regards to the evaluation for some of the courses, but the main point is that you will learn better through dedicated practice: pushing through a level of ability that is slightly higher than your current level with consistency.
Because we just have to have some hero worship, don't we? ;-)
Use the checklist below to get a rough measure of your knowledge.
-
If you have a Mac, start playing around with your terminal.
-
If you don’t, figure out how to install Virtual Box and then figure out how to install a Linux distribution on it.
-
Recommended ones are:
-
Ubuntu (Most user friendly?)
-
Arch Linux (minimal Linux distro. Good for those who likes to poke around and install stuff on your own. Not newbie friendly.)
-
Manjaro Linux (An Arch derivative that aims to be more user friendly than Arch; good if you want a more up-to-date distro without too much pain)
-
CentOS (Most battle tested, loved by sysadmins who treasure their sleep)
-
-
Unix is required knowledge. As is familiarity with the shell (figure out what that means ;-) (Also, figure out what
sudo rm -rf /
means before trying it out) (And:() { : | : & };:
) -
Learn an editor - either emacs or vim. They will save you a lot of time when you’re coding for CS2105. Actually, in pretty much everything else in life, as well.
-
Vim
- To get started, run vimtutor from the terminal, read:
- Finally, zhng your Vim according to Coming Home to Vim.
-
Emacs
- Get Emacs for your platform from the GNU site.
- Or google for more specific instructions for your platform. It’s always good to RTFM, and to go through an emacs lisp intro.
- Or get a quick head start with Emacs starter kits, in order of light to heavy:
-
-
💣 🔫 Pew! Smoking all the other editors 😉
-
Know some regex-fu.
-
Pick a project to trick yourself into learning new technologies. Drop by Hackerspace.SG
-
Attend NUS Hackers events. The club was created, years ago, by the same people who founded Hackerspace.SG
-
Intern.
-
Sign up for Google's Summer of Code
-
Work for a research lab for peanuts (only recommended if you really want to learn the techniques from that lab, or you want a career in academia).
-
If you need something to trick yourself into tricking yourself, take CS3216/CS3217.
-
Read code - lots of it - there’s a whole truckload of it available online
-
Learn and use version control. Thank us later.
-
For Mercurial - there’s a great guide written by Joel Spolsky.
-
For Git - read Pro Git chapters 1-5, and skip chapter 4. Come back and read the rest after you’ve used Git for awhile.
-
Set up a http://github.com account.
-
‘Follow’ a few famous programmers.
-
Start a few projects and show them off there.
-
Also, don’t forget to give back to the community. Contribute to popular open source projects by sending in pull requests on github.
-
Some awesome open source NUS projects include:
-
-
-
On making things...
-
Consider starting an open source project.
-
Build your profile, write your blog using jekyll with Github Pages for free.
-
You may also apply for a free github student account, check out here, applying using your NUS account makes it easier to verify that you’re really a student. Private repos are great for collaborating on school projects.
-
Hack for fun. Fun and pointless is better than unicorny and non-existent.
-
When in doubt, sketch out your problems. Diagram them. They'll usually be easier to break down and analyse after a few doodles. If that doesn't work, take a break.
-
Read The (um..) Fine Manual. [aka RTFM]
-
Question ALL your assumptions! eg. Does 'x' really hold the value I think it does here?
-
Before coding a single line, question your own mental model of the problem. Do you understand the problem? Do you understand the desired outcome?
-
Know the rules first, then see how you can break them.
-
-
CS1010S Programming Methodology (Python is damn cool)
-
CS1101S Programming Methodology (Functional Programming Paradigm )
-
CS3216 Software Product Engineering for Digital Markets ‘the Facebook module’: Multi-disciplinary approach to building web apps. Crazy workload (you’re expected to pick up new technologies and run with them in a week). Loads of fun. Not only for programmers.
-
CS3217 Software Engineering on Modern Application Platforms - ‘the iPad module’: CS3216’s twisted cousin. Programmers only. Highly interesting (and time-consuming) module where you will have to code a few iOS apps within a semester.
-
CS3233 Competitive Programming: An extremely tough module, suitable for anyone thinking of challenging themselves.
-
CS2104 Programming Languages Concepts - an excuse to learn Assembly, C, Prolog, Python, Ruby, Haskell, OCaml, Scheme and Oz in a single semester.
-
CP3108B (Mozilla) - Independent Project module. "The Mozilla module". Want to contribute to open source projects but don’t know where to start? Join it. ;)
-
Why limit yourself to modules? You might be surprised to know that SoC is pretty generous in allowing Independent Project modules. Want to work with an industry partner on a project (that is not in the ATAP list), just go talk to your advisor.
-
CS5231 Systems security. You rewrite IP Tables as an assignment ;)
-
CP2106: Independent Software Engineering Project (Earn module credits in summer while working on your very own project! If you're not thinking of doing an internship and are free in your first summer, this is a very worthwhile module to embark on)
You can also browse this list of high-level SoC modules organized into focus areas. As a general rule, the higher level specialized modules tend to be more interesting (pending good lecturers). Try and get past the level-2000s so you can get at the level 4000s and above.
These are books that are widely recognized to be seminal in computing. Worth reading (or at least putting on your to-read list).
Colloquial book titles are used where it’s famous enough to warrant so. For instance, when people in CS say ‘CLRS’, they mean ‘Introduction to Algorithms’.
-
SICP (an introduction to programming that’s pretty much the best out there. Note: not many people have finished this, though).
-
The Mythical Man Month (a classic in Software Engineering)
-
CLRS (the book on algorithms)
-
Modern Operating Systems (the book on Operating Systems)
-
The Dragon Book (the book on compilers)
-
The Cinderella Book (the book on the theory of computation)
-
Russell & Norvig (the book on Artificial Intelligence)
-
Paradigms of Artificial Intelligence by Norvig
-
Gang Of Four (the book on Design Patterns)
-
The New Turing Omnibus (a preview of everything in Computer Science)
-
The Art of Computer Programming (a review of everything in Computer Science; pretty much nobody, save Knuth, has finished reading this)
-
The C Book (worth reading for its style, influence and brevity).
-
The Passionate Programmer (My Job Went to India)
-
Refactoring by Martin Fowler (Ruby edition of the book that introduced 'Refactoring' to the world).
-
Hackers & Painters by Paul Graham
-
Clean Coder by Uncle Bob
-
Little Book of Semaphores (Good for OS and parallel programming modules)
-
Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin
-
Competitive Programming 4 by Steven Halim and Felix Halim
-
Contains links to freely available ebooks online. Good for those living on a FnM (Father and Mother) scholarship.
Not necessarily about programming/computing.
Some recently famous; others highly influential.
-
Growing a Language, Guy Steele (wait till 8:43 minutes before you understand what he’s doing).
-
What We Actually Know About Software Development, and Why We Believe It’s True Greg Wilson (how to think about software engineering)
-
Stats that shape your world-view, Hans Rosling (on data-visualization)
-
Inventing from Principle, Bret Victor (the future of computing interfaces)
-
Here’s another Bret Victor one, though a bit more abstract: The Future of Programming
-
The Last Lecture - Randy Pausch (Achieving Your Childhood Dreams)
-
2005 Stanford Commencement Speech by Steve Jobs (Stay hungry, stay foolish)
-
Harvard Commencement Speech by JK Rowling
-
CS Lectures from Stanford, and especially:
-
These lectures will really push you. And if you are up for it do the assignments too.
Programming Languages Lectures
-
Douglas Crockford - Crockford on Javascript
-
Rich Hickey - Series on Clojure Design and Thinking about Programming Languages
Read the awesome advice from our professors at School of Computing here.
Hear from your seniors about their insights and experiences here.