read


read
or learn more

Our industry needs more…

Nov 27, 2012

A few weeks ago I tweeted:

Every programmer should create, at least once: OS, editor, database, roguelike, interpreter, compiler and robot.

https://twitter.com/fogus/status/268736490836750337

Yesterday a lovely post was released by an adventurous programmer Gusts Kaksis who hopes to create an operating system from scratch. Much to my chagrin, the discussion over at Hacker News was quite negative.1 However, a nice comment was added to the thread that summarizes my thoughts exactly:

Our discipline needs more people who have dared to write an OS from scratch, not fewer.

http://news.ycombinator.com/item?id=4834302

In fact, I wouldn’t stop at the OS. Instead I would advocate most, if not all, of the following:

Operating system

There is no need to create an entire operating system, but it would behoove us to learn more about the needs of a machine at its lowest levels. Perhaps a kernel, some boot code, a HAL, a memory manager or process scheduler would suffice. The point is that we should learn what it means to true operate at the level of bare metal.

Text editor

Many programmers spend a vast majority of their time on the confines of some IDE of some sort. Very often the IDE is nothing but a glorified text editor. As a result we often take our editing environments for granted, but to create one from scratch covers a vast swath of computing topics.

Database

Many of you have probably already created some sort of in-memory database for a project or ten, but those can hardly be called databases. Why not try to create a database that provides efficient storage, querying and run time optimization techniques?

Game

In my original tweet I mentioned a roguelike, but that was simply my own bias leaking out. In reality the field of game development is cyclopean in its coverage so to create any specific type of game is likely to only scratch the surface of the programming depth required. However, to pick a certain type of game and run with it is fun and provides a deeper appreciation for what it takes to bring something to market that requires technicality, an exquisite attention to detail and a strong design sense.

Interpreter

It’s not as important to design a new programming language as it to gain an appreciation of what it takes to build one. The easiest first step in language creation is to build an interpreter…

Compiler

The next step is to build a compiler. I would advise starting with a simple Pascal variant requiring only a single compilation pass and then moving on to more complex languages with ambiguities in syntax and semantics. For bonus points, throw in a VM and/or an assembler.

Robot

My final suggestion is to actually build a robot. This is similar to the OS task except even deeper in that the design and creation of hardware and software is required. There is nothing like debugging with an oscilloscope, and doing so makes you wish for something as sophisticated as printf. Performing the robot task can be a stand in for all of the other tasks if done properly, but really I view it as a culminating event.

What’s the point of all this? Education and betterment, nothing more.2 The goals of a list such as this is never the artifacts, although if you create something amazing along the way then all the better for us!

Does our industry need more text editors or operating systems? That’s debatable.3 However, our industry definitely needs more people willing to work hard to sharpen their craft, not fewer.

What do you think? Is your list different? Feel free to post a comment below or email me in my inbox at email.

:F


  1. Don’t let the bastards grind you down Gusts! 

  2. In a perfect world we would have covered all of these topics in our undergrad computer science curriculum. 

  3. I fall on the side of the fence that says the world needs vastly more of each of the things mentioned. Mountains more. 

16 Comments, Comment or Ping

  1. Well said, and I couldn’t agree more. I might personally do some of these that you suggest above.

  2. Dmitri Kuvshinov

    Very good. I’d like to throw in “write a simple CPU in an HDL” just to know what are you coding for, e.g. MIPS or a TTA variant.

  3. Could you imagine a university where each comp sci class focused on one of these? I would drop everything and figure out how to go there tomorrow.

  4. Thank you so much for writing this. It reminded me of one the reasons that I got in software and computers in the first place: the tantalizing notion that anything is possible and that there is so much to do, so many interesting problems to solve. As we progress in our careers, I think it’s easy to forget that many of us got into this field because we loved to explore and create and learn and computers and electronics make it so easy to do that. So thanks again for reminding me a little of what I first discovered about 10 years.

  5. aparkin

    Yes, because that’s what we need is more programmers working even harder on make-work projects.

  6. @aparkin

    This is my list of recommendations. There is no reason that it should be adopted outright. Instead, a programmer could adopt their own list more appropriate to their interests. In any case I wouldn’t call it “make-work” if the goal is to learn while having fun at the same time.

  7. Done. (Though only sort of for some of them.)

    Wrote the task schedulers for a Ceefax editing system in PDP-11 assembler and for a task scheduler and other code for a MC6800 based datacomms device (all “to the metal” code).

    Wrote a batch (sort of like sed) text editor for the IBM 370 VM/CMS system in IBM assembler and another, rather primitive, editor for use on HP intelligent terminals on CDC process control mini-computers (CDC 1700).

    Written a few systems that could be called “databases” though not anything relational which is what I suspect is meant here. Have done some mildly clever query optimization on a simple database, though.

    Written a few mini-compilers of various sorts for specific applications and fairly heavily extended one of the original Pascal compilers. Also a cross assembler for a Hitachi microprocessor.

    Wrote a byte-code interpreter for my own Smalltalk-like language though didn’t get much else of the system working. Also converted one largish module of a COBOL interpreter from something else (8086 assembler?) to PDP-11 assembler.

    Wrote a Monopoly game with a few other pupils when I was at school. Fortran. Punch cards. Not a lot of video manipulation.

    A level (“high school”) Engineering Science project was a sort-of-programmable (by plugging in little cards with diodes on them) line following robot.

    Funny, most of these were in the 1970s or early 1980s. Not a lot since. Humph!

  8. Gordonsowner

    I thought the answer to this was “cowbell.” My bad.

  9. The book “The Elements of Computing Systems: Building a Modern Computer from First Principles” is a comp sci text appropriate for self study that has you build a computer and OS from scratch, and is highly rated on amazon.

  10. modelpractice

    … should solve a real problem of real users with real benefit!

  11. Dmitry

    It would be great if you recommend a book on each topic, so one knows where to start.

  12. This post was really heartening. The sad part is, with even undergrad curricula being somewhat affected (in some places) with this “real problem of real users with real benefit!” etc. Many a time a young CS student just stretching his wings with thoughts of building a kernel from scratch will be forewarned. The end result of a final yr project – yet another mobile app, or face recognition software, garbage collector or others of that ilk. This list I say is holy – even if a programmer caught up in the troubles of the non-binary real world cannot do all of them, even then the thought or desire to do all those ‘someday’ is very important. When that desire dies, so does the most basic part of why we chose computer science in the first place… “I think that it’s extraordinarily important that we in computer science keep fun in computing. When it started out, it was an awful lot of fun. Of course, the paying customers got shafted every now and then, and after a while we began to take their complaints seriously. ” – Alan J. Perlis (from SICP)

  13. I agree with all of the above, and would add we need a kind of “Structure and Interpretation of Computer Systems” to illustrate how each of these systems have commonalities and differences.

    e.g. how is a web server or a database server or a web browser for that matter like an operating system? How are they different?

  14. Wowie, Glad two people mentioned SICP. I got the book just this monday. I am reading it :) and I totoally agree with your post. :)

  15. Terry

    I agree that points are effective and useful for the programmers.

Reply to “Our industry needs more…”