People often hire me to grab their codebase by the horns and introduce a modicum of engineering standards. Eventually I get to implement new features, but they usually come at the cost of heavy refactoring before I can even get started.
A good month ago a founder emails me "Hey, I have this product, customer development at a point where big customers are waiting with fat checks to use product. I can't even get it to run, original developers nowhere to be seen. Can you help?"
The original developers fleeing was a bit of a red flag, but the product was right up my alley: node.js, mongodb, plenty of real-time data flow and speed requirements for updating the UI. The names of waiting users made my ears perk up as well.
I'll do it! How bad could it be?
A daily dose of WTF
It could be very bad.
Part of the project is done in Java. This makes sense, strict typing is the only logical decision considering what the codebase is doing.
Everything else is done in JavaScript. The communication protocol between Java and server JavaScript and frontend JavaScript ... well that's got a ban on parameter names being longer than three characters.
Okay, saving bandwidth, right? We're talking about a high volume of data so let's keep those json objects small.
That's where things get tricky.
Because the core protocol only features names that are 3 characters long, so does the database. And because the database is full of such objects, guess what happens next? That's right! Most of the codebase is an incoherent mess of variable names are no longer than 3 characters.
The habit leaks beyond variables touching the data.
Why write label when you can have lbl? And so on and on ... in almost two months of working on this codebase, I still have no idea what most of the names actually mean. I use them as pictograms describing vague concepts. I'm starting to get a feel for how they fit together.
It gets better.
How do you make a boolean value fit this protocol? By doing this:
function fix(boolean_value) {
return boolean_value ? "tru" : "fls";
}
So much for saving space. Encode 1bit values into 24bit strings! Booyah!
Oh I wish that was all, here's another interesting thing I discovered ... this is repeated through much of the code and I don't dare touch it because I don't know what crazy things will break.
Did I mention there's no unit tests? How about that I'm discouraged for writing them? Yep. But hey, it's not like this application needs to go through a proper security audit when it's done ... oh wait, it does.
if (!thing || thing === 'null') ...
Lovely huh? Of course null is encoded as a string. How else would you do it?
I try to convince myself there was a good reason for this originally.
But I could live with all of that, some of it might have sounded reasonable at the time, or might simply be a result of deluded optimisations and whatnot. It's bad, but something I can live with.
Here's the stuff that really makes my life difficult:
function getPurple(cake) {
cake.color = global_color_setting;
return cake;
}
I don't know how to even begin refactoring that so it makes sense ... it's just ... what? Who does that!?
However, the worst thing, the absolute worst thing is that some time in the past this application was moved from traditional jQuery to Backbone. Nothing wrong with that, great move I'd say, I love Backbone!
They forgot to move most things. A lot of times Backbone is just a thin wrapper around old stuff. Most of the code doesn't even leverage Backbone and there's still a bunch of \\\$.ajax peppered everywhere.
And don't even get me started on _"Hey, we changed name X in the protocol, can you change all references to that please" _in a weakly typed language with no unit tests ... fun times. I never know when something's going to blow up because I forgot to click on a button when testing.
Grep only gets you so far ...
Continue reading about My very own daily WTF
Semantically similar articles hand-picked by GPT-4
- My old code is atrocious
- Backbone → React – Step 1
- A lesson about client-side templating
- I added linting to a 3-year old project. You can totally guess what happened next.
- Hard work is a total waste of time
Learned something new?
Read more Software Engineering Lessons from Production
I write articles with real insight into the career and skills of a modern software engineer. "Raw and honest from the heart!" as one reader described them. Fueled by lessons learned over 20 years of building production code for side-projects, small businesses, and hyper growth startups. Both successful and not.
Subscribe below 👇
Software Engineering Lessons from Production
Join Swizec's Newsletter and get insightful emails 💌 on mindsets, tactics, and technical skills for your career. Real lessons from building production software. No bullshit.
"Man, love your simple writing! Yours is the only newsletter I open and only blog that I give a fuck to read & scroll till the end. And wow always take away lessons with me. Inspiring! And very relatable. 👌"
Have a burning question that you think I can answer? Hit me up on twitter and I'll do my best.
Who am I and who do I help? I'm Swizec Teller and I turn coders into engineers with "Raw and honest from the heart!" writing. No bullshit. Real insights into the career and skills of a modern software engineer.
Want to become a true senior engineer? Take ownership, have autonomy, and be a force multiplier on your team. The Senior Engineer Mindset ebook can help 👉 swizec.com/senior-mindset. These are the shifts in mindset that unlocked my career.
Curious about Serverless and the modern backend? Check out Serverless Handbook, for frontend engineers 👉 ServerlessHandbook.dev
Want to Stop copy pasting D3 examples and create data visualizations of your own? Learn how to build scalable dataviz React components your whole team can understand with React for Data Visualization
Want to get my best emails on JavaScript, React, Serverless, Fullstack Web, or Indie Hacking? Check out swizec.com/collections
Did someone amazing share this letter with you? Wonderful! You can sign up for my weekly letters for software engineers on their path to greatness, here: swizec.com/blog
Want to brush up on your modern JavaScript syntax? Check out my interactive cheatsheet: es6cheatsheet.com
By the way, just in case no one has told you it yet today: I love and appreciate you for who you are ❤️