About Nancy Zhang
Nancy is a Senior Consultant on the Software team, located in Richmond, VA.
This site uses cookies to enhance your browsing experience and deliver personalized content. By continuing to use this site, you consent to our use of cookies.
COOKIE POLICY

In consulting, one of the least visible but most expensive phases of a project is the beginning. Teams can spend days or weeks setting up repositories, agreeing on structure, wiring basic infrastructure, and solving problems that have already been solved many times before. Code templates are a practical way to reduce overhead while improving consistency.
This post focuses on building reusable templates intended for real client work. The goal is faster project startup without sacrificing flexibility or maintainability.
Client buy-in is essential, and the message needs to be tailored to the audience.
For business stakeholders, the value is straightforward. A reusable template reduces non-functional startup work. That means fewer billable hours spent on setup, earlier delivery of visible features, and more predictable timelines. Framing the template as a way to move faster to meaningful outcomes tends to resonate well.
If you have numbers, use them. Even a rough comparison helps: “Our last two projects used the template and had their first feature PR within two days. Before the template, initial setup typically took one to two weeks.” Concrete results are more persuasive than abstract promises.
Technical stakeholders often care about different things. A template establishes coding patterns and practices early. It provides sample implementations for logging, error handling, configuration, testing, and deployment. Instead of debating fundamentals on every project, teams can focus on domain-specific problems.
In one engagement, the client adopted the template’s patterns as their team’s new coding standards going forward. Sample implementations for common concerns gave new developers a concrete reference point for how the project was expected to work, shortening their ramp-up time considerably.
It is important to position templates as a starting point, not a locked-down framework. Engineers should feel empowered to adapt the template rather than constrained by it.
Templates tend to fail when they try to solve too many problems up front. A good rule is to choose an architecture that is widely understood and easy to maintain, then keep it intentionally small.
If you are using Clean Architecture, for example, the base template might include:
More specialized concerns such as authentication, messaging, background jobs, or caching should live in clearly separated modules. If a project does not need them, they should be easy to remove without breaking the rest of the system.
The same principle applies to Onion Architecture. Keep the core small and dependency-free. Infrastructure details should be swappable and optional. If removing a feature requires touching half the codebase, the template is too tightly coupled.
The key question to ask is not “what might future projects need” but “how easily can this be removed if it is not needed”.
Successful templates separate core structure from optional features.
The core should include:
That last point is easy to overlook. Build, test, and deploy pipelines are some of the most copy-pasted and least standardized artifacts across projects. Including a working pipeline definition, whether GitHub Actions, Azure DevOps, or something else, removes an entire class of early-project friction.

Optional components should be isolated behind clear boundaries. For example:
For each optional module, consider including a short removal checklist. Something like: “To remove the authentication module, delete these folders, remove these service registrations, and drop these configuration keys.” This makes the modularity concrete rather than aspirational.
Documentation matters here. Explain why the structure exists and when to remove or replace parts of it. A short README that describes intent is often more valuable than detailed API documentation.
Beyond a README, include lightweight Architecture Decision Records in the template. These do not need to be formal. A short document explaining “We chose X over Y because of Z” gives future teams the context they need to know when it is safe to deviate.
Without this context, teams either follow patterns blindly or discard them without understanding the tradeoffs. Neither outcome is good.
A template that requires tribal knowledge to run is a template that will frustrate new team members.
Include a clear path from clone to running application:
The first experience a developer has with the template sets the tone. If it takes thirty minutes of asking around to get the application running, much of the perceived value is lost.
The delivery mechanism matters more than it might seem. A template that nobody knows how to use will not get used.
There are several approaches depending on your ecosystem:
The right choice depends on your team’s tooling and how much customization is needed at creation time. Whatever you choose, document the process clearly and keep it to as few steps as possible.
Adoption is rarely all-or-nothing. Some teams will use the template as-is. Others will selectively copy parts of it. Both are valid outcomes.
There are real trade-offs. Templates need ongoing maintenance to stay relevant. Dependencies evolve, best practices change, and client requirements shift. If a template is never updated, it quickly becomes a liability.
On the other hand, constant feature additions can turn a template into a bloated internal framework. Being selective about what gets added is critical. Features should earn their place by being used repeatedly across projects.
Templates without clear ownership tend to fork silently. One team copies the template, makes improvements, and never contributes them back. Another team does the same. Within a few months, you have several divergent copies and no single source of truth.
A lightweight governance model helps:
This does not need to be heavy process. A pull request workflow and a quarterly review of what has been added or changed is often enough.
Maintaining a template is an investment. Time spent updating it is time not billed to a client. The return comes from reduced startup costs across multiple engagements.
Versioning helps. Tag releases, document changes, and allow teams to opt into updates when it makes sense. Not every project needs to be on the latest version.
It is worth addressing how teams pull in updates from newer template versions. Options include maintaining an upstream branch that project repositories can merge from, publishing a changelog that teams apply manually, or simply accepting that most projects will snapshot the template at creation time and diverge from there. Be honest about which model you are actually supporting.
It is also reasonable to periodically prune features that are no longer pulling their weight.
Versioning helps. Tag releases, document changes, and allow teams to opt into updates when it makes sense. Not every project needs to be on the latest version.
It is also reasonable to periodically prune features that are no longer pulling their weight.
Templates are not always the answer. Highly experimental projects, quick prototypes, or clients with mature existing platforms may not benefit. In those cases, flexibility matters more than consistency.
The goal is not to force reuse everywhere, but to remove unnecessary friction where reuse makes sense.
Well-designed code templates act as a force multiplier in consulting work. They capture lessons learned, reduce waste, and give teams a strong starting point without dictating the end result. When kept simple, modular, and well-maintained, they can significantly reduce project startup time while improving overall quality.
In practice, this can extend beyond the consulting engagement itself — one client adopted the template’s coding standards and sample patterns as a baseline for their broader development organization, and the built-in solutions to pain points like slow deployments and local environment setup became part of how their teams work day to day. For organizations carrying deeper technical debt, the same principles of reusable structure and standardized patterns also apply when modernizing at a larger scale — as explored in Transforming Legacy Systems: Application Modernization Drives Efficiency & Scalability.
The templates that last are the ones that respect two constraints equally: they must be easy to adopt and easy to outgrow.
Nancy is a Senior Consultant on the Software team, located in Richmond, VA.
Tre is a Senior Consultant on the Engineering team.