Skip to content
Expert Guide Series

How to Spot a Development Team That Takes Code Quality Seriously?

Choosing a development team on the basis of portfolio and hourly rate is a reasonable starting point, but it tells you almost nothing about how that team behaves once the work gets difficult. Code quality is one of those things that looks invisible from the outside until the moment it becomes catastrophically visible: a rewrite, a six-week delay, a product that quietly stops working under load. By the time you can see the problem clearly, you have usually already paid for it.

The signals are there early in the conversation, long before a single line of code is written.

What we have found, across products in health, sport, food and drink, and consumer technology, is that the signals are there early. Teams that take code quality seriously talk about it differently, run discovery differently, and react to inherited codebases differently. The challenge is knowing what to listen for before the build begins rather than after the damage is done.

This article is a practical guide to spotting those signals. It draws on specific projects we have worked on, including a communications product where technical debt nearly broke a trust-critical system, and a dating app where skipping one discovery phase cost £15,000 and two months of rework. The patterns repeat. Understanding them means you can ask better questions, read the answers more clearly, and make a more grounded decision about who to trust with your product.

Why Code Quality Is Hard to Assess From the Outside

The difficulty with evaluating code quality before you engage a team is that the things you can see, the portfolio, the technology stack, the LinkedIn profiles, are not the things that determine whether the codebase will hold up at scale or under change. A visually polished product can be sitting on structurally fragile foundations. A team that shipped something beautiful twelve months ago may have done so by deferring a long list of problems they have not yet addressed.

What you are really trying to assess is a team's relationship with the unglamorous parts of software development. Do they write tests? Do they document? Do they talk openly about trade-offs, or do they talk only about features and timelines? These behaviours are not visible in a portfolio, but they are audible in conversation if you know what to ask and what to listen for.

Part of the problem is that clients often do not have a technical frame of reference to evaluate what they are hearing. A team can use the right vocabulary, clean architecture, test coverage, continuous integration, without those practices being genuinely embedded in how they work. Conversely, a team that struggles to articulate its approach in jargon may actually have excellent habits. The vocabulary is not the evidence. The evidence is in how they describe real decisions they have made on real projects, including the ones that did not go well.

How a Team Talks About Technical Debt

Technical debt is not inherently a sign of poor practice. Every product accumulates some of it, and in a fast-moving build, some degree of deliberate short-cutting is rational. What distinguishes a quality-conscious team is not that they have zero debt but that they know exactly where it sits, can describe it clearly, and have a position on when and how to address it.

We worked on a communications product over an extended period where the client repeatedly declined to allocate time to address accumulating debt. Each sprint, the decision was made to keep building features rather than stabilise what existed. The debt did not stay static. It grew. And because the product was built around trust and security, the eventual fragility was not just a technical inconvenience, it was a direct threat to the product's core value. Only when the structural problems became impossible to ignore did the client agree to pause feature development, rework core mechanisms, and rebuild the foundational flows. That work would have been far cheaper and far less disruptive had it been done incrementally.

According to ScienceDirect, teams spend roughly 25% of development time dealing with technical debt. A good development team will be able to tell you specifically where their debt is on any current project, what trade-off created it, and what it will cost to resolve. A team that cannot answer that question is either not tracking it or not being honest with you.

What healthy debt conversations sound like

A team with a mature approach to debt will frame it in terms of risk and timing, not shame or denial. They will say something like: "We chose to skip thorough error handling on this edge case to hit the deadline, and we have logged it for the next sprint." That specificity is the tell. Vague reassurance that the code is "clean" or "well-structured" with no supporting detail is a warning sign.

The design layer your developers need

We deliver complete UX/UI design and technical specifications your development team can build from immediately. No guesswork, no back and forth, no mid-project surprises.

See how we work Get started

No commitment

Whether Discovery Is Treated as Optional

One of the clearest indicators of a team's quality standards is how they approach discovery, and specifically whether they treat it as something that can be skipped for certain parts of the product to save time or budget.

We built a dating app focused on verified profiles and preventing automated activity. The client agreed to discovery for the onboarding flow but wanted to skip it for the messaging component, feeling that messaging was standard enough to build without research. We built a generic messaging system. That system directly contradicted the core premise of the app: it allowed automated messages and fake interactions, precisely the behaviour the verification process had been designed to prevent. The onboarding and the messaging were pulling in opposite directions.

Skipping discovery for one component cost £15,000 in additional budget and two months of rework.

The entire messaging section had to be rewritten. That cost roughly £15,000 in additional budget and added approximately two months to the project. The lesson is not that clients make bad decisions. The lesson is that a development team with genuine quality standards would have pushed back harder on the decision to skip discovery, or at minimum made the downstream risk explicit in writing before proceeding.

Ask any team you are considering how they handle a client request to skip or shorten discovery on a particular feature, as this is one of the most reliable quality checks in app development. The answer will tell you whether they treat discovery as a quality control mechanism or as an optional add-on.

Ask prospective teams to walk you through a recent instance where they pushed back on a client decision. A team that cannot recall a single example of holding a position under pressure is a team that tends to do what they are told, and that is not always in your interest.

How the Team Handles Inherited or Third-Party Code

Working with inherited codebases or alongside third-party developers is one of the most revealing stress tests for a development team. It is easy to write clean code when you control everything. The test of genuine quality standards is how a team behaves when they do not.

We took on a trading platform for the drinks industry where the existing web product had been built by a third-party developer with no API layer exposed. The architecture was tightly coupled: to connect different parts of the system, we needed access to data that only the original developer controlled. Getting timely responses from that developer became a persistent blocker. The project risked stalling indefinitely.

Taking ownership of the specification

Rather than waiting, we changed our approach. We wrote the API specification ourselves, worked to that specification internally, and then presented it to the third-party developer to implement. Taking ownership of the spec broke the deadlock and moved the project forward. That decision required a willingness to step outside a passive role and take structural responsibility for something that was, technically, someone else's domain.

Ask a team how they have handled situations where the code they were working with was not their own. Strong teams will describe specific decisions they made, constraints they worked around, and trade-offs they documented. Weak teams will describe the situation as a problem they endured rather than one they acted on.

When a team inherits third-party code, the first conversation should be about what is and is not documented. Undocumented systems create dependency: the person who built it becomes the only person who can explain it. A good team will surface that risk immediately and have a plan for reducing it.

Documentation, API Design, and Ownership of Specifications

Documentation is the part of code quality that teams most readily defer and most rarely recover. In the early stages of a build, when everything is moving fast and the team holds most of the context in their heads, writing things down feels like it slows progress. By the time the original team has moved on, or the codebase has grown beyond what any individual understands fully, the cost of that deferral becomes clear.

The drinks industry trading platform described above illustrated this at the integration level: a system with no exposed API and no specification was effectively locked to whoever built it. That kind of dependency is a commercial vulnerability. If the third-party developer becomes unavailable, changes their pricing, or simply stops responding promptly, the product's ability to evolve is held hostage.

Specification ownership as a quality signal

A team that takes quality seriously will typically own its own specifications rather than leaving them inside someone else's head or system. When we took over the API specification on the drinks platform, we were doing something that should have been done at the start of the original build: making the system's behaviour explicit, portable, and independent of any single developer's knowledge.

Ask a team what their documentation practice looks like on an active project. Ask who owns the API specification and what would happen if a key developer left. If the honest answer is that significant knowledge lives in one person and nowhere else, that team is carrying a risk they may not have named yet.

How Quickly Shortcuts Accumulate Into Structural Problems

A single shortcut in a codebase is rarely catastrophic. The problem is that shortcuts compound. Each one makes the next one slightly more likely, because the code around it becomes harder to work with cleanly. Over time, a codebase with many small shortcuts becomes a codebase where clean work is structurally difficult, and the debt is no longer a list of known items but a general property of the system.

On the communications product we worked on over an extended period, this is exactly what happened. Debt was deferred sprint after sprint, each individual decision defensible in isolation. The product was under commercial pressure, features were prioritised, and the team kept moving. But the debt did not wait. The fragility grew slowly and then, from the client's perspective, suddenly. By the time the structural problems were undeniable, a point-by-point resolution was no longer possible. Core mechanisms had to be reworked, core flows rebuilt. The disruption was far greater than it would have been at any earlier intervention point.

According to a McKinsey survey from 2020, technical debt can account for up to 40% of the total technology estate value in some organisations. That figure describes the ceiling, not the average, but it illustrates the scale of what accumulation can produce when it goes unaddressed long enough.

Ask a team to show you how they track technical debt across a project. A spreadsheet, a backlog tag, a dedicated column, the format matters less than the fact that it exists and is actively reviewed. If debt is not tracked, it is not managed.

The Questions to Ask Before Engagement Begins

Most pre-engagement conversations focus on portfolio, timeline, and rate. These are not the wrong things to discuss, but they are not the things that will tell you whether a team will protect your product's structural integrity over time. The questions below are designed to surface that.

  1. Can you describe a recent instance where you pushed back on a client's technical decision? What was the outcome?
  2. How do you track and review technical debt within an active project?
  3. What does your documentation practice look like, and who owns it?
  4. How do you handle a request to skip or shorten discovery for part of the product?
  5. If a key developer left mid-project, how much knowledge would leave with them?
  6. Have you ever worked with inherited or third-party code? How did you approach it?

The quality of the answers is less about technical vocabulary and more about specificity. A team that answers with real projects, real decisions, and real outcomes, including ones where things went wrong, is giving you something to evaluate. A team that answers in principles and reassurances without ever naming a specific instance is not giving you evidence, whatever else it is giving you.

Reading the answers

Pay particular attention to how a team talks about situations where a client disagreed with their advice and proceeded anyway. A team with genuine standards will have a clear position on those moments. A team that frames every past engagement as one where everything went smoothly, and the client always agreed, is either very fortunate or not being straight with you.

Red Flags During the Build That Leaders Often Misread

Some of the clearest signs of a code quality problem emerge during the build itself, but they are often misread by non-technical stakeholders as normal development behaviour. Knowing what to look for changes what you see.

  • Features consistently taking longer than estimated, with explanations focused on complexity rather than specific causes
  • Bug fixes that introduce new bugs in adjacent parts of the system
  • An inability to give a clear answer about what has changed between two versions
  • Resistance to adding test coverage retrospectively, framed as "too time-consuming"
  • A growing list of items described as "we'll tidy that up later" with no scheduled time to do so

The bug-fix-that-creates-new-bugs pattern is particularly telling. In a well-structured codebase, a fix in one area should not routinely destabilise another. When it does, it usually means the components are more tightly coupled than they should be, a structural problem, not an isolated one.

On the wellness genetics product we worked on, a design layer was applied on top of an existing functional codebase, with the handoff going through an intermediary designer. The gap between the visual intent and what the underlying code could support created significant rework. The visual design demanded behaviour the architecture had not been built to provide. By the time the mismatch was clear, it had already produced a set of problems that required structural decisions, not surface fixes.

When "we're nearly there" keeps resetting

Another commonly misread signal is the perpetual near-completion: a feature that is "ninety percent done" for two consecutive sprints. This usually means the remaining ten percent has hit a structural obstacle the team did not flag explicitly. It is not necessarily dishonesty, it can reflect genuine optimism, but it is a sign that the team's understanding of the underlying architecture is less complete than their confidence suggests.

Conclusion

Code quality does not announce itself. A team with poor standards can deliver something that looks good for six months and then becomes increasingly expensive to maintain and extend. A team with strong standards will sometimes slow a sprint down to address a problem that is not yet visible, and to a non-technical stakeholder, that can look like inefficiency rather than discipline.

The projects we have described here, the communications product that accumulated debt until it became fragile, the dating app that paid £15,000 for a skipped discovery phase, the drinks industry platform where we had to write the API specification ourselves to unblock the build, all share the same underlying pattern. Standards that are not explicit and actively defended tend to erode under commercial pressure. A team that takes quality seriously knows this and has built practices that hold the line even when the pressure to cut corners is real.

The signals are available before you commit. A team's language around debt, discovery, documentation, and inherited code will tell you most of what you need to know. The questions in this article are designed to draw out that language. The answers will not be perfect, no team's are, but honesty about imperfection is itself a quality signal.

If you are evaluating development partners and want a second perspective on what you are hearing, let's talk about your product and the team behind it.

Frequently Asked Questions

Why is it so difficult to assess code quality before hiring a development team?

The things you can easily see, such as a portfolio or technology stack, do not reveal whether a codebase will hold up under pressure or scale. A visually polished product can sit on structurally fragile foundations, and a team may have shipped something impressive by deferring problems they have not yet resolved.

What is technical debt and should I be worried if a team mentions it?

Technical debt refers to shortcuts or deferred work accumulated during a build, and some degree of it is a normal part of fast-moving development. What matters is not whether a team has debt, but whether they can describe clearly where it sits and have a considered plan for addressing it.

What questions should I ask a development team to gauge their attitude towards code quality?

Ask them to describe real trade-offs they have made on past projects, including ones that did not go well. Teams that take quality seriously will be able to speak openly about decisions around testing, documentation, and technical shortcuts rather than focusing only on features and delivery timelines.

Can I rely on a team using the right technical vocabulary as a sign of quality?

No. A team can use terms like clean architecture or test coverage without those practices being genuinely embedded in how they work. The more reliable signal is how they describe real decisions on real projects, not whether they can recite the correct terminology.

How much can skipping a discovery phase actually cost my project?

Based on real project experience, skipping a discovery phase can result in significant rework. One example from a dating app project resulted in £15,000 in additional costs and two months of delays, all of which could have been avoided with proper upfront discovery.

What does a quality-conscious development team look like in early conversations?

They tend to ask questions about trade-offs, constraints, and long-term maintainability rather than jumping straight to timelines and features. The signals of a quality-focused mindset are often visible early in conversation, well before any code is written.

Is it possible to inherit a poorly built codebase without realising it until things go wrong?

Yes, and this is one of the most common and costly situations in product development. Problems with inherited codebases often remain invisible until they become serious, such as a system failing under load or requiring a full rewrite, by which point you have usually already paid for the damage.

Does the industry a development team has worked in affect how I should evaluate their code quality?

The core signals of code quality, how a team talks about debt, testing, and trade-offs, are consistent across industries. However, teams with experience in regulated or trust-critical sectors such as health technology may have more developed habits around reliability and documentation.