Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?


Failed to load latest commit information.
Latest commit message
Commit time

Notes to (NUS) Computer Science Freshmen, From The Future

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.


You’ll probably want to start with some general advice written for undergraduates/beginners in Computing. Read:

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.

Computer scientists or Programmers that you should know

Because we just have to have some hero worship, don't we? ;-)

(Informal) Checklists

Use the checklist below to get a rough measure of your knowledge.

Introductions to various specializations

Graduate School

Programming Languages

Game Programming

Learning Unix

  • 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?)

    • Linux Mint

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

  • 💣 🔫 Pew! Smoking all the other editors 😉

  • Know some regex-fu.

Learning Stuff

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

Good/Interesting Courses in SoC

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

Famous Books

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

List of free programming ebooks -

Good books

Not necessarily about programming/computing.

Good talks

Some recently famous; others highly influential.

Seriously Good CS Lectures:

Programming Languages Lectures

Advice from seniors

Seniors - submit a pull request please!


Apply for NOC Silicon Valley to intern in a tech startup. You’ll learn loads with the right attitude. Don’t worry if you "didn't start a business" or “don't have entrepreneurship experience”. They love CS students.


Computer Science is not about programming, though they go hand in hand.


Don’t be afraid


You’re probably not learning as much as you should be

Wen Bin

Join CCAs, don’t just mug. CAP is not everything.


Be language agnostic. Learn how to self-learn. Also, the curriculum is made for everyone to follow. Learn beyond the course.


Experiment; it’s not expensive to experiment with computers.


Go out and meet people from industry


Be brave. Read, read and read. Read widely. Don't just read about computer science stuff.

Derek Sivers, has a very good reading list.

Learn at least a new language every year (Or learn 7 Languages in 7 Weeks).

Make sure the language messes with the way you normally think about programming. Alan Perlis once said: "A language that doesn't affect the way you think about programming, is not worth knowing"


Make stuff to make your life easier. This works in more ways than one.


Don't be intimidated/overwhelmed if you find yourself among the really awesome programmers, especially if you're coming in without any background. do your best to keep up with the lectures, and learn to pick up skills/knowledge outside of school-taught content by doing your own reading


Learn it the hard way. CS people are not meant to write fancy web pages to impress people from business school. Get yourself deep into the technical stuff. A sound foundation in C programming and system architecture are essential.

The teaching style in NUS (at least undergraduate courses) is easy to follow but often omits some exciting challenging stuff. Get yourself used to reading the textbooks (not the garbage ones) from cover to cover and to read research papers.

If you want to get an admiring CAP, the best way is to forget about your CAP. Choose the courses that appeals to your heart and can help you in your research.


Don’t be afraid to challenge yourself. Some of you may be saying to yourself "I have no background" or “The workload of the module seems daunting” but in the end you’re only preventing yourself realising your potential (just to let you know, I had never written a single line of code prior to entering uni and I’m surviving fine).

Only through the ‘hardcore’ modules do you learn skills that are practical for real-world use. Have a little confidence in yourself. University is the last place you can make mistakes without reservation before you go out into the working world.

Don’t learn what you need to know to pass exams because very quickly that knowledge may become obsolete.

Learn how to learn. In computing, it is very hard for you to be able to dig a niche for yourself and get away with it.

Technology evolves at a mind-blowing pace and the only way you can keep abreast is if you’re able to evolve with it.

Pursue what piques your interest because that’s the only way you’ll be able to keep yourself going once the going gets tough.

Learn to read the f***ing documentation. It’s the best way to learn the nuances of a language.

And last but not least, Google is your best friend =D


  1. Ask questions. Don’t be afraid. At max, the other person will refuse to answer and never talk to you again. If the latter scenario happens, it is probably as well since he wasn’t helping you much anyway.

  2. Learn to say ‘no’. I have learnt it the very hard way that doing okay in many things and badly in a few is exponentially worse that doing well in one and only one. Don’t be overwhelmed by the many things people around you are doing. Believe and have faith in yourself.

  3. Stay fit. You shouldn’t make programming late at night an excuse for a McDonald’s meal or a coke at night. Do at least half an hour of vigorous exercise everyday. Never think you don’t have enough time to care for your body. A healthy body also allows your brain to work faster. Again, saying this from personal experience.


CS can get very political, and it's easy to get into debates where someone says you should make use of some software/programming-language/API/operating-system/convention etc. etc. rather than the one you're using, or how you should learn 20 different things when what you know is all you need to get you through the job. (And they may even be correct. ;-) ).

Ostentation will not make you a better programmer.


Don’t just spend all your time on school work. CS is all about doing things yourself, figuring things out without much official help. Hack around whatever thing you like. Remember, the goal is learning. You can’t learn with just textbooks alone. You must learn by doing. Also, make yourself surrounded by smart people. You can learn a lot from your peers who are better than you.

GCL (aka Chun Lin/Carrot)

Read newspaper or books (not just textbooks), everyday.


Learn different kinds of programming paradigms. Learn functional programming, logic programming, stack-based programming, voodoo-oriented programming (I made the last one up)... The (computing) world is not just made of this shiny OOP thing


It doesn’t matter what you study, as long as you keep learning. Read lots (blogs, books, papers), keep experimenting and keep practicing!


  1. Differentiate yourself from the rest. Don’t make yourself a cog in a machine. If you do, make yourself an important one. If not you will be replaced with someone cheaper. Hint: do your own stuff outside of class

  2. Study other disciplines. Computer science is a great aid to other disciplines ⇔ you understand enough of the problem in computing terms to solve it.

  3. Pick up logic - If nothing else, make sure you don’t forget the natural deduction and first order logic you learn in CS1231 (to freshies: make sure you LEARN it.). Most papers are written by people who feel like throwing in excessive symbols to represent simple things.

  4. Make your school fees worth it. I.e. don’t spend time taking easy mods to pull your CAP up. I should repeat that this is basically the last time that you

  • get to make mistakes and get away with them

  • get to learn (additional) things for for free.

  1. Study ideas, apply technologies.

    • The hottest thing on the market now a) is going to continue being the hottest thing, b) get chucked out.
    • If a), then well everyone will know it, violating 1).
    • If b) that means everyone that knew it found something better, so no loss either.

    Just learn enough about a technology to apply(unless specializing into tech field, e.g. security). FYI, cloud computing is almost as old as the internet ;)

  2. That which does not exist is for you to create!

Shaun Stanislaus

Ideas were never really new, they were reinvented.

Yang Shun

  1. Learning how to learn is crucial in this age where current technology turns obsolete in the blink of an eye. The skills you possess may not be needed by your future employer and you will have to learn on the job. Your employers will want you to learn FAST.

  2. Like what you do and do what you like. Naturally you will spend more time on it and you will do them well.

  3. CAP is hardly of importance (but don’t neglect it!) in securing a decent job. Your employers look out for your past experiences and how fast you pick things up. Attitude comes before aptitude.


  1. Computer Science/Software Engineering is the best industry where you can fail early, fail often, and fail cheaply, and learn new tricks more efficiently

  2. Inspiring video by Derek Sivers: Why you need to fail

  3. The test of pudding is in the eating. Go get a freelancing project, teach youngl gitings and be IT consultant. You will learn more from what you picked up from theory books and grill your knowledge and skills

  4. The ultimate goal of science and engineering, including Computer Science & Software Engineering is to reproduce success and best practices so learn to convey your message with simplicity


Overseas internships on overseas internship. Also, it has been mentioned before but again, learn and use a version control system. I have seen people spending 1 year as a computing student, yet still refusing to learn, using Dropbox to sync code with their teammates.


All of this may seem really overwhelming, if you’re just starting out. Just make the best out of your time in NUS (and SoC especially). You’re not alone.


If you take the CS1101S mod, skip the last two missions. lol. You can get a decent mark from the rest of it, no point wasting time near finals :P .


Functional programming is kind of hot nowadays. New programming languages such as Swift and Rust has several features borrowed / inspired from functional language. Even Java 8 and C++11 added things like lambda. It is quite sad that you can graduate from NUS without learning those things.

If you did not take CS1101S, it’s fine, you can catch up on those concepts by taking CS2104 or learning it on your own. You can always go beyond maps and folds and pick Haskell.


If you are willing to take risks, test your limits, and put in the hard work you need to, you will find friends and mentors glad to guide you, help you, and accompany you.


Take your time, but remember to take the time. Plan your days and buffer everything. Best part about buffers is that if you don't need them, you have instant free time. Also, cap isn't everything.(lucky freshies)

Zhu Liang

Networking is actually quite important, actively meet with new people, not just your peers from SoC.

Jing Rong

  1. Make sure you get an internship during your college years! Even Y1 Summer isn't too early. Try your luck out there - there are companies willing to take you on as long as you display the hunger to learn. Also - NOC is a great learning experience! You get to go to work at a startup (probably an overseas one!), take on responsibility and autonomy for your projects, attend tech meetups, go to hackathons, etc. It's pretty life changing.

  2. Work on projects you like outside of school work. Doesn't even have to be useful or original. Just make something you like, and learn something new whenever you have pockets of free time

  3. Go to Hackathons - Not to win, but to pick up a new skill/work on something challenging. Of course freebies and prizes are great to have :)

Aadit Kamat

Tons of great advice here, just filling in what I've come to realize post-graduation:

  1. Invest in study strategies. As most people here have mentioned, CAP is not all-important. However, the process of learning how to learn (metacognition) is essential no matter what your career is, as long as you are a knowledge worker. Cal Newport has a lot of content geared specifically towards knowledge workers. One of his blog posts is often mentioned by Prof Ben in the context of the study habits of top students. The gist of it is you have to be consistent when you are learning and chunk information in spaced-out study sessions, rather than cram last minute.

  2. Start a blog. A lot of blogs have been referenced in this document and there is a reason why many knowledge workers start a blog in the first place: writing helps consolidate knowledge. There are a lot of resources mentioned here, but the only way you would be able to build a knowledge base around the topics of your interest is if you make the effort to recreate it for yourself. To become a better writer, you have to read more. However, writing helps you avoid the "fluency trap" created by passively consuming information: you are forced to summarize what you have learned by putting it in your own words. This way you identify the gaps in knowledge and seek to redress them.

A great MOOC to learn the nuances of writing is Writing for the Sciences, offered by Stanford University. While the name suggests that the techniques apply specifically to scientific literature, she touches upon a lot of the basics that make your writing effective. It may seem a little redundant, especially if you have taken a lot of classes that involve writing before, but I think it's good to recapitulate upon these basics.

Essentially, you have to break down writing into three processes that must be independent: 1) Prewriting, 2) Drafting, and 3) Revising. It's usually the first part that takes the most time because you are gathering the relevant information (researching) you need for the writing. Once you do that, you just need to combine these using complete sentences during the drafting process. You only worry about the nitty-gritty details like grammar, typos, and the overall flow of the written piece while revising your drafts. Edit yourself, read the drafts out, and use Grammarly to help you proofread one last time if you can't get others to do so.

  1. Create an effective organizational system for your notes. This is related to the first two points. The art of note-taking is essential for making the best use of your time studying and writing. Instead of passively reading lecture slides and textbooks or passively watching videos, you are spending the time capturing the information that you have learned from these reference materials. The notes can themselves be revised by referring to the reference materials when needed. In the end, you have to only go through the notes when you are studying for the exams.

Most exams at SoC allow a cheatsheet. Even if they don't, you should anyways create one because the process of creating the cheatsheet is more useful for learning than the cheatsheet itself. The only way to gain knowledge is by recreating the knowledge and making mistakes along the way.

One of the most effective note-taking systems that I have come across is the Zettlekasten, German for "slip box". As a researcher, you can see almost immediately why it is effective: you are making connections between the different topics covered in the literature review rather than going through them sequentially. This applies generally to the processes of studying and writing as well because they rely heavily on research.

In the Zettlekasten, you are splitting up the notes into three categories: 1) Fleeting notes, which are like Tweets: you only pen down your thoughts based on the information you have gathered 2) Literature notes, which are the takeaways from the literature summarized in your own words and 3) Permanent notes, which are formed by combining Fleeting and Literature notes and become the basis for your first drafts.

I use Obsidian to organize my Zettlekasten because I think that it was created expressly for this purpose, but feel free to use any other tool of your choice. Again, don't worry too much about the tool, it's the process that is more important.

  1. Connect with your professors. It is easier, in my opinion, to connect with industry professionals due to a plethora of social media tools at your disposal but it is harder to establish a good relationship with your professor outside the classroom. The role of university professors is not just to teach, they often conduct cutting-edge research and are subject matter experts in their respective fields. You can tap into their reservoirs of wisdom; they can become your mentors and guides. That is why it is also important that you pick the right classes to avoid the wrong kinds of professors if you can. This might sound self-serving, but do make sure that you get reference letters from professors in the classes you have done well or where you have helped them out. You never know when they would come in handy.

  2. Cut down on social media time. Some, like Cal Newport, advocate quitting social media altogether, but that may seem a little too extreme. I believe that you can harness the power of social media in a way that serves you better, especially if you don't have strong networks, to begin with. Rather than focusing on information consumption, focus on how you can use it to market yourself. This shift in mindset from consumption to production is essential for learning. Again it's quite easy to fall into the trap of obsessing over the stats, but what's most important at the end of the day is sharing ideas and getting feedback.

To cut back on the consumption, you can install the news-feed-eradicator extension on your browser. You can also look at other interventions suggested by the Centre for Humane Technologies.

  1. Look at college as a way to build career capital. You may end up pursuing a CS-related career, you may not. But what's important is you are making connections, learning new skills, and finding ways to grow as a person. You can then leverage this capital to create opportunities for yourself, crafting the kind of career you like in the long run.

  2. Don't compare yourself. It's easy to get carried away by peer pressure, especially when you are surrounded by the talented folks at SoC. Just because others are gunning for FAANG internships, doesn't mean that you should be. Your journey is your own to undertake. Try to see your peers as companions rather than competition. This is easier said than done when you are pitted against each other by the bell curve, but there are honestly more ways in which they can help you than hurt you.