Hegel conceives of history as moving in the direction of progress. Progress, for Hegel, is when society refines its consciousness of positive freedom. Being short of a complete understanding will inevitably lead to a societal breakdown, and so history is viewed as a series of societal upheavals moving in that direction. Once there were mostly only autocratic governments, in those only the ruler is free. History happens and creates some democratic governments, like ancient Greece, where more people (male landowners) get to be free. Progress has always happened and it always will.
Well, until 1806.
Hegel sees the french revolution as the turning point — finally, we became conscious that we all should be free. Prussia set up a nice constitutional monarchy and nailed it. And that's that. Yeah, there are some details in realizing freedom, but now we pretty much know what we're looking for and can stop all this business with the dialectic.
Paul Graham's (very good) beating the averages argues that using the programming language lisp was a unique competitive advantage for his startup. To make the point, he introduces "the blub paradox".
The argument, crudely restated, is that programming languages vary in power. Some have more, some less, and the more powerful ones allow you to write 'better' programs. Let's say there's a "middle" power language "blub". When the blub programmer looks at a less powerful language, they say "That's useless! It doesn't even contain [feature of blub]". But when they look at a more powerful language, they say "Ah, that's like blub with some stuff no one needs thrown in". So inevitably, the blub programmer thinks they are already using the most powerful language, totally missing out on the gains from more powerful languages.
Unless blub is lisp. That's actually the most powerful language.
For want of a better name, let's call this phenomenon the "blub paradox" paradox. It's not hard to find more examples. Like Fussel's Class skewering every social class's clueless obsession with signaling, but dedicating the last chapter to the one class that... doesn't do that (I wonder what class Fussel identifies with). Or Francis Fukuyama's claim that history ended in 1989 with the cold war, ushering in a "universalization of Western liberal democracy as the final form of human government". Or on a smaller scale, your co-worker saying: The two times we rewrote this component we only thought we understood the problem, now that we finally do we can rewrite it correctly.
Why are there so many arguments of this form?
Framing it uncharitably, someone divides things into groups. Historical epochs, programming languages, whatever. They show every group fails to realize some important ideal. They point out that members of groups often think they have achieved the ideal, even when they haven't. Worst of all, the group might constrain how you think, so your membership makes it impossible to even figure out what the right ideal is! Except for their group, it doesn't apply to them.
Often, making the exception doesn't hurt the argument much. The insight in the argument is usually the "law", how the groups tend to fail. Even if the exceptional group is bound to fail for the same reason, it’s probably still an improvement. I'm interested because I think it's surprising that people make the exception claim so regularly. I think the "Beating the Averages" argument holds up without the exception, so I'd like to figure out why he bothered.
First, does Graham actually say "except my group"? His only direct claim is that lisp is the most powerful of Eric Raymond's list of 5 languages to learn. This doesn't necessarily claim there aren't any languages more powerful than lisp, just none in the list. But he also says "if you have a choice of several languages, it is [...] a mistake to program in anything but the most powerful one", and argues specifically that you should use lisp. This adds up to "lisp is the most powerful language".
So lisp is the most powerful language. Graham argues that metaprogramming is the secret sauce that sets lisp apart. In a footnote, power is formulated as "features you could only get in the less powerful language by writing an interpreter for the more powerful language in it". Well, you'll rarely have to do this in lisp, since you can probably achieve whatever you want with macros.
This is all fine if the notion of power you care about is exactly Graham's. But there are a lot of things that could make a language powerful. Like getting help writing correct code using types, or even proving parts of your code are correct. Or unifying multi-threaded and multi-node concurrency. In another essay, Graham wonders if power is succinctness. Even these examples stick to the conception of power as just language features. A good development environment or an extensive standard library should count for something. Everything could be implemented in lisp, but as Graham himself notes, you can implement anything in anything. How easy it is to achieve these goals is relevant.
You might say, so what if it doesn't capture all you might care about, Graham has defined power such that he is correct. While it's maybe misleading to use a loaded term like "power" with only a footnote, there's no mistake. But the problem is that the definition of power he used is totally just the conception of power that a lisp programmer would use! A blub programmer would have written the same essay, but just defined power as whatever thing blub is good at.
If language power is precisely defined as "the thing lisp as good at," lisp is as powerful as you can get. If progress is defined as a hyper-specific formulation of freedom, sure, Prussia really is the end of progress. The issue isn’t in the logic, but in re-defining a complex human ideal with a specific quality that may not capture it. This only becomes a “paradox” when a bad understanding of the ideal was the original complaint.
When framed uncharitably (like in this post), the problem seems obvious. The argument locates empirical evidence, mines a descriptive law from then, but then fails to make the final step of applying the law reflexively. But if you go backward, the reasoning seems more natural. You start with a thing that is "good", like lisp or enlightenment liberalism. To claim that it's good, you must describe how other things fall short, what biases and conceptual frameworks cause them to fail, and how improvements can be seen as iterative progress toward your thing. The described biases inhibit a goal you've already achieved, so they don't apply.
Arguing from the end, teleologically, might be illuminating. Hegel, at least, did it intentionally: "The owl of Minerva takes its flight only when the shades of night are gathering."1 In less avian terms, Hegel means that you may only comprehend something after it is finished. To evaluate how something gets iteratively better, there must be a target in mind. And there's not a good way to escape the confines of the current conception when creating the target. Worse, sometimes the ideal really has been achieved and the argument should just be accepted.
So how can the good and bad versions of the argument be distinguished? Usually, in both forms, "Except for my group" is logically sound. So the problem hinges on definitions of the goals. It seems there are two escapes.
1. The definition is narrow, specific, and does not attempt to tie that specific goal to a broader concept. Rather than "Lisp is the most powerful language", it says "Lisp is the most homoiconic language".
2. The broad concept is used, but the definition is one that members of every group agree on (paradigm invariant).
If neither are the case, it's worth triple-checking if the exception belongs in the argument.
I swear I couldn't find a more straightforward statement of this sentiment. An approximation of Hegel's last words: "Only one man ever understood me, and even he didn't"