January 1, 1993
What kinds of design ideas went into the writing of Mathematica?
One way I tried to design Mathematica was the following: Think about computations that one wants to do, and think about well-defined chunks of those computations that one could give a definite name to and do lots of times. A very simple one might be Nest, a function in Mathematica that is sort of an iteration construct. There are a lot of programs one writes where one wants to do that, so it makes sense to give that thing a definite name, and say, “This is a chunk of computation that this language provides a primitive for doing”. In a sense it’s like [making] up the instruction set for a RISC machine. So [in developing] Mathematica I wrote a lot of sample programs in Mathematica, and my principle was if I keep on having to use an idiom it should have a name…
One principle is to keep the number of fundamentally different ideas fairly small, and then with each of those ideas to pin a lot of actual elements of the system on top of [it], because if you pin enough stuff on top of an idea, people are going to have to understand that idea to use the system. One of the mistakes that one has to fight in designing is to say, “For this particular thing we want to do, maybe there’s a nice mechanism we can make up, a special mechanism, say, for the way Poisson series work”. This will be a big mistake, because nobody will understand this mechanism. But if you have that mechanism be the mechanism that’s used for all list-like objects, say, then anybody who can use the system is going to understand the basic mechanism. Moreover, their understanding of the mechanism is going to grow if they see it used in a whole variety of different of places.