In software engineering, “design patterns” has been used in a few different ways. One of them is something like “abstractions that are a little bit higher-level than the ones built into your programming language.” Fans of some languages (Lisp, Haskell) looked at “patterns” in other languages (C++, Java) and said, “Why do you need to write a ‘pattern’ for that? It’s just a {higher-order function, macro, monoid in the category of endofunctors, etc.}” — something built-in to the speaker’s preferred language. (See Dominus, Norvig, C2 Wiki, and Graham’s “Blub paradox”.)
Analogously, there are “ethical design patterns” that are easily expressed by core features of other systems of morality. One example of the sort of thing I mean is (moral, legal, political) equality. (The sort that expands as “the same rules apply to everyone,” not “everyone is assumed to have identical needs and abilities.”) Some people say equality is a value itself; others might say equality is a tool for aligning people to achieve other values like peace or prosperity; others that some sort of equality is necessary for talking about morality to be meaningful at all (because a rule is only ‘a rule’ if it can apply to more than one person).
Regardless, equality describes a symmetry among rules. A claim like “Everyone has an equal right to own property, not a right to own equal property” is just saying that one symmetry exists and another doesn’t. (Or, cynically, “the rich and the poor are equally forbidden from sleeping under bridges and stealing bread.”)
(Other terms I think might work at higher levels of abstraction include “faith” and “grace”. Faith points at something like “acting as if X is true, in a way that supports it turning out to be true” — like forgiveness in the iterated Prisoner’s Dilemma, or loving your neighbor because God loves everyone and you are God’s hands — and grace is when that actually works.)
To the person whose moral language is higher-level than consequentialism, consequentialists have gotta look a bit like C++ programmers look to the Lisp or Haskell hacker. Greenspun’s Tenth Rule generalizes: “Any sufficiently developed consequentialist morality contains an ad-hoc, informally-specified, bug-ridden, slow implementation of half of Kantianism.” (Or maybe ”...of virtue ethics.” Or something else.)
I don’t have the math to express it, but I think this points at consequentialism and something-like-Kantianism not being opposed, but rather both just true at different levels of abstraction. And a fun part of that, is that it makes “categoricalimperative” into a math & CS pun.
I think this analogy fails to engage with how philosophically different consequentialist morality and non consequentialist morality. Here is how i would describe moral frameworks in programming terms, from an admittedly consequentialist perspective. Here a single line of machine code will correspond to some simple moral claim (eg “John prefers outcome A over outcome B”). The programming languages are different consequentialist moralities. Each of which will have some terminology which compiles down to the machine code. Examples of such terms could be “the common good”, “action A is better than action B in situation S”, “outcome A is good”, “person P is good”, which each language can include or exclude, also notably two languages might implement the same thing in ways that compile fundamentally differently (compare how the basic list type in some languages is an array and in some languages is a linked list).
Then non consequentialist positions is like having programming languages that cant compile to machine code. The non consequentialist claims that the machine language is impoverished. This would be similar to criticizing a programming language as not Turing complete. And maybe thats a correct criticism, but it is a fundamentally deeper disagreement.
Maybe its worthwhile to compare with the question of reductionist vs non reductionist ontology. Here the machine code is some simple empirical claim (eg “there is an electron at (x,y,z,w)”). The programming languages are languages that contain words that compile down to machine code (possibly in layers biology → chemistry → particle physics). Then non reductionism claims that there are real objects (eg souls or numbers) which cannot be compiled like that, the machine code forms an impoverished ontology, that cant explain/compile everything that exists.
I have this saying I find pithy and fun, which may or may not reflect my actual morality: “The correct ethical system is virtue ethics, but it is not virtuous to ignore consequentialism”.
Full agree. Hopefully consequentialism and kantianism are not opposed, in most cases. They can be seen as mirrored process, inductive vs deductive. My first thought when reading the blog post was like : isn’t this idea of “ethical patterns” like “be kind” a fall back to deontologism as a safe mode ? But if predicting the optimal result is often intractable, the arbitration between deontologic principles is not easy either.
In software engineering, “design patterns” has been used in a few different ways. One of them is something like “abstractions that are a little bit higher-level than the ones built into your programming language.” Fans of some languages (Lisp, Haskell) looked at “patterns” in other languages (C++, Java) and said, “Why do you need to write a ‘pattern’ for that? It’s just a {higher-order function, macro, monoid in the category of endofunctors, etc.}” — something built-in to the speaker’s preferred language. (See Dominus, Norvig, C2 Wiki, and Graham’s “Blub paradox”.)
Analogously, there are “ethical design patterns” that are easily expressed by core features of other systems of morality. One example of the sort of thing I mean is (moral, legal, political) equality. (The sort that expands as “the same rules apply to everyone,” not “everyone is assumed to have identical needs and abilities.”) Some people say equality is a value itself; others might say equality is a tool for aligning people to achieve other values like peace or prosperity; others that some sort of equality is necessary for talking about morality to be meaningful at all (because a rule is only ‘a rule’ if it can apply to more than one person).
Regardless, equality describes a symmetry among rules. A claim like “Everyone has an equal right to own property, not a right to own equal property” is just saying that one symmetry exists and another doesn’t. (Or, cynically, “the rich and the poor are equally forbidden from sleeping under bridges and stealing bread.”)
(Other terms I think might work at higher levels of abstraction include “faith” and “grace”. Faith points at something like “acting as if X is true, in a way that supports it turning out to be true” — like forgiveness in the iterated Prisoner’s Dilemma, or loving your neighbor because God loves everyone and you are God’s hands — and grace is when that actually works.)
To the person whose moral language is higher-level than consequentialism, consequentialists have gotta look a bit like C++ programmers look to the Lisp or Haskell hacker. Greenspun’s Tenth Rule generalizes: “Any sufficiently developed consequentialist morality contains an ad-hoc, informally-specified, bug-ridden, slow implementation of half of Kantianism.” (Or maybe ”...of virtue ethics.” Or something else.)
I don’t have the math to express it, but I think this points at consequentialism and something-like-Kantianism not being opposed, but rather both just true at different levels of abstraction. And a fun part of that, is that it makes “categorical imperative” into a math & CS pun.
I think this analogy fails to engage with how philosophically different consequentialist morality and non consequentialist morality.
Here is how i would describe moral frameworks in programming terms, from an admittedly consequentialist perspective. Here a single line of machine code will correspond to some simple moral claim (eg “John prefers outcome A over outcome B”).
The programming languages are different consequentialist moralities. Each of which will have some terminology which compiles down to the machine code. Examples of such terms could be “the common good”, “action A is better than action B in situation S”, “outcome A is good”, “person P is good”, which each language can include or exclude, also notably two languages might implement the same thing in ways that compile fundamentally differently (compare how the basic list type in some languages is an array and in some languages is a linked list).
Then non consequentialist positions is like having programming languages that cant compile to machine code. The non consequentialist claims that the machine language is impoverished. This would be similar to criticizing a programming language as not Turing complete. And maybe thats a correct criticism, but it is a fundamentally deeper disagreement.
Maybe its worthwhile to compare with the question of reductionist vs non reductionist ontology.
Here the machine code is some simple empirical claim (eg “there is an electron at (x,y,z,w)”).
The programming languages are languages that contain words that compile down to machine code (possibly in layers biology → chemistry → particle physics).
Then non reductionism claims that there are real objects (eg souls or numbers) which cannot be compiled like that, the machine code forms an impoverished ontology, that cant explain/compile everything that exists.
I have this saying I find pithy and fun, which may or may not reflect my actual morality: “The correct ethical system is virtue ethics, but it is not virtuous to ignore consequentialism”.
Full agree. Hopefully consequentialism and kantianism are not opposed, in most cases. They can be seen as mirrored process, inductive vs deductive. My first thought when reading the blog post was like : isn’t this idea of “ethical patterns” like “be kind” a fall back to deontologism as a safe mode ? But if predicting the optimal result is often intractable, the arbitration between deontologic principles is not easy either.