163 comments

[ 0.26 ms ] story [ 310 ms ] thread
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.
How is any of that computer science?

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

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

LAMP exposure gives the CS student useful experience.
Chill, I think it was just an example he used.
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."

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

    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.

> 10000 Learn to use source control

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

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.

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.

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

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

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.

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

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

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.
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.
Quick someone (preferably a graduate) knock out a web app where grads can tick the boxes & provide links (where applicable) for these milestones
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.

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.
Take some math courses at a community college or online and boost your math grades, then reapply.
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.

10001 - Talk to a girl.
Beat me to it. :)

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

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

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

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

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.

(comment deleted)
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.
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.
Somebody should write a "stuff that will make you SUPER BALLER" list.
HN could create a master list of that.
Didn't they do that and call it SICP(/TAOCP/K&R/HTDP/...)?
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.

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

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.

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

Bingo.

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

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.

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 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.
This list has nothing to do with CS students. It's just (specifics about LAMP/etc aside) stuff any competent programmer should do.
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.)

Stuff on the list gets you jobs. Your stuff doesn't.
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.

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?
Don't you? Of course you would...
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.

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.

Wait, are you saying I can't get jobs? I wonder whos been paying my bills all this time!
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)

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.

Those sound like engineering problems, not science problems.
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.
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.
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.
(comment deleted)
Agreed, this stuff is lame.

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

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

numbering computer-related lists in binary stopped being cute a long time ago
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.

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

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

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