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

Contributions welcome GitHub forks GitHub Repo stars

Ported over from the original document.

The mailing list announcement that started it all (23 August 2012): Link to thread

Intro

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.

Contents

Links

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

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 Profs

Read the awesome advice from our professors at School of Computing here.

Advice from Seniors

Hear from your seniors about their insights and experiences here.