Applications

The application you can still change in year three

Year three is when an application tells the truth about how it was built. The launch team is smaller. The person who “just knows” the billing rules has a different job. A customer asks for a change that sounded small in the sales conversation. The question is no longer whether the software runs. It is whether someone can change it without holding their breath.

Maintainable is not a style of code. It is a property you can observe. A developer who did not write the feature can find the rule, change it, and name what else might move. If that takes a week of archaeology, the application is already expensive, whatever the original estimate said.

Organize the code around the product

Frameworks encourage a shape: pages here, components there, hooks in a folder that grows until it is a junk drawer. That shape is fine on week two. By year three the question a teammate actually asks is “where do we decide that an invoice is overdue?” The answer should be a module named for the decision, not a search across the repository.

Put the rules of the product in one place the interface is not allowed to reinvent. The web app and the mobile app can both call them. When they each grow a private copy, they will disagree, and the disagreement will surface as a support ticket you cannot reproduce on one platform. Sharing the rule is the point of choosing technology you can leave. The shared part should be the boring, testable center.

Prefer boring names

A clever abstraction feels like progress on the day you write it. In year three it is a puzzle. If a module is called Manager, Helper, or Utils, it is a place where decisions go to hide. Name the concept the business already uses. If the business uses a muddy word, agree on a definition and write it at the top of the file. Ten lines of definition save a day of argument.

The same courtesy applies to the interface. Buttons should say what they do. Empty states should say what is missing. Error messages should say what the person can do next. Clean software is not minimal for the sake of a screenshot. It is minimal so a person can tell what happened.

Let tests describe behavior

A test suite that only proves the code does what the code says is a mirror. Useful tests describe a behavior a product manager would recognize. An overdue invoice cannot be marked paid twice. A member without the role cannot export the report. A draft is not visible to the client.

Those tests are also the documentation that survives. Comments rot. A failing test is at least honest. You do not need a test for every branch. You need a test for every rule that would embarrass you if it broke. When a change is scary, that is usually because the rule is untested, not because the change is large.

If a change is scary, the rule is probably untested. Add the test, then make the change.

Delete tests that assert incidental structure, such as the exact order of internal function calls. They make refactoring expensive and teach the team to work around the suite.

Deletion is part of the design

Applications get harder to change because old paths stay alive “for now.” A flag that is always on, a screen nobody opens, an API version with one caller: each one is a decision the next person has to rediscover. Schedule deletion the way you schedule features. If you are not willing to delete it, you are willing to maintain it, and that should be a conscious cost.

On mobile this shows up as screens that exist because a release once needed them. On the web it shows up as routes that redirect in a circle. Draw the map once a year. If a path has no traffic and no obligation, remove it and say so in the release notes.

Make the next change obvious

A maintainable application leaves a trail. When you choose a library, a schema, or a compromise, write the reason where the next reader will see it: beside the code, in a short decision note, not in a chat that will be archived. Future you, and the person who replaces you, should not have to reconstruct the argument from blame.

Operationally, the application should tell you when it is unhappy. A change you cannot observe is a change you will fear to ship. Errors need a place to go, and someone needs to look. That habit overlaps with compliance more than teams expect. If you cannot see who did what, you also cannot explain it later. Infrastructure that stays compliant starts from the same instinct.

Year three is a success condition

Treat “a new teammate can change this” as a requirement, next to the user story. Ask for it in review. When a design only the author can extend, send it back, kindly, and ask for the version a stranger could edit. The launch will be a little slower. The third year will be a lot cheaper.

That is the whole standard. Clean enough to read, structured around the product, tested at the rules, and willing to delete. If your application is approaching the year where the original team thins out, that is a good moment to talk to Insight Apps about what to simplify first.

Start a project

Tell us what you are building.

Write to connect@insightapps.online, or send a note through the form. We read every enquiry.

Contact Insight Apps