MildFist
← Back to Blog
EngineeringProcess

How We Think About Software Quality

Quality is one of those words that everyone agrees is important and almost no one defines precisely. At MildFist, we have had to be specific about what it means in practice, because vague commitments to quality produce vague results.

Quality Is Not Perfection

The first thing to establish is that quality does not mean perfect. Perfect software does not exist, and pursuing it is a good way to never ship anything. Quality means fit for purpose: the software does what it is supposed to do, reliably, in the conditions it will actually be used in.

That definition has real teeth. It means we care about edge cases, not just happy paths. It means we think about what happens when the network is slow, when users do unexpected things, when third-party services go down. It means we test under realistic conditions, not just in ideal ones.

Legibility Matters

Code is read far more often than it is written. A function that works correctly but is impossible to understand is a quality problem, not just a style problem — because the next person to touch it will be confused, and confusion leads to bugs.

We write code as if the next reader has no context about why it was written. That means clear naming, small functions that do one thing, and comments that explain the "why" rather than restating the "what." It means code reviews focused on comprehension, not just correctness.

Automation as a Baseline

Automated tests are not a nice-to-have. They are the mechanism by which we verify that software continues to work as it changes. Every significant piece of logic should have test coverage, and the test suite should run on every change.

We are not dogmatic about coverage percentages — chasing 100% coverage often leads to tests that are brittle and expensive to maintain. What we care about is that the important paths through the system are tested, and that the test suite gives us genuine confidence when it passes.

The Cost of Cutting Corners

The argument for cutting quality corners is always the same: we need to move faster now, we will fix it later. In our experience, "later" rarely comes. The shortcut becomes load-bearing. The workaround grows dependencies. The technical debt compounds until the cost of addressing it is far higher than the cost of doing it right the first time would have been.

We push back on this pressure, respectfully but consistently. Speed and quality are not opposites — sustainable speed comes from maintaining quality, because quality reduces the rework, the debugging, and the incidents that slow teams down over time.