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.)
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.
(Also, please don't use asterisks (* ) to indicate footnote or put a whitespace after each one. See http://news.ycombinator.com/formatdoc)
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'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.
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.
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.
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?
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.
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.
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 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]
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.
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).
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.
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>
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?
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.
> 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.
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'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.
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 mean, is there a list out there for astronomy students that includes, grind your own lenses?
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.
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.
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.
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?
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.
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)
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.
So 0001 is definitely on my someday TODO list.
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.
It just sounds like ESR's advice, to be a great hacker you should be just like me...
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."
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.
— 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.
Has everyone forgotten that there's more to computer science than writing a CRUD app with a web interface?
EDIT: Also, the list is numbered in binary
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).
We also have Computer Engineering, which is a middle ground between Electrical Engineering and SoftEng. :)
- Build your own computer
- Build your own (small) operative system
- Build your own programming language
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.
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 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.
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.
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).
I'm not talking about wasting years here, I'm talking about something that is possible to learn in a single course.  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 and operative systems, because it may actually come back and help you someday - even if you're not going to make a programming language or an operating system.
 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.)
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.
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.
- 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.
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.
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..
Studying Computer Science should be about learning the fundamentals. Algorithms, Discrete Math, Operating Systems, Compilers, Computer Architecture, etc.
10 Write code in <language> for <project> based on <technology/idea> on <platform>
20 goto 10
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 ], etc.).
In my free time, I'm playing with opencv. For example, here  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 , but that's nowhere near as interesting as the previous two paragraph.s
 in my case: FreeBSD, Lighttpd, mysql, and python, so... FLMP
There is, sadly, some truth hidden in this quip.
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.
* 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
* 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!
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.
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.
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.
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.
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.
Edit: I live 1800 mi. from the Valley.
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™.
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
There's a gigantic world of computing out there, with good jobs to boot, that has nothing to do with web 2.0.
No wonder resumes come with tens of technology names on it, but the owner fails to implement basic things like itoa.
Made all the difference for me.
Since when adding 3-4 self-describing lines (bare minimum required to add a virtual host) to config file is non-trivial?
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!
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.
CS students, lucky sods, should be making transistors.
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".
Writing software != Selling software
(havent applied yet either)
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.
Computer Science is about (per your example):
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
My plan is to double major: Finance+CS.