In 1982, Alan Perlis wrote a widely-quoted series of epigrams on programming. All the good programmers I know recognize deep truths in many of these epigrams, but some are enigmatic, and I have come to find new meanings in many of them that I missed at first. Sometimes, I'm embarrassed to think of what I used to think some of them meant.
I'm engaged in developing a revolutionary new programming environment called Bicicleta, which I described a little bit in my earlier kragen-tol posts, "functional programming for amateurs in an outliner" and "towards a modern programming environment". It's unusual in many ways, and it's sometimes difficult to explain to other people why I'm making certain choices in its development. Perhaps a screencast will help, when it reaches a sufficiently mature stage of development. I'm calling it Bicicleta for four reasons: 1. A human being on foot is slower than any other land animal of the same size; but a human being on a bicycle can go 80MPH, faster than any other land animal. Bicicleta is a bicycle for your mind. 2. According to folklore.org, the above anecdote was a favorite of Steve Jobs's during the early development of the Macintosh, and for a time it looked like the new machine might be called Bicycle. If it's successful, Bicicleta will change the way people interact with computers as much as the Macintosh did, and in many of the same ways: it will make difficult things easier for experts, and it will make it possible for amateurs to do things that previously required experts. 3. There's already software called Bicycle and lots of software about bicycles, but "Bicicleta" is far more googlable. I plan to spend the next several years of my life in Spanish-speaking countries, talking mostly to speakers of Spanish, so a Spanish name seems reasonable. 4. "Functional Programming for Amateurs in an Outliner" is too long and contains at least three words that scare or offend some people. (Maybe I shouldn't worry about this, follow the lead of the Bell Labs folks, and call it Castrado or something.) Rereading Perlis's epigrams, I was struck by how relevant they are to these difficult-to-explain aspects of Bicicleta. I thought I would try to explain Bicicleta in terms of comments on some of the epigrams. So I have selected 34 of the 120 epigrams, and added comments. Probably I'll be embarrassed when I look back in a few years and see what I used to think some of these epigrams meant. 1. One man's constant is another man's variable. In Bicicleta, every named constant is a potential parameter, with its originally specified value as a default. 2. Functions delay binding; data structures induce binding. Moral: Structure data late in the programming process. In Bicicleta, data structures are replaced by, in essence, functions with multiple named return values. Consequently it is never too late to restructure the data. 3. Syntactic sugar causes cancer of the semicolon. Bicicleta's basic syntax can be written down in a few lines, but it does have syntactic sugar. 6. Symmetry is a complexity-reducing concept (co-routines include subroutines); seek it everywhere. Bicicleta uses the same construct to replace the data structure, the procedure, the function, the object, the class, and the module. Thus many classical OO refactorings become no-ops. 7. It is easier to write an incorrect program than understand a correct one. Bicicleta supports interactive experimentation, so that you can understand correct programs more quickly, and find the bugs in your incorrect programs as well. 11. If you have a procedure with ten parameters, you probably missed some. Bicicleta allows the caller to override the value of any variable in the routine they call. 15. Everything should be built top-down, except the first time. To support bottom-up programming, Bicicleta programs execute on example values as you write them, so that you can see if they do what you wanted; to support top-down programming, it's easy to stub out lower-level parts of your code. 19. A language that doesn't affect the way you think about programming, is not worth knowing. Bicicleta differs fundamentally from every well-known or widely-used programming language. 22. A good system can't have a weak command language. Bicicleta's concise and limitless programming language works for manual interaction with your data as well as writing programs to be reused, and there is a smooth slope between the two. It's so good that the programming environment itself serves as the user interface for many Bicicleta programs. 24. Perhaps if we wrote programs from childhood on, as adults we'd be able to read them. Bicicleta helps children write programs in two ways: first, its immediate and visual nature enables them to create programs more easily than traditional systems, and children can study and modify existing programs in Bicicleta more easily than in traditional systems, because it is easy to inspect their execution. 25. One can only display complex information in the mind. Like seeing, movement or flow or alteration of view is more important than the static picture, no matter how lovely. Bicicleta makes it instant and easy to see what a program would do if invoked a little differently; while, of course, no system can make it easy to understand a complex program, this ability speeds the process up a bit. 26. There will always be things we wish to say in our programs that in all known languages can only be said poorly. The usual solution to this problem is to invent a new domain-specific language, which can either be a standalone language or embedded in an existing language. Existing languages vary in how well they support embedding domain-specific languages in them. Bicicleta is close to Scheme's and Haskell's excellence here. 28. Around computers it is difficult to find the correct unit of time to measure progress. Some cathedrals took a century to complete. Can you imagine the grandeur and scope of a program that would take as long? Today, we have programs and libraries that have taken 20 or 30 years --- Emacs, DB2, Oracle, BSD, Nethack, SAS, Ingres/PostgreSQL, BRLCAD, GCC, and, of course, OS/360/z/OS, VMS, and Microsoft Windows. Grandeur is not the first term that comes to mind. "Rococo, then rubble," seems more apt. Perhaps this is because each new generation of masons cannot understand the work of their fathers, or feels incompetent to change it? Bicicleta, more than anything else, supports the understanding of existing Bicicleta programs in an unprecedented way. 30. In programming, everything we do is a special case of something more general -- and often we know it too quickly. Bicicleta is designed to turn this weakness into a strength, by smoothing the path from a solution to a specific case of a problem to a more general solution. 35. Everyone can be taught to sculpt: Michelangelo would have had to be taught not to. So it is with great programmers. I began programming when I was 4, and when no computer is handy, I write programs with pen and paper. But I do not think I am yet a great programmer; I have only had 25 years to learn, and I wasted ten of them not learning because I thought I was a great programmer. Perhaps in another 15 years I will be a great programmer. 39. Re graphics: A picture is worth 10K words - but only those to describe the picture. Hardly any sets of 10K words can be adequately described with pictures. Consequently, the user interface of Bicicleta is still essentially textual in nature, although it accommodates pictures and uses visual organization. 42. You can measure a programmer's perspective by noting his attitude on the continuing vitality of FORTRAN. My perspective is that FORTRAN has begun to absorb progress, and its continuing vitality is a testament to the importance (above all else) of language implementation quality, which in this case has won out over language design quality. 43. In software systems, it is often the early bird that makes the worm. Bicicleta is a radical rethinking of some of our oldest worms: the nature of the source/execution distinction, the program/data distinction, the definition/use distinction, and the development/use distinction. None of these distinctions disappear, but they change in nature. Such a rethinking is long overdue. 51. Bringing computers into the home won't change either one, but may revitalize the corner saloon. And today we have computers in our homes recycling software systems designed for use in research labs and hierarchical office environments. It is time to change the way we interact with computers again, as fundamentally as the Macintosh did. 57. It is easier to change the specification to fit the program than vice versa. This is often because the program, once written, was practical to write, or to use; while no program that fits the specification was. 59. In English every word can be verbed. Would that it were so in our programming languages. In Bicicleta, the distinction betwen data structure and function, noun and verb, disappears from the language and remains only as a property of how different things are used. This is possible because it is purely applicative. 68. If we believe in data structures, we must believe in independent (hence simultaneous) processing. For why else would we collect items within a structure? Why do we tolerate languages that give us the one without the other? Data structures make programming easier; in the absence of parallel hardware, concurrent shared-mutable-memory programs only make it harder. Perhaps a different programming paradigm will change this. Bicicleta is purely applicative, which offers one way out. 74. Is it possible that software is not like anything else, that it is meant to be discarded: that the whole point is to see it as a soap bubble? Bicicleta is designed with the idea that ephemeral programs quickly thrown together by end-users are as important as the more enduring and carefully crafted artifacts upon which they build. Burning Man has changed me, as has Excel. 76. It is the user who should parameterize procedures, not their creators. Any caller of a Bicicleta procedure can override the value of any variable, up to and including the return value. 94. Interfaces keep things tidy, but don't accelerate growth: Functions do. In Bicicleta, as in Smalltalk or Python, any object can be replaced by another that implements the same (subset of its) interface that its callers demand, so interfaces are implicit; and any object attribute can contain functional computation. 100. We will never run out of things to program as long as there is a single program around. Bicicleta expands the set of people who can write any particular program, and reduces the effort required, by reducing the gulfs of evaluation and action and by making it easier to study the work of others. This only makes sense if you believe in the above epigram. 103. Purely applicative languages are poorly applicable. Certainly this was true in 1982; perhaps today Haskell provides a counterexample, or perhaps not. Bicicleta will fail if it turns out to be an immutable truth. 104. The proof of a system's value is its existence. Bicicleta does not yet exist, so its value is unproved. 106. It's difficult to extract sense from strings, but they're the only communication coin we can count on. Consequently, Bicicleta stores its programs as strings that you can send to other people in email or keep in your Darcs or Subversion repository; but it provides a user interface that supports the programmer in their attempts to understand the programs much better than reading the raw strings could. 108. Whenever two programmers meet to criticize their programs, both are silent. Unless they are competent, in which case either one can talk for hours about the flaws in their own program. 109. Think of it! With VLSI we can pack 100 ENIACS in 1 sq. cm. Yet we cannot yet sell 100 ENIACs to every citizen of the world, because they can't yet program them, and because our computers are designed for US businesses, who will pay hundreds of dollars for one. 115. Most people find the concept of programming obvious, but the doing impossible. Bicicleta is designed to change this. 117. It goes against the grain of modern education to teach children to program. What fun is there in making plans, acquiring discipline in organizing thoughts, devoting attention to detail and learning to be self-critical? Bicicleta does not eliminate these requirements of programming, but it does eliminate other unnecessary barriers to children programming: the difficulty of imagining in your head events that you can never see, for example. 120. Adapting old programs to fit new machines usually means adapting new machines to behave like old ones. As true today as ever. Much of my computing time today, before Bicicleta, is spent using my laptop to run Emacs in full-screen mode, editing code and compiling it with a batch-mode compiler --- effectively, I'm emulating a space-cadet-keyboard video terminal talking to a PDP-10, except that some joker labeled my Meta key "Alt", and I'm writing C instead of Lisp. I'm developing Bicicleta in Squeak, which pretends my 3D-accelerated video card is a framebuffer on a colorized Alto that can barely blit by itself.

