It has long been an axiom of mine that the little things are infinitely the most important.— Sherlock Holmes (“A Case of Identity”, Sir Arthur Conan Doyle)
A few years ago, the architecture team at my work (of which I am a part) put together a presentation for the business designed to explain why a serious rearchitecture was important. We all contributed ideas and analogies and metaphors, and different ways to illustrate the problem.
One of the ones that I contributed was this: Many times throughout your work week as a programmer, you run across things in our ten-year-old codebase that you just don’t understand. Things that look insane. Things that look like they couldn’t possibly work, and may in fact represent subtle bugs that no one’s ever been able to catch. When you find such a thing, you have two choices: you can ignore it, or you can fix it.
If you fix it, you risk breaking something. This, after all, is the source of the ancient adage that “if it ain’t broke, don’t fix it.” By “correcting” something without a complete understanding of just what the hell it’s supposed to do, you may correct one subtle bug only to introduce another. The new bug could be worse. It could cause a loss of revenue that’s not immediately obvious, and you might end up six months later in some business meeting trying to explain how you cost the company tens of thousands (or hundreds of thousands, or millions) of dollars because you “fixed” something that no one asked you to. If you are a corporate programmer with any reasonable amount of experience, this has already happened to you in your career. Probably more than once, even.
So, for any one given situation like this, the smart thing to do is to ignore it. That is, from a risk vs reward perspective, or from a return-on-investment perspective (both of which are very proper business perspectives), the right thing to do, the responsible thing to do is to just leave it and move on. Because the advantage of making your codebase just a tiny bit more sensible and sane isn’t worth that risk.
But the problem is, all those little things add up. When you stand back and look at the big picture, over the course of ten years you’ve made thousands (or even tens of thousands) of individual decisions where each one was the right decision individually, but together they spell disaster. Together, this approach means that you are literally incapable of ever improving your code. Your code is, by definition, continually going to get worse.
Among the maxims on Lord Naoshige’s wall there was this one: “Matters of great concern should be treated lightly.” Master Ittei commented, “Matters of small concern should be treated seriously.”— Yamamoto Tsunetomo, Hagakure
It’s very popular in business culture to quote Sun Tzu. After all, the competition of companies often seems like a war. Plus pithy quotes like “attack the enemy’s strategy” and “speed is the essence of war” sound really cool when you break them out in a business meeting. In reality, The Art of War does have quite a few valuable lessons for us. For instance, “lead by example” (technically, “a leader leads by example not by force”). That’s pretty good advice. Or how about this one: “Pick your battles.”
Actually, what Sun Tzu said was: “Thus it is that in war the victorious strategist only seeks battle after the victory has been won, whereas he who is destined to defeat first fights and afterwards looks for victory.” But most people interpret that as just a more flowery version of “pick your battles.” And plenty of people have expounded on this theme. Jonathan Kozol, educator and activist, once said: “Pick battles big enough to matter, small enough to win.” It seems like where Sun Tzu started was an aphorism on trying not to get into battles you know you can’t win. But where Kozol, and most of us, seem to have ended up is closer to the military version of “don’t sweat the small stuff.” That is, learn to let the little things go so you can save your strength for the big ones, the ones that are really worth fighting for.
And certainly this seems to make good sense. If you’re going to be losing any battles, they probably ought to be the ones that don’t matter as much ... right? As we contemplate where to direct our energy, where to concentrate our efforts, when each little battle comes along, it’s always going to make sense to let it go and wait for the big problem that’s inevitably going to show up tomorrow. But, the problem is, there’s a flaw in this reasoning.
See, little things add up.
I think we’re looking at the wrong end of the trite maxim spectrum. Maybe we should be considering that “mighty oaks from little acorns grow.” Or that “a journey of a thousand miles begins with a single step.” This is what disturbs me about the (quite common) corporate attitude that, as employee freedoms are eroded bit by bit in the name of increased efficiency, each such loss is a small battle, and not worth fighting over. I often speak out about such things, when I have the opportunity. And I’m often told that I need to learn to let these little things go, because, you know, there are bigger fish to fry. Pick your battles and all that.
So I get a lot of eyerolls, and shaken heads, and derisive snorts, because I’m making mountains out of molehills. I need to go along to get along. Because my argument is one of those “slippery slope” arguments, and you know how silly those are. Let gay people get married today and tomorrow we’ll have legalized bestiality. Stop people burning flags and next thing you know our free speech is gone. That sort of thing. Poppycock.
But here’s the thing. When you first start a job, the world is full of possibilities. And the environment of the place—the culture—is awesome ... if it weren’t, you wouldn’t have taken the job, right? And if, later, after you’ve been there for a while, some little small thing that attracted you to the job is taken away, it’s not a big deal, right? There’s still all the other things you liked. And, the next year, if one other little thing disappears, it’s still no big deal, right? This job is still far and away better than anything else you could find out there. And if, the year after that, one more little thing is taken away ...
Here’s another saying for you: death by a thousand cuts. None of those individual cuts hurt, really, but one day, you just realize that there’s no point in going on. And you start to question whether it really is true that there couldn’t be something better out there. And you toss off an email to some random recruiter and next thing you know you’re moving across the country to an even more awesome job. (But then I’ve told this story before.) And then you start the whole cycle all over again.
The really sad thing is that, no matter how often this happens, the corporate managers will never see it coming. See, from their perspective, people are quitting over stupid, trivial things. And people that will quit over stupid, trivial things ... you don’t want those people anyway, right? There was nothing you could do. They were unpredictable. Anything might have set them off.
They’re missing the big picture.
They let the little things slide, because they weren’t worth fighting for, and the little things added up. There were haystems snapping dromedary spines right and left, to coin a phrase. Is it really true to say there was nothing they could have done? I wonder ...
I wonder what Sun Tzu would say if asked that question. It’s sort of difficult to know for sure, seeing as how he’s been dead for about 2,500 years. But I could hazard a guess. I think he’d say this:
Treat your men as you would your own beloved sons. And they will follow you into the deepest valley.— Sun Tzu, The Art of War