Dear web developers: No client in the world gives a flying fuck about your code

Clients don't care about your code

Clients don’t care about your code. There. I said it. How bad was that big pill to swallow? Or did it make you feel more like having a colonoscopy? Either way, this is the truth that I—a programmer and full-stack web developer for many years—have found out. And this wasn’t decades ago, no, not even a couple of years. It’s a hard truth for everyone who takes programming seriously and is passionate about it, but it’s also a truth that we must accept.

A couple of years ago, I was working for a ~30-person agency in my hometown in Germany. Being German myself, this was a good fit, and since I consumed too many travel books and other “things” during my teenage years, which led me to move to Bangkok, Thailand, in 2011 at the age of 21, remote work was a given. But during the COVID-19 pandemic, I had to sit it out at my mom’s house in Germany.

The New One

If I said “The work was underneath me,” or that I’m “overskilled,” it would surely sound arrogant, but that was just the case. I was the Senior Lead Web Developer, a title I sometimes had to laugh about myself since the only people working with me were: one guy who was hired “because he seems to know quite a bit about programming.” His name was Erik.

Indeed, he did. But his skills were ultimately limited to WordPress (PHP; at least not the page builder crap) and some Vanilla JavaScript. Especially the latter pissed me off, because it was the time of the JS framework wars. Every month, a new framework or even a meta-framework would pop up, all with “⚡️ Batteries included” (to this day, I’ve no idea what this actually means).

Easy but Difficult

One day, an offensively simple “project” came in from the local subsidiary of a well-known German bank. It was some sort of ad packaged into what German bank managers consider a “funny” game: The title was something along the lines of “Is your investment in safe hands,” or something. A four-step “quiz” with each step containing three cards with four different questions you had to click. At the end, the score would determine some generic text, and, oh, what a surprise, they also had the perfect investment plan for you, “Klicken Sie hier!” (“Click here!“)

I looked at it in disbelief. What have I become… If AI were as it is today, I’d have given it to AI because—again, this just sounds arrogant—I had more important things to deal with than doing things a Jr. developer could do, and by “Jr.” I don’t mean Junior but Janitor. Back then, Generative AI was still in its infancy, at least in a way to save you time rather than taking it, so we didn’t have any AI or LLMs to do the job.

But we had Erik.

Or, let’s say, I had Erik. Remember, me, the prestigious in-house Senior Full-Stack Web Developer, the absolute monarch in a kingdom of… two? So I invited Erik, who was literally sitting right behind me, to an official audience in the palace—the `#programming` channel in the company’s Slack workspace.

The Perfect Code

A little side note: The “CEO” of this company, which was filled with as many employees as the lifeboats of the Titanic, was, and I really mean this, a funny, almost clownish guy who, oddly enough, attended the Karneval in Cologne each year and held a high position in one of its clubs. A scent of undiagnosed ADHD followed him wherever he went, and of all the clients we’ve had during the time I was there, he turned out to be the biggest—and worst. But that’s a whole different story.

Symbolic ivory tower
Not ivory, but a tower, and me telling people how it must be done, because i know best!

He was also the one who, through one of his rare internal emails, mandated that communication should mainly go through Slack, despite being in an open office with aisles of people who could touch each other if only one of them extended their arm. This is why I contacted Erik via Slack, who was sitting directly behind me, where I could hear the sound of my incoming Slack messages through his speakers.

I’m drifting. Alright, so, after a few messages, the whole thing became too ridiculous to me, and I swiveled my generic company chair around and tapped him on the shoulder to discuss things in person. Well, as I already mentioned, there wasn’t much to discuss; the scope was clear, the deadline too, and the screen designs and content had already been prepared.

Did I mention that he was quite versed in JavaScript? Yeah, that was a lie, sorry. Any developer with a brain cell would’ve known that this is a clear case for the good, old, HTML/CSS/JS stack. That’s all it needs. And even then, the code was, to put it mildly, as light-weight as a thorough README.md.

Decisions

Erik, however, had other plans. The only thing I had told him was the what, not the how. In my wildest dreams, I couldn’t fathom how this was not the most obvious thing in the world to a web programmer. So, while I was busy resuscitating and fixing bugs and errors on WordPress and Laravel sites caused by Indian programmers from Hyderabad or Chennai the website client had initially hired previously for $2 an hour on Upwork or Fiverr, I didn’t think much of it.

“So,” I texted him after a couple of hours, “how’s it going?” “I’m still on it,” was his reply. Alright. Maybe something more urgent I wasn’t made aware of (a habit for this agency and a giant red flag for all agencies) has been put on his desk. Or maybe he had trouble configuring a local environment since the Karneval CEO, in a moment of sheer generosity or just soberness, decided to give the developers and a few selected other employees an early Christmas present in the form of the then newly released iMacs with Apple silicon chips, which, obviously, came with a fresh OS.

Another side note: When I started and was shown my workplace, and more importantly, my workstation, I was greeted with an iMac from 1872. Desperate attempts by the procurer of the company to “just switch to Microsoft” were met with so much force that the CEO, on my first day, spontaneously told me to get into his 124.355 Euro-worth Mercedes G Class, drove to the next shop that sold iMacs, and said to me: “Pick whatever you want.” Erik wasn’t as fortunate as I was; in fact, I was given the task to choose which computer the new developer should have.

The Forbidden HTML Tags

The day came to an end, and Erik, who barely knew the basics of Git, had finally pushed his code, which came as one giant commit to the repository in our company’s GitLab Groups. I think I don’t have to mention who set up this infrastructure in the first place.

The next day, I took a quick glance at it. In fact, “brief” is almost too long; within seconds, I threw my hands up in disbelief.

Erik had coded the quiz in PHP.

Not only is this completely overkill, but the bank’s global IT department made it absolutely clear that no server-side code would be used on their server, for very obvious reasons. Erik, not deterred by the [URGENT] in the subject lines of the emails our tiny team received, had found a workaround. Instead of putting the PHP code on their server, we could just host it ourselves and embed it with an <iframe>!

Wow, <iframe>… it’s been a while since I saw or even heard of a website that uses this digital fossil in its HTML code. Is it even still encouraged, despite all the security risks and styling horror? Using <iframe>s is almost as fun as creating email templates with inline styling and tables. Absolutely horrible.

Think Before You Code

Erik didn’t see it that way. To his defense, I must admit that I should’ve right then and there intervened, which I didn’t. Most of the entire second workday, I saw Erik not only using PHP, but also including my favorite PHP template language, Twig. This not only added to the unnecessary complexity of the whole project but also caused a major break he had obviously not anticipated: He cached the output.

Trying to come up with a logical explanation of how he got to this point, I pulled him aside for a much-needed chat:

Me: What’s up with the PHP and all that? This is a simple static website.

Erik: Well, yeah, but hear me out, if we host it ourselves with PHP and Twig, we can reuse the code later if the client suddenly wants something more dynamic. I also added caching, super fast, you know. That’s just good practice, right?

Me: Good practice? Erik, this isn’t Stack Overflow. It’s literally four pages, three buttons, and a “Danke fürs Mitspielen!” at the end. Even the animated paperclip from Word could handle this without breaking a sweat.

Erik: I thought we’d impress the client by showing we could handle future changes easily.

Me: Impress them? Erik, they’d be impressed if we used Microsoft Paint and exported it as a JPEG. Trust me, the only thing that’s going to impress the client right now is us actually meeting the deadline.

Erik: But isn’t it smart to think ahead?

Me: Of course, thinking ahead is good. But you’re overengineering a basic quiz game to the point that it could power NASA’s Mars rover. Let’s scale it back to reality, please.

git checkout main
git rm -rf *
git commit -m "Remove all files"
Bash

Erik went back to work, but this time, I was afraid he’d code the whole thing in Java or something. So I downloaded Vue—remember, it was the holy war between JS frameworks—, which wouldn’t have been necessary, but a) made things a lot easier and b) helped me follow my long-term plan: To slowly indoctrinate the employees that Vue.js should be the main JS framework (or framework at all) before somebody came along and would say “React!” I was the one who needed to “react” (I’m sorry, I suck at puns).

Delusions of Grandeur

So, while he was doing his vanilla version, I created the same in Vue.js CLI (back then, Vite didn’t yet exist) and Tailwind CSS, which wasn’t as annoying as it is today in v4. I forgot how long it took me, but it was done and ready to be shipped within a day. Since I had developed the app so quickly, I let my OCD run free, aligning all JSON keys and values in the package.json, commenting almost everything in the code, and even creating a CHANGELOG.md and a README.md that, for this mini project, no person in the world, let alone the client, would ever see.

This is not overengineering. This is the absolute minimum if you want to do professional work within a team, no matter the number of developers.

Meanwhile, Erik stitched together a single Frankenstein index.html with all of the CSS and JavaScript included in this single file. If you think Java is verbose, just take a look at this monstrosity! He used a mix of classes and functions, var variables whose values were overwritten all over the code, loosely compared if conditions with == instead of ===, no semantic HTML tags (<div> instead of <footer>), a forgotten console.log(), inline attribute styling (<div style="...">) in addition to embedded CSS. Do you want me to continue?

Looking Down from the Ivory Tower

At this point, I had already given up on him. Clearly, the client will prefer my technologically advanced version and threw his bullshit right where it belongs: rm index.html. I’d be lying if I wasn’t looking forward to the schadenfreude that would come with his failure.

I should’ve mentioned that this project had an intermediary, a project manager. He handled all the communication with the client and tried his best to translate their wishes into something we could build. As the deadline arrived, we both sent our versions to the PM, which he forwarded to the client.

And then the unthinkable happened. Erik’s code was accepted while mine was not even mentioned. I was bewildered and angry at the people’s incompetence at the same time. I felt like Hunter Biden in his (eye-opening, in my opinion) interview and his view on George Clooney:

“Fuck you, fuck you, fuck you!”

I lost. The Senior Full-Stack Web Developer was beaten. Beaten by a “developer” who, before joining the agency, mostly “programmed” WordPress sites with fucking page builders.

And then it dawned on me: Clients don’t care about your code. Not only about cleanliness, but about code at all. While I was sitting high up in Ivory Tower deciding what is quality code and what is unreadable garbage that followed no best practices whatsoever, the client saw the thing a bit differently.

He just wanted it to work. Preferably, with the least amount of work possible.

As much as I despise the outcome: kudos to Erik. He’s got me there. Now, whether this was a well thought-through decision remains a mystery, but my opinion give me another opinion:

“I daut it”

To make it as clear as it can be:

Clients do not give shit about your beautifully written, commented, documented, safety-typed code. In most cases, they don’t give a single fuck. Clients don’t care about your code. They just want it to work.

And, you know, thinking about it from a different perspective: who can blame them? If my motorbike breaks down in the middle of Bangkok, I also don’t give a shit about how the mechanic repairs it. Or why three Thais are necessary to fix the constantly leaking air conditioning in my bedroom. Or any other topic that I’m not passionate about.

Lessons Learned

Yes, it was a hard pill to swallow, I must admit. For so long, I’ve followed best practices, commented my code in great detail, always included a README.md and a CHANGELOG.md (at least), used linters—in short, I was too focused on writing “quality code” that my projects looked more like I wanted to win a beauty pageant for programmers.

The lesson I’ve learned is this:

  1. The average client doesn’t care about clean code
  2. The cheaper the client, the less work I should put into it. “Give them what they pay for” is the rule
  3. Higher-paying clients usually do care about it, but not so much by looking at it but by asking technical questions

In some twisted sense, I have to thank Erik of all people for this epiphany. Having mild OCD and coding, along with being constantly haunted by perfection, not only costs me a lot of time but also affects my mental health.

But the biggest lesson I’ve learned from this whole but tiny disaster: even though clients don’t care about your code, quality still matters. Yes to README.mds, yes to incremental Git commits, yes to commenting code sections—just don’t overdo it. Create code that doesn’t focus on perfection; write code that makes sense, that is readable and maintainable, that people in your team will understand once you’ve left, as I did with the German company.

However, this doesn’t mean you should neglect essential parts like security. But not every website needs to be written in whatever programming language or JavaScript framework is currently hyped. Your code is not a painting; nobody will print out your proudest code and hang it on anyone’s wall. Keep it professional, yes, yes, yes. But there’s just one thing I beg you not to do:

Don’t be another Erik.