We have seen that computer programming is an art, because it applies accumulated knowledge to the world, because it requires skill and ingenuity, From Donald Knuth, from “Computer Programming as an Art” (1974) in Literate Programming (1992) and especially because it produces objects of beauty. Programmers who subconsciously view themselves as artists will enjoy what they do and will do it better.
I think that it’s extraordinarily important that we in computer science keep fun in computing. When it started out, it was an awful lot of fun. Of course, the paying customers got shaded every now and then, and after a while we began to take their complaints seriously.Alan J. Perlis, from the Dedication page of Structure and Interpretation of Computer Programs (1985) We began to feel as if we really were responsible for the successful, error-free perfect use of these machines. I don’t think we are. I think we’re responsible for stretching them, seeing them off in new directions, and keeping fun in the house. I hope the field of computer science never loses its sense of fun. Above all, I hope we don’t become missionaries. Don’t feel as if you’re Bible salesmen. The world has too many of those already. What you know about computing other people will learn. Don’t feel as if the key to successful computing is only in your hands. What’s in your hands, I think and hope, is intelligence: the ability to see the machine as more than when you were first led up to it, that you can make it more.
A computer is like a violin. You can imagine a novice trying first a phonograph and then a violin. Marvin Minsky, “Why Programming Is a Good Medium for Expressing Poorly-Understood and Sloppily-Formulated Ideas” in Design and Planning (1967) The latter, he says, sounds terrible. That is the argument we have heard from our humanists and most of our computer scientists. Computer programs are good, they say, for particular purposes, but they aren’t flexible. Neither is a violin, or a typewriter, until you learn how to use it.
When you look at the “programming” bookshelves in a random bookstore, you will see loads of books that promise to turn you into a programmer on the spot. Now that you have worked your way through some first examples, however, you probably realize that this cannot possibly happen.Felleisen, Findler et.al, How to Design Programs (2018)
Acquiring the mechanical skills of programming—learning to write expressions that the computer understands, getting to know which functions and libraries are available, and similar activities—isn’t helping you all that much with real programming. If it were, you could equally well learn a foreign language by memorizing a thousand words from the dictionary and a few rules from a grammar book.
Good programming is far more than the mechanics of acquiring a language. Most importantly, it is about keeping in mind that programmers create programs for other people to read them in the future. A good program reflects the problem statements and its important concepts. It comes with a concise self-description. Examples illustrate this description and relate it back to the problem. The examples make sure that the future reader knows why and how your code works. In short, good programming is about solving problems systematically and conveying the system within the code. Best of all, this approach to programming actually makes programming accessible to everyone—so it serves two masters at once.
It’s certainly true that a lot of them sold out. I don’t know if there actually is a hacker’s ethic as such but there sure was an MIT Artificial Intelligence Lab ethic. This was that bureaucracy should not be allowed to get in the way of doing anything useful. Rules did not matter—results mattered. Rules, in the form of computer security or locks on doors, were held in total, absolute disrespect. Richard Stallman, Interview with Mondo 2000 We would be proud of how quickly we would sweep away whatever little piece of bureaucracy was getting in the way, how little time it forced you to waste. Anyone who dared to lock a terminal in his office, say because he was a professor and thought he was more important than other people, would likely find his door left open the next morning. I would just climb over the ceiling or under the floor, move the terminal out, or leave the door open with a note saying what a big inconvenience it is to have to go under the floor . . . “so please do not inconvenience people by locking the door any longer.” Even now, there is a big wrench at the AI lab which is entitled “the 7th floor master key” to be used in case anyone dares to lock up one of the more fancy terminals.
We still find the opinion that the teaching of programming boils down to the teaching of programming languages. This misconception is not restricted to the organizers of the vocational training courses in the field and their victims.Edsger W. Dijkstra, On the teaching of programming, i.e. on the teaching of thinking (1975) On many an application for a research fellowship I find the applicatant in his curriculum proudly advertising his fluency in, or at least experience with, a wild variety of instruction codes, programming languages and systems. An organization that in my country claims a central role in the education of programming professionals gives two courses in programming: its introductory course covers FORTRAN and some ALGOL 60, its advanced course deals with .... COBOL! We call such courses “driving lessons”. The student’s attention is almost entirely absorbed by becoming fully familiar with the ideosyncrasies of the various languages and is made to believe that the more of these ideosyncrasies he understands, the better a programmer he will be. But no one tells him that all those bells and whistles—those so-called “powerful features”—belong more to the problem set than to the solution set. Nobody tells him that at best he will become an expert coder of trivial algorithms, and that his difficulties will never arise from the problem itself, but always from the funny way the (usually given) algorithm has to be coded.
The Linguist has the following view of semantics in linguistics: he is interested in characterising the fact that the same sentence can sometimes mean different things, and some sentences mean nothing at all. W.A Woods, What’s In a Link: Foundations for Semantic Networks (1975) He would like to find some notation in which to express the different things which a sentence can mean and some procedure for determining whether a sentence is “anomalous” (i.e., has no meanings). The Philosopher on the other hand is concerned with specifying the meaning of a formal notation rather than a natural language. (Again, this is not true of all philosohpers—just a caricature.) His notation is already unambiguous. What he is concerned with is determining when an expression in the notation is a “true” proposition (in some appropriate formal sense of truth) and when it is false. [...] Meaning of the Philosopher is not defined in terms of some other notation in which to represent different possible interpretations of a sentence, but he is interested in the conditions for truth of an already formal representation.
An expert is more effective than a novice in doing scientific and engineering computations, not because he is better at computing per se, but because he knows what computing to do and, more importantly, what computing not to do.Harold Abelson & Gerald Jay Sussman, The Dynamicist’s Workbench: I (2004) In determining the voltage-transfer ratio of an electrical network, a novice typically writes down many equations and attempts to solve them as a problem of pure algebra. For the expert electrical engineer, in contrast, the algebraic terms carry meaning. He knows, for example, that one cannot add a resistance to a capacitance, or that the transfer ratio for a circuit with a series capacitor has no constant term in the numerator. While the novice grapples with a complicated algebraic problem of many variables, the expert can postulate a general form for the result, and can use constraints and consistency checks to determine the detailed answer in a few steps.
On what grounds the conviction of the unassailable exactness of mathematical laws is based has for centuries been an object of philosophical research, and two points of view may here be distinguished, intuitionism (largely French) and formalism (largely German).L.E.J Brouwer, Intuitionism and Formalism (1912) In many respects these two viewpoints have become more and more definitely opposed to each other; but during recent years they have reached agreement as to this, that the exact validity of mathematical laws as laws of nature is out of the question. The question where mathematical exactness does exist, is answered differently by the two sides; the intuitionist says: in the human intellect, the formalist says: on paper.
[...] algebra is to the geometer what you might call the Faustian offer. As you know, Faust in Goethe’s story was offered whatever he wanted (in his case the love of a beautiful woman), by the devil, in return for selling his soul.M. Atiyah, Mathematics in the 20th century, Bull. London Math. Soc. 34 (2002) Algebra is the offer made by the devil to the mathematician. The devil says: I will give you this powerful machine, it will answer any question you like. All you need to do is give me your soul: give up geometry and you will have this marvellous machine.
Mathematics education is closely linked with the foundation of mathematics; only the teaching and learning process can transmit, to those who will apply it, the foundation that has been concentrated in any given epoch. The design of foundation is thus strongly influenced by the needs of education. An outstanding example is Richard Dedekind’s struggle 150 years ago to find the clearest way to explain differential calculus to his students at the Zurich Politechnicum, a struggle which resulted in his famous analysis of the continuum, now an icon of foundations. Some more recent developments that are claimed to have foundational importance, such as elementary topos theory, were also strongly influenced in their origin by the need to explain calculus. Teaching can incite individual scientists to discover—and make explicit—concepts that before had been implicit in collective thinking, and in turn, the explicit concepts accelerate learning, as well as research.William Lawvere, Explicit Foundational Concepts in the Teaching of Mathematics (2007)
The principle “avoid concepts” is proposed as pedagogical doctrine in the US and in other countries, justified by the pragmatic claims that concepts do not lead immediately to the needed applications or that concepts are too difficult to teach. In this note I want to oppose these mystifications. Explicit concepts, definite enough to be the basis of reasoning, are indispensable to applications and to education. Though it is clear that the concepts that are concentrated from applications may sometimes need testing to evaluate their consistency, and it is also clear that much work is involved in presenting concepts in such a way that they can be understood by all the students who consciously participate in learning, such presentations need not be burdened with the historical constructions that have been used to establish consistency. For example, a perfectly rigorous treatment of infinite-dimensional differential geometry (that is, of the mathematics underlying the everyday physics of continuous bodies and waves), does not have to be preceded by a long detour into topological vector spaces or countable additivity, nor does it require an elaborate arbitrary build-up of atlases of charts, based in turn on rituals devised by Bolzano and Cauchy, based in turn on a cumulative hierarchy of sets. All those steps might be useful in developing some particular aspect of the subject, but they should not be a barrier that prevents people from learning to work rigorously.