The Computer Sign

Computer Sign

Jan 2008

When I was serving my military service, I spent some time doing office work near a civilian employee named Panagiotis. After my transfer to that office, I remember Panagiotis inquiring about my studies, and summarizing my explanation with the following phrase: "Computer Sign".

"Computer Sign" was his rendition of "Computer Science", but the phrase stuck with me since, as if it was revealing some hidden truth with the ingenious stratagem of an apparent lack of mastery of English. Like the sign of Cain that marked him and his descendants, according to the Book of Genesis, there does seem to be an invisible sign marking all programmers for life.

The strange pictogram is not the "computer sign", of course. It appears in a blog entry which is in the Public Domain

What is it about you people, anyway?

First of all, let's define who "us people" are. Not all people who work with computers and can program are programmers. Many programmers (of yore, at least) hold degrees in anything but computer science or related disciplines. So it's not a matter of education. In fact, of all people holding degrees in such disciplines, only a handful will pursuit a career in software development. Some people even program for a living but they don't like it any more than doing any other "desk job". They don't qualify as programmers in the context of this text, either. I'd say that being a programmer is a matter of avocation rather than vocation.

A programmer wouldn't do any other job but, if forced by circumstances beyond his control, would earn his living by doing something else and program in his spare time to make up for the loss. (Male gender used for convenience only, although the numbers do tend to be skewed in favor of male programmers). A programmer is still a programmer after he punches his card to go home. Being a programmer is a qualifying adjective that sticks to you, like being a doctor or a policeman - they, too, remain doctors and policemen while on vacation or walking their dogs. (Not that I imply any other similarity between them and programmers; in fact, it would probably surprise you to know that I consider Medicine to be the highest of sciences, since its impact on the Human Condition is unquestionably the most readily felt).

Programmers enjoy programming, professional or otherwise. I believe that good professional programmers are first of all devoted amateur ones (in the true etymology of the word, from latin "amator", lover). Unless found in extremely adverse working environments, they usually find their job enjoyable and go to work happily. Even in the contrary case, they've been known to boast about masochistic feats of bravery against impossible deadlines, sleep depravation and lowly bodily needs.

Programmers, like most geeks, are introverts and shy away from tasks involving mainly human manipulation and non-technical (a.k.a. "boring") work. There's a popular myth that programmers avoid human interaction. This is simply not true, as software development is mostly teamwork, and intensely conducted one at that. Even programmers working solo write as if another programmer might look at (and revel in) their work.


Is it like engineering? Craftsmanship? Mathematics? Writing? I'd argue that it is unique in having elements of all of these. It is mind-challenging, it has schools of thought that are passionately followed, it allows personal style, it is constructive, its artifacts can be engineered to embody specific, testable qualities.

Among constructive fields, it stands out for demanding attention to levels that are orders of magnitute apart. The equivalent for civil engineering would be to work across the gamut from blueprints down to making your own cement - at the same time. Software is a discipline a few decades old, and has not yet matured to the point of building upon ready materials. It is also more versatile, as the difference between any two buildings is less than the difference between any two programs. I'm going to be flamed for this, but buildings, much as they differ, provide similar amenities (storage/working/living space, partitioned differently to suit different needs and constraints) to humans, they stand upright against the force of gravity and connect to their environment in limited ways. The engineering problems they pose can be tackled using a huge, established body of knowledge in applied mechanics, similar to which there is nothing in the field of software.

That's why I claim that software shares qualities with craftsmanship. Borrowing from another engineering field, this time, software is like automobile fabrication where most of the parts are painstakingly built from scratch. All we have advanced until now, is limited to the equivalent of having some standard parts and some standard tools to build the rest. Which is not an activity that is considered of lower esteem than design and architecture. Programmers take great pride from demonstrating mastery of the tools of their craft, and peer acceptance is gained by getting your hands dirty and creating things.

Saying that programming is like mathematics in some way, would certainly not appeal to any mathematician. It is meant to evoke the layperson's idea of mathematics, as something that involves the abstract, the exact and the cerebral. Formulating a program is demonstrably an activity beyond the usual, even though planning one's actions certainly is an everyday task. The difference is that a plan of action is mostly serial and branched, and addressed to one's own self or peers, which are infinitely more clever than the average compiler. Formulating everything, to the detail needed by a program, seems like self-punishment to the eyes of the onlooker.

As for the relation to writing, apart from the fact that programs are, in fact, typed into a computer, programming allows so much freedom in putting your thoughts forth, that it borders on the artistic. No two programmers will approach a problem the same way. From the overall shape of the solution to the syntax of their program (identation, choice of names etc), the personal style of a programmer, his or her knowledge and past experiences show through.

My personal vice

My personal vice is computer languages. It has been argued that human language, much more than the vehicle of communication, might be the actual substrate of thought. Humans can think only to the extent that their language permits them to. Computer languages for me are the expressive means of programming thought. Programmers can think only to the extent that their programming language permits them to. That's why I find it essential to be acquainted with many programming paradigms. People who close their eyes to alternative paradigms limit their perception to a narrow field.

My first encounter with programming was ZX/81 Basic. My same-named cousin was into electronics and I saw the Sinclair ZX/81 at his home during a visit. It should be evident by now, that this event has had tremendous impact to my life. Basic was so small that a demonstration by my cousin was all that was needed to understand it. I coerced my father into buying me a ZX/81 the same year, but I was writing Basic snippets on the borders of my textbooks even before that.

I then went to the NTUA and joined a small group of computerphiles sharing my infatuation with computers. One had an Amiga, one had an Atari ST, but one had an Acorn Electron (which I later bought) and another had a BBC Microcomputer. Acorn Basic entered my life. Disposing of line numbers and resembling COMAL in its syntax, it pointed me towards structured programming. And a side-effect of approaching the Acorn world was the low price of a particular book: "LISP for the Acorn Electron". This small book was my introduction to LISP. Although I didn't actually run LISP many times (external storage was a "tape drive" at the time...), just reading it was very influential. Enough, in fact, to earn me a straight A in the LISP course during my first year in France.

Apart from Mechanical Engineering, which was my area of studies, I did a lot of extracurricular study of whatever caught my interest that involved programming. "Programming in Prolog" by Clocksin & Mellish taught me this wonderful language (also very handy when I went to France), and I also had access to a PC XT clone and a copy of a Prolog interpreter to try it out.

Turbo Pascal was the language du jour after PCs entered the scene (did not make us popular with professors though, who preferred Fortran programs they could run themselves). But Turbo C was my first experience with the complexities of a modern compiled language, linking, makefiles and a zillion ways for things to go wrong and your program to go down the drain long before it even reaches the stage of being executable.

At some point I don't really remember I learned about Forth. I was intrigued by the simplicity of the execution and the circularity of the Forth environment, and was sufficiently motivated to actually write a Forth kernel for indirect threaded Forth (don't be amazed, as a Forth kernel is a few hundred machine instructions) in 8086 assembly.

During my stay in France I actually worked with LISP and Prolog, and had a chance to learn about all sorts of non-mainstream languages. One of them was CLP(R), distant relative of the Concurrent Constraint languages my D.E.A. thesis was about. Working in AI also acquainted me with rule-based systems. SNARK was the most close to me, as it was built by the late Jean-Louis Laurriere, with which I was wokring part-time.

Object orientation was a hot topic, although the field was a lot less rigidly defined than now. ObjVLisp was my introduction to metaclass-based OO. C++ was not taught at the university, but was catching up in the world at large. And the book by Bjarne Stroustrup was a really enjoyable read. I was recommending it at the time, along with Structure and Interpretation of Computer Programs as general education regardless of C++ itself.

Functional programming was a natural outcome of the course in Lambda Calculus, which lead to Miranda, Haskell and Scheme. The latter then came to me as a natural choice for a small scripting language for Ovrimos, and TinyScheme was born.

After I came back to Greece, I ordered Icon from the University of Arizona. It featured generators, goal-directed evaluation and SNOBOL-like text processing.

Java and C#. Well, they are very interesting in their own right but are direct derivatives of others. They are very interesting in their approach to software engineering, and have moved it forward very much from the time of C and 10,000-line programs that pushed the limits of software teams, but programming-wise, they are nothing new. Aspect/J (and the lesser-known Hyper/J) do fascinate me, though, and my hope for the next great thing lies with AOP, generative programming, Intentional Programming and the likes of them.

The latest in the zoo of varied programming languages is J. Not because I learned about it just now, but because I only found the time to study and understand it during the summer vacations of 2007. On the one hand, my free time is less than before. On the other hand, I have not found other stimulating programming languages worthy of inclusion in that list. I am not going to talk about Clipper, Perl, Python, various Unix shells and such, which fall short of this criterion. While they might present novelties, they do not rock my world.

I am in search of new frontiers in programming. The Computer Sign in my forehead is pulsing with a faint glow. What will the future bring?



Programming Languages