What I learn about Software Engineering from a 60-yr old French car
There’s an elegance and timelessness to simple designs
A couple of years ago, my wife and I were driving home, and I noticed a red and black vintage Citroën 2CV in a parking lot. I have been told that at that exact moment I made a funny excited shriek. I don’t remember. I just remember frantically yelling at my wife to make a U-turn to pull into that car dealer with my heart beating fast.
Citroën is a hundred-year old French car maker that is hugely popular in Europe and Latin America, but never really made it in the USA. I couldn’t remember the last time I had actually seen a Citroën in town.
My initial excitement about the 2CV was because one had been a huge part of my childhood. I was born in Argentina in the seventies, and back then French and Italian cars were everywhere: Citroën, Renault, Peugeot, Fiat. My parents owned a decrepit 1968 Citroën 2CV, blue. They drove it from the vast plains of northern Argentina all the way to Patagonia and back for their honeymoon. The day I was born, my dad brought me home from the hospital in it. He drove me to school thousands of mornings. I still remember the way the car smelled: old leather and burnt oil. And the noises from the gearshift as it sputtered down the road. Eventually, when I was 12, the car kind of rusted away and my dad upgraded to a Renault 6. A year later, my dad passed away. I often thought about that 2CV.
Back to 2019, after my wife and I parked in the car dealer’s lot, I walked around the car with my heart beating fast, opened the back door of the Citroën, closed my eyes, and took a deep breath. Old leather and burnt oil took me back to when I was ten years old riding in the back of my dad’s car. I started crying, feeling a connection to the father I had lost over 30 years ago.
So I took the plunge and bought it. I drive it almost every single day now, despite owning 3 other much nicer cars.
By now you’re thinking. Ok that’s a lovely sappy story Carlos but what’s its connection to “software engineering”?
The car reminds me every day that there’s an elegance and timelessness to simplicity. Simple designs are beautiful. Both in cars and in software. The world is full of over-engineered things.
Citroën 2CV (in French: “Deux Chevaux”) was a hugely popular car, with four million sold between 1948 and 1990. The design of the car was virtually unchanged in four decades. Watch just about any movie set in Paris (even kids movies like Ratatouille or Cars 2!) and you’ll see them ubiquitously chugging along the Parisian cobblestone streets.
As a professional software engineer for two and a half decades at Microsoft, Amazon and Google, I am in awe of the extraordinary ingenuity of the design.
While Mercedes Benz set out to build beautiful vehicles, Porsche set out to build fast vehicles, BMW set out to build luxury vehicles… Citroën set out to build the cheapest, most utilitarian, most minimalistic vehicle possible. Their goal was to motorize the large number of farmers still using horses and carts in 1930s France. It was a “working class man” car. There was no priority given to comfort, luxury, safety, speed, looks. Instead, low cost of ownership, simplicity of maintenance, and nominal fuel consumption were the guiding principles.
There are minimalistic touches everywhere. Instead of a complex mechanism to roll windows up and down, the 2CV had manual hinged-flap front windows. This allowed the car to have extremely thin door panels which reduced manufacturing cost (less metal) and weight (better fuel consumption), but to add strength to the body, the metal was corrugated. Simple solution, but clever and effective. They also saved in manufacturing and weight by having a canvas rollback roof instead of metal. It was a utilitarian choice, but on sunny days, you could put the top down and enjoy a glorious drive in the French countryside. And it also meant that if you had any oversized items you could just open up the top and load it up. Again, simple, clever and effective.
Its 29 horsepower engine does not thrill with acceleration (there are lawnmowers more powerful than that!), but it does deliver 80 miles per gallon (in contrast, most modern cars deliver about 20 miles per gallon). That’s unbelievable even for today’s green standards.
Everything in that car is there because it absolutely needs to be there. I could spend hours talking about minimalism in the Citroën 2CV. It’s not that those French engineers didn’t think about X, Y, Z. It’s that they explicitly thought: how can we not have X, Y, Z? Yet it is comfortable, and its tiny engine is adequate to get me up and down those Seattle hills. And it is such a unique looking car that it puts a smile on anybody that sees me driving down the road.
Back to software engineering. I have an embarrassing confession to make. In 2013, I read Design Patterns: Elements of Reusable Object-Oriented Software by the Gang of Four. I fell in love with patterns and over-used them everywhere. I was pursuing a promotion to Principal Engineer at Amazon, and was told I needed technical artifacts showing complexity. I thought design patterns were a way for me to show others I was a great engineer. Look at me! I’m creating these really complex interactions between all these abstractions! I’m smart!
My views have evolved. Don’t get me wrong: the Design Patterns book is a must-read for any software engineer. But I think immediately after reading that book most people end up applying design patterns on anything that moves. Like all good things, moderation is key. I got to observe that first-hand, as new junior engineers ramped up on that codebase I created and cursed my name for a decade. Creating something complex leaves a nightmare in maintenance for another generation of engineers.
What eventually dawned on me is that the complexity we want to reward is in the problem, not the solution. I want to celebrate individuals that came with simple solutions for complex problems.
In fact, that’s a thing we often misunderstand at performance review time in software companies. Discussions often get ratholed on “Was X’s design complex? Did X build something complex?” instead of “Did X tackle and disambiguate a complex space?” When you have a simple solution for a complex problem, it’s often hard to grasp how complex the problem was and how much intellectual horsepower it took to distill it down to that simple solution.
I recently spent a week on a 20-line code change here at Google. Writing the actual 20 lines took me maybe ten minutes. Testing the change took me a few hours. But figuring out which were the correct 20 lines to add took me 4 days. I could see a person looking at the code review thinking, “oh that was easy, he spent a week on this???”
“Invent and Simplify
Leaders expect and require innovation and invention from their teams and always find ways to simplify. They are externally aware, look for new ideas from everywhere, and are not limited by ‘not invented here.’ As we do new things, we accept that we may be misunderstood for long periods of time.”
The fact that both Invent and Simplify were baked into the same leadership principle gave amazonians the opportunity to focus on both equally when discussing somebody’s performance. But since most people tended to over-index on the Invent part, I made it my mission during review and promotion time to be the advocate for the Simplify part.
“Simple” means less things that can go wrong with the system. “Simple” means easier to understand, maintain and evolve for new generations.
Before owning the 2CV, I owned a couple of S-class Mercedes Benz models. The amount of engineering that goes into a luxury German sedan is unbelievable. It had double-pane windows to reduce noise, and the doors were heavy so a little vacuum pump assisted you: yes, self-closing doors! There was a little computer somewhere that monitored your speed and steering, and constantly reconfigured different parts of your seat real-time to adapt to the curves. The Mercedes Benz S-class seat has more engineering just in its front seat than the entire 2CV. And on, and on, and on. Brand new, it was extremely fun. Years later I was still discovering little features here and there. As the car got older, more of these things started failing. The pump that self-closed the doors died and it was $1000 to replace. That was my final straw. The car was amazing, but in the quest for creating the perfect luxury vehicle, Mercedes Benz had over-engineered the hell out of every aspect of the car. To contrast that, in the 3 years I’ve owned the 2CV, I’ve only changed the oil. The thing just works — 60 years later. A lot of the parts are original. It is so simple that I’ve actually fixed a thing or two myself, with minimal knowledge, a screwdriver and duct tape. There’s very little that can go wrong.
Yes, working at Microsoft, Amazon and Google, I’ve operated with the general assumption that whatever I’m working on will someday have to scale to thousands, millions, perhaps billions. But maybe it doesn’t need to do that exactly tomorrow. Maybe it’s ok to build a minimum delightful product and iterate relentlessly. Time to market matters. Perfection is over-rated. Maybe product market fit is unclear, and we’ll need to pivot a time or two before we get there. The 2CV reminds me every day to be scrappy, to be ruthlessly pragmatic about exactly what I need and nothing more.
We’re engineers, we’re builders. Of course we want to build the Mercedes Benz S-class with the self-closing doors and the hugging-seats. But sometimes, it’s ok to just build the 2CV. After all, Citroën sold 4 million — they must have done something right. These cars could go anywhere — and they did. One person drove 100k miles in 4 years, visiting 54 countries. Another one drove his from Brussels to Western Africa, on the Sahara. One day it snowed six inches in Seattle, I of course had to take mine out to see how it handled in the snow. It did fine!
One sentence in Amazon’s definition of “Invent and Simplify” sticks out: “As we do new things, we accept that we may be misunderstood for long periods of time.” When the 2CV came out, the public hated the shape. It was weird, unrefined. Unlike anything that anybody had seen. Didn’t look like what people expected a car would look like. It was called the ugly ducking. Yet over the years, it was one of the most beloved cars in history and achieved cult car status, becoming a design icon.
Not particularly related to software engineering per se, but when I drive my 2CV, it’s about the journey, not the destination. In fact I drive it for the sheer pleasure of the journey. It forces me to slow down. Modern cars have power steering, power braking, cruise control, automatic shifting, sensors everywhere, and are making thousands of micro-decisions on your behalf every minute. There will be a generation for which self-driving cars will be the norm. Driving a 2CV is a mechanical experience where all your senses are engaged. They have to. If you don’t have 100% of your attention on how to get this decrepit thing to shift, accelerate, brake, or turn, you’re in trouble. There’s a lesson there about situations where the journey is more important than the destination.
So yeah, a quirky 60-yr old French car reminds me every single day that there’s beauty, elegance and timelessness in simple designs. I never thought a utilitarian, minimalistic thing designed to replace horses in rural France in the 1930s would teach me a valuable lesson Software Engineering — but it did.