Software Delivery · Field note

Scope Before Estimate: Turning a Software Idea into a Buildable Boundary

A useful estimate begins after the team has named the workflow, the exceptions, the dependencies, and the line that defines the first release.

An estimate is an output, not a starting point

The first description of a custom software project is usually a destination: an operations dashboard, a customer portal, a booking system, or a replacement for a collection of spreadsheets. That description is useful for orientation, but it is not yet a unit of work. Two teams can use the same label while imagining completely different users, permissions, data rules, integrations, and operating responsibilities.

Before estimating, I look for the boundary of the system. Who is allowed to do what? Which event starts the workflow, and what marks it as complete? Where does the authoritative data live? What happens when information is late, duplicated, rejected, or changed after approval? These questions reveal the work that a list of screens tends to hide.

A premature fixed number creates false precision. It encourages everyone to defend an early guess while the actual product is still changing shape. A more responsible first answer may be a range, a short discovery engagement, or an estimate for one defined slice. The format matters less than making the uncertainty visible rather than burying it in a contingency line.

Describe decisions and state changes, not just features

Feature lists are easy to write and difficult to build from. “User management” could mean one administrator inviting five colleagues, or several organizations managing thousands of accounts with role inheritance, approval, suspension, audit history, and data isolation. The name of the feature says very little about its implementation weight.

I rewrite each important feature as a small operational narrative. A named user begins with a known state, takes an allowed action, and leaves the system in a new state that another person or service can verify. Then I add the unhappy paths: expired links, unavailable providers, partial payment, duplicate submissions, lost connectivity, permission changes, and manual correction. Not every exception belongs in the first release, but each one should be consciously handled, deferred, or excluded.

Define the first release by evidence

A first release should be small enough to explain without hand-waving and complete enough to support one real journey from beginning to end. I prefer a thin, connected workflow over several polished fragments. For an internal approval tool, that might mean creating one request, routing it to one role, recording a decision, notifying the requester, and preserving a readable history. Reporting, bulk actions, secondary roles, and unusual exceptions can follow if they are not required to operate safely.

Acceptance criteria make that boundary testable. They should identify the actor, the starting conditions, the action, the expected result, and any data or audit record that must remain afterward. Visual references help with interface intent, but they do not replace rules. A button can look finished while the permission model behind it is still unresolved.

This is also the point to assign dependencies. Content, access credentials, sample data, legal wording, API documentation, store accounts, and infrastructure decisions often sit outside the developer's control. Each dependency needs an owner and a date. If it is missing, the estimate should show the consequence instead of quietly assuming perfect availability.

Price the known work and expose the unknown work

Once the boundary is clear, the estimate can be organized by modules, delivery stages, and review points. I separate confirmed implementation from investigation, migration, third-party approval, and optional work. This lets a client see which parts are firm, which depend on a decision, and which can be removed without breaking the core journey.

The estimate should also state what happens when a discovery changes the plan. A legacy export may contain unusable records. An external API may lack a sandbox. A requested permission rule may conflict with the existing data model. Naming these possibilities is not pessimism; it is the practical difference between managing a project and merely hoping the first assumptions survive contact with production.