Skip to main content
Baldur Bjarnason

I am Uncluttered(Yellow)

Doom-prepping web dev through disdain, disrespect, and doing the right thing
An Ebook By Baldur Bjarnason
I am Uncluttered (Yellow)
Cover for I am Uncluttered (Yellow)

Doom-prepping web dev through disdain, disrespect, and doing the right thing

We may not prevent World War 3, but we should be able to repair a broken industry.

The mess we’re in #

Let me ask ChatGPT…

Well, according to Claude…

Perplexity thinks the best library for this is…

I’ve become known to people around me as the tech guy who gets annoyed by typical tech idiocy, so when a worker I know in a office supplies store said “I’ve got a good story for you,” they knew they’d get a sympathetic ear and I knew I was about to get annoyed.

This store sells fancy marker boards – the kind where the board itself is in a pretty colour and you use a white marker to write on it.

This manager came along, after having bought one the other day, and asked for a replacement marker.

He’d lost the marker, as happens.

The staff showed him the white marker they sell specifically for this purpose, labelled as safe for both marker boards and chalkboards.

“Let me ask ChatGPT whether this marker is safe for a marker board.”

It didn’t matter that the staff pointed out the text on the marker saying it was safe, the text in the accompanying promotional pamphlet saying it was safe, or even the manufacturer’s website saying it was safe.

The manager refused to buy it until ChatGPT had promised him that the marker could be used on a marker board. He has enthusiastically transformed himself into a meat puppet for a mindless stochastic parrot.

Managers in tech and tech-adjacent companies have never taken their craft seriously, but their buffoonery has ramped up to new levels.

Beyond a tiny minority that has been systematically quarantined by the rest of the manager class, the people who ultimately make the decisions have always been driven by stock market fluctuations, rumours, fads, and the desire for control, but now they have substituted their reasoning with a non-deterministic text generator.

The rest of us, from middle management down, have to sit back and watch them mindlessly scuttle the ship that we’ve all been building over the past three decades.

The web dev industry is in ruins:

We’re fucked…

Now what?

It’ll get better some day, right? #

Ideally, we’d replace the current tech monoculture – dominated by oligopolies and monopolies – with something more distributed and robust.

Mostly HTMl and CSS, with a little bit of JavaScript to pull things together, all using small reusable dependencies that require little active maintenance.

Made using processes that work well with small teams.

Using tools that are small and straightforward to use.

An ecosystem built out of components that are modest in size and safe from the outset, so we don’t have to engage in an endless death march of updates.

Unfortunately, that’s not going to happen any time soon, if ever. The existing industry is still burning down.

But we can get a tiny, modest, head start on how it could be by adopting sensible practices and understanding the limitations of the technologies we’re using.

It won’t fix the big problems, but fixing the small problems first is not nothing.

You can always make it better, even if it’s just small improvements #

There are no pre-packaged solutions.

I am Uncluttered (Yellow) is the combined second edition of Uncluttered, my earlier course on vanilla JS test-driven development, and Yellow, a short book collecting some of the more useful principles of management and software development. This new edition has been comprehensively restructured and rewritten and is substantially longer than its predecessors combined, over 220 pages or 40 000 words.

It is much, much more opinionated than any of my other books.

It has:

More importantly, it does not engage in false positivity.

We are fucked. The industry, from the perspective of the web developers working in it, is still in the process of burning to the ground. These are genuinely bad times. Trying to pretend that something as neat as import maps or something as useful as test-driven development can pull the industry out of the hole its in serves nobody.

But but they can help us manage our projects better, with less money, and fewer resources, and that can keep us going until we figure the rest out.

Get The Ebook for €35 €30 EUR
(price includes VAT, where applicable)

Principles for better management of small projects #

This is not a management book that delivers the teachings of W.E. Deming or promises a “micro” MBA in a few pages. But I will explain some of the more useful principles and processes that are likely to benefit web development, specifically those that help lower costs and work with smaller teams.

This shit saves money and time.

Understanding the mess that is JavaScript #

I won’t give you a detailed technical overview of how Import Maps work as a browser feature, analyse the specification, or deliver a “here’s how you can solve these 100 problems using ES modules” guide. I’ll leave the specific technical training to others because you might not even be using Import Maps directly and might use them only through a framework.

But I will tell you why Import Maps are important, what problem they’re trying to solve, and why adopting them and ES modules is likely to benefit your projects in the long run, whether you do so directly or indirectly through that framework.

This shit saves money and time.

Understanding what test-driven development is for #

I’m not giving you an authoritative textbook on test-driven web development – you could write a thousand pages on the subject and still not be even remotely done – but I will explain what exactly it is about test-driven development that saves you time and money and outline why the some of the different approaches to it exist.

This shit saves money and time.

Fucking dependencies #

I won’t give you a step-by-step recipe for deterministically managing your dependencies with this or that tool – this or that standard. But I will outline both the core problems and the broad approaches you could use to address them.

This shit saves money and time.

Towards a new practice #

I can’t solve the ongoing chaos of the industry or the world. But I can tell you that we’re in this together, that you aren’t imagining that things are shit, because things really are shit. Facing the actual problem and knowing you aren’t the only one facing it is always easier than thinking you’re alone.

I can’t prevent what’s already happening – nothing in the industry will ever be the same – but I am here to remind you that many of these problems can be fixed. Whatever we end up with, after the fact, will be smaller and different – possibly scarred and showing its seams – but it can be fixed.

There is a path from here to there. It’s not a prescriptive one, one that we know in advance, where we get a map and guide that tells us how to get to our destination.

But we can look at what other people have done, what they’ve learn, and try to steal some of their ideas for how to fix it.

Until the end of day Monday, 14th of April, you can get either the bundle or the ebook at a €5 EUR early adopter discount.

Four Ebook Bundle

Get the four-book bundle of my ebooks

This includes I am Uncluttered (Yellow), The Intelligence Illusion, Out of the Software Crisis, and Bad Writing, in PDF and EPUB...

For €59 €54 EUR together, almost a 50% discount off the combined price.

I am Uncluttered (Yellow)

Just the ebook, 227 pages or 40 000 words, in PDF and EPUB, for €35 €30 EUR.

Preview Excerpt

3. Worse is better, but it’s also how we made this mess #

What really helped turn the software industry into The Software Industry™ trash fire it is today was the fundamental contradiction at the heart of pretty much every major decision in software over the past fifty years:

  1. Worse really is better.
  2. But it’s also how we got into this mess where everything is awful and broken.

If you aren’t familiar with the term worse is better – good god where have you been? Tell me now, so I can move there, lock the door, and crawl under the bed, you lucky stiff. I’m jealous.

At least I can make you suffer by forcing you to understand just how broken the rest of us are. The term “worse is better” comes from the early days of the software industry. Not quite the very beginning, but the moment it was coined definitely marked a beginning in software development: the beginning of modern programming practices.

Most fields, especially the ones that have some sort of creative dimension to them – of which I consider software development to be one – tend to have two opposing theoretical frameworks that are in constant conflict.

They don’t really. The emphasis on dichotomies in fields and academia is all bullshit to get a bunch of undergraduates to argue about shit. It’s the arguing that’s the skill they want them to develop and dichotomies are good at getting people to argue. People have a strong tendency to create factions around arbitrary totems and then proceed to murder (metaphorically or actually) the “other” and dichotomies have the advantage of collapsing the plurality of society into a single, focused “other”.

When factional debate is what you want, it’s an extraordinarily effective tool. When it isn’t – well, you’re gonna get it in the neck anyway, because people love to form factions and then fight over them. Over time, those factions often get polarised further and further apart and their respective roles and arguments take on a ritualistic dimension. The true “heterodox” thinker – the genuine alternative to whichever of the two is the “orthodox” faction – isn’t the Brainy McBrains that picks the less popular side of the dichotomy. The two factions exists mostly to establish each others boundaries and outlines, so the true “heterodox” is the viewpoint that rejects the duality of dichotomies altogether. But genuine heterodoxy is also a reliable way of getting thrown out of the room and the hallmark of the boring asshole who stands alone in parties, so… never mind. Go ahead, pick a side, and club the other.

In literature and drama, this dynamic often gets expressed as romanticism versus classicism.

Romanticism would be all about the larger context of the work, the emotions, the people, how it plays out, where the author of a romantic work matters almost as much as the work itself.

Classicism focuses on the meaning that’s found in the work itself, in its very structure and composition, without referring to the larger context. The author and the environment does not matter. It’s the work itself that matters. The text is what matters.

You can see why these two approaches are in opposition. One claims that the work primarily gets its meaning from context, while the other claims that the work primarily creates meaning internally through its structure and form, which is why adherents to these two movements tend to always be in a spiral of conflict and evolution, where they grow and evolve their ideas in constant argument with the adversary, who is also always evolving their ideas, eternally arguing and never coming together.

(Until their funding is cut and they all get jobs flipping burgers instead. Hard to seriously debate the intentional fallacy if you smell of lard and stale beef. Don’t mock. We’ll join them soon enough.)

Actual practice in literature, writing, and drama tends to be a mixture of the both approaches.

The author and context are both always going to matter to some degree. We exist in a society, and we can’t rid ourselves from it, though Thatcher certainly started the trend in the eighties of politicians pretending you could.

Meaning is also in the work itself.

Once we have a base level of understanding of language and text and how texts work, each text will carry a meaning of its own.

The structure of the text will tell you something on its own. You might not see all of it, but it’s still there.

Reality is always somewhere in between. Two things can be true at once. Both the inside and the outside matters.

Software development similarly has two opposing ideas.

You have the ideological kin to the literary classicists who focus on the correctness of the work and writing software that using approaches that are structurally correct.

Back in the day, this wing of software development bet on LISP – a hybrid of metastatic bracket kudzu and the self-important nerds’ love of maths.

The LISPers even had bespoke machines for running LISP code.

This faction of programming tended to be obsessed with proven validation of correctness of one kind or another. The idea was that you should be able to build software incrementally while its internal structures made sure all of it worked properly and was correct and stable. Whether it worked for actual end-users was often an afterthought. At least that’s one idea from the old LISPers modern programming has embraced with enthusiasm.

(I’m caricaturing the position a bit, but honestly not as much as you’d think.)

The idea is that software should be able to demonstrate to some degree its own correctness. An academic would cite an incompleteness theorem here, but I’m not an academic and you’re already a little bit bored (I can tell), so I’ll just leave you with a flat statement that fully proving the correctness of a piece of software with other software is both impossible in theory and in practice.

The question is how close you can get.

The idea that drove the code classicists was that the only way to make defect-free software was to make it impossible for it to have defects through language and platform design. Correctness came from internal structure and maths.

This is a more feasible goal than proving said correctness for reasons I’m still not going to go into because they are, honestly, still quite boring. (The I am Curious… movies tried to make up for their tediousness with sex and nudity. I don’t think attempting the same here would be to my advantage.)

The ideological adversary of the code classicists – the code romantics, if you will – would be the Unix, C and BSD side of the industry and the entire cavalcade of garbage that has followed, which basically said, what if we just get things done and build things out of simple concepts to begin with, and then try to improve it from there?

It’s going to have bugs, but we’re going to be able to fix them all afterwards, right?

Right?

That was, essentially, how the LISP crowd caricatured the success of Unix. They called it the worse is better approach.

The code romantic’s idea with worse is better was that by layering up relatively crude languages and systems, you would end with more correct software – as in more software that’s roughly correct – than with the alternative approach. Improved productivity gave you more time to work on the correctness of your code, all in less time than with the approach used by the hoity-toity “maths matters!” crowd. The classicist approach, conversely, gave you software that was arguably more correct, if agnostic in terms of User Experience, but with less productivity and slower overall because the work went at a much lower pace.

The worse is better approach has won out over the past 40 years. We just hammer things together and try and fix things afterwards.

That’s pretty much the only way for us to be realistically able to ship software at anything resembling the scale required by investors and employers.

If we wait until we can prove mathematically, with reasonable confidence, that a piece of software has no meaningful defects, we’re going to be waiting forever.

It’ll never ship, which obviously isn’t practical – you’ve got to at least pretend to ship if you are to con stock options out of somebody gullible – so instead we’ve decided to build an entire industry on the other thing. Not bothering to check at all. That thing.

We’ve built all of software on the concept that we’ll muddle through to begin with, and then try and fix things after the fact, at, y’know, that point in the future we all know will eventually arrive when you have tons of spare time to fix things?

These errors, mistakes, and flaws that litter modern software are baked into its very concept, and now we’ve built layers and layers and layers on top of that shoddy foundation. So, now we have rocket ships whose controls and steering is a React web app all wrapped up in an Electron container.

We have this tension where the only way to realistically ship anything that works (sort of) is to do it imperfectly, but those imperfections collect and build up over time which then begins to hinder our ability to ship anything ever again.

Now most, if not every, project in the software industry is dealing with decades of accumulated platform, language, process, or hardware defects.

There are security flaws in everything. There are user interface flaws in everything. “Ease of use” is an extinct concept.

Flaws accumulate. Things have become too complex and error-prone.

We can try to minimize the imperfections we ship with unit testing.

We can use type checking when that’s appropriate. That sometimes helps.

But the compromise we are struggling to overcome is baked into our industry – it’s the very ground we build on. Worse is better.

We ship imperfections because, on the whole, it’s better. At least for certain definitions of “better”.

The improvements we ship, on the whole, have a bigger impact than the defects we’re shipping with them.

But the defects are still there, and they’re still accumulating, and we’ve coasted for the past decades on the fact that we believe that the improvements are collecting faster than the defects.

Occasionally, for some software systems, you actually get the opportunity to stop and pause and try and fix some of the defects.

But you can never get rid of them all because “let defects ship” is baked into the system.

We’re working in a compromised industry.

There’s nothing we can do to truly fix it.

Not in this lifetime.

(I’m sure your fucking chatbot will talk you past all of the landmines.)

We live in a compromised world and there’s nothing we can realistically do, as individual developers, to fix the underlying issues. Especially now that we keep bouncing from job to job, just to get laid off next quarter while all the surplus funding gets sucked up by an avalanche of “magical” Elizas.

Except…

Taking my own advice above on rejecting dichotomies, we could treat the two as a sliding scale or spectrum. “Worse is better” approaches, at the behest of the stock market and investors, piling on dependencies, frameworks, and building complex monolithic software as a never-ending march of new features to drive the software industry’s stratospheric growth is the extreme end of that spectrum.

We can’t do much to salvage an industry that’s entirely geared at building upwards without paying any mind to foundations, but we can slide back on the scale for the work we control.

What we can’t do is absolve our industry of its “original sin” – the You-Only-Live-Once moment where corporate software platforms embraced “worse is better” for everything. We’d have to invent an alternate timeline. Where we made different choices 50 years ago and decided to prioritize correctness. Where the software we’re using is much less capable than the software we have today, but has fewer flaws, is easier to use, and doesn’t have the near-singularity, black-hole-singularity levels of defects that our current system has.

But that world doesn’t exist.

We have to live in this one, which means we have to find marginal improvements and incrementally fix what’s broken.

I am Uncluttered (Yellow)
Cover for I am Uncluttered (Yellow)

Doom-prepping web dev through disdain, disrespect, and doing the right thing

We may not prevent World War 3, but we should be able to repair a broken industry.

Table of Contents #

PART ONE: INTRODUCTION #

  1. What this book is for
  2. Let’s be honest, this industry is a joke anyway
  3. Worse is better, but it’s also how we made this mess
  4. Sometimes software just isn’t right

PART TWO: PRINCIPLES AND SHIT #

  1. Fear is a signal
  2. Always maximise your understanding
  3. Technology changes more slowly than you think
  4. Gall’s Law
  5. Widely used standards
  6. Correct and incorrect
  7. Just-in-time research
  8. Don’t tinker
  9. Don’t try to solve every problem
  10. Don’t over-engineer basic setup
  11. You’re going to need a web server
  12. The browsers are our runtime
  13. On code smell and gut feeling
  14. Avoid state management
  15. UX bugs versus complexity
  16. Throwaway prototypes
  17. Don’t be a correctness bully
  18. Premature optimisation

PART THREE: LATE FUCKING BINDING #

  1. JavaScript is unavoidable (unfortunately)
  2. The mess we’ve made with JavaScript
  3. The mess we’ve made with TypeScript
  4. JavaScript modules are great, but also a little bit broken
  5. The troubled history of standard JavaScript modules
  6. We can do better than this shit
  7. Managing dependencies in code is bad
  8. Import maps make ES modules late-bound
  9. We can use import maps today
  10. A new primitive for decoupling JavaScript modules

PART FOUR: BEING TEST-DRIVEN #

  1. The two questions
  2. WTF is test-driven development? (Really)
  3. Planning
  4. Where to begin?
  5. The actual code is just a small part of the job
  6. And we’re d—oh, wait, there’s more?
  7. Classicist testing
  8. Mockist testing
  9. Which school to choose?

PART FIVE: FUCKING DEPENDENCIES #

  1. We have to talk about dependencies
  2. Consider avoiding external dependencies altogether
  3. Implicit dependency testing
  4. The Mockist approach
  5. Split your dependencies into layers

PART SIX: IN THE END IT’S ALL PRACTICE #

  1. I am Uncluttered
  2. (Yellow)

APPENDIX: TECHNICAL SHIT #

  1. What these are for
  2. Set up a web server (or, don’t just curl|sh random scripts)
  3. Browser Launch Scripts
  4. An HTML File for Launching Mocha
  5. Mocking Sources of Randomness and Time with Import Maps
  6. Bibliography
I am Uncluttered (Yellow)
Cover for I am Uncluttered (Yellow)

Doom-prepping web dev through disdain, disrespect, and doing the right thing

We may not prevent World War 3, but we should be able to repair a broken industry.