Skip to content
Santi020k

Search

Match titles, tags, and descriptions. Arrow keys to move, Enter to open, Esc to close.

Open from the page (not while typing in a field): / · K or CtrlK

    Permalink to this article
    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

    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.

    Boosting Code Quality and Efficiency with My ESLint Configuration Library
    Writing Case Study 5 min read

    Boosting Code Quality and Efficiency with My ESLint Configuration Library

    Reusable ESLint library for React, Next.js, and TypeScript projects. Enforces code quality with flat config support and simplifies the move from ESLint 8 to 9.

    In series: ESLint in Practice · Part 2

    Get new posts in your inbox

    Low volume — engineering notes, architecture writeups, and occasional career updates. Prefer a feed? Subscribe via RSS .

    We never share your email. Privacy policy .