Skip to main content
Test Double company logo
Services
Services Overview
Holistic software investment consulting
Software Delivery
Accelerate quality software development
Product Management
Launch modern product orgs
Legacy Modernization
Renovate legacy software systems
DevOps
Scale infrastructure smoothly
Upgrade Rails
Update Rails versions seamlessly
Technical Recruitment
Build tech & product teams
Technical Assessments
Uncover root causes & improvements
Case Studies
Solutions
Accelerate Quality Software
Software Delivery, DevOps, & Product Delivery
Maximize Software Investments
Product Performance, Product Scaling, & Technical Assessments
Future-Proof Innovative Software
Legacy Modernization, Product Transformation, Upgrade Rails, Technical Recruitment
About
About
What's a test double?
Approach
Meeting you where you are
Founder's Story
The origin of our mission
Culture
Culture & Careers
Double Agents decoded
Great Causes
Great code for great causes
EDI
Equity, diversity & inclusion
Insights
All Insights
Hot takes and tips for all things software
Leadership
Bold opinions and insights for tech leaders
Developer
Essential coding tutorials and tools
Product Manager
Practical advice for real-world challenges
Say Hello
Test Double logo
Menu
Services
BackGrid of dots icon
Services Overview
Holistic software investment consulting
Software Delivery
Accelerate quality software development
Product Management
Launch modern product orgs
Legacy Modernization
Renovate legacy software systems
Cycle icon
DevOps
Scale infrastructure smoothly
Upgrade Rails
Update Rails versions seamlessly
Technical Recruitment
Build tech & product teams
Technical Assessments
Uncover root causes & improvements
Case Studies
Solutions
Solutions
Accelerate Quality Software
Software Delivery, DevOps, & Product Delivery
Maximize Software Investments
Product Performance, Product Scaling, & Technical Assessments
Future-Proof Innovative Software
Legacy Modernization, Product Transformation, Upgrade Rails, Technical Recruitment
About
About
About
What's a test double?
Approach
Meeting you where you are
Founder's Story
The origin of our mission
Culture
Culture
Culture & Careers
Double Agents decoded
Great Causes
Great code for great causes
EDI
Equity, diversity & inclusion
Insights
Insights
All Insights
Hot takes and tips for all things software
Leadership
Bold opinions and insights for tech leaders
Developer
Essential coding tutorials and tools
Product Manager
Practical advice for real-world challenges
Say hello
Leadership
Leadership
Leadership
Maximize software investment

The trouble with estimates in custom software development

Estimates can doom custom software projects from the start. Learn why this happens and explore better ways to plan your next software project.
Justin Searls
|
February 28, 2014
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

As a software development agency, prospective clients will often ask for an estimate of how much time and money the custom software they want will cost.

Inside the software world, this debate is settled: estimates suck. In a group, this terse declaration is used as a sort of tribal banner to identify other developers of the same ilk.

I worry, however, that the community spends so much time reveling  in estimate-bashing, that we've collectively gotten worse at explaining the trouble with estimates to software outsiders.

Can you estimate this for me?

Here are a few example responses to the question, "can you estimate this for me?" that are unlikely to close the deal:

  • "We don't do estimates, we do <Describe Other Activities>", even when it's unlikely to be clear how other activities are an adequate substitution for an estimate
  • "Estimates put too much pressure on our developers", as if clients are adversaries to protect oneself from
  • "Sorry, but people who ask for estimates simply aren't a good fit for <Insert Agency Name>", disregarding the fact that most people have no idea why competent developers might refuse to give estimates

Responses like these are more likely to come off as pretentious than persuasive.

Some studio runners take pride in turning away anyone who so much as utters the "e"-word. Other firms jump at the chance to win any work, and eagerly provide (and even contractually commit to!) detailed estimates. Worst of all, some of the biggest players in the industry habitually lowball their estimates up front, with the intention of later employing their well-staffed legal departments to ensnare clients in a supremely profitable death by a thousand change requests.

The more responsible approach, it seems to me, is to make a best effort to educate prospective clients on the reasons behind our community's collective distaste for estimation. After all, it requires a counter-intuitive realization to understand that specifying a complete system up-front actually increases—as opposed to decreases—a project's overall risk of failure.

Have some empathy

Imagine yourself in the shoes of someone hoping to pay others to write an application on their behalf. They are embarking on an expensive venture to buy something intangible, made out of mysterious code they can't comprehend, and from people who have them at a tremendous informational disadvantage. That's a lot of unknowns!

If I were the one swimming in that sea of variables, I'd try to fix as many constants as I possibly could. If only I could convert the intangible aspects of purchasing software services into something tangible, then I would have greater control over the project's success. Or so I might expect.

The vast majority of things people buy in their lifetime are physical goods, it's hard to fault someone for trying to buy software services in the same way they'd go about remodeling their kitchen: design it up front, shop the plan around to a number of contractors, and choose the best proposal from a number of quotes. This approach makes sense when building physical things, because:

  • Changing the design partway through will require rework and increase overall expense, so one can only benefit from starting with a complete and detailed plan
  • Pitting contractors against one another to propose a price and schedule will externalize the buyer's own expertise deficit, because the contractors will be under competitive pressure to minimize their price
  • Contractors participate in a local, reputation-sensitive economy and will be incentivized to swallow any losses in the event that cost overruns exceed their quoted price (in the absence of changes requested by the client)

Any experienced developer will recognize that literally none of these conditions are true when buying software development services.

Nevertheless, it's important to keep in mind that, in the real world, people who want to buy software services are usually under very real constraints: they might have a legitimately hard deadline, or users might demand a minimum set of functionality, or they might be under severe budget constraints. Only after spending the time to uncover and empathize with someone's constraints can anyone begin to define an approach that's appropriate for their situation.

It's entirely reasonable for someone to naïvely start a conversation with a software studio under the presumption (or hope) that paying someone to write software will compare to paying someone to remodel a kitchen. Consequently, it's our responsibility as professionals to do our best to articulate the dangers inherent in that assumption.

Articulating the dangers inherent in that assumption

Earlier, I mentioned that specifying a complete system up front actually adds to the project's risk of failure. That risk is separate from but compounded by seeking fixed-price quotes from  software developers based on estimates of a fixed scope.

One reason developers bristle at in-depth system specifications is because they prematurely solidify the whole team's opinion of what "done" should look like, even though few finished applications ever resemble their initial designs upon completion. From an outsider's perspective, the intangibility of software seems scary, but an insider will recognize that software's inherent malleability can also be its greatest asset. If the team starts by building something very small, the highly-variable nature of software allows them to build incrementally in whichever direction seems best, allowing the eventual design of the system to emerge organically over time. While such an approach might see one's kitchen remodel ultimately encroach well into the bathroom, it can confidently ensure a software system will never do more than it absolutely needs to do.

After all, why decide every detail at a project's outset, the moment when we will have the least information available to us? While nailing down the details in advance might appear comforting from a risk management perspective, it has the deleterious side effect of dramatically diminishing the team's empowerment to make future decisions that deviate from that initial plan. Future decisions are typically better-informed than today's decisions, because they carry with them the benefit of the team's concrete experience building the software and can incorporate the feedback from stakeholders based on actual interactions with the nascent application.

Moreover, when developers commit to an up-front estimate, it unnecessarily creates an adversarial relationship between the present-tense team who is best informed about the software versus the past-tense buyer initially promised a fixed cost, fixed-scope quantity. Negotiating over the financial impact of these inevitable deviations does not contribute to the success of the project, but does run the risk of destroying otherwise healthy working relationships.

Constraint-conscious development

For these reasons, a more sound strategy is to distill the initial expectations of the hypothetical application into a list of its desired outcomes. The team can then identify the simplest human and system activities that those outcomes will require. The goal of this activity is to set the bar for initial success so low that everyone involved can easily visualize stepping over it.

To keep the design simple while it remains in this abstract state, the entire team must be on-guard against specifying any detail unnecessarily. Of course, secondary decision points should be acknowledged as they materialize, but it's best to defer them until a concrete implementation of the initial simple design has emerged.

But what if the prospective client and the developer fail to arrive at an approach simple enough to begin work with one another confidently?

As it happens, great developers employ a number of proven practices for building trust by reducing uncertainty and risk. They might:

  • Work in the open. Deploy and demo working code frequently while keeping everything in a stable state. Should an unforeseen event prematurely end the project, the incomplete system is likely to be independently valuable (or, at worst, in a salvageable state)
  • Minimize commitments. At the end of each week, give the client the opportunity to cut their losses and end the engagement if the team isn't showing progress commensurate with their rates
  • Find a common language. Run a 1-2 day paid "inception project" to break down the most important aspect of the application into an initial backlog of sufficiently small, technically viable units of work—all the while educating the client about their role as a product owner
  • Aggressively address risky unknowns. Sometimes, a poorly understood aspect of the system that won't be needed for weeks carries with it a valid risk of blowing the project's budget out of the water. To avoid that outcome, pull forward focused research activities ("spikes") to eliminate these unknowns toward the beginning of the project, before sunk costs can become too great
  • Be a fantastic partner. Great development agencies openly exhibit a desire for close and honest collaboration with their clients. Their developers will have lots of experience coaching clients on the skills it takes to be a successful product owner

The goal of these practices is to put the client in a position to make informed decisions about each feature at the moment they'll be best-equipped to do so: just before developers start implementing that feature.

Avoiding an impasse

For developers, it's easy to scare off perfectly legitimate customers by shouting "we don't give estimates!" It's a little more difficult to realize that doing so has the side effect of limiting one's list of potential clients to those who already understand why up-front specification and estimates are so problematic. That's a relatively small market.

For prospective buyers, some will continue to insist—even after hearing all this out—on contracting at a fixed price for a fixed scope of work. After all, plenty of software consultancies are happy to contract under those terms. Sadly, what such a buyer is unlikely to realize is that they're self-selecting for less-talented vendors, including potentially predatory ones. Agencies of highly-skilled developers are typically unwilling to contract on that basis because they understand that it leads to significantly worse outcomes for all parties involved. (To say nothing of the fact that premier agencies are in high-enough demand to avoid signing such contracts.)

My hope is that we as developers will continue to hone our pitch about the dangers of up-front specification & estimation, while acknowledging that it will continue to be entirely reasonable for folks outside the software realm to initially request them.

Related Insights

No items found.

Explore our insights

See all insights
Developers
Developers
Developers
You’re holding it wrong! The double loop model for agentic coding

Joé Dupuis has noticed an influx of videos and blog posts about the "correct" way of working with AI agents. Joé thinks most of it is bad advice, and has a better approach he wants to show you.

by
Joé Dupuis
Leadership
Leadership
Leadership
Don't play it safe: Improve your continuous discovery process to reduce risk

We often front-load discovery to feel confident before building—but that’s not real agility. This post explores how continuous learning reduces risk better than perfect plans ever could.

by
Doc Norton
Leadership
Leadership
Leadership
How an early-stage startup engineering team improved the bottom line fast

A fast-growing startup was burning cash faster than it could scale. Here’s how smart engineering decisions helped them improve the bottom line.

by
Jonathon Baugh
Letter art spelling out NEAT

Join the conversation

Technology is a means to an end: answers to very human questions. That’s why we created a community for developers and product managers.

Explore the community
Test Double Executive Leadership Team

Learn about our team

Like what we have to say about building great software and great teams?

Get to know us
Test Double company logo
Improving the way the world builds software.
What we do
Services OverviewSoftware DeliveryProduct ManagementLegacy ModernizationDevOpsUpgrade RailsTechnical RecruitmentTechnical Assessments
Who WE ARE
About UsCulture & CareersGreat CausesEDIOur TeamContact UsNews & AwardsN.E.A.T.
Resources
Case StudiesAll InsightsLeadership InsightsDeveloper InsightsProduct InsightsPairing & Office Hours
NEWSLETTER
Sign up hear about our latest innovations.
Your email has been added!
Oops! Something went wrong while submitting the form.
Standard Ruby badge
614.349.4279hello@testdouble.com
Privacy Policy
© 2020 Test Double. All Rights Reserved.