
10000 things all CS students should do before graduating - amesign
http://tagide.com/blog/2011/06/things-ics-students-should-do-before-graduating/
======
raffi
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.)

~~~
presidentender
Stuff on the list gets you jobs. Your stuff doesn't.

~~~
pvarangot
I think you are being a little shortsighted. You may mean it doesn't get you
jobs in the specific area that employs most of the people you share
online/offline time with.

I'de bet most of the guys that programmed the operating system you were
running when writing that post got paid for they job. The same goes for people
developing compilers or VMs, like, you know, the one Python/PHP runs on... and
don't get me started on database servers.

~~~
presidentender
That is definitely true. But how many compiler and VM jobs are there? How many
web monkey jobs are there? It's like automotive engineers, as opposed to
mechanics and drivers.

Now, I realize that we're being trained as automotive engineers, but most of
us get jobs driving. I think the blog post's advice is much more useful for
that.

~~~
demian
Good analogy, but then developers are more mechanics than drivers.

You can use your cool and deep automotive engineering knowledge to "do
mechanics", but most of the time is not efficient cost/benefit wise. Most of
the time it's more important to get the thing running in order to start the
business.

~~~
presidentender
That is what I am trying to say.

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

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

~~~
illumin8
Wireshark should be a required tool for any developer writing netcode. If you
don't understand the OSI model, or how a 3-way handshake works, how can you
possibly debug your code?

I've had to work with customers before who were writing code to send data over
XML to a web server before who had no idea how to use tcpdump and Wireshark -
it was unbelievable, but I was able to show them bugs in their code because I
could see where the TCP conversation broke down.

~~~
younata
tcpdump is also great, and I prefer it to wireshark.

I've learned how to read the packets coming through in real time, at an office
environment. I can tell people "I don't even see the code anymore, all I see
is blonde, brunette, redhead."

------
gaius
How is any of that _computer science_?

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

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

~~~
gaius
I am wary of that sort of very specific advice. Why LAMP, just because it's
fashionable? There are many, many other sorts of web stack alone, let alone
the many, many other sorts of application. Same with GitHub (which I use
myself, btw), there are plenty of others.

It just sounds like ESR's advice, to be a great hacker you should be just like
me...

~~~
bluesnowmonkey
Sure, just because it's fashionable. X86 is fashionable, C++, Java,
JavaScript, HTML, CSS. You definitely should try to become familiar with
everything fashionable in our industry. Yeah they're all messy, but they are
the reality of how things are done. People who think they don't need to are
why we have the term "ivory tower".

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

~~~
spacemanaki
> Similarly, I have no idea why you would build your own programming language.

So, I might be biased because I'm a wannabe languages geek, but I think
studying PL really does give you a lot of insight. I think if more people
tried to write their own language, there would be far fewer flame wars about
inane things like syntax, and far fewer poorly argued debates about types.

Plus, learning about parsing is definitely practical and useful.

~~~
Locke1689
I'm doing research in PL, but as much as I like it I just don't think that
designing your own PL is much of a benefit.

 _I think if more people tried to write their own language, there would be far
fewer flame wars about inane things like syntax, and far fewer poorly argued
debates about types._

I'd much rather people just leaf through some the PL research that already
exists rather than try and invent their own. Most people don't even know what
HM is.

 _Plus, learning about parsing is definitely practical and useful._

I completely disagree. Writing a parser is a character-building exercise. It
ultimately wastes more time than its worth and you're better off using someone
else's parsing system anyway.

~~~
spacemanaki
Actually I think we basically agree, it's just a matter of degree. When I read
"write your own language" I'm mostly thinking of the kinds of work you might
do in an undergrad PL class, which I think works well as a kind of antidote to
the Java monoculture. I agree that inventing and designing a custom language
with no reference, in a vacuum, would probably not be helpful.

As for parsing, that was almost exactly my point, learning about parsing, and
realizing what kind of work is involved, is just the experience you need to
reject being assigned the writing of a custom XML parser by a clueless manager
(true story).

------
phxrsng
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
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
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
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
Silly me. I hesitated clicking on the link because I was affraid of reading a
super long list.

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

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

~~~
pyrhho
Maybe release it at some point? For me, actually _shipping_ things is often
the hardest part...

------
younata
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&#...</a><p>[2] <a
href="http://michaelbrindle.com/images/meDistTrans.jpg"
rel="nofollow">http://michaelbrindle.com/images/meDistTrans.jpg</a><p>[3] in
my case: FreeBSD, Lighttpd, mysql, and python, so... FLMP

------
thenduks
This list has nothing to do with CS students. It's just (specifics about
LAMP/etc aside) stuff any competent programmer should do.

------
vduquette
10001 - Talk to a girl.

~~~
sambeau
Beat me to it. :)

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

------
praptak
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
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
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
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
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
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
> _"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.

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

I build plenty of things. I just don't get why you'd focus on PHP, which has
little business value anymore (no NEW, serious project is going to use it) or
Python (which is itself less questionable, but in a big period of transition
right now). I'm suggesting building something with technology you'll probably
end up working with once you're out of school, and Python 2.* is probably
leaving that list.

I don't know where you get "language purity" from.

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

 _Nonsense._

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

The target audience here is CS students. Odds are they've got a _bit_ of
coding experience.

> The industry needs people who build things.

Actually, the industry needs people who can both build and learn. _EVERY JOB_
you go to will have its own stack, with its own idiosyncrasies, and its own
tooling. If you are not ready to learn something new every time you go into
work, you probably shouldn't be in this career. Seriously. It's this sort of
attitude ("Stop fucking around with all that _learning_ and _build_
something") that has screwed our industry over so consistently. It is
possible, and mandatory, to do both.

> Whether or not you're familiar with Silicon Valley's Incestuous Circle of
> Hot Languages And Platforms is strictly secondary.

Not if you'd like to be employed.

~~~
dpritchett
Wouldn't C# and Java be the two obvious choices for employability? Neither
seems to show much sign of slowing down at the enterprise level, where there
are huge numbers of jobs.

Edit: I live 1800 mi. from the Valley.

~~~
KirinDave
I did say a big-iron language, did I not? Java and C# are certainly valid.

But, for example, it's not unreasonable at all for you to be expected to know
how to set up and use Redis, even at a Big Company™.

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

------
dendory
I've done all of that many times before, and I don't have any CS degree. Do I
get an honorary one now? :P

~~~
JoeAltmaier
I eat a burrito - that doesn't make me Mexican :)

~~~
badusername
Burrito eating was never a prerequisite to being a Mexican :)

------
peacewise
It is sad that CS students are now encouraged to become fancy sysadmins,
linking existing technologies together 95% of the time and maybe adding 5% of
actual stuff.

No wonder resumes come with tens of technology names on it, but the owner
fails to implement basic things like itoa.

------
yesimahuman
This is essentially the same advice I give to people when they ask me. A great
way to become a self-sufficient developer is to try coordinating a group of
machines all running software you've written. Bonus points if someone actually
uses it.

------
mattdeboard
First step for anyone who actually WANTS to be a skilled programmer is, in my
opinion, find a mentor who: 1). is really really good at programming; 2). is
even better at teaching complex matters in understandable ways.

Made all the difference for me.

~~~
zheng
So, where does one find said mentor?

~~~
mattdeboard
Have to talk to people and network. Make friends and so forth.

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

Since when adding 3-4 self-describing lines (bare minimum required to add a
virtual host) to config file is non-trivial?

------
evan_
numbering computer-related lists in binary stopped being cute a long time ago

------
asciilifeform
10000) Learn arc welding, plumbing, or other genuinely useful skill.

------
DLarsen
I'd go further and suggest completing most of these _before_ entering a CS
program. Consider it the start of a long career of self-education and
improvement.

------
Swannie
Before GRADUATING?!

This was all things I was doing before I started ATTENDING university. It's
super simple, and you won't be downloading Slackware on 30 floppy disks any
more!

------
joezydeco
Learn to install _and reinstall_ Windows. Not just Vista or 7, but XP as well.
Learn how to add/remove/troubleshoot device drivers without killing yourself.
Connect to a local server, get networking set up, get wifi working.

Because someone, somewhere, shortly after you graduate, will ask you to do
this. You might even have to do it for yourself at your first job.

[EDIT] You can downvote me, but any fellow CS grad that makes it to a business
environment will encounter _some_ coworker that will want help with their
machine, and I guarantee it will be running some version of Windows. Trust me
on this one.

------
jccodez
I would add: Visit an art museum and learn about the different styles of art.
It's about different forms of expression that don't involve 1s and 0s.

------
primitur
This is more like what "IT" students should do before entering the workforce.

CS students, lucky sods, should be making transistors.

------
mashmac2
Binary... not a literal 10,000 item list, a mere 16 items in base-10.

~~~
rcfox
<http://cowbirdsinlove.com/43>

------
zb
10 - learn to count in hex instead of binary.

------
urwrong
Isn't CS supposed to be a branch of math?

~~~
ek
Yes and no. This list makes me sad because it neglects every single computer
scientist that's interested in doing work on theory. I am one such computer
scientist, and much of the work that I do involves merely pen and paper. There
are a lot of people on HN that are web monkeys and make good money doing Web
2.0 stuff, and there are a lot of people that know pretty much nothing about
computer science but use computers and program. These people equate CS with
programming and the other sorts of tasks described in this article and then
forget that there are computer scientists that could conceivably have no idea
how to program in a modern language and still make contributions to the field.

But maybe HN is the wrong place to go looking for discourse on this sort of
material. The point, though, is that this article is misleading. Perhaps it
would have better been titled "10000 things every software engineer-hopeful
should do" or "10000 anyone who writes code for the web should do".

------
known
And do MBA.

Writing software != Selling software

------
benihana
All of these I did the first five years of my career - I feel that I got a lot
more out of them than if I would have done them while in my CS program. With a
few years of experience, I have a much better context into which to place
these experiences.

------
JacobIrwin
up to 0100 and haven't been accepted to a CS program...

(havent applied yet either)

~~~
dendory
Actually that's not a bad comment about how an actual College CS program may
not have anything to do with the real world. I run my own servers, I code my
sites from scratch in HTML, JavaScript, PHP, SQL etc.. build all my
computers.. made several open source contribution coding in C.. I can do
everything in that list and much more..

Yet when I applied to a local University in a CS program a couple years ago I
was denied. Why? High School Math grades not quite high enough.

~~~
vbtemp
That just isn't true. CS _isn't_ about "running servers, coding sites in HTML,
JavaScript, PHP, etc.."

Computer Science is about (per your example): 1\. developing the programming
paradigms underlying javascript

2\. creating SQL (i.e., defining the grammar, but also proving it's
correctness and completeness)

3\. Architecting the network protocols that provide HTTP and HTML their plush
delivery

\---3.1, Naturally, is involves inter-and-inner domain routing, name system
protocols, reliability and transmission throttling. Not to mention, generally,
complex autonomous systems

\-----3.2 To formalize, define, and prove the correctness of each the
protocol/solution these problems, you must resort to deep results in graph
theory and other branches of applied mathematics that are useful for modelling
computational problems.

\----------3.3 This requires the study into the purely theoretical realms of
computational complexity theory, graph theory, etc... in order to define
properties of the structures in the aforementioned fields of applied
mathematics. This is the traditional heart of computer science, one in which
true "computer scientists" generally have to express their results in terms
of.

So I'm glad you can do everything on that list and much more. But that isn't
computer science. sure you're hacking around, that's great, but don't go
around thinking school is dumb because they don't appreciate your web
development and unix skillz

~~~
JacobIrwin
And for those reasons 'vbtemp' I fully intend to apply once my pre-reqs are
fulfilled.

My plan is to double major: Finance+CS.

