Index / 00 — Engineering practice

Software built
like laboratory
work.

TRAIN IN THE LAB LTD is an IT company. We design, build and maintain custom software, web applications and cloud infrastructure for organisations that depend on those systems every working day.

Custom software · Web engineering · Cloud & DevOps · Integration · QA · Consulting

Engineering workspace with three monitors displaying source code and a whiteboard covered in service architecture diagrams
Fig. 01 — Development environment

01Introduction

A small practice organised around one question: will this still be maintainable next year?

Most software problems we are asked to solve are not exotic. They are the ordinary consequences of systems that grew faster than their structure: manual steps that should be automatic, data that lives in three places, a release process nobody wants to run on a Friday.

Our work is to replace that with something deliberate. We write code that another engineer can pick up, keep the number of moving parts as low as the problem allows, and make the behaviour of a system visible once it is running.

We work in English with distributed teams and communicate in writing by default, so decisions are recorded rather than remembered.

02Core areas of expertise

Four practices, one delivery team.

01

Application engineering

Back-end services, front-end interfaces and the data models that hold them together, built as one coherent system rather than disconnected parts.

02

Infrastructure and delivery

Reproducible environments, build pipelines and deployment routines so that releasing a change is an ordinary, low-drama event.

03

Interfaces between systems

APIs, message flows and data exchange between internal tools and third-party platforms, including the error handling those exchanges require.

04

Verification

Automated test suites, manual exploratory passes and instrumentation that make the behaviour of a system observable after release.

03Custom software development

Systems shaped around how the work is actually done.

Off-the-shelf products assume a standard process. When a business has a process worth keeping, bending it to fit a product is expensive in a way that rarely appears on an invoice. Custom software is worth building when the process is a genuine part of how the organisation operates.

We start from the data and the rules that govern it, then build the interfaces around that model. Typical deliverables are a running application, a documented data model, automated tests, deployment configuration, and notes explaining why the system is arranged the way it is.

Two engineers discussing a system architecture diagram drawn on a large whiteboard
Fig. 02 — Architecture review

04Web application engineering

Interfaces that stay fast as the data grows.

Front end

Component-based interfaces with predictable state handling, keyboard accessibility, and layouts that hold together from a phone to a wide desktop display.

Back end

Server-side logic, authentication and authorisation, background processing, and database schemas designed with the query patterns in mind.

Performance

Rendering strategy, caching and query tuning chosen against measurements taken on representative data rather than assumptions.

Longevity

A conservative dependency list, a documented upgrade path and build tooling that a new engineer can run on the first day.

05Cloud architecture and infrastructure

Row of dark server racks in a data centre corridor with indicator lights
Fig. 03 — Hosting infrastructure

Environments you can rebuild from a repository.

Infrastructure assembled by hand becomes a record only one person holds. We describe environments as code so that staging and production differ by configuration rather than by history, and so that recovery is a procedure instead of an improvisation.

Provisioning

Declarative infrastructure definitions kept in version control and applied through the same review process as application code.

Pipelines

Automated build, test and deploy steps with a clear signal for what is deployable and what is not.

Observability

Structured logs, metrics and alerts chosen around the failures that actually matter to users, not around everything that can be measured.

Cost and scale

Capacity sized to observed load, with the scaling behaviour written down rather than assumed.

06Systems integration and automation

The interesting part of an integration is what happens when it fails.

Connecting two systems on a good day is straightforward. The engineering is in the rest: duplicate deliveries, partial writes, a provider returning a response nobody documented, a nightly job that silently stopped three weeks ago.

We design integrations with explicit contracts, idempotent operations, retry behaviour with limits, and dead-letter handling so failed work is visible instead of lost. Data migrations run as repeatable scripts with verification steps, not as one-off manual imports.

Automation follows the same rule: a scheduled task is only finished when its failure is as loud as its success.

contracts · idempotency · retries · reconciliation · alerting

07Quality assurance and testing

Testing that describes behaviour, not coverage targets.

A test suite earns its keep when it lets a team change code confidently. We write unit tests around business rules, integration tests across real boundaries such as the database and external APIs, and a focused set of end-to-end tests covering the journeys that must never break.

Tests run in the pipeline on every change. Flaky tests are treated as defects and fixed or removed, because a suite people learn to ignore is worse than no suite. Exploratory manual testing covers what automation is poor at: ambiguity, layout and the feel of an interaction.

Laptop screen showing a terminal with a passing automated test run and linting output
Fig. 04 — Automated test run

08Security-conscious engineering practices

Security treated as a property of the build.

We are engineers, not auditors, and we do not present ourselves as a security certification body. What we do is apply established practice consistently during development: input validation at trust boundaries, parameterised database access, authentication and authorisation checked on the server, secrets kept out of source control, least-privilege access for services, and dependencies reviewed and updated on a schedule.

Where an engagement calls for formal penetration testing or a compliance audit, we prepare the system and documentation for a specialist to assess, and we act on their findings.

Abstract illustration of layered translucent panels over a dark circuit surface with a glowing lock symbol
Fig. 05 — Access boundaries

09Project delivery process

How a project runs, start to finish.

Step 01

Discovery

We read the existing code, data and documentation, talk to the people who use the system, and write down the constraints that will shape the work: integrations, data volumes, compliance expectations, deadlines.

Step 02

Shaping

We describe the proposed solution in plain terms — components, data flow, sequencing — and identify the parts we consider risky. Anything uncertain is prototyped before it is committed to a schedule.

Step 03

Build in slices

Work proceeds in vertical slices that can be reviewed in a running environment. Each slice ships with its own tests and documentation rather than leaving both to the end.

Step 04

Review and hardening

Code review, dependency review, performance checks under representative load, and a pass over failure paths: timeouts, partial writes, unavailable third parties.

Step 05

Release

Deployment through an automated pipeline, with a documented rollback and a defined check to confirm the release behaved as expected.

Step 06

Handover and support

Runbooks, architecture notes and a walkthrough with the team who will own the system next, followed by an agreed period of support.

10Engineering principles

Six commitments we hold to.

01

Readable before clever

Code is read far more often than it is written. We favour direct, explicit implementations over abstractions that only pay off in theory.

02

Small, reversible steps

Changes are kept small enough to review properly and to undo quickly when something unexpected appears in production.

03

Tests as specification

Automated tests describe intended behaviour, so the next engineer can change the code without guessing what it was supposed to do.

04

Boring infrastructure

We choose well-understood tools and keep the number of moving parts low, because operational simplicity compounds over the life of a system.

05

Explicit boundaries

Modules and services have defined responsibilities and contracts, which keeps a change in one area from rippling through unrelated code.

06

Written decisions

Significant technical decisions are recorded with their context and trade-offs, so future work starts from reasoning rather than archaeology.

11Engagement models

Four ways to work together.

Project engagement

A defined scope with an agreed outcome — a new application, a migration, an integration. Suitable when the objective is clear enough to plan end to end.

Ongoing team capacity

A continuing allocation of engineering time working alongside your own team on a shared backlog. Suitable for products under active, open-ended development.

Focused consulting

A short, bounded piece of work: an architecture review, a performance investigation, a plan for modernising a legacy system. Produces written findings and recommendations.

Maintenance and support

Dependency updates, security patching, small improvements and responses to defects for a system that is already live.

Terms, timelines and commercial arrangements are agreed individually for each engagement.

12Illustrative project scenarios

What a typical engagement can look like.

The scenarios below are illustrative examples written to show how we approach common situations. They do not describe specific clients or completed engagements.

Illustrative scenario — replacing a spreadsheet workflow

A distribution team coordinates orders across several spreadsheets. The work would involve modelling the process as data, building a web application with role-based access, importing historical records, and running both systems in parallel until the new one is trusted.

Illustrative scenario — integrating a new payment provider

An existing platform needs a second payment provider alongside the current one. The work would involve an abstraction over both providers, webhook handling with idempotency, reconciliation reporting, and a test suite covering refunds, retries and partial failures.

Illustrative scenario — moving a monolith to managed infrastructure

A long-running application is deployed by hand to a single server. The work would involve containerising the application, defining infrastructure as code, adding a build and deploy pipeline, introducing monitoring, and cutting over with a documented rollback.

Abstract line drawing of intersecting wireframe grid planes with violet and lime accent nodes on an ivory background
Fig. 06 — System model, abstracted

13Frequently asked questions

Questions we are asked most often.

What kinds of projects do you take on?

Software that a business depends on to operate: internal platforms, customer-facing web applications, integrations between systems, and modernisation of software that has become difficult to change.

Do you work with an existing codebase?

Yes. A substantial share of software work is continuation rather than greenfield. We begin by reading the code and its history before proposing any change.

How do you handle changing requirements?

Work is planned in short slices, so direction can change at slice boundaries without discarding completed work. Changes to scope are discussed explicitly rather than absorbed silently.

Who owns the code you write?

Ownership of deliverables is agreed in the contract for each engagement. Our default position is that the client owns the code produced for them.

What do you need from us to start?

A description of the problem, access to any existing system or documentation, and one person on your side who can answer questions and make decisions.

How is progress reported?

Through working software in a shared environment, plus a written summary of what changed, what is in progress and what is blocked.

Do you provide support after launch?

Support terms are agreed per engagement. This can range from a defined handover period to a continuing maintenance arrangement.

What technologies do you use?

Choices follow the problem and the team who will maintain the result. We prefer mature, widely supported tools over novel ones, and we document the reasoning behind each significant choice.

14Contact information

Get in touch by email.

Write to us with a short description of the system, the outcome you are aiming for and any fixed constraints such as a deadline or a platform you must stay on. We reply in English.

Company

TRAIN IN THE LAB LTD

Email

[email protected]

Website

trainlabfitness.com