Hacker News new | ask | show | jobs
by adregan 50 days ago
APL is the only language I've ever dreamt about writing (as in: I could see the characters); I'd dreamt about programming in the past, but those dreams were usually what I would categorized as a nightmare—desperately trying to fix a bug that I couldn't figure out.

Due to my affinity for the language, and my wish to have worked in its heyday (would love to have an APL gig someday), I have been exposed to various writings and recordings of Ken Iverson. I've also been exposed to a few of Dijkstra's thoughts on APL.

I have to say that Iverson generally comes across as a very generous and curious individual while Dijkstra seems to have been a miserable ass. Maybe, given the lens, I've not given Dijkstra a proper chance to demonstrate a more positive attitude, so I'm open to any suggestions of writings where he doesn't seem like such a grump.

3 comments

> Maybe, given the lens, I've not given Dijkstra a proper chance to demonstrate a more positive attitude, so I'm open to any suggestions of writings where he doesn't seem like such a grump.

Kinda hard to find where Dijkstra praised something (except Algol 60).

One funny example: he called FORTRAN "an infantile disorder", though he said this about the team behind it: "At that time this was a project of great temerity and the people responsible for it deserve our great admiration.".

On LISP: "LISP has jokingly been described as 'the most intelligent way to misuse a computer'. I think that description is a great compliment because it transmits the full flavor of liberation: it has assisted a number of our most gifted fellow humans in thinking previously impossible thoughts."

Alan Kay on Dijkstra: "Arrogance in computer science is measured in nano-dijkstras."

Alan Kay elaborating on that quote: https://news.ycombinator.com/item?id=11796557#11799963

“This quote keeps on showing up out of context. […]”

"Kinda hard to find where Dijkstra praised something (except Algol 60)."

Hamilton Richards, who was one of Dijkstra's colleagues at the University of Texas, told me in an email that Dijkstra was impressed by the work of Richard Bird on functional programming.

Interesting. Bird-Meertens formalism? That was directly influenced by APL. In the broader scope — algebra of programs — Dijkstra heavily disliked Backus’ FP.
He liked to make fun of emerging CS, it was his thing, and he did it pretty well. He wasn't "miserable ass", he was a man of different culture. "Positive attitude" as you used it is a late americanism FWIW. In many parts of the world we often bring our criticisms in similar caustic manner, and we enjoy it while being resilient and optimistic.

It doesn't mean that he was always right, of course.

I suppose the thing that stuck in my craw is what I perceived as a personal slight:

> Your writings made me wonder in which discipline you got your doctor’s degree.

It’s ambiguous, so I can give the benefit of the doubt. However, if intended as an insult, I believe that goes beyond speaking frankly about one’s feelings about a programming language in a manner consistent with one’s culture.

I see what you mean, and in fact I'm sure it is an insult. However, sensitivity to it is still a matter of particular culture-time. Some cultures tend to consider such things to be an attack against someone's social status no matter what context. Others may take them as banter, or emotional coloring if you like.

Another example: Americans seemingly normalized public swearing using what was originally sex-related slang, while in many other cultures it is a very-very dangerous minefield. And let's not forget that the whole field at that time was orders of magnitude smaller, which implies less formal spectrum of accepted styles of communication.

Your comments on Dijkstra are blasphemous ;-)

I often see a lot of folks here on HN who are too eager to pass judgement on Dijkstra without having read and understood his writings nor giving much thought to the context and times which shaped his thinking. All of his opinions should be thought over and appropriately adapted for use in our context. He was a wide-ranging polymath philosopher (technical and non-technical) with a laser-like focus on exactitude using Mathematics. Radical approaches must be pushed, particularly when they are hard/difficult to learn and understand. If his language was biting, then it was so much the better for promulgating his cause viz. "correctness over easy", "mathematical reasoning underpinning everything", "structure in aid of the previous", "proper language syntax/design in aid of the previous" etc.

As an example; read EWD 1036: On the cruelty of really teaching computing science (https://www.cs.utexas.edu/~EWD/transcriptions/EWD10xx/EWD103...) in entirety and carefully. The thesis is that computing is "radically novel" from other forms of human endeavour and hence it cannot be taught by simplifying to known analogues and adhoc procedural operations. You need the rigor and exactitude of Mathematical Logic to build a "Scientific" basis.

Excerpts:

... What is a program? ... I prefer to describe it the other way round: the program is an abstract symbol manipulator, which can be turned into a concrete one by supplying a computer to it. After all, it is no longer the purpose of programs to instruct our machines; these days, it is the purpose of machines to execute our programs.

So, we have to design abstract symbol manipulators. We all know what they look like: they look like programs or —to use somewhat more general terminology— usually rather elaborate formulae from some formal system. It really helps to view a program as a formula. Firstly, it puts the programmer's task in the proper perspective: he has to derive that formula. Secondly, it explains why the world of mathematics all but ignored the programming challenge: programs were so much longer formulae than it was used to that it did not even recognize them as such. Now back to the programmer's job: he has to derive that formula, he has to derive that program. We know of only one reliable way of doing that, viz. by means of symbol manipulation. And now the circle is closed: we construct our mechanical symbol manipulators by means of human symbol manipulation.

...The point to get across is that if we have to demonstrate something about all the elements of a large set, it is hopelessly inefficient to deal with all the elements of the set individually: the efficient argument does not refer to individual elements at all and is carried out in terms of the set's definition.

...

Back to programming. The statement that a given program meets a certain specification amounts to a statement about all computations that could take place under control of that given program. And since this set of computations is defined by the given program, our recent moral says: deal with all computations possible under control of a given program by ignoring them and working with the program. We must learn to work with program texts while (temporarily) ignoring that they admit the interpretation of executable code.

Another way of saying the same thing is the following one. A programming language, with its formal syntax and with the proof rules that define its semantics, is a formal system for which program execution provides only a model. It is well-known that formal systems should be dealt with in their own right, and not in terms of a specific model. And, again, the corollary is that we should reason about programs without even mentioning their possible "behaviours".

... a program is no more than half a conjecture. The other half of the conjecture is the functional specification the program is supposed to satisfy. The programmer's task is to present such complete conjectures as proven theorems.

He then goes on to describe the importance of teaching Predicate Calculus via a simple imperative language where its semantics are given by proof rules. This language is described in EWD 472: Guarded commands, non-determinacy and formal derivation of programs - https://www.cs.utexas.edu/~EWD/transcriptions/EWD04xx/EWD472... There is no compiler for this language and so the student is forced to implement the program and its proof by hand. However this radical approach is not being accepted by educationists/industry.

He concludes;

Teaching to unsuspecting youngsters the effective use of formal methods is one of the joys of life because it is so extremely rewarding. Within a few months, they find their way in a new world with a justified degree of confidence that is radically novel for them; within a few months, their concept of intellectual culture has acquired a radically novel dimension. To my taste and style, that is what education is about. Universities should not be afraid of teaching radical novelties; on the contrary, it is their calling to welcome the opportunity to do so. Their willingness to do so is our main safeguard against dictatorships, be they of the proletariat, of the scientific establishment, or of the corporate elite.

That's a whole lot of text that does absolutely nothing to justify the stuff the parent comment is talking about. Let's be honest here: he was really smart and got away with being kinda an asshole a lot because of that (probably because at least some of the time his arrogance wasn't pointed at anyone and instead was genuinely funny, like his comments about not being able to lie about being "the world's greatest computer scientist" because he was under oath on a jury.

I personally don't think that being right ever excuses the method of delivery; there's always a way to be just as right and convincing without being an asshole, but it requires conscience choice. Dijkstra probably would have found this sort of insistence tedious and beneath him, and he wouldn't be wrong about being smarter than me and probably anyone else who would have expressed this to him, but like I said, I don't think that excuses it.

In OP's post, Dijkstra explicitly points out that APL aficionados don't seem to be able to write programs without an implementation (i.e. computer+special characters keyboard) while according to him Programming is about humans manipulating symbols and hence should be doable with pencil and paper.

The reason why is what EWD1036 elaborates beautifully. My second comment with excerpts here https://news.ycombinator.com/item?id=47985605 follows on the previous (which talked about Programs) with Dijkstra's views on Programming Language.

This is what should have been discussed in this thread since it shows quite clearly the reasons for Dijkstra's uncompromising stand in the note. Roger Hui then argues that Dijkstra may have been hasty in his conclusion since Ken Iverson clearly invented APL explicitly as a notation for mathematical communication (his famous paper "Notation as a Tool of Thought") and therefore Dijkstra's insistence on writing a program formally (i.e. with proof) should be natural in APL. He then demonstrates it with a couple of examples making it a nice teaching lesson.

But "adregan" focused on some trivial phrase that Dijkstra had employed, imagined a silly slight in his head and labelled Dijkstra a "miserable ass" without having understood anything in the note (his comment has no relevance to the post). Apparently Dijkstra has not demonstrated any "positive attitude" in any of his voluminous writings! The ignorance was so breathtaking that i could not resist throwing a wall of excerpts from EWD1036 for his (and others) edification.

> I personally don't think that being right ever excuses the method of delivery; there's always a way to be just as right and convincing without being an asshole ...

This is more nuanced then you seem to think. One can be aphoristic/pithy/sharp/biting/assertive/etc. all without being an asshole. When it comes to communication, particularly of difficult scientific/mathematical abstract concepts/ideas one needs to be precise/specific so that the listener's attention is focused on the essence and not on the frills. Dijkstra did this masterfully and that is why people love to read his EWDs. When he makes a sharp observation or gives a biting opinion, it grabs your attention and you immediately start asking why/what-does-he-mean which more often than not leads to great insights.

I also pointed to the influence of time and context on Dijkstra's writings. Programming was at its infancy with Computers/OSes/Compilers/Languages/Tools all being unreliable since there was no unifying scientific principles underlying them. His knowledge of Mathematics gave him the one solid foundation on which he could build the "Science of Programming" which he did with masterful finesse and uncompromising attitude.

Lastly, Dijkstra was Dutch and culturally their society is known for their "straightforwardness" i.e. "say it as it is" way of communication - https://www.bbc.com/travel/article/20180131-where-dutch-dire...

I apologize for taking the conversation off course as it wasn’t my intention, and I also thank you for providing examples of Dijkstra‘a writing. In asking for a recommendation, I was admitting a great blind spot, so you needn’t be breathless from the ignorance.

The only thing that I feel bears repeating is that I also compared Dijkstra to Ken Iverson—a mathematician who worked in the same time period and also taught in North America—who didn’t (as far as I have seen) muddy the waters of his writings/teachings with superfluous insults.

Note that Roger Hui here foregrounds the fact that

> Ken Iverson invented his notation as a means of communications among people

(Emphasis mine) and I think that it is important that this fact of APL is conflated against one’s desire to prove a program. A fact which Hui says has little to do with the correctness of the result.

One aspect of the original which I believe you are eliding over, but which I focused on and tacitly referenced (wouldn’t be an APL discussion without a little tacit programming reference), is that in conveying one’s ideas or proofs, one can distract from their point by introducing unrelated jabs or insults. I believe this fact is present in Roger Hui’s writing.

The OP's post does not have enough data for you to make the conclusions that you made. You are merely extrapolating from your preconceived bias which is wrong. A few issues;

Comparing greats like Dijkstra, Iverson etc. is silly; each is great in his own way. However Dijkstra definitely wrote much more than any of his peers thus allowing us to better understand his modes of thinking and reasoning behind his statements. Hence your comparison is purely subjective bias.

I have already pointed out that Dijkstra placed the ability to formally reason a program over everything else. What Hui is implying is that APL's design focus on communication aids in the above which is true to a certain extent. Dijkstra draws a hard line here stating that it must not be at the expense of formal reasoning. In EWD1036 Dijkstra explicitly calls this out w.r.t. visual programming languages/systems.

I don't think Hui is comprehending any insults/slights which for some reason you seem fixated on. He merely, diplomatically implies that perhaps Dijkstra is wrong w.r.t. his comments about APL programmers. Dijkstra's note is primarily about APL aficionados and their shortcomings; there is nothing about his views on APL itself except to note that a language influences its practitioner. We also don't know what was in the original note to which Dijkstra penned this response; this Dr.Caplin might have made some snide remarks (probable given the phrase And you, too, write to me that you would like to meet me in your part of the world, so that you can “demonstrate APL” to me.) and so the sharpness of Dijkstra's response can be justified.

Regardless of any/all of the above; it is quite silly to focus on trivial and ephemeral human behavioural aspects and neglecting the very real knowledge to be gained. All greats have some behavioural quirks which one must learn to overlook if we are to learn from them. In the case of Dijkstra, he wrote so prodigiously that not only can you gain new knowledge, but can learn modes of thinking and reasoning which are applicable universally i.e. the meta-knowledge of "learning to learn". Few authors have the genius to provide you with this essence of education.

To conclude, i recently came to know of an author named Trevanian and some of his quotes, one of which seems very pertinent here.

“Your scorn for mediocrity blinds you to its vast primitive power. You stand in the glare of your own brilliance, unable to see into the dim corners of the room, to dilate your eyes and see the potential dangers of the mass, the wad of humanity. Even as I tell you this, dear student, you cannot quite believe that lesser men, in whatever numbers, can really defeat you. But we are in the age of the mediocre man. He is dull, colorless, boring — but inevitably victorious. The amoeba outlives the tiger because it divides and continues in its immortal monotony. The masses are the final tyrants. ... The roar of the plodders is inarticulate, but deafening. They have no brain, but they have a thousand arms to grasp and clutch at you, drag you down.”

― Trevanian, Shibumi

This is what we need to guard against i.e. "not become mediocre" (and add to the noise on the Internet) in our own communications/behaviour on social media and elsewhere. We need to focus on the s/n ratio always.

SICP already does that for the programmer, and "Concrete Abstractions" for the novice making it ready for SICP.
Not quite.

The books you mention deal with "Software Abstractions" i.e. Procedural Abstraction, Data Abstraction, ADT, Patterns etc. They are at a much higher level than Dijkstra's concepts.

What Dijkstra is talking about is the Set Theory/Logic Operations underlying all of them. This is why he was sceptical of OO/Functional etc. styles of programming. They were all mere syntactic sugar over the underlying Mathematics obscuring the essence of Programming. For him all computation is basically a series of manipulating values from a Set as a whole using Logical Expressions i.e. Predicate Calculus.

Again from EWD1036;

Before we part, I would like to invite you to consider the following way of doing justice to computing's radical novelty in an introductory programming course.

On the one hand, we teach what looks like the predicate calculus, but we do it very differently from the philosophers. In order to train the novice programmer in the manipulation of uninterpreted formulae, we teach it more as boolean algebra, familiarizing the student with all algebraic properties of the logical connectives. To further sever the links to intuition, we rename the values {true, false} of the boolean domain as {black, white}.

On the other hand, we teach a simple, clean, imperative programming language, with a skip and a multiple assignment as basic statements, with a block structure for local variables, the semicolon as operator for statement composition, a nice alternative construct, a nice repetition and, if so desired, a procedure call. To this we add a minimum of data types, say booleans, integers, characters and strings. The essential thing is that, for whatever we introduce, the corresponding semantics is defined by the proof rules that go with it.

Right from the beginning, and all through the course, we stress that the programmer's task is not just to write down a program, but that his main task is to give a formal proof that the program he proposes meets the equally formal functional specification. While designing proofs and programs hand in hand, the student gets ample opportunity to perfect his manipulative agility with the predicate calculus. Finally, in order to drive home the message that this introductory programming course is primarily a course in formal mathematics, we see to it that the programming language in question has not been implemented on campus so that students are protected from the temptation to test their programs. And this concludes the sketch of my proposal for an introductory programming course for freshmen.

The language mentioned above is described in EWD472 (also see wikipedia for a detailed explanation - https://en.wikipedia.org/wiki/Guarded_Command_Language). Notice the total absence of syntactic sugar and fancy computation models i.e. no complex Types, no mapping to lambda calculus or any other mathematical model (since a computer is fundamentally imperative over a state space) etc. It is just the absolute basic mathematics of Set Theory and Logic.

Note that Tony Hoare had systematized the algebra for this in his "Hoare Logic" via Pre/Post conditions for a executable statement - https://en.wikipedia.org/wiki/Hoare_logic

Dijsktra then went one-step further by giving automatic calculational rules to derive a program by simple logical manipulation of symbols. In this case we reason backwards from the output of the program (known apriori from its functional specification) i.e. from postcondition to precondition using the idea of a predicate transformer. This is his weakest-precondition (wp) calculus where with each executable program statement a Pre = wp(Statement, Post) total function is defined by the Programmer i.e. his code must satisfy the function which is the predicate transformer transforming the postcondition to a weakest-preconditon. See this wikipedia page on Predicate Transformer Semantics for a nice detailed explanation - https://en.wikipedia.org/wiki/Predicate_transformer_semantic...

Thank you for this treatment. I agree 100% with you, people for opinions about the name Dijkstra based on silly echoes of polemics that lost much of the irony in their origination.

The replies here I think support that. Dijkstra had a lot of radical ideas about computer science and I am glad to have the opportunity to read about them. When I read his texts I feel like I'm drinking from a pristine fountain and all my wandering was worth having found it at last. But people do have strong knee-jerk reactions about Dijkstra's name and some of his jabs taken out of context.

I'm talking about Lisp where most of the concepts you are talking about are being mapped almost 1:1 to some ML language, MLite, point for point:

https://www.t3x.org/mlite/index.html

Read the manual and the paper.

On guarded commands (and guards under ML), they are a bit close to a cond and recursivity under Scheme, a simple case.