Hacker News new | comments | show | ask | jobs | submit login
10000 things all CS students should do before graduating (tagide.com)
237 points by amesign on June 24, 2011 | hide | past | web | favorite | 159 comments

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

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.

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)

Those sound like engineering problems, not science problems.

I have a bias towards the systems side of computer science. I didn't mean to neglect my theoretical brethren. Maybe we can both agree that the OP is off the mark.

Completely off the mark. It seems to embraces the popular distortion of the term, when we are suppose to correct it.

In the original link there are useful problems for a web developer, but they are far from being science problems.

True, I didn't mean that to say they were, but only to clarify that what's considered computer _science_ problems, sound more like engineering ones.

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.

I go to a small liberal arts college, so our CS department is rather lacking in course breadth (although that is made up in 1-1 interaction), and so I haven't been privileged with being able to take classes on web technologies. Are you saying that all courses on things that aren't web-based are bogged down with useless crap?

He is actually saying the opposite. He is saying that your CS department is doing you a disservice if it hasn't covered the basics listed by the original poster (OS hacking, theory, making a toy language, etc.). My schooling covered all of that, and they even had a web development elective (separate from low level networking and database classes). I was also told by my professors that when the CS college first started, OS, compiler, networking and database classes were mandatory (now they are just part of a large pool of electives), so this is pretty standard stuff.

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

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.

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.

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.

That is what I am trying to say.

Umm... I don't think so. If you are thinking of CS as in Computer Science then that is CS and what the list mentions is what someone who wants to work in IT would need to know. Computer science is much more than just web technologies and many many people on HN will testify they got jobs because of knowing what this list mentions I am not denying that there are many others who would say they got jobs by knowing stuff on the list in the link, but hey its just plain wrong to say these things do not get you jobs. Many university professors have this as a minimal requirements for their job, thats one example.

Indeed, university professors, programming languages researchers, compiler and IDE developers and others do certainly need theoretical knowledge.

Could you speculate for me as to the number of job openings for compiler writers as opposed to the number of jobs for web monkeys like me?

The skills learned from writing something like a compiler or operating system can be applied to any type of software development job and are more valuable than anything on the OP's list.

College isn't a vocational school where you learn X so you can get a job doing exactly X. The idea is to learn a broad range of CS, Mathematics, and general problem solving skills. Doing so will allow you to write any type of software.

You believe that a toy compiler or operating system (which are common in CS curricula) will teach you more about software development than a toy LAMP application?

Yes. Absolutely.

Don't you? Of course you would...

I know people who do stuff on the parent's list won't find the number of job postings as plentiful as the ones who do the items in the link, but let's face it, those are hard to come by skills.

If a recent grad finds himself lacking in confidence with his or her abilities, then taking "baby" steps like those outlined in the link are perfectly fine. I know I could stand to try some of those myself. The hope though is that should a person have the drive, that they can eventually be able to do the computer science tasks.

I would be wary of confusing the idea of pursuing an education with that of getting a job. There's a correlation between the two, for sure, but they're not the same thing. I think universities themselves have been pushing this correlation, but I don't think it's necessarily the right idea to push. raffi's point is a very good one. If you're a computer scientist, then study computer science. If you're a professional programmer, then practice programming that you'll need for your job. It's like comparing technical institutes with universities.

Isn't the distinction kind of academic? Most people study computer science with the goal of getting a job as a professional programmer.

I don't think it is academic at all - CS is pretty much irrelevant to most programming jobs in the same way that theoretical physics is irrelevant to a plumber or electrician (both very skilled jobs) - it's not that the subject is inapplicable, it's just not very useful.

Note that I did a CS degree and have been lucky to have jobs that built upon that foundation (in order: research, start-ups, industry) - if you want to do fundamentally technically difficult stuff then a CS or engineering degree may help, but that is the exception not the rule.

Wait, are you saying I can't get jobs? I wonder whos been paying my bills all this time!

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.

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]

Right, but if you had to configure LAMP, could you?

What I said was, "every CS student SHOULD be able to configure LAMP." If you graduate with a degree and you can't configure the easiest web stack possible, then something went terribly wrong.

edit sub LAMP with WISC# or whatever you want. The specific technologies aren't the point of the article. It's far more useful for him to say, "Do this in Python" for somebody that is currently in a CS cirriculum. If he would have said, "configure a web stack using your database and application layer of choice," many would be (unfortunately) be lost.

> What I said was, "every CS student SHOULD be able to configure LAMP." If you graduate with a degree and you can't configure the easiest web stack possible, then something went terribly wrong.

This is kind of meaningless. Every CS student should be able to do X, but that doesn't mean every CS student should actually do X. X here could be "set up LAMP", "implement a linked list in every language you know", "read Mozilla's nsString code", "microwave a bag of popcorn", "part your hair in the middle", or "read Twilight: New Moon". A CS student should be able to accomplish these tasks, but that doesn't mean that a CS student should actually set a goal to do any of these things.

I've set up a LAMP stack before. I did it because I had a reason to, not because it was a meaningful learning experience. Setting up LAMP is sysadmin work. It has exactly nothing to do with CS.


I got a job where I learned pretty much everything I could about the LAMP stack within a couple of months. I purposefully ignored everything to do with web programming when I was in uni because I wasn't even the slightest bit interested.

A computer science student should be able to get up to speed fairly quickly on any computer science subject - they shouldn't be an expert on all computer science when they graduate (although they probably will have a specialization in which they're pretty good).

If you graduate with a degree and you can't configure the easiest web stack possible, then something went terribly wrong.

I think you've confused your specialty with the whole of computer science here. I have no idea how to configure any sort of web stack, but I certainly think I got a good value out of my degree. I bet that many people who would have no idea how to go about writing device drivers if you gave them a chip's datasheet, but that just means that they're pursuing a different specialty, not that they or their school is incompetent.

Fair enough. I guess I've been living in web / cloud la-la land where that's 99% of what me and my peers do, I literally forgot there was non web-based CS work. My apologies.

>I literally forgot there was non web-based CS work

Surely there's not much of it, not with everyone's toaster now getting IP6 addresses and heart pacemakers having built in wireless web servers. </sarcastic-hyperbole-masking-genuine-enquiry>

I think that's a very valid point. I've had some wtf discussions with software engineers that were widely respected in their careers (usually Microsoft MVPs, for some reason) yet didn't understand something as simple as how to configure a web server, or what the significance of a subnet mask was to their ability to have a functioning network connection.

It was "beneath them", yet to me that's like an airplane pilot that doesn't know how to drive a car. Being able to fly a plane is great, but what about when you just want to get across town and buy some groceries?

Difference in specialties. I'm in my mid 40's and I've been programming since I was 18. The very first time I had to configure a web server was about 5 months ago when I got nginx running on my laptop.

Ask me about microcontroller programming or writing code to control the real world and I'll talk your ear off. Ask me about web stuff and my knowledge stops at PHP.

Valid point, but if you were writing code meant to run on the web, you should be expected to know a little bit about the server stack that will host your application.

The point is that not all CS students (and later graduates) write code for the web.

Given how common guides are for setting up a basic LAMP, and that you can actually download free software called "MAMP" or "WAMP", it does seem like easily acquired knowledge.

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.

The key word here being "average". Many of my classmates weren't even able to do the things on the list, much less write a toy OS or language. So yes, for average people this list is a good stepping stone to become above average.

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.

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.

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

I don't know. I'm a sophomore and I've done most of these, and I don't consider myself to be very smart or a good programmer. I would say these are good tasks for people that are familiar with programming basics -- how to write a console application, what a for loop is, etc. -- and want to make the jump into making something actually useful. I wish I would have had this list a year ago.

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.

Somebody should write a "stuff that will make you SUPER BALLER" list.

Didn't they do that and call it SICP(/TAOCP/K&R/HTDP/...)?

HN could create a master list of that.

How is any of that computer science?

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

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.

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.

While I'm surprised someone got through four years of CS without learning to use mv, if you are looking for 'developers' then you should look for software engineering majors, and if you are looking for sysadmins then you should look at people with two year associates degrees in information systems or something. CS is a branch of mathematics; expecting fresh CS grads to make good sysadmins is like expecting comparative literature majors to win spelling bees. They might do better than average but it's not really what they're educated in.

We don't have good programs in systems administration and network engineering, but we should. (Any major university starting one?)

In the meantime, a good CS program is a perfectly reasonable foundation for a career in systems and networks. I ran through the gamut of logic, basic logic circuits, assembly, algorithms, data structures, complexity and then features of various languages, operating system structures, and finally graphs, automata, networks and projects in all of the above. All of that is a solid base. As with anything else worth doing, you then need to build on that base with the tools of the day.

I suspect the overall high failure rate of IT projects is attributable to "people with two year associates degrees in information systems or something". I'd rather hire an autodidact with a degree in math, physics or engineering.

>I suspect the overall high failure rate of IT projects is attributable to "people with two year associates degrees in information systems or something". I'd rather hire an autodidact with a degree in math, physics or engineering.

yawn yeah, yeah, I know that going to yale makes you better than I am.

Kids today. No respect for the trades.

Everyone choosing a major out of highschool is encouraged to go in to something highly theoretical or impractical. I think it's a show of wealth. I mean, if you get a degree in fine arts or something, well, you had better have a rich uncle or something, right?

Granted, the fact that every SysAdmin education program I've seen was decidedly second rate doesn't help. /good/ sysadmin education programs would help a lot. Really, there is no excuse for the lack of good SysAdmin programs. *NIX is older than I am. It's not like the field changes faster than anything else to do with computers.

I think you have similar problems educating people as computer scientists and then expecting them to work as software engineers. We need a lot more software engineers than we need computer scientists; and if I need a program written, sure, I'd prefer an excellent software engineer who was also a computer scientist, but if I had to make the choice, I'd choose a software engineer who was not a computer scientist over a computer scientist who was not a software engineer for 95% of all projects. But what kind of high school kid choosing a major would choose to be a lowly Engineer instead of a Scientist?

If there's ever a program that should fall under a polytechnic or college umbrella rather than the university umbrella, systems administration and network maintenance is one.

We're always going to have this issue, because IT and sysadmin will always be scoffed as something for vocational schools, dismissed by "real universities of pure knowledge and research." Major universities will never condescend to offer such programs.

And perhaps they shouldn't. But at the same time, vocational schools are still seen as having less prestige (and, thus leading to careers making less money) in the U.S. It's just an endless dilemma.

"vocational schools are still seen as having less prestige..."

Except for a few vocations that have managed to get themselves tagged as "professions". There are a number of fields where students are supposedly taught to think in general-purpose undergraduate programs, and then taught the minutia of their chosen field in "professional school". e.g. law school, medical school, and a growing list of professional doctoral programs in fields like Psychology, Occupational Therapy, Pharmacy, Optometry, Nursing, Education, etc.

Maybe someday we'll have a "Doctor of Network Configuration" or a "Doctor of Database Schema Design"? (I'm not sure if I'm kidding or not)

Why shouldn't sysadmin or network engineering be turned into some sort of engineering major? What makes EE or Computer Engineering more deserving of the ivory tower than them?

Google expects its software engineers to do all that and more with a computer science degree. So what if it's not taught in the major? You're smart -- figure it out.

Don't get me wrong, I'm plenty capable with real world stuff. I just don't like it when people think a CS education should mean learning Java libraries and design patterns and server configuration. I'm glad I wasn't forced to waste my time taking classes devoid of conceptual material.

I agree that CS shouldn't mean learning Java or ASP.NET from top to bottom, but it wouldn't hurt to have an idea about them. Also let's not forget that even Peter Norvig said Remember that there is a "computer" in "computer science".

I'd go so far as to say that I've never read a job description that was looking for a CS major and didn't expect them to know how to do these things.

This isn't "expecting comparative literature majors to win spelling bees." This is, "expecting comparative literature majors to be able to spell."

I don't think that programmers should be sysadmins. There's room in the organization for both roles. However, I do think that programmers need to understand the practical difficulties in deploying and maintaining a running application. The more difficult it is to deploy an application, the greater the chances of someone screwing it up. By putting some forethought into how their application code is organized and by making some small investments in automation up-front, programmers can save endless headaches for themselves and the sysadmins supporting them when it comes time to go live.

Knowing how modern operating systems work is crucial to the study of many CS topics. At the end of the day, a CS major must understand the workings of all systems (because they can often be generalized). Hands-on experience is one of the best ways to achieve that clarity.

I agree, and count me as one of those who needs to learn sys admin tasks (though I can move files and directories around :) ). I developed a side project last year and used Google App Engine precisely because I've never setup my own web server. In the short-term I think it was the right decision as I had a tight deadline to get the app running. In the long-term I'm not so sure since I'm now locked into GAE.

So 0001 is definitely on my someday TODO list.

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.

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

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

Questioning specific advice is part of the learning, I believe.

Specific advice is good when the audience doesn't necessarily know enough about what they need to differentiate between the various options. Thousands of man-hours are wasted every day by people trying to decide which of two (or more) entirely adequate tools they should use.

I think it's better presented as a heuristic instead of an imperative (as it is here), though: "Use X until you can articulate a reason not to."

LAMP exposure gives the CS student useful experience.

Chill, I think it was just an example he used.

> 10000 Learn to use source control

This is much better advice than telling someone to install LAMP.

    10010 Work with at least one other person on a software project; bonus points if they are remote.

Whats a good place to start studying for 10001? Say for someone engineering minded.

I offer you a few gateway drugs:

The Visual Display of Quantitative Information by E. R. Tufte;

The Elements of Typographic Design by R. Bringhurst;

The Design of Everyday Things by D. Norman;

Don't Make Me Think! by S. Krug.

Beware of Tufte. Using charts to abduct engineers into the world of design is just dirty.

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?

But being able to write a CRUD app is a basic task. Like writing a FizzBuzz program.

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

This is Hacker News, sir--how dare you suggest that coding positions exist which are not web development? :)

Haven't you heard? Mobile native applications are the new black. Great job security.

In fact there should be a buy an Arduino (http://arduino.cc) board and program it item on the list.

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

Yeah in my experience (both personal and from interviewing people), you end up getting a poor introduction to both (at least at the undergraduate level) since in many universities the major can't decide which it wants to be. You have cases where people know of NP (but have never done a reduction), and simultaneously know of version control (but have never actually used svn or git). This is really unfortunate because I feel similar majors (like math and EE) probably prepare you better for these fields (math perhaps being a better precursor to real CS and EE giving you great fundamentals for programming/comp engineering). It seems more and more like there needs to be a clearer separation, something like how econ or finance is separate from math, where math majors don't really have to learn excel or financial formulas, and econ/finance majors don't have to learn linear algebra, and both can go pretty deeply into the things they actually care about.

The counter argument to this is that we often see computer engineers that lack a basic grasp of the importance of algorithmic complexity and theoretical folks who write terrible code. You have only to read some discussions on "JS performance" to see the ridiculous attention paid to making sure variables are local, when in almost all cases user programs are actually being slowed down by O(n^2) algorithms being used. Similarly, a lot of theoretical work takes a long time to make it into the "real world" because they are inaccessible to engineers (being written completely "in math"), and often when they do provide actual sample code for their work its written in a very sloppy way (from a "code organization" standpoint). It really would be ideal if you could have a major that covered both of these really well (and I'm sure there exist some that do, I obviously have not gone through every CS/CECS/EECS major in every university).

At University of Waterloo we make that distinction by having a Software Engineering program that's part of both the Math department (the department CS belongs to) and the Engineering department.

We also have Computer Engineering, which is a middle ground between Electrical Engineering and SoftEng. :)

What do you think graduating computer science majors go on to do?

That graduating computer scientists often get work as programmers is orthogonal.

...unless you read the title with an implied [to prepare for their job] rather than an implied [to be better at computer science].

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.

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.

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

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.

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

(It seems like all the points in my list have been interpreted in many different ways here, so I apologize beforehand if any of you misinterpreted my list.)

I'm not talking about wasting years here, I'm talking about something that is possible to learn in a single course. [1] Also, I'm not talking about making a computer from scratch by building your own circuit board and make your completely own compiler to your newly designed programming language for your home made OS without any proper design. I meant simple stuff - simple compilers[2] and operative systems, because it may actually come back and help you someday - even if you're not going to make a programming language[3] or an operating system.

[1] http://video.google.com/videoplay?docid=7654043762021156507#

[2] http://norvig.com/lispy.html (maybe not THAT simple, but the idea is that doesn't have to take that long or be that hard.)

[3] http://steve-yegge.blogspot.com/2007/06/rich-programmer-food...

But wasn't that how Linux came to be?

I'm not sure what you're saying, but regardless it's not useful to attempt to create another open source OS from scratch. Unless you're an expert you're probably not going to do a very good job anyway.

Can't you can write your own programming language and use someone else's parser? When we implemented our own subset of java, we hand wrote our own parser to see how to do it, but then the professor introduced us to JavaCC.

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.

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.

I assume he means putting together a computer in the sense of constructing one from commodity parts, in which case that one is definitely in line with the rest of the list. The other two are certainly more advanced exercises than the rest, but I think they are absolutely things CS students should be expected to be able to do, though many won't be willing to. Many won't be willing to do the other things on the list either, that's kind of the point of making an inspirational list, isn't it?

Oh. I read it as, "design and construct your own circuit board." Building your own computer isn't that hard, but I don't know what (if anything) it has to do with computer science / software engineering.

You would be surprised how many CS students don't even know what parts are in the computer. Picking parts yourself forces you to research exactly what each part does.

Though I think that is a much lower bar than pretty much anything that is on the list there, any nontechnical person could figure out what parts to buy and put it together but it would be a lot harder for those people to write a MapReduce.

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.

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.

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

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.

Silly me. I hesitated clicking on the link because I was affraid of reading a super long list.

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.

Same here. I actually clicked on the link because of your comment.

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

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

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

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

10001 - Talk to a girl.

Beat me to it. :)

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

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.

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.

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

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.

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.

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.

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

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


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

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.

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

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

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.

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

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

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

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.

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.

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.

So, where does one find said mentor?

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

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

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

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

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.


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!

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.

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.

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

CS students, lucky sods, should be making transistors.

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

10 - learn to count in hex instead of binary.

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

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

And do MBA.

Writing software != Selling software

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.

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

(havent applied yet either)

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.

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

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

My plan is to double major: Finance+CS.

Take some math courses at a community college or online and boost your math grades, then reapply.

Go talk to someone at the uni who who cares about enthusiasm. Simply filling out a boilerplate form deliver great results unless you are boilerplate too. Engage some social hacking.

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact