10000 things all ICS students should do before graduating

It’s Commencement time! So I thought I’d compile a list of 1010 10000 things I believe all ICS students should have done (by  themselves) by the time they get their diplomas. With luck, students have come across some of these in courses. Most likely, that won’t happen, so students need to make time for extra-curricular activities.

This list is inspired by others out there, but, as the title says, it’s about doing, as opposed to knowing or learning. First-hand experience is the absolute best route for exploring the fun things that can be done with computers. Once we make it work and/or surpass the hurdles, we feel empowered (startup companies, anyone?). It also builds up the critical skill of finding things out by oneself.

Here is my list, in no particular order:

0000 – Buy your own domain name.

0001 – Install an Apache web server and configure it in a non-trivial way, e.g. to serve multiple domains.

0010 – Install WordPress and have your own blog. Write blog posts regularly. Write well. Good writing is a critical skill to master in this profession.

0011 – Run your own web site at home or in a hosting company.

0100 – Write at least one complete LAMP web app, preferably two — one where P=PHP, the other where P=Python.

0101 – Have your own [physical or virtual] server on the cloud.

0110 – Install VMWare or equivalent in order to boot up your laptop with more than one OS.

0111 – Configure your home DSL router so that you serve a web site or other kind of server from your home machine / laptop to your friends.

1000 -Use a packet sniffer to learn about the network requests your computer does to your favorite game server.

1001 – Make contributions to an open source project.

1010 – Write an app that uses at least one of the popular Web APIs, like Facebook Connect or one of Google’s.

1011 – Use Google AdSense on your web site, and make money just by virtue of attracting traffic.

1100 – Compile a complicated open source project from scratch, like OpenSim or Matterhorn. (Thanks, Sean!)

1101 – Read works of literature and, besides enjoying the ride, pay close attention to how the author tells the story and makes use of words. Your programs should be as carefully written as those works of art! (Thanks, Beki!)

1110 – Get yourself involved in a software project where requirements are bound to change halfway through — that’s about 0.01% of homework projects and about 99.99% of real world projects, so find one of the latter kind. Finish the project with patience and the ability to take criticism in a constructive way. (Thanks, Lorraine!)

1111 – Write an application using map-reduce. Run it on Google app-engine or amazon EC2. (Thanks, Ian!)

This entry was posted in academia, advice. Bookmark the permalink.

88 Responses to 10000 things all ICS students should do before graduating

  1. Ian Smith says:

    Write an application using map-reduce? Run it on google app-engine or amazon EC2? Does 1010 cover this?

  2. crista says:

    It doesn’t cover that. I like it, let me add it.

  3. JB says:

    1101 is great!

  4. cpa says:

    0100: Better yet, with P=NP, if you manage to do it.

  5. Peter says:

    Another idea would be to realize that the software world is much bigger than technologies directly related to the web and try one of those too.

  6. jc says:

    Visit an art museum and learn about the different styles of Art.

  7. James H. says:

    I’ve taken my time after graduating to complete as much list as I have, but it’s a real encouragement to realize how much I’ve already knocked out. Thanks!

  8. Vijay Parikh says:

    Replace PHP with RAILS, even though it doesn’t fit the LAMP acronym

  9. quas says:

    Cool list. I would add:
    Train for and compete in at least one Algorithmic Programming Competition!
    I suggest Google Code Jam as its open to anyone, regularly attracts world class coders, and has great problems with solutions.
    Even if you don’t qualify, it’s a fun way to master the fundamentals.

  10. Paul says:

    Now you just need to add instructional links for how to do each for non-cs majors.

  11. Nelz says:

    I get the intent of this listing, and as a (currently) web-centric CS graduate I think this is a good list of items for those of us who are web-focused.

    But, what about for the giants whose shoulders we stand upon at the device layer? Or other layers/niches that even I am forgetting?

    My point is that there are A LOT of other types of software out there, and advocating for a web-centric course curriculum kind of robs the hypothetical students of the breadth of our field.

  12. Dave says:

    What’s ICS?

    In any case, most of these don’t have anything to do with CS, unless I stands for “Internet”. If it does, then some of the “mehs” below are no-brainers.

    0000: Meh.
    0001: Meh.
    0010: Really just “write”. Everyone should be able to communicate via the written word. I’d add “speak” and/or “present”, too, which is a related, but separate skill.
    0011: Meh.
    0100: Meh.
    0101: Meh.
    0110: No problem with that one.
    0111: Meh.
    1000: I’d stop at “use a packet sniffer”–what your machine is talking to is of secondary/tertiary concern.
    1001: Sure.
    1010: Meh.
    1011: Not setting the bar very high, huh.
    1100: Meh, but fine.
    1101: If you’re gunning for expressiveness, then aim at poetry specifically, not literature. A lot of literature sucks. Cooper isn’t going to help you code; if anything, the opposite.
    1110: You’ve combined two things. The first part is irrelevant. The second part is the more general, and useful, “accept (well-intentioned) criticism gracefully”.
    1111: Doesn’t need to be on GAE or EC2, and meshes nicely with the VM suggestion.

  13. Right-on for 1000 — Many, *many* developers barely understand HTTP and it can get crippling in app development. Understand other protocols is also greatly useful. At some point your web app will likely send SMTP messages, so knowing SMTP is useful too. One could conceivably add “issue an HTTP request over telnet”. And … send an SMTP message over telnet to your mail exchange server.

    For more human-friendly packet-sniffing and to more easily look at protocols built on TCP (HTTP, SMTP) I would highly recommend http://ngrep.sourceforge.net/ — just like tcpdump, it uses libpcap under the hood. tcpdump can be a bit overwhelming, and installing wireshark to process your dumps can be a bit asynchronous and somewhat heavy-handed. ngrep eases you into the process.

    ngrep -d eth0 -q -W byline -i “GET /”
    ngrep -d eth0 -q -W byline -i “GET /” dst net and src net

    -q will ensure you don’t get the #
    -W byline will make the output more readable
    -i just means case-insensitive which may or may not be what you want
    after that is the search string
    after the search string are libpcap-compatible network restrictions on the packets it sniffs. Usually a good idea to leverage so you parse less packets in real-time, to isolate traffic to host(s) and protocol(s) you care about.


  14. Justin says:

    Pick a language you don’t know and implement all the data structures from your data structure books.

  15. Abhinav says:

    I think “putting adsense on your site” is ambiguous – it really depends on what the website is. I wouldn’t put Adsense on my personal blog or homepage because I’d rather keep it ad-free than make a few extra bucks on the side and make it look cheap.

    If it means building an application that is monetizable, then I agree.

  16. Amos Wenger says:

    Code a non-trivial web application in Pylons (Python), Ruby on Rails (Ruby), and node.js (JavaScript) :)

  17. Andos says:

    Host your code on GitHub or some such. That includes making your code good enough that you won’t feel ashamed of displaying to the public.

  18. J says:

    Eh, installing WordPress? This is what non-security aware CS students would do.

  19. Ruudjah says:

    Fail completely with at least one project. Knowing how to fail dramatically increases chances on success in other projects.

  20. Lakshan says:

    I think presenting your project to an audience and defending/explaining your approach is also a good skill to acquire while being a graduate. This is covered partly when running your own blog, but when it comes to real world good presentation skills can be an advantage.

  21. Lakshan says:

    Another thing I would like to add is learn how to use a decentralized source code management tool like Git or Mercurial.

  22. Ironmaniaco says:

    0000 – I don’t have a domain yet(sad panda face). No-IP was enough to my ex-TeamSpeak server.

    0001 – Done

    0010 – Done, on a friend’s blog(that isn’t a advanced user/blogger)

    0011 – Don’t have a site.

    0100 – No. I don’t have programming skills(except bash scripting).

    0101 – I had one.

    0110 – VirtualBox with FreeBSD and Windows as guest systems. Xen+CentOS on my last job.

    0111 – Done, a TeamSpeak server on my house. Had to buy a hosted solution cause it was almost impossible to play with a 1200ms latency. lol

    1000 – Done, to learn about Aion Online Traffic :)

    1001 – Did a Request Tracker Translate, but didn’t pushed the contribution to the community. The Result: Another guys did it first pushing his translate/contribution, that became the official pt_BR translate. ¬¬

    1010 – No

    1011 – No

    1100 – Compiled Kernel with -RT patches, Wine with -O2 optimizations to Play Lineage2 under linux, compiled all Beryl(when it was beryl, not compiz) with its libraries on Slackware, Compiled Nagios, Cacti and NTOP with PF_RING patches on my work :)

    1101 – RPG player that enjoys well detailed scenarios/landscapes.

    1110 – Still, no

    1111 – I manage some Elastic Agents on my job :)

    Really good post :P

  23. DS says:

    Nice list. On 0110, one of those operating systems needs to have a name that does not match /^Win.*/

  24. No mention of mobile development? I would suggest building atleast 1 iPhone app and 1 Android app before entering the real world

  25. Julio says:

    Learn a functional language like lisp or haskell?

  26. Jim says:

    I like 1010 (APIs). I’ve had to write code to connect with the APIs of several different companies, and I’ve had to create our own API. Experimenting with Google’s charts and maps APIs in the past was a great quick and easy intro to the API world.

  27. ltamake says:

    > 1011 – Use Google AdSense on your web site, and make money just by virtue of attracting traffic.

    Until they suspend you unfairly.

  28. Jason says:

    I’d encourage kids to complete this list before college. Easily achievable by a couple long weekends with some books.

  29. lynn says:

    Write an app in your favorite language then convert it to several others.

  30. Joe Fiorini says:

    Love this list. Especially 1101. It would be helpful if you had links pointing to recommended resources on some of those topics.

  31. ajuc says:

    I’ll add:
    – write your own interpeter or compiler for some toy language
    – write simple game
    – fix bugs or add features in code you wrote a few years ago and haven’t touched since then
    – make software that is supposed to be installed by users on their own, and help them when they have problems with installing it

  32. This is a good list. Lot’s of relevant but often overlooked little tasks that regularly pay dividends down the road.

  33. I first graduated college in 1995, when most of these would have seemed either like science fiction or just plain ridiculous for a student to attempt. Now, just 16 years later, it seems completely reasonable to do all of these things before you graduate (although I’ll admit, there are still a few I need to cross off the list myself). Technology is an amazing field to be involved in.

  34. Tyresse says:

    thanks for the post

  35. Great list. Any undergrad that goes through this will be a ton more prepared for the real world of programming and software. A ton and then some.

  36. Yotam Oron says:

    As irrelevant as it may seem – get to master C. It’s like learning ballet for dancers, it’s the real foundation.

  37. I’d say you could abstract some of the items…

  38. Demian says:

    Great advice for the CS students interested in working in the mainstream modern day industry.

    It’s too bad that in the USA the term “computer science” is used for all disciplines involving Informatics (Computing Science (math), Software Engineering (engineering approach to software development), Computer Engineering (electronic computers engineering), Information Technology (computer systems usage and maintenance) and Information Systems (generic information process, storage and distribution in business)).

  39. A says:

    Have written an android & iPhone app

  40. etrain says:

    Ship something. Even if it isn’t “finished”, get it in the hands of real users.

  41. I would suggest they also read at least one book on design, particularly UX design, which is much more about functional elements and human psychology than visual elements. I recommend Bill Buxton’s “Sketching” or Moggridge’s “Designing Interactions”

  42. Justin Baker says:

    I’ve done all of this in high school :P
    I am fearing the idiots I will have CS classes with at UNCC who know literally nothing about programming, or the computers beyond Internet Explorer(because they aren’t well versed enough to use Firefox, Chrome, Safari, Opera..).

  43. Boo at the binary counting. You got me here. But I feel like I just got suckered with misleading link bait. I do agree that everyone should get a domain name and stand up a web site tho.

  44. Joe Zhou says:

    Man, once again I am a victim of binary.

  45. Joshua Volz says:

    What about creating their own GitHub based open source project? Or learning Git or Mercurial for that matter? How about learning a testing framework for their favorite language?

  46. Do a project, however small, for actual money. Create a website for Aunt Rita’s business, do a couple of minor jobs on rent-a-coder, or whatever. But monetize your skills directly in some way.

  47. Peter says:

    A few exercises in team coding:

    1. Run a static analysis tool on a large OSS project. Find 5 biggest coding mistakes that they made and explain them to your colleague.

    2. Take you colleague’s 0100/1010/1111 projects, review them and discuss design decisions, errors and possible enhancements with them.

  48. Jannik Jochem says:

    Absolutely required imho: Hack a compiler and/or a language VM!

  49. real cs says:

    Not really CS related at all… just general school level web development.

    OK so maybe 15 years ago but today this list is common place

    A proper CS list should have “try to prove p!=np” and “document all you code pesudo or otherwise with BigO” or “write your own language and compiler like Piet “”

  50. Sam Rose says:

    I think running at least 2 or 3 different Linux distributions before graduating should be on this list :) unless, of course, you didn’t list it because it is more or less a given.

    Great article, some brilliant ideas for young minds :)

  51. Ted Gueniche says:

    Develop an app using a MVC framework like CakePHP or Zend? or even create your own?

  52. Martin Suchan says:

    I’ve done most of this stuff, but not all though before getting my Master’s degree in CS. Great article :)

  53. Anil says:

    I am quite happy trying most of the above listed items, but could not get into an opensource project. I searched for quite a while (source forge) just couldn’t find something that interested me, most of them were too complicated. can you guide to any other sources?

    loved the 1111! i did my undergraduate project using Hadoop map-reduce.

  54. Josh says:

    YES. CSCI students desperately need more practical experience.

    If you can’t perform trivial tasks like compiling a piece of software or configuring a web server, your prospects are not good.

    I’d like to add:

    1. Write your own shell for a *n*x variant. Learn to use a build tool (e.g., make) and get it to compile on more than one OS.

    2. Write your own simple HTTP server. HTTP 0.9 (a GET-only subset of the protocol) will do for starters, but your server should be capable of concurrency. That means you’ll need to use fork(), multithreading, or async IO. For extra credit, support all three and make it a configuration option.

  55. Steven Seagal says:

    PHP? Eww.

  56. aab says:

    1111 is so hard!!! it’s for senior architects!

  57. Sebastián says:

    I’d say: “Become fluent on the Linux command line” would be useful too.

  58. Cool post, but you know what i’ve been missing the most?? Working with french CS students, 1 out of 10 ever read hackernews, had a github account, asked (let alone answered) a question on StackO, knew about Heroku, …

    The best intern you can find is not a [insert_language] rockstar developer, it’s a f***cking lazy guy who knows where to find the best possible answer to a problem, and then integrate / adapt it to the challenge he’s given… And I feel this is not something taught well in CS schools => “how to be lazy”.

  59. Gale Fitch says:

    I don’t even know how I ended up here, but I thought this post was great. I do not know who you are but certainly you’re going to a famous blogger if you aren’t already ;) Cheers!

  60. Jason Gorman says:

    Write 10,000 lines of code that’s used by 10,000 people for a total of 10,000 hours and make a profit of £10,000 from it.

  61. Erik says:

    +1 on 1001, this is by far the most important one.

    I’d add follow and read blog posts ala the change log etc

  62. eugf_ says:

    hahahaha nice :D
    What about: Build your own custom Linux system with Linux From Scratch (LFS)?
    I don’t know if you ‘should’ do that, but you can get a good knowledge.

  63. Paulo de Freitas Coleta Neto says:

    Challenge Accepted!

  64. michael says:

    Can I suggest another: Learn how to use a whiteboard.

  65. Nick Maroulis says:

    I graduated in 2007 and the major changes I have noticed since then are the popularity and accessibility of the cloud (abstraction of hardware and storage). The boom of social media and particularly the integration with other sites is really noticeable ie waiting 2 minutes for facebook to load when the page you want has already loaded. I feel the inevitable conclusion is that many pages will be subpages of facebook as facebook attempts to become its own internet. Hardly anyone wants a PC in the household because you can get the internet on the tv or overpriced underwhelming handheld gadgets. I essentailly use my laptop to bring to work to plug into a larger screen. I think digital media/ tv on demand will completely replace the dying cable/UHF model and video games will be streamed replacing the need for powerful cards and hurting game piracy. There are alot more people using opensource operating systems and software and if you can install windows, you can install ubuntu without too much diffuculty.

    I am constantly following the internet for new technologies and since 2007 nosql variants have become really popular but unless you have a massive site, you can probably get by with a relational DB. NodeJS could start to give apache a real run for its money and at the moment inmemory databases are coming more common.

    So in 4 years, there have been alot of changes and it is a constant learning exercize.

  66. Rudy Godoy says:

    Involve yourself in non technical projects so you see problems from the average people’s perspective, then build a technical solution that address such problems.

  67. ozz says:

    10000: recover a deleted file on NTFS using a Linux boot cd

  68. NT says:

    0100- Why encourage CS students to do PHP? Don’t we have enough mediocre programmers in the world already? Try a more interesting language instead, e.g. Scala.

  69. Gilbert says:

    Damn you right. Gotta do this

  70. 10001 says:

    10001 – Get laid

  71. Mario says:

    This list is way too short, but a start.

    I’ld add: do all of this without using search engines (or similar).

    There seems to be a study that says that the internet renders people dumb as instead of thinking themselves about how, what and why, they look up the anwser on the web. As a result they no longer think about it.
    This kind of confirms what I see with “just graduated” people: they often lack the skill of thinking using the basics.

  72. Tony says:

    About 0111: can it be done if your ISP handles it’s clients connections using NAT?

  73. Ravi Sant says:

    Way too busy with 1110 always…

  74. Talk to some real users!

  75. Oscar says:

    Awww, did you just graduate or recently graduate? This is really cute and not bad advice. I’m going to check out the rest of your site now. =)

  76. jsc42 says:

    Write software for batch procesing on a mainframe; preferrably in assembler using punched cards. Unless you try to do a ‘how it used to be done’ project, you won’t appreciate how easy all this modern web stuff is and what lengths your predecessors went to to provide you with the environment that youy take for granted today. Plus many new graduate are unaware that the world still revolves on old style software, even if it has been given glossy front-ends by web designers.

  77. Frank says:

    what if I have already graduated?? :) guess, this post is valid for all… so I am gonna go ahead and finish off this list completing whatever I haven’t done yet! Although, I would add one of my personal favorites too, “Win a programming contest on your own i.e. motivating, practising, doing and winning all by yourself”… :) :) Great post BTW, some nice food for thought…

  78. rax says:

    great 1 :)
    I am going in right way to follow these all 10000 things ;)

  79. Justin says:

    I was doing almost all of this stuff in high school.

  80. crista says:

    Sorry everyone for the delay in approving the comments! I was on vacation… back in business now :-)

    Thanks for all the comments! The list could be extended by a lot in all sorts of directions. These 16 are fun, cheap and trendy things to do, with tons of help all over the Internets, and usually don’t get covered in ICS curricula. It’s like… you kids really need to do this stuff by yourselves over a few weekends and summer vacations, if you want to feel empowered with computers and the Internet economy. That is, besides getting the more formal material in the courses.

    Technologies and economies evolve. In 5 years, this list will likely be different. But the fundamental skill of making whatever-technology-of-the-moment work by oneself with no grade carrot, simply curiosity and the potential to start your own business, will never go out of fashion.

  81. SAJ says:

    1101 is great, and applies to everyone in every career.
    0010 is partially correct–writing regularly is important. What blog software, or even via a blog is irrelevant to that.

    The rest of the list, I would submit as a 25-year IT professional, is targeted towards what is fashionable in one sector of the IT industry at this point in time, but are far from universal. Technology and product fashions change; in ten years only one or two of these named technologies will still be significant, although it is not always easy to predict which one(s).

    On the other hand, none of the suggested activities are harmful, and the more real world things a person does, the more they can learn more real world things, and that is a truly important skill.

  82. Lance says:

    Where’s 10000?

  83. Tim says:

    PHP > Rails

    Done most of the above before having read it :-)

    Google Ad Sense should be next on the list for me, but I’m not even sure I want to have ads on my site(s), because they’re advertising me. ;-)

  84. Utsav says:

    really great post…
    done some of the above… ll surely try the rest…

  85. Mike B says:

    @Dave Prove you actually can do #0010 by learning a word other than “meh.”

    Semi-related: Maybe add “Realize you aren’t a god and learn to interact with people in a beneficial way.”

  86. PK Shiu says:

    While this list’s intention no doubt is good, completely most of these task (with the exception of two good ideas like “learn to write well” and “work on large project”) just exercise your learning skills as a technician. It add nothing, exercise none of the more important skills like:

    - write correct software
    - manage your time
    - listen to the user

    For example, I have watched many bad programmers “installed apache in a non trivial way” and made it work, but would never be able to do it again because it was just an endless iteration of:

    - google
    - type
    - try
    - fail maybe

    A much better piece of advice would be to “install apache…, document, and manually or automatically repeat the task”


  87. can add more to the list like
    create an good apple application for ipad and make money.
    learn and teach an upcoming technology or language via seminar,workshop and symposiums.
    create your own enterprise and start doing small projects .

  88. Will Raresheid says:

    @jc re: visit an art museum
    What a comment!! I am an ex art major who finds computing a logical equivalent of creating art (the search for solutions). Your comment blew me away. Bless you.

Comments are closed.