Smash Company Splash Image

November 1st, 2018

In Technology


If you enjoy this article, see the other most popular articles

If you enjoy this article, see the other most popular articles

If you enjoy this article, see the other most popular articles

Zed Shaw is angry (abstraction and indirection)

(written by lawrence krubner, however indented passages are often quotes). You can contact lawrence at:, or follow me on Twitter.

In the tech world, a headline such as “Zed Shaw is angry” is the ultimate evergreen headline, since he is always angry, and it is easy to get tired of his ranting. But I think he has a good point here:

I hate using badly designed APIs. I hate it even more when someone beats me over the head with words they were handed in some rhetoric class masquerading as a computer science course. Words like “abstract”, “pattern”, and “object oriented” are used like a shield to protect the implementer from critical words like “crap”, “complicated”, “obtuse”, and “annoying”. It’s even worse when the implementer realizes that if he implements the most complicated piece of shit possible then he can go rogue consultant and make tons of mad cash helping poor unsuspecting companies implement his steaming pile of bullshit. Harsh words? You bet. But I’m fed up with people imposing their faulty definitions and ideas on me without any way for me to easily fight back with a reasonable explanation as to why their crap is steaming. I’ve decided to start fighting back by coming up with a set of essays about programming that highlight common design misconceptions. This essay is about my top pet peeve: an abstract interface and an indirect interface are entirely different things.


Check out my books:
"I wish I could go back," said Anna. "I guess I thought it would always be there, and I could go back and learn more when I was older. But now I'm older and it's gone."

"All the great art scenes are like that," said Mariah. "Renoir's career was half over before the term Impressionism caught on. And Fitzgerald and Hemingway had given up on the Left Bank long before the place was overrun by talentless hacks who wanted to imitate the Lost Generation lifestyle. And the Beats had mostly left San Francisco before busloads of visitors started to do tours of the Haight-Ashbury. When Johnny Rotten couldn't work with the Sex Pistols anymore, he left and the London punk scene began to die. Later on, he said he regretted his decision to leave. Everyone thinks they can go away and come back later, but they never can. When Joan Didion and her husband left New York, she quipped that some other couples were staying too late at the party, but that gets it all backward. The party ends whether you want it to or not, and it takes an unusual arrogance to celebrate the end of an era that some people will remember as the best years of their life. Hemingway lived in Paris during his twenties, but he didn't write about his experience in Paris until he was in his sixties. No one ever knows they're part of an art movement; it's something you only see afterward."

"But if we only see it in retrospect, then how can we find the next great art scene?" asked Anna. "What do I look for?"

Also read this true story about a startup I worked at in 2015:


September 2, 2019 11:58 am

From lawrence on Docker is the dangerous gamble which we will regret

"Chrisco, thank you, this is a great comment. You raise the point of MySQL in Docker, but you have to provide a..."

September 1, 2019 8:12 pm

From chrisco on Docker is the dangerous gamble which we will regret

"I live in the Java world. Since about 2000 all my web apps have been deployed into what have been known as "ap..."

August 29, 2019 5:39 pm

From Brandon on How I recovered from Lyme Disease: I fasted for two weeks, no food, just water

"This is a fantastic story. There's something deeply harrowing in the sentence "[then] I took Amoxicillin for 1..."

August 27, 2019 1:53 pm

From lawrence on High Availability is not compatible with a MVP

"Joshua Hoover, I strongly agree. I've previously advocated for Heroku, which was the pioneer in the serverless..."

August 26, 2019 10:39 pm

From Joshua Hoover on High Availability is not compatible with a MVP

"Agreed on HA not being a part of MVP. It's waste. The MVP is one step closer to discovering you have to do som..."

August 21, 2019 8:47 am

From Jorge Castro on Docker is the dangerous gamble which we will regret

"Hi there and I agree completely but I can resume as follow: Docker promises simplicity, i.e. IT IS EASY. ..."

August 20, 2019 2:29 pm

From lawrence on If you want to go dancing in New York City, consider Silvana

"Which is fine. Like I said, there are dance scenes that have strict “no alcohol” rules. That might appeal to y..."

August 20, 2019 1:35 pm

From Just An Observer on If you want to go dancing in New York City, consider Silvana

""Promise of an early bed" - the whiff of danger keeps me away from many venues like the one you describe...."

August 20, 2019 12:22 am

From lawrence on If you want to go dancing in New York City, consider Silvana

"I think any time you go to any club there is the possibility of running into an angry person, maybe a person w..."

August 19, 2019 7:56 pm

From Just An Observer on If you want to go dancing in New York City, consider Silvana

"I'm confused. You and your friends went out, had a fight, and it's still a great place to go to? Maybe..."

August 18, 2019 8:57 pm

From Michael L on Americans increasingly hate each other

"You seem to have little patience for people who choose different tech paths than you. Although it looks like o..."

August 18, 2019 8:53 pm

From Michael L on Many of my Stackoverflow questions have been marked as duplicates even though they were not

"You don't suffer slights well, do you? Others who choose to waste time with dumb tech, do they keep you up at ..."

August 18, 2019 8:34 pm

From Michael L on Docker protects a programming paradigm that we should get rid of

"Me again. I've worked for a company that focuses on containerized applications for some time now. There is abs..."

August 18, 2019 8:00 pm

From Michael L on Docker protects a programming paradigm that we should get rid of

"To build on my last statement, I'm not trying to show that I'm "smarter." I'm probably not, or if I am, who gi..."

August 18, 2019 7:48 pm

From Michael L on Docker protects a programming paradigm that we should get rid of

"You think that containerization is going anywhere? I agree that it isn't strictly necessary, but you mistake y..."


November 4, 2018
10:34 am

By Cat Mara

Normally, I’d agree with a lot of what Zed has to say but I think he misses the mark here. Most of what he says here seems to boil down to the “overloading” of certain words in OO languages like “abstract”. Abstract classes in most OO languages (at least the ones descending from C++ that I’m familiar with) are not necessarily abstract in a design sense; rather, they are partial implementations that must be subclassed before they are instantiable. Is this confusing? Sure. Just don’t get me started on the way these languages abuse the word “static”!

Regarding his points about the excessive ceremony of J(2)EE: I learned about JEE in its heyday when the XML Kool-Aid was at its height but never really used it in anger. To be fair to the guy who taught it to my colleagues and me, he went through how the whole thing tied together: the home and remote interfaces, using rmic to glue everything together, the JNDI to locate services, writing a service descriptor by hand instead of letting your IDE do it for you, all the gory details. It made sense when you understood that J2EE in its earliest incarnations was heavily influenced by CORBA and things like UDDI: this dream that one day we’d be able to locate remote services and drop them into our systems without a care for where exactly they were running. Of course, none of this ever paid off: sysadmins firewalling everything except port 80 killed CORBA RPC and forced a move to Web Services; universal service discovery remained a pipe-dream, and all the machinery built into JEE to one day support it looked more and more ridiculous as more lightweight ways of building distributed applications came along. TL;DR JEE was not merely “abstraction for abstraction’s sake” as Zed would paint it: there were definitely elements of “design by committee” to be sure but the main problem IMO was it was based on a model of distributed computing whose initial assumptions were rendered irrelevant by changes in the landscape brought about by the Web.

November 4, 2018
11:46 am

By lawrence

Cat Mara, I can agree with about half of what you say. It is true that Zed Shaw is criticizing some horrible old practices that existed only because of some really odd ideas about how to handle distributed computing (or at least, ideas that now seem odd).

But it’s worth thinking about why stuff like CORBA and JEE had such problems. Serializing objects is very difficult when objects have methods, or they contain references to other objects. But serializing an object is easy if the object is simply a container for data. And we’ve all gotten used to this over the last 15 years or so, having objects of data that we serialize and then pass along through our communication channel (which might be Kafka or Redis or HTTP or RabbitMQ or raw UDP).

But if we are building a communication system and we only want pass around data objects, or documents, then surely some of the weight of object oriented ceremony is causing us some unnecessary cost? It seems like a contradiction to argue that such ceremony is 100% necessary, but also we can freely forget about it whenever we pass around messages.

I’d go further than Zed does, I’d argue that Object Oriented Programming Is An Expensive Disaster Which Must End. Even after 4 years, this remains the most popular essay I’ve written:

I’ve been working with Clojure a lot in recent years, I find its functional approach very clean. It’s built on Java, so underneath, the data structures I hand around are really Java objects. But thinking of these structures as pure data structures, rather than “objects” in the complicated Java sense, has made it easier for me to think about how I want to handle the data in the systems I build.

November 4, 2018
2:59 pm

By Cat Mara

Laurence, it was your OO essay that brought me to your site and I’ve been reading your posts ever since. And I would agree with a lot of that essay. I especially agree that languages like Java that have mutable state while at the same time encouraging programmers to use threads has brought about a uniquely fragile way of doing software development. Have one or the other, but doing both together is fucking insanity. The Clojure or Erlang approaches make more sense to me. FWIW, I have tried dipping my toe into Clojure development (I have done some work in Lisp-like languages in the past) but nothing hard-core as of yet.

I’m finding it a bit difficult to articulate all my thoughts in a comment– I should probably take a shot at trying to write an essay of mine own one of these days!– but there were some ideas in the CORBA/OMG stuff that I would be loath to see thrown out with the bathwater, or at least dismissed as mere “ceremony”. Some of the problems they were trying to address were genuinely difficult problems, rather than just design-by-committee wankery– distributed transactions, for example, or guaranteed once-only delivery in messaging. I’m thinking of Fred Brooks’s distinction between “essential complexity” and “accidental complexity” in the Mythical Man Month here. The proof of this, IMO, was that when they decided that CORBA was too complex and dated and Web Services were the new hotness, the resulting WS-* specs were every bit as byzantine as what they were supposed to be replacing. It’s easy to declare “there’s too much ceremony” and start over only to find yourself at the same point a few years down the line having to deal with one of these “essentially complex” problems like trying to maintain consistency across system boundaries.

(There’s another perspective, of course: the reason these kinds of problems are hard isn’t because they’re really technical problems, it’s because they’re political problems. Distributed transactions are hard because people are trying to subtract human accountability from the system; they want it to Just Work™ and for the buck to stop anywhere in front of them if it doesn’t. But that’s a whole other rant and I’ve probably monopolised your comments as it is)

November 4, 2018
10:43 pm

By lawrence

Cat Mara, that is a good point about the way CORBA was deemed too complex but it was replaced by WS-* specs every bit as byzantine as previous attempts at object serialization and message passing. I have previously linked to some commentary on that subject here:

I agree with you that some of the problem goes to the essence of the challenge — that is to say, this is an essential complexity. Certain problems, such as service discovery, are difficult when one is dealing with one’s own apps talking to one’s own apps, and that problem becomes extremely difficult when one wants to do service discovery of 3rd party services (or offer service discovery of one’s own services to 3rd parties).

I might have said this poorly, but my point is, I look at where the trend has been, over the last 20 years. It’s been away from all-in-one solutions. The problem has been broken down into parts. JSON emerged as the standard way documents are passed to 3rd party services, and it became common to serialize objects to JSON and then recreate them. But myself and many others continued to struggle with the problem, how should a 3rd party attempt to create the behavior of an object? So increasingly, the trend was to pass around documents, rather than whole objects.

Arguably, we were addressing the problem at the wrong level. Maybe it is best to think of network communications as an extension of inter-process communication. I believe that is one of the central ideas of RINA:

In that regard, I agree with you that “the main problem IMO was it was based on a model of distributed computing whose initial assumptions were rendered irrelevant by changes in the landscape brought about by the Web.”

Likewise, perhaps we might make further success if we challenge the assumptions the Web is based on, but that is a different conversation.

I never did anything serious with J2EE so I’m probably the wrong person to either praise it or damn it. I invite you to expand on what you were saying, if you felt there were some ideas there that should be rescued.

Regarding this:

“a few years down the line having to deal with one of these ‘essentially complex’ problems like trying to maintain consistency across system boundaries”

I agree with you that is a hard problem. I’m curious if you have a favored approach? Also, are there aspects of Object Oriented Programming that you think make this task easier?

November 5, 2018
3:03 pm

By Cat Mara


Also, are there aspects of Object Oriented Programming that you think make this task easier?

No, not really. I’d really only be interested in mining this stuff to see if people had at least thought about some of the problems inherent in building big systems before charging off on another round of wheel-re-invention. As far as I’m concerned, I’m with you that the OO crowd has been big on talk for the past forty-odd years with very little to show for it beyond a lot of expensive failures and whiny self-justifications when called to account.

November 5, 2018
7:51 pm

By lawrence

Cat Mara, that is a very good point. Even if some of the previous attempts were badly done, if someone claims they have a new approach, we should ask how much they understand about the previous failures, otherwise their new idea probably is headed for the same kind of failures.

November 22, 2018
11:49 pm

By Free Speech Message Board

Americans used to think hippies were lazy fruits for dropping out during the Vietnam War, but maybe the hippies had the right idea after all.

If you can’t change a corrupt system, why be a part of it?

Leave a Reply

Your email address will not be published. Required fields are marked *


You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>