The programming assembly-line
I read Matthew Crawford’s book, “Shop Class as Soul Craft”1, nearly 2 years ago, and in that time no other book has been on my mind more. There are things about it that ring deeply true to me, and others I think are deeply misunderstood. What’s worse, the topic is so raw and close to my heart that the thought of writing about it makes me singe. Anyway, here goes.
The book is a philosophical meditation on the concept of work. What makes work meaningful, satisfying and enjoyable? What makes it dull, boring and soul crushing? He talks about how blue-collar work can be intellectually challenging and satisfying, and how white-collar “knowledge work” can be repetitive and stultifying. Whether or not you agree with his conclusions, his examination of the underlying issues is stimulating, and is peppered with colorful and entertaining episodes from his own life. He was the director of a Washington think tank, but ended up as the proprietor of a bike repair shop specializing in Japanese motor bikes. So he speaks from experience on both sides of the fence, which already gives him more credibility than most authors on the topic. If you want a shorter introduction to some of the core issues discussed in the book, read these two2 essays3 by him.
The primary culprit for the dehumanization of work, according to Crawford, is Taylorism. So we must look at that first, and then we will loop back to what all this has to do with programmers and programming.
Taylorism is so deeply ingrained in every aspect of not just modern commerce but life in general that it is almost impossible to identify it. Just like a fish doesn’t even know that it is in water. If you haven’t read his “Principles of Scientific Management”4, it is a short and easy read, and now available free on Project Gutenberg. After reading it, you will realize that it is one of the founding documents of modern life, as well as the progenitor of the “business book” category.
Briefly, Taylorism has two central tenets:
- Measurement: associate metrics with all aspects of work.
- The separation of thinking and doing: An educated class of managers measures and plans all the work, and is responsible for the overall process, while a class of laborers carries out the implementation of those plans.
Taylor was convinced that the laborers he was studying were “soldiering”—knowingly working slowly to maintain work and wages for all their brethren.
Consider this dialogue that Taylor had with a worker in order to convince him to move more pig iron:
"Schmidt, are you a high-priced man?"
"Vell, I don’t know vat you mean."
"Oh, come now, you answer my questions. what I want to find out is whether you are a high-priced man or one of these cheap fellows here. What I want to find out is whether you want to earn $1.85 a day or whether you are satisfied with $1.15, just the same as all those cheap fellows are getting."
"Did I vant $1.85 a day? Vas dot a high-priced man? Vell, yes, I vas a high-priced man."
"Well, if you are a high-priced man, you will load that pig iron on that car to-morrow for $1.85. Now do wake up and answer my question. Tell me whether you are a high-priced man or not."
"Vell—did I got $1.85 for loading dot pig iron on dot car to-morrow?"
"Yes, of course you do, and you get $1.85 for loading a pile like that every day right through the year. That is what a high-priced man does, and you know it just as well as I do."
"Vell, den, I vas a high-priced man."
"Now, hold on, hold on. You know just as well as I do that a high-priced man has to do exactly as he’s told from morning till night. Well, if you are a high-priced man, you will do exactly as this man tells you to-morrow, from morning till night. When he tells you to pick up a pig and walk, you pick it up and you walk, and when he tells you to sit down and rest, you sit down. You do that right straight through the day. And what’s more, no back talk. Now a high-priced man does just what he’s told to do, and no back talk. Do you understand that? When this man tells you to walk, you walk; when he tells you to sit down, you sit down, and you don’t talk back at him. Now you come on to work here to-morrow morning and I’ll know before night whether you are really a high-priced man or not.”
The net effect of all this was that the worker could, under the appropriate supervision, now load 47 tons of iron a day, up from his previous 12 1/2 tons a day. He got a 60% pay raise, while the company moving the iron decreased its labor per ton by about the same percentage (from 9.2 c/ton to 3.9 c/ton). But another windfall for the company was the saving in time. Previously, moving 100 tons using 2 workers would have taken 4 days, whereas now it would take just a little over 1 day.
The assembly line
The earliest well-known enterprise to go whole-hog Taylorist was Ford, with its assembly line for manufacturing cars. The world never looked back.
The assembly line with narrowly specialized roles for each worker is a consequence of the thinking/doing separation. The smarts are in the process, the assembly line. The workers operating it are fungible. Of course, the workers did not like this at all. Skilled craftsmen that built entire artifacts were replaced with machines that required only semi-skilled operators churning out one tiny part of the whole. The pace of their work was determined by the speed of the assembly-line, which was set by managers. They had lost all autonomy and control over their work. Their work had been de-skilled. The transfer of power from skilled, knowledgeable craft workers to “the management” was sealed. Ford made this palatable by paying his workers high wages.5
In his book, Dan Pink6 talks about the three factors that make work meaningful: autonomy, mastery and purpose. The fungible non-distinguishable worker manning the assembly line was stripped of all three.
The drive to specialize
The seeds of Taylorism go back to 1817, when David Ricardo outlined the principle of comparitive advantage. He explained how two parties could gain by making goods they were efficient at and then trading with each other, even if each of them could make the traded good on its own. So even if the other party is worse than you at making something, you are better off trading and focusing on your specialty, because of the saved opportunity costs. (See the Wikipedia article for a number of concrete examples7).
The undeniable math of comparitive advantage is the natural driver for specialization. Taylor brought the concept down from the level of countries to individual workers.
What does this have to do with writing software?
The field of software engineering was built on firmly Taylorist principles. It had no other choice, because that was the default school of thought.
In 1968, NATO called a conference on the subject of “software engineering” (the field did not have a name back then, and NATO’s pick of terminology stuck)8. The industry was having a lot of trouble creating large and complex software, and it was about time something was done about it.
Doug McIlroy expressed what became the rallying cry for the field: “The software industry is not industrialized”!9 He said:
Software production today appears in the scale of industrialization somewhere below the more backward construction industries. I think its proper place is considerably higher, and would like to investigate the prospects for mass-production techniques in software. In the phrase “mass production techniques,” my emphasis is on “techniques” and not on mass production plain. Of course mass production, in the sense of limitless replication of a prototype, is trivial for software. But certain ideas from industrial technique I claim are relevant. The idea of subassemblies carries over directly and is well exploited. The idea of interchangeable parts corresponds roughly to our term `modularity,’ and is fitfully respected. The idea of machine tools has an analogue in assembly programs and compilers. Yet this fragile analogy is belied when we seek for analogues of other tangible symbols of mass production. There do not exist manufacturers of standard parts, much less catalogues of standard parts. One may not order parts to individual specifications of size, ruggedness, speed, capacity, precision or character set.
More than 40 years later that still remains the Holy Grail of software engineering.
McIlroy envisioned a world where we would be constructing software by picking components off a shelf, and snapping them together like Legos. The hard work would be building the right blocks, and then it would be easy to snap them together.
Later, Osterweil played a neat recursive trick and argued that the process of making software could be expressed as software too10. The implication was that it could be executed, just like software.
In some ways this vision has come true, in other ways, it hasn’t.
Post-modern programming11 starts with Googling, and ends with glue code.
In fact, this componentization has come far enough that many developers complain that the plumbing of pre-existing parts has drained the joy and skill out of their profession12. Does that sound familiar? The craftsman-turned-assembly-line worker of the 20th century had exactly the same lament!
John D. Cook argues that calling somebody “plumber programmer”13 is actually a compliment, because it’s the plumbing and connecting and impedance matching that is hard. But I suspect today that’s true because it’s only the plumbing that is left to do.
How many times can you build a cookie-cutter CRUD app with a web frontend that fetches and displays data from a SQL backend before you feel like all you are doing is cranking a lever? If your Java IDE generates half your code for you, and you auto-complete (Ctrl-Space!) most of the rest, do you feel like you are operating machinery, and not really engaging in expression?14
In other ways, McIlroy’s vision is still a dream.
Massive development effort still goes into applications that are young and not standardized. There are no components that will let you build your own web-scale search engine quickly, for example.
Programmers are certainly not fungible assembly-line operators15.
As in all things in life, there is a hierarchy to these things. There is a small number of elite wizard programmers who do write significant things from scratch. Think of those who have implemented language compilers and runtimes, database engines, search engines, operating system kernels and the like. Unfortunately, such projects come along rarely, and the bar for contribution is extremely high.
(By the way, if you are tired of plumbing together databases and PHP and really want to experience the wild West of programming, go contribute patches to the Linux kernel. No fancy languages or libraries that make you soft in userspace. Just plain old C.)
Some problems, such as building webapps backed by databases, are well understood, and their solutions have become templatized. Others, such as indexing a billion documents, or storing a bazillion petabytes across a gajillion machines, are at the edge of our knowledge, and their solutions are still being actively explored.
If you think you are writing cookie-cutter code, it is because you are working on a cookie-cutter problem.
But we must all realize that at the end of the day, we work on something that is in economic demand (in other words, software engineers are well-paid), intellectually challenging (at least, on most days) and in some small way improves the world and helps people. Even all this self-examination and criticism is a luxury that many do not have.
So, be grateful.