Articles

How we build: from a written design to a merged change

Watch: this article in 81 seconds
Read the transcript

Any supplier will tell you their software works. You learn more by asking who relies on it.

A design says, in ordinary language, what a change is for. Words are the cheapest thing to change.

A specification says exactly how the software must behave, in terms that can be checked.

A plan breaks a change into steps small enough that each can be built, tested and reviewed on its own.

Test-first means the test is written before the code it tests.

Reviewers working independently tend to miss different things, so between them they catch more.

Merging is the point at which a change joins the main body of the product's code.

The specification is checked against the design, the tests against the specification, and the code against the tests.

Ask a supplier: who reviews a change besides the person who wrote it, and what happens when they disagree?

Read the article at freestart.ai/articles.

The short answer: We use what we build before anyone else does. Each piece of work starts as a written design, then a specification and a plan. It's built test-first, reviewed independently by several different AI models and by us, and merged once disagreements have been recorded and settled. It runs on our own servers, with storage that keeps snapshots, a private network between our sites and off-site backups that can't be altered.

Our How we build page says this in a few lines, and there's a short film there too. This article is the longer version, for the reader who has to assess a supplier: a technical lead, or whoever is doing the procurement. For each stage it sets out what we do, and then, separately, what a stage of that kind is for and what you could ask any supplier to show you.

Run it ourselves first

Everything on our site was built for Freestart's own work before anyone else saw it. Our own teams are the first users, and if it doesn't help them, it doesn't ship. CallHub, TrainingHub and ProspectHub are in use at Freestart, which means our own teams use them at work today.

Why this matters to a buyer is simple enough. A supplier that depends on its own software finds the faults first, and hears about them from colleagues who are trying to get their work done. Any supplier will tell you their software works. You learn more by asking who relies on it.

The six stages

StageWhat we doWhat it's for
DesignA written designAgreeing what the change is for before any code exists
SpecificationThen a specificationStating the behaviour exactly enough to test
PlanThen a planPutting the work in order, in small steps
BuildBuilt test-firstProving each piece does what the specification says
ReviewSeveral different models, and usCatching what the builder missed
MergeDisagreements recorded and settledMaking the change part of the product

1. Design

Work starts as a written design.

A design, in the general sense, says in ordinary language what a change is for, what it will do, and what it won't. Writing it down first matters because words are the cheapest thing to change. A misunderstanding found in a design costs a conversation, and the same one found after the build costs a good deal more.

Ask a supplier: could I read a design for something you've built, and would I understand it?

2. Specification

Then a specification.

Where a design says what is wanted, a specification says exactly how the software must behave, case by case, in terms that can be checked. "Flag invoices that look wrong" is a wish. "Flag an invoice when its total differs from the purchase order" is a statement someone can test.

Ask a supplier: how do you get from what we said we wanted to something you can test against?

3. Plan

Then a plan.

A plan orders the work. Its main job is to break a change into steps small enough that each can be built, tested and reviewed on its own. A reviewer can read a small step properly, and a large one tends to be skimmed.

Ask a supplier: how big is a typical change by the time someone reviews it?

4. Build, test-first

It's built test-first.

Test-first means the test is written before the code it tests. The test describes what the software should do, and at first it fails, because the code doesn't exist. The code is then written until the test passes. Two things follow. Each piece of behaviour has a check that it works, and those checks stay in place, so a later change that breaks an earlier one is caught straight away.

Ask a supplier: when you change something next year, how will you know you haven't broken what works today?

5. Review

It's then reviewed independently by several different AI models and by us before it's merged.

The reason for more than one reviewer is the reason for a second opinion anywhere. Reviewers working independently tend to miss different things, so between them they catch more. The reason for people in the review is accountability: somebody has to stand behind what goes in.

Reviewers won't always agree. On our How we build page we put it this way: disagreements are recorded and settled, not skipped. A disagreement is evidence that something is unclear, in the code or in the specification, and waving it through leaves the problem in place.

Ask a supplier: who reviews a change besides the person who wrote it, and what happens when they disagree?

6. Merge

Merging is the point at which a change joins the main body of the product's code. Until then it sits to one side, where it can be tested and reviewed without affecting anything in use. In our process a change is reviewed before it's merged.

Ask a supplier: can anything reach the live system without being reviewed?

Why the order matters

In a process like this, each stage produces something the next one is checked against. The specification is checked against the design, the tests against the specification, the code against the tests, and the review looks at all of them.

Work in the opposite order, with code first and documents afterwards, and the documents describe whatever happened to get built. They can't tell you whether that was the right thing.

There's a commercial side to this as well. A written design is what makes a fixed price possible, because both sides can see what's being bought. The fourth article in this series makes that case.

Cite it or say so

One rule applies to what the software does, as well as to how it's built. Where software gives an answer, it shows what the answer rests on. Where the evidence isn't good enough, it says so.

PlanningAssist, which is in beta, is the clearest example: it answers with numbered sources. The first article in this series describes how it finds them.

Our own infrastructure

We run our own servers, with storage that keeps snapshots, a private network between our sites, and off-site backups that can't be altered. We test restores rather than assume them.

Here is what each of those terms means, in general, and why a buyer should care.

  • Storage that keeps snapshots. A snapshot is a record of the data as it stood at one moment. If something is deleted or damaged, the earlier state is still there.
  • A private network between sites. Servers in different places can talk to each other without that traffic being open to anyone else.
  • Off-site backups that can't be altered. A backup kept somewhere else survives the loss of a site. One that can't be altered also survives a mistake or an attack that would otherwise overwrite it.
  • Tested restores. A backup has only been proved when someone has restored from it. Plenty of organisations find out that theirs doesn't work on the day they need it.

What we build for other businesses is looked after in the same place. We run and maintain what we build, on the same infrastructure we use for our own products.

Ask a supplier: where does it run, who looks after the servers, and when did you last restore from a backup?

What we leave out

We don't put numbers on our site we can't stand behind, and we label what isn't finished.

The labels mean what they say. "In use at Freestart" means our own teams use it at work today. "Beta" means it's public and still changing. "In development" means it isn't finished. A buyer should be able to tell from a supplier's own website which of its products exist.

Contact

Ask us

If you're assessing us as a supplier and have a question this article doesn't answer, email hello@freestart.ai or use the contact page.

Agents and software

Agents that do the work. Software that holds it together.

Questions

Frequently asked questions

Another question?

Email hello@freestart.ai, ring 0330 223 8390 or use the contact page.

What does "test-first" mean?

The test for a piece of behaviour is written before the code. It fails at first, and the code is written until it passes. The tests then stay in place and catch later changes that break earlier work.

Why have several reviewers look at the same change?

Independent reviewers tend to miss different things, so together they catch more than one would. Our changes are reviewed independently by several different AI models and by us before they're merged.

What happens when reviewers disagree?

The disagreement is recorded and settled, not skipped. A disagreement usually means something is unclear, and settling it is how that gets fixed.

What is the difference between a design and a specification?

A design says in ordinary language what a change is for and what it will do. A specification states the behaviour exactly, case by case, so that it can be tested. Our work starts with the first and then moves to the second.

Where does freestart.ai's software run?

On our own servers, with storage that keeps snapshots, a private network between our sites, and off-site backups that can't be altered. We test restores rather than assume them.

What do your status labels mean?

"In use at Freestart" means our own teams use it at work today. "Beta" means it's public and still changing. "In development" means it isn't finished.

About the author

Mark Gerrard

Managing Director, freestart.ai

freestart.ai is the engineering arm of Freestart plc.