Computers Are Not About Computers

Edsgar Dijsktra was a computer science pioneer who stressed the importance of math and formalism in software development. At times funny, at times profound, at times polarizing, much of what he said decades ago still holds true. This says a lot, given this field’s rapid pace of change.

Today, I want to explore one of his quotes:

“Computer science is no more about computers than astronomy is about telescopes, biology is about microscopes, or chemistry is about beakers and test tubes. Science is not about tools. It is about how we use them, and what we find out when we do.

On first glance, this seems wrong. Astronomy, Biology and Chemistry are not named after their primary tools, but Computer Science is. This implies Computer Science’s subject of study IS the tool, right? Besides, people who use telescopes are generally doing Astronomy, even if it’s a very simple sort. A similar argument holds for microscopes and beakers. However, there is no single field of study that unites computer users, many of whom aren’t even studying! Computers are used for games, chatting, checking the news, writing, etc…

These objections can be answered, but the answer is subtle and perhaps a bit confusing. Fortunately, history can help us here.

Before computers were invented, companies used…. computers. In fact, the word “Computer” was in use since at least 1613! In this case though, “Computer” was a job description – it was a human being who performed computations: Compute + er.

Then one day, a new kind of machine came on the scene, one that could do the job of the (human) computers. Naturally, it was named after the job it automated, and the Computer as we know it was born. In all fairness, there were predecessors, but it wasn’t until the 30s that machines were built that led to the computers we know and love (or hate) today.

From here on, I will use “hardware” to mean the physical machine, and “computer” to mean anything capable of computing. In theory a computer can be a person, machine (built in a variety of ways) or an army of super-intelligent ants acting as one.

Originally, computers were programmed by switching wires, but later machine languages were introduced, and people could type in commands. They were still specific to the hardware, but then compilers were created that not only allowed people to get more done with less effort, but allowed the same program to be run on different hardware, provided one recompiled. Now this wasn’t perfect as there were still some hardware specific portions of any non-trivial software that was included for efficiency or to take advantage of unique features, but a great deal of the software was hardware independent and became more so as time went on.

Today, we have software that’s 100% hardware independent. Take a web app; it often runs on a server to which we have no direct access, its client-side code runs on platforms we may not be aware of, and we’re more concerned about the browser than the hardware or even the O/S!

So this raises the question: what is the programmer programming? Computation devices, which could be abstract machines. The machines are in the form of the formalisms of the languages, frameworks, etc… used. A computer can be something running on a computer which in turn can be something running on a computer all the way down to the hardware. For instance, a program written in JavaScript is running on the JavaScript “virtual machine” which is the browser’s environment. This in turn is running on either a virtual machine (like Java) or directly on the O/S and hardware – the O/S itself containing its own machines running on hardware.

Ask someone how to program a task and the first question you will be asked is “what language”, not “what hardware”. The hardware is largely irrelevant.

Which brings us back to Djisktra.

Djikstra was talking about software development, a subset of computer science. I take his statement to mean that Computers are the formal system, not the hardware. Therefore, we should restrict our study to the things common to all formal systems used to implement complex projects and not any particular sets of hardware. Therefore, study the properties of formal systems, semantics and reasoning. Study how to reliably change code and how to write it in such a way that it is amenable to change, which includes clarity of purpose. These challenges have not changed from day one. Whether one programs in assembler or JavaScript, they will face these challenges.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s