June 2026

Disciplina: Standards Beat Preference

A healthy codebase cannot depend on every engineer carrying a private version of good. Disciplina turns taste into shared standards the team can actually follow.

Code Quality Roman Virtues
A healthy codebase cannot depend on every engineer carrying a private version of good. Disciplina turns taste into shared standards the team can actually follow.

A codebase cannot survive everyone carrying a private version of “good.”

One engineer likes factories. Another likes orchestrators. Another wants a new language. Another wants to introduce the pattern they read about last weekend. Another wants to refactor the UI stack because the current one feels boring.

Each preference can be defensible in isolation. That is what makes the problem hard. Smart engineers do not usually propose bad ideas because they are bad. They propose good ideas that solve the problem in front of them, fit their taste, and make sense from their local view.

Then the codebase has to hold all of it.

Factories here.

Orchestrators there.

Single-purpose services in one module.

God objects in another.

Three ways to validate input.

Two ways to model errors.

Four different approaches to the same UI problem.

That is preference sprawl masquerading as architecture.

Disciplina is how you stop it.

Discipline Is Ordered Practice

Disciplina is easy to misunderstand because the English word discipline often sounds like punishment. That is not the useful meaning here. In engineering leadership, disciplina is ordered practice: the shared habits, standards, and constraints that let a team move together without renegotiating first principles every day.

This is not about making engineers less creative. It is about putting creativity in the right place. The team should spend its judgment on the product problem, the domain model, the tradeoff, the migration path, and the real risk. It should not spend that judgment re-litigating folder structure, naming conventions, error handling, dependency direction, or whether this feature gets to be the one written in a different language because someone had a productive weekend.

Preference is expensive when it becomes the operating model. Every private pattern creates another thing the next developer has to learn. Every local exception becomes a future code review argument. Every clever one-off forces the team to remember not only what the code does, but why this part does it differently.

Standards are how you stop paying that tax.

Standards Are Not Bureaucracy

Weak teams hear “standards” and picture bureaucracy. They imagine meetings, checklists, architecture review boards, and someone using process to avoid thinking. That version deserves its bad reputation.

Useful standards do the opposite. They reduce the number of decisions the team has to make so attention can go where judgment actually matters. A standard says, “We already decided this. Do it this way unless there is a real reason not to.”

The thinking happened once, in the open, so the team does not have to recreate the same debate in every pull request.

This is why I care more about principles than rules. Rules say, “Do this.” Principles say, “Do this because this is the outcome we are protecting. If you have a good reason to choose differently, bring the reason into the open.”

That distinction matters. Rules create compliance. Principles create judgment. A team that only knows the rule will follow it blindly or break it quietly. A team that understands the principle can apply it, challenge it, and know when an exception is actually justified.

Where does validation live? How do errors move through the system? What belongs in the domain layer? How do we structure a controller? When do we add tests? What does a migration have to include before the old path can be removed? These decisions should not be rediscovered through code review comments forever.

Write them down. Teach them. Enforce them. Update them when reality proves they are wrong.

That last sentence matters. Standards are not sacred. They are working agreements. A standard that no longer fits the system should change, but it should change deliberately. The alternative is silent drift, where every engineer updates the architecture one preference at a time.

Preference Sprawl Hides As Progress

Preference sprawl often enters the codebase wearing the costume of progress.

The new framework is cleaner. The new pattern is more expressive. The new language is better suited for the job. The new UI approach is more modern. The new abstraction gives us flexibility.

Sometimes all of that is true.

It still might be the wrong decision.

A technical choice does not only have to work. It has to be carried. Someone has to debug it, secure it, document it, onboard new developers into it, support it during an incident, and explain how it fits the rest of the system after the excitement of the decision is gone.

That is the cost technical appetite likes to skip.

I am very slow to introduce new languages into an existing codebase for exactly this reason. If the company stack is C# and SQL Server, a new service in Go may be elegant, fast, and fun to write. It may also create a support burden the rest of the team did not consent to carry.

The question is not, “Is Go good?”

The question is, “Should this team own Go in production for this product right now?”

Those are different questions.

Disciplina asks the second one.

I have seen preference sprawl in multiple inherited codebases. In one concrete case, different areas solved similar problems with radically different patterns. Some sections used standard ASPX pages. Other sections had a previous developer’s attempt at an MVC pattern. Other sections used custom ideas that were interesting, if I am being charitable.

The hard part was not that any one pattern was impossible to understand. The hard part was that the team had to re-orient every time it moved through the system. The organization of the code changed based on the pattern. Naming conventions changed. The location of behavior changed. A small fix or tweak required the developer to first discover which local architecture applied to that feature.

That is the cost of preference sprawl. It turns every change into an orientation exercise before the actual work can begin.

Standards Protect Cognitive Load

Engineering leaders talk about velocity all the time and cognitive load far too little.

Cognitive load is the hidden cost of inconsistency. It is the mental tax developers pay when they have to remember which module uses which pattern, which service handles errors differently, which frontend stack applies here, which naming convention belongs to this older area, and which parts of the codebase are exceptions nobody has written down.

That tax compounds.

It slows onboarding because new developers have to learn exceptions before they can trust patterns. It slows code review because every pull request becomes an argument about taste. It slows incidents because the person debugging production has to understand the local architecture before they can understand the failure.

Standards protect the team from that tax. They let developers build a mental model once and reuse it. They make the boring parts predictable so the interesting parts can get attention.

That predictability is speed.

When the team shares standards, code review gets faster because reviewers are not adjudicating first principles on every pull request. Onboarding gets easier because new developers learn one set of expectations instead of a museum of past preferences. Incidents get cleaner because the system has familiar shapes. AI output gets safer because agents have explicit conventions to follow.

That is why boring consistency is not a lack of ambition.

It is an advantage.

AI Makes Standards More Important

AI-assisted development makes disciplina more important, not less.

An AI agent does not understand your codebase through cultural absorption. It does not sit in sprint planning for six months. It does not learn your team’s unwritten rules by overhearing code review conversations. It follows the context you give it and the patterns it can infer from the files it reads.

If the codebase has five competing patterns, the agent will find all five.

If the standards are implicit, the agent will guess.

If the team disagrees silently, the agent will amplify the disagreement in code.

This is why explicit conventions matter. AI can follow standards when they are written down, loaded into context, and enforced in review. It can route API work to API standards, testing work to testing standards, UI work to UI standards, and architecture work to architecture rules.

A standards router keeps humans and agents aligned by loading the right guidance for the work in front of them.

At a marketing services SaaS provider, my team is moving toward exactly this model. Our AI instructions are modular instead of one giant prompt. UI work can load the UI standard. API work can load API conventions. Testing work can load testing expectations. Architecture review can load the architectural rules.

Before that, an agent had to infer the standard from whatever files it happened to read. If the codebase contained three old patterns and one current pattern, the agent could easily choose the wrong one with complete confidence.

After that, the work can be routed: “This is UI work. Use .NET MVC with partials and HTMX. Use CSS Grid and LESS. Do not introduce Bootstrap or a new frontend framework.” That instruction does not make the agent brilliant. It removes ambiguity before ambiguity turns into code.

A good instruction file does not make AI magically wise. It gives the agent the same thing a new engineer needs: context, constraints, examples, and a clear definition of what good looks like here.

Without that, AI does not create discipline.

It creates drift at machine speed.

Taste Has To Become Teachable

Good engineers have taste.

They know when an abstraction is too clever. They can feel when a pattern will spread badly. They can see when a local shortcut is going to become a maintenance problem. That taste is valuable.

It is also insufficient.

Private taste becomes a problem when it starts making shared decisions without explanation. A senior engineer prefers one pattern, a different engineer prefers another, and both preferences land in production. Over time, those local choices harden. Eventually the team is no longer debating taste. It is maintaining six ways to do the same thing.

The leader’s job is to turn taste into teachable standards. If a pattern is better, explain why. If a boundary matters, name the risk it controls. If a convention lowers cognitive load, write it down. If a shortcut is acceptable in one context but dangerous in another, define the line.

Do not ask the team to trust your taste.

Translate your taste into judgment they can use.

That is disciplina.

Enforcement Is Part Of The Standard

A standard that is not enforced is not a standard.

It is a suggestion with good formatting.

This is where many teams fall apart. They write the document. They agree in principle. Then the first deadline arrives, the first exception feels convenient, the first senior engineer pushes a different pattern, and everyone quietly lets it pass.

The team learns immediately.

They learn which standards are real.

They learn which standards belong to juniors only.

They learn which standards vanish when the calendar gets tight.

They learn whether leadership means what it says.

Enforcement does not have to be theatrical. It should be boring. Code review enforces it. Templates enforce it. Architecture tests enforce what can be tested. AI instructions enforce it before code is written. Senior engineers model it when nobody is watching.

The goal is not to punish deviation.

The goal is to keep the shared system shared.

Standards Should Be Narrow Enough To Use

There is a failure mode on the other side too.

Some teams respond to inconsistency by writing standards so large nobody can use them. A 4,000-word coding standard buried in a wiki is not discipline. It is a monument. Nobody reads it during real work, and AI will not reliably apply it unless it is available in the right context.

Useful standards are modular. They are close to the work. They answer the questions developers actually face.

How do we write API endpoints?

How do we structure tests?

How do we handle validation?

How do we model errors?

How do we build UI screens?

How do we decide whether a new dependency is allowed?

Each standard should remove ambiguity. If it does not change what someone does during implementation or review, it is probably not a standard. It is documentation theater.

Disciplina does not mean writing more rules.

It means writing the rules that matter and making them usable.

This is how mature teams move quickly without becoming chaotic.

They do not move fast because everyone does whatever they think is best.

They move fast because “best” has been made legible.

Disciplina is the decision to stop making the codebase absorb every private preference. It is how a team turns judgment into practice and makes taste teachable.

Receipts

  • Inherited codebase: I have worked in codebases where similar features used different patterns depending on who wrote them and what was fashionable at the time.
  • Concrete pattern sprawl: One inherited system mixed standard ASPX pages, an attempted MVC pattern, and custom approaches in different parts of the same codebase.
  • Cognitive-load cost: Small fixes became slower because developers first had to discover the local pattern, naming convention, behavior placement, and file organization for that part of the system.
  • Current standards model: At a marketing services SaaS provider, my team uses modular AI instructions so UI, API, testing, and architecture work load the right standard instead of forcing humans or agents to infer the standard from mixed historical code.
  • UI standard: The team standardizes new UI work around .NET MVC with partials, HTMX, CSS Grid, and LESS, and explicitly avoids introducing another frontend framework without a reason large enough to justify the added weight.
← All writing