top | item 2692430

10000 things all CS students should do before graduating

237 points| amesign | 14 years ago |tagide.com | reply

160 comments

order
[+] raffi|14 years ago|reply
I'm a computer scientist, not a web monkey (FOOTNOTE). I'd say these are not the things all CS students should do before graduating. The field has much more to it.

How about:

1) add or modify a significant feature of a working kernel

2) write a toy programming language

3) program in a programming language with concurrent constructs (e.g., erlang)

4) study some theoretical area, develop a practical application based on the theory

I don't know, these are some things a CS student should aspire to. Setting up a WordPress blog and configuring a basic Apache instance? Yeah, good stuff--but I would in no way attach computer scientist to these activities. It's like calling the Best Buy Geek Squad folks electrical engineers.

(FOOTNOTE let me caveat that I do on occasion, work as a web monkey.)

[+] illumin8|14 years ago|reply
Please allow me to use a car analogy:

If you want to get a job as a mechanical engineer and design car engines for a living, you don't necessarily need to know how to be an auto mechanic, however, if you spent a summer rebuilding a classic car engine, you might be surprised to learn a few things along the way that help you to design better engines when you do get a job.

I think this analogy works very well for simple web monkey tasks. Sure, building a simple LAMP application will not help your CS chops like writing your own toy programming language will, but you might learn something along the way about Apache, PHP/Python, Linux, or MySQL that will help you in your career. It also gives you a chance to question some of the fundamentals that have been with us for years - why do we use SQL for so many things? Maybe a key/value store would work better for certain apps.

Just like a mechanical engineer might be able to design an engine that is easier to work on if he rebuilt an engine in a garage once or twice, a software engineer might be able to write code that is more easily maintainable if he installed WordPress once or twice. Learning the difference between a good and a bad install procedure can at the very least help you write an installer that doesn't suck.

[+] rednum|14 years ago|reply
Concurrent programming (#3) is covered in most CS courses, as well as studying some theoretical areas (#4). Many universities seem to also include courses that include both writing some level stuff (#1) (like OS course) and writing at least a toy compiler for some given language (#2). The point of post is to give students tasks that are not required in their courses, but may give some knowledge/skills valuable in their future work. However, I think that your points are valid too - all of the things you mentioned are something worth spending a longer while when studying, not just being a homework assignment you forget about the day you submit it.

(Also, please don't use asterisks (* ) to indicate footnote or put a whitespace after each one. See http://news.ycombinator.com/formatdoc)

[+] demian|14 years ago|reply
Those sound like engineering problems, not science problems.
[+] wisty|14 years ago|reply
Surely these are already in the course. Unless the course is bogged up with useless crap like OOP, COCOMO, XML, SQL, and so on.

There is a case for CS courses to be nothing but algorithms and compilers; but that's not the way they work in the real world.

[+] tdignan|14 years ago|reply
Agreed, this stuff is lame.

Most CS students worth a dime could write programs to do these things.

[+] presidentender|14 years ago|reply
Stuff on the list gets you jobs. Your stuff doesn't.
[+] natural219|14 years ago|reply
I think a lot of people here missed the point. This isn't a list of "stuff that will make you SUPER BALLER," it's a list of easy things that teach you very much and give you a lot of confidence for a very small amount of effort. Plus, all of these tasks are highly relevant in our web database-driven world. Not everyone wants to be Johnny Writes His Own C Compiler Geek, but every CS student SHOULD be able to configure LAMP.
[+] sukuriant|14 years ago|reply
Why should they all know how to configure LAMP? I use LAMP neither at work, nor at home; and even if I start running a server at home, the only things that will follow those initials there will be linux and python.

I have no intention of using Apache or MySQL, so why LAMP?

Furthermore, there are plenty of devs may never be on the web-app-dev/linux side of the world, so what's the point of Apache? (client-side development, internal application development).

Most will, but not everyone; and in that most, they might use the Windows stack version of LAMP: Windows, IIS, SQL Server, [favorite .NET language]

[+] ender7|14 years ago|reply
I'm surprised that most people seem to have ignored this line:

> it’s about doing, as opposed to knowing or learning

After graduating, I had to teach myself everything in that list before I could actually do anything that I found interesting. Now, this obviously doesn't apply if you're, as you say, writing a compiler, but for the average CS student, this is a great list to complete.

[+] jvehent|14 years ago|reply
While I totally agree with you, I don't think that: "1000 -Use a packet sniffer to learn about the network requests your computer does to your favorite game server." Is an easy thing to do. The first time I learned networking, packet encapsulation, protocols and so on, it took me a while to get the concepts. It's only after a few years of CS studying that I got fluent in wireshark (if that's even possible).

This is a list of hard things to do from a beginner, freshman, perspective. But they are also highly necessary if you want to work on fun stuff later on.

A sysadmin who doesn't understand pools of threads will go nowhere, same goes for a developpers who doesn't know what database replication implies.

[+] cbailey|14 years ago|reply
I agree. While most of the items on that list are web based, they are easy enough things that can be worked on while taking classes. Working on projects like these get you into the hacking/diy mindset that really differentiate the top and low level CS students. Will every CS student need to build a web app or use MapReduce? No, but learning new technologies and getting your hands dirty teaches you to ask questions, start something, and learn as opposed to being complacent with your current level of knowledge.
[+] RyanGuest|14 years ago|reply
Somebody should write a "stuff that will make you SUPER BALLER" list.
[+] gaius|14 years ago|reply
How is any of that computer science?

I mean, is there a list out there for astronomy students that includes, grind your own lenses?

[+] Caerus|14 years ago|reply
Speaking as a mechanical engineer, experience in fields related to your own, however tangentially, is extremely valuable.

Two example from my career:

I spent two summers working construction on job sites. Running pipe, cutting beams, and building scaffolding are skills I likely will never use again professionally. However, it gave me insight into what people who are directly affected by my work experience. I am now extremely careful to consider what the end users experience. Maybe moving the bolt holes from position X to Y will add 4 hours to my workload, but it will save the installer 30 minutes on every one they put in.

I started in computer engineering. I didn't go very far but thanks to those 2 semesters, my programming skills are miles ahead of many of my peers (although they are still quite primitive). This gives me the ability to write scripts/programs to create functionality that is nonexistant it my field. Sometimes it allows me to work projects that would otherwise be impossible, sometimes it just saves myself or others hours or even days.

I hope this doesn't come across as boastful, my skillset is woefully inadequate in many areas which my peers do have experience.

Neither of those skills were touched on in my engineering curriculum, but learning them made me a much better engineer. I would imagine many of these items, while not "core computer science", would make a CS grad better and more marketable.

[+] quanticle|14 years ago|reply
Its not, and that's the point. I've seen computer science students struggle at basic system administration tasks - even things like moving files and directories. I maintain that half the trouble we have deployment is that developers don't know anything about how configuration and setup works in the real world. This list helps to bridge some of that divide by having programmers deploy software, not just build it.

EDIT: I also think astronomy students should grind their own lenses and mirrors, so that they can understand the practical difficulties of building and operating a telescope.

[+] ghurlman|14 years ago|reply
That's the point. There's a general disconnect in a good amount of CS programs between the curriculum and reality. This post is trying to bridge the two.

I'd also like to add:

  10000 Learn to use source control, use it to store your new LAMP code on Github.
  10001 Start studying design: web, graphic, type.
[+] pavel_lishin|14 years ago|reply
Specifically, grinding lenses for one specific type of telescope designed for looking at once specific thing.

Has everyone forgotten that there's more to computer science than writing a CRUD app with a web interface?

[+] zheng|14 years ago|reply
It isn't computer science per se, but it is a list of common tasks that many CS grads will end up doing in their career. However, I think it is basically a list of things for those who are going into web/software dev type positions. If I've just been hired to write Roomba firmware, some of that might not be quite as helpful.

EDIT: Also, the list is numbered in binary

[+] bdhe|14 years ago|reply
This article has got me really conflicted. On one hand, I am a CS graduate, but on the other hand, I work in theory, and I would always point out to people that computer science and computer engineering are two completely different things. Unfortunately the two are often conflated in almsot all CS curricula. Maybe there ought to be two different majors, one that focuses on building systems and implementing algorithms (as suggested) and the second that focuses on the basic stuff, designing algorithms, working on math applied to computer science (crypto, AI, etc.)
[+] parfe|14 years ago|reply
What do you think graduating computer science majors go on to do?
[+] JeanPierre|14 years ago|reply
It's an interesting list, but I do believe it lacks a lot of computer-specific things which I personally think people should do. For example

  - Build your own computer
  - Build your own (small) operative system
  - Build your own programming language
would be on my list of things a CS-student should do before graduating, because you will most likely get into problems where knowledge of the three things mentioned above will help you understand/solve the problem. Obviously, that list is not complete, but I think those are some of the more important points.
[+] Locke1689|14 years ago|reply
Building your own computer or your own operating system very rarely help, in my opinion, because the real systems you work on are so much more complex than the pretend stuff you build that you miss massive layers of complexity. It's far better to have a good knowledge of how modern systems work than waste years attempting to build such a system.

Similarly, I have no idea why you would build your own programming language. You're very rarely likely to run into a problem with closure conversion in a programming language you wrote, but you might run into a problem with peephole optimization that you would never get to implementing unless you have a PhD in PL.

[+] cstavish|14 years ago|reply
I absolutely agree. Many would scoff at the prospect of writing a barebones OS for educational purposes, claiming that they would never have to use that knowledge in the real world. While they will not be given such a task by an employer, realistically, the vast insight gained from the project about process scheduling, interrupts, memory protection, hardware interaction, etc. is incredibly valuable.

Programmers not at least familiar with low-level concepts are not grounded in reality. Their solutions to problems and code may be of worse quality than those of more well-rounded programmers.

I probably sound like quite a snob, but I'm the kind of guy who reads Understanding the Linux Kernel before bed and reverses parts of the stage 2 iPhone bootloader for fun, so put what I say into perspective.

[+] natural219|14 years ago|reply
I wouldn't recommend that EVERY CS student do those. I mean, I would, but you can't expect every person to be able and willing to build any of those things. I think that this list is great in that it's reasonable; none of these things are particulalry hard, but each one of them actually sounds fun and produces something cool.
[+] phxrsng|14 years ago|reply
I'm a CS student, near the end, and let me add at least one or two things to this list:

- Meet a lot of interesting students outside of CS

- Go to at least one random social even that has no connection to CS

- Minor in something non-technical, or at least take a few classes

Not to detract from CS at all, but it discourages me how many of my classmates spend 4 years doing nothing but computer science and never think/learn anything else and become even the slightest bit well-rounded. So many of them barely socialize at all for 4 years, even within CS, much less outside of it.

There's more to being a good student and having a good life than knowing the ins and outs of programming languages and kernels, and your career will benefit from being a little rounded.

[+] xxpor|14 years ago|reply
I agree with this list, but let me add that when you say "Go to at least one random social even that has no connection to CS" I hope you mean "make a commitment to a social group that has no connection to CS".

Also w/ regards to "Minor in something non-technical, or at least take a few classes" I can't agree more. I am a CE, not CS, but close enough. Currently I am taking German, and I would say it is one of my favorite classes. It has completely changed my way of thinking about languages, including English.

To be honest, my involvement with student gov, fraternity, and German is what keeps me sane for my technical classes.

[+] jdefr89|14 years ago|reply
Why can't I down vote? That advice was horrid, and basically said 'learn all about buzz technology and blog stuff'.... Seriously, thats what they should be doing way LESS.. They should do more things such as the following: (My own biased list)

1. Designing their own CPU (this will go along with learning memory management, paging, translations, etc) 2. Learn about Linking and Loading 3. Write Toy OS 4. Learn C and x86 assembly 5. Learn TCP/IP and OSI model well. 6. Write some damn code and try to contribute to open-source 7. Learn about application security (stack overflows, heap, etc.) 8. Write your own API for anything to learn how to create consistent and easy to use code. 9. Apply what you learn about an algorithm or data structur in a novel way to solve a practical problem. Who knows you may see something and say 'wow I could use that algorithm and apply it to finding words that rhyme' or something like that.... 10. Please... have some damn system administration skills. Learn your way around a modern system be it linux, bsd, windows. 11. Figure out why design patterns and OO aren't goddamn silver bullets for every issue. 12. Christ sakes, learn some damn math. 13. Stop trying to learn every damn language you see. Just because proggit/hackernews is buzzing about some new technology doesn't mean it is worth your time. Be different go against the grain.

... and other stuff I can't think of..

[+] rreeves|14 years ago|reply
I agree, the advice is off mark.

Studying Computer Science should be about learning the fundamentals. Algorithms, Discrete Math, Operating Systems, Compilers, Computer Architecture, etc.

[+] tudorizer|14 years ago|reply
Silly me. I hesitated clicking on the link because I was affraid of reading a super long list.
[+] mattdeboard|14 years ago|reply
Yeah, especially after I saw he'd increased from 1010 to 10000 items. That's a difference of 10101... right? I should've paid more attention to the binary subtraction section in class.
[+] sandipagr|14 years ago|reply
Same here. I actually clicked on the link because of your comment.
[+] maurits|14 years ago|reply
Let me compress this list, for those people in CS programs which focus on theoretical/more abstract paradigms, it is useful ( and fun ) to code. SO

10 Write code in <language> for <project> based on <technology/idea> on <platform>

20 goto 10

[+] younata|14 years ago|reply
I just finished my first year of Uni.

I'm spending the summer at an intership, where I'm writing very low level code. (For example, right now, I'm writing a utility to arping an address range. I've learned all about OSI, ethernet interfaces [I'm using BPFs [1]], etc.).

In my free time, I'm playing with opencv. For example, here [2] is an image I took of myself, ran through an edge detector, ran again through a distance transformer. I'm thoroughly enjoying myself.

I also know how to configure a LAMP [3], but that's nowhere near as interesting as the previous two paragraph.s

[1] http://www.FreeBSD.org/cgi/man.cgi?query=bpf&apropos=0&#...

[2] http://michaelbrindle.com/images/meDistTrans.jpg

[3] in my case: FreeBSD, Lighttpd, mysql, and python, so... FLMP

[+] thenduks|14 years ago|reply
This list has nothing to do with CS students. It's just (specifics about LAMP/etc aside) stuff any competent programmer should do.
[+] vduquette|14 years ago|reply
10001 - Talk to a girl.
[+] sambeau|14 years ago|reply
Beat me to it. :)

There is, sadly, some truth hidden in this quip.

[+] praptak|14 years ago|reply
Quite web-specific (not necessarily bad!) It's been over 10 years since my MSc in CS and even more since I started working in IT and I still haven't done most of the things.
[+] flexd|14 years ago|reply
I think there are about two things on that list I haven't done, besides not having started CS/Comp. Engineering yet.

It might just be me but shouldn't just a whole bunch of debugging, technical know-how and actually having a strong interest in technology also be important? I know many CS students that besides gaming are not really interested in nerdy technical things and I know there are a lot of people starting CS (at least here in my country) that have never really used a computer for anything other than internet surfing and word processing.

It's not like you become a good programmer or computer person over night just by taking a three year long CS bachelor.

Somebody who is already committed to learning more things on their spare time and already has an interest in these things before starting school will always come out of the situation/bachelor better. Don't you think so?

I would also have included a bit of electrical engineering knowledge (like soldering, electrical circuits and things like that) because just because you are a CS student and work in software it shouldn't mean you should know nothing of the systems and technology you use.

[+] dlo|14 years ago|reply
Maybe different lists can be prepared for different career tracks. The items enumerated in the main article obviously has a Web development feel to it. For perhaps another track, I feel that the following tasks, actually performed by someone, can be re-formed into a similar list.

* modifying the Linux implementation of strace to implement system call interposition for CDE

* modifying the official C implementation of the Python interpreter to create IncPy and SlopPy

* prototyping Python interpreter extensions by hacking on PyPy, a Python interpreter (written in Python!)

* enhancing Klee, an automated test generation and bug-finding tool based on the LLVM compiler infrastructure (written in C++)

* performing quantitative data analysis using SQLite for data storage and retrieval, Python for ad-hoc data munging, and the R project for statistics

* creating lightweight interactive data visualizations using HTML and JavaScript with jQuery

* writing lots of Python scripts to automate routine tasks and to administer computational experiments

* writing a custom memory allocator for C programs

* creating dynamic program analysis tools in C using the Valgrind code instrumentation framework

* building components of a software simulator for semiconductor tester hardware using C++ within the Microsoft Visual Studio IDE

* creating an interactive image filtering application in C++ using OpenGL and GLU for image rendering and Qt toolkit for GUI.

* building graphical applications for Palm OS handheld devices in C using the Metrowerks CodeWarrior IDE

* writing a GUI for a handwriting recognition application in C++ using the Qt GUI toolkit

Programming, and indeed all of computer science, is a very mixed bag!

Source: http://www.stanford.edu/~pgbovine/academic.htm

[+] wonnage|14 years ago|reply
I don't think you actually learn much from doing any of these things. For example, most of the developers I meet set up apache the following way: google a bunch of conf files; bash at it until it works; never touch it again. In any case, what good does it do you to rote memorize how any one piece of software works? What if Apache didn't exist, what if it was 1999 and all these shiny Web 2.0 APIs didn't exist - how would you write a web server or communicate with other applications then? Seems like that's the sort of knowledge you want to have, and precisely the sort of handwavey theoretical stuff you have the luxury of spending time on in college.
[+] vvnraman|14 years ago|reply
Well, the author intends to give us advice on the the general purpose CS stuff which all the CS students should have a practical knowledge in.

I think its taken for granted that while graduating, we would be doing the more demanding things such as: -designing our own programming language. -developing a minimal OS dedicated for some specific task. -develop an new alogorithm or drastically improve upon an existing one. -etc...

While doing the things mentioned in the author's list, you may surely implement a few of the crypting concepts which you have learned during your graduation. No one is stopping you to do that.

[+] KirinDave|14 years ago|reply
Why is the rule restricted to LAMP? And why should the P = PHP & Python? What makes these special? Both are poorly designed languages (since I assume we're not talking Python 3k here)?

If anything, I'd say, "Do the systems engineer job application challenge at Square in 2 languages of your choice, one of which should be Valley mainstream. Keep Python or Ruby in slot one, and aim for a big-iron language for #2, like maybe Scala or C++ or OCaml or Haskell.

[+] potatolicious|14 years ago|reply
> "Why is the rule restricted to LAMP? And why should the P = PHP & Python? What makes these special? Both are poorly designed languages (since I assume we're not talking Python 3k here)?"

Hehe, I think this is the exact attitude the author is trying to prevent. Far too many CS students become too enamored and obsessed with language purity, the perfect design, etc etc, that they end up never building anything.

The LAMP stack (in both its variations) is by a really long shot the easiest stack to string together (honestly though, Rails will work too). PHP is incredibly easy to approach from the perspective of someone who hasn't written too much code before, the documentation is way more extensive than just about any other platform, the user base is heavy and has a long track record for helping out. For a novice programmer this is an ideal way to build something end-to-end (which is the whole point of that advice) and learn the pitfalls that come with building a whole product (as opposed to one small module of a larger thing).

The industry needs people who build things. Whether or not you're familiar with Silicon Valley's Incestuous Circle of Hot Languages And Platforms is strictly secondary.

[+] sayemm|14 years ago|reply
This is very web-based, which is good and I think it should be done by current CS students - it shows passion/motivation and actually getting real-world exp.

On the other hand, for a more CS-based list of tips, this is what Joel Spolsky has to say: http://www.joelonsoftware.com/articles/CollegeAdvice.html

[+] pnathan|14 years ago|reply
Web-monkeys need to get of their shell more.

There's a gigantic world of computing out there, with good jobs to boot, that has nothing to do with web 2.0.