Computers, Cars, and a Tale of Two Apples

Here’s great article about the ideological path from open computing to computing appliance and the two Steve’s of Apple that were at the vanguard of pushing both ends of that spectrum:

Steve Wozniak, Steve Jobs, and the long road to the iPad. – By Tim Wu – Slate Magazine.

I have long contended that computers have the same trajectory as automobiles. Initially the domain of cutting-edge enthusiasts, moving through eras of: mass-production (Model-T v. IBM PC), large-differentiation (trucks/cars v. laptops/desktops), into customization (hot-rods v. case-mods). Eventually, the car market evolved into what we have today, a highly commoditized market were owners are are unlikely to tinker with the vehicle and depend on specialists to maintain and repair their car. Rather than increase the performance of their car through tuning, adjustment, or upgrades, consumers choose to just purchase new cars. The same is probably now true of computer users as well. It has been common industry knowledge that a segment of the population only upgrades operating system by purchasing a new computer.

As a thoughtful and long-time computer user, I applaud the design and functionality that modern Apple products represent. As a long time computer enthusiast, I bemoan the increasing commoditization of computing. As a computer science researcher and educator, I worry over the fact that our students seem to be increasingly the former rather than the latter.

RobotWar

This 10 top list of computer games includes an honorable mention for RobotWar. I actually discovered RobotWar when my friend Steve Green created a version for X11. While we had a great time coding robots I think the most interesting things was figuring out how Silas Warner managed to program it on an Apple ][. For a good bit Steve struggled with performance issues on hardware several times more powerful than those early Apple systems.

My experience with RobotWar probably indirectly led to my changing majors to computer science, and it certainly affected my perception of the need to efficient coding to this day.

Perspectives on Programming

Lately Mike Taylor over at the Reinvigorated Programmer has been on a roll with a couple of interesting blog posts (at least interesting enough to make Slashdot). First he blogged about deterioration of programming into pure drudgery and more recently he’s disagreed with Dijkstra on the value of BASIC as a first programming language. Here are links to the articles:

Whatever happened to programming?
Where Dijkstra went wrong: the value of BASIC as a first programming language

Continue reading

My first iPhone app

I’m still tinkering, but I pretty much just finished my first iPhone app that’s more interesting than a list of text. As I mentioned before, I’m taking the iPhone class at UMD this semester; and this is/was lab #3. Basically it’s just a small app that creates bubbles as you tap the screen, and pops them if you tap the bubble. The project specification is online here.

I’ve added a few additional features: “pop” sound and vibration, custom bubbles, multiple bubble sizes and additional colors, application icon, about screen, and removing the status and icon bars while bubbles are on screen. It’s probably not worth $0.99 (and I can’t publish to the App Store even if I wanted to), but at least one of the kids likes it. Mostly, I’m jazzed to have created something that works on the phone. Here are some screenshots (so you can see what you aren’t missing).



Recommended classes for computer science majors

csic-at-nightThis semester I am TA’ing a computer systems course. The most common questions I’m getting (aside from project help requests) are regarding classes to take it upcoming semesters. So, to that end, I thought I’d elaborate on my views regarding classes recommended for computer science majors. (I’m couching this discussion in generic terms, but after any mention of a course I’ve included the University of Maryland, College Park course numbers). From my perspective, their four courses that every computer scientist should aspire to take: algorithms, data structures , operating systems, and compilers.

Algorithms is an easy choice, is the foundation upon which all applied computer science and programming is built upon. Without at least some exposure to ideas presented in an algorithms course (CMSC 451), most programmers are at best groping in the dark. With a thorough grounding in algorithms one can be relatively confident that your code is not tragically ineffective — or blatantly attempting the impossible. Everything I’ve said about algorithms applies equally well to a data structures course (CMSC 420), so I’ll just leave it there.

An operating systems course is important because for most students it’s the only time they are forced to build upon code they themselves have written. In the classic version of an OS course (CMSC 412) students build operating system as a series of projects. Project 2 builds upon project 1 which in turn was built upon project 0; the situation that is rarely offered otherwise in an academic setting. That experience alone, beyond the simple exposure to the inner workings of an often intimidating part of our computing environment, is worth the price of admission. Lastly, and possibly most importantly, a good compilers course is key to being successful computer scientist or programmer.

Of all things taught in university computer science curriculum, compiler theory (CMSC 430) might be the only thing that a student could not discover or teach themselves. It is highly unlikely that all but the brightest students would accidentally stumble upon — or brute force their way into — the correct implementation of a compiler. Additionally, a compiler class gives the budding programmer a chance to build code using an intermediary tool. Exposure to this method of programming is both enlightening and frustrating to students, but increasingly common, if not critical, to computing in the future.

That is not to say that there aren’t other good and important classes for CS students to take, but these four courses get my vote as key to any computer science curriculum.

So what, dear reader, is your opinion?