Skip to content

 ·  3 min read

The Engineering System Is a Product

CI, tests, repository standards, release practices, and developer experience deserve the same deliberate design as the software they help deliver.

On this page

An engineering system has users. They are the people trying to change, review, test, integrate, release, and operate software.

It has interfaces: commands, pipeline definitions, test reports, repository conventions, and release artifacts. It has failure modes: checks that disagree, unexplained policy, slow feedback, and automation that leaves the next person guessing.

That makes it a product worth designing, not a collection of chores to finish after the real software.

Start with the engineer’s task

Before choosing a tool, name the task it should improve.

Can an engineer reproduce a pipeline failure locally? Can a reviewer distinguish a useful test from coverage that never checks the behavior? Can a downstream team identify the artifact and configuration needed for integration?

Those questions are more useful than asking whether every repository uses the newest tool. A consistent interface around a dependable tool can matter more than replacing the tool itself.

Make the feedback loop explicit

Local checks and authoritative CI have different jobs.

Local checks should catch inexpensive mistakes quickly. CI should establish reproducible evidence for a change. Integration validation should exercise the contracts and environment assumptions that a repository cannot prove alone.

The layers should agree about what they check, while remaining honest about their boundaries. A successful local run is not a release decision. A passing repository pipeline is not proof that the complete system works.

Describe the path from an edit to a release. At each boundary, identify the consumer, the evidence they need, and the person responsible for making the next decision.

Treat policy as an interface

A policy that only lives in a document depends on memory.

Executable checks can make it repeatable, but only if their failures are understandable. A useful failure explains what went wrong, why the check matters, and how to recover. It should not require a private conversation with the person who wrote the pipeline.

Defaults should handle the ordinary path. Exceptions should be visible, owned, and reviewed. When the same exception appears repeatedly, reconsider the baseline rather than normalize bypassing it.

Measure usefulness, not installation

Installing tooling does not establish that it helps.

Useful signals include the time to first meaningful feedback, the ability to reproduce failures, repeated support requests, release rework, and how independently a new engineer can complete a change.

These are questions to investigate, not performance claims about a particular tool. Start with a baseline, observe actual use, and change one part of the workflow at a time.

Keep ownership close to the work

A platform should remove repeated decisions without taking every decision away from teams.

Provide a small, documented baseline. Version its interfaces. Explain changes before rolling them across repositories. Give maintainers a way to propose improvements and report friction.

The goal is not a central team that owns everyone’s pipeline forever. It is an engineering system that lets people make reliable changes with less guessing and better evidence.


Mentions

No webmentions yet. This post accepts mentions at https://karlhill.com/webmention.

Share

Copied

Written by

Karl Hill