Skip to content
Blog Article
engineering-standards

Code Standards That Scale With a Team

The version of coding standards I would actually hand to a growing frontend team today.

4 min read

685

#engineering-standards #typescript #frontend #team-process

Many team “standards” fail because they are too abstract, too rigid, or too outdated to help real work. A useful standard should make the next decision easier. If it adds debate without reducing ambiguity, it is probably not a good standard.

This is the version I would actually hand to a growing frontend team.

Standards should remove decision fatigue

The goal is not to control every personal preference. It is to make common choices predictable so the team can spend energy on product and architecture instead of re-litigating naming, structure, and formatting in every pull request.

A strong standard does three things:

  • Makes the desired path obvious
  • Lets tooling enforce the boring parts
  • Leaves room for judgment where context genuinely matters

Separate presentation from product behavior

I like a clear distinction between presentational components and feature or module logic.

Presentational components should:

  • Receive data and callbacks via props
  • Focus on rendering and interaction states
  • Stay reusable where that reusability is real

Feature-level modules can:

  • Orchestrate business rules
  • Coordinate API calls and state
  • Adapt data for the view layer

That boundary is never perfect, but it is still useful. It keeps UI pieces easier to test and easier to move.

Prefer strong typing and explicit names

If a team is using TypeScript, it should get the benefit of TypeScript.

That usually means:

  • Avoiding any
  • Modeling domain concepts with named types
  • Keeping interfaces and utility types readable
  • Using names that describe intent instead of implementation mechanics

I also like consistency in naming. If the codebase uses one pattern for DTOs, one pattern for component props, and one pattern for feature folders, that pattern should stay stable. Naming is where a lot of accidental complexity begins.

Make structure predictable

A predictable file structure helps more than people admit. It reduces search time, lowers onboarding cost, and makes reviews easier because the shape of the code stops being part of the puzzle.

I generally want teams to agree on:

  • Where presentational components live
  • Where feature-level modules live
  • How tests are colocated
  • Where styles belong
  • How route or page files map to supporting code

There are several good answers here. The main requirement is that the answer should be shared.

Let tooling enforce the boring parts

Standards that rely on memory are fragile. If something matters often, the toolchain should help.

I want the tooling to own:

  • Formatting
  • Import order
  • Obvious dead-code detection
  • Baseline accessibility checks
  • The type system

That is why I still value clear linting and formatting defaults. A good setup removes arbitrary review noise and lets humans focus on the tradeoffs that actually need human judgment. If you are building a modern stack around those ideas, my post on Building the Best Next.js TypeScript Standard Vitest ESLint Configuration covers one practical example.

Write TODOs like future work, not like confessions

I do not mind TODOs when they are specific, temporary, and actionable.

I do mind TODOs that say nothing beyond “fix this later.”

A useful TODO should answer:

  • What is incomplete
  • Why it is incomplete
  • What condition should remove the TODO

If the team never returns to those notes, they are not TODOs anymore. They are decoration.

Testing expectations should be explicit

Not every component needs the same test depth, but every team benefits from a shared expectation.

For example:

  • Components with behavior should have interaction coverage
  • Modules with branching logic should have unit coverage around the decision points
  • Critical flows should have end-to-end coverage

That is more helpful than a vague rule like “everything must be tested.”

The standard I care about most

If I had to compress all of this into one idea, it would be this: a standard is useful when it makes good behavior the easiest behavior.

That is the bar. The best standards are not the strictest ones. They are the ones that quietly help the team ship better work, more consistently, with less friction.

Share this piece
Keep reading

More writing in the same thread.

A few more posts that overlap in topic, tooling, or the engineering tradeoffs behind this article.