دفتر سليمان

Article

Small Improvements That Can Survive

Improvement is not only about finding a better solution. It is about finding a better solution that can still be maintained when time, attention, infrastructure, or people change. Durable progress often comes from small improvements that fit the real environment.

There is a seductive kind of improvement.

It looks complete.

A process is redesigned from beginning to end.

A new platform replaces several old ones.

An elegant automation removes every manual step.

A large architectural change promises to solve not only today’s problem, but several future problems at once.

These improvements are easy to admire.

They are harder to keep alive.

A much smaller change may look less impressive.

One repeated action is automated.

One confusing field is clarified.

One duplicate source of truth is removed.

One verification step is added.

One fragile dependency is reduced.

The result may not deserve a launch announcement.

But six months later, it may still be working.

That matters.

Because an improvement that cannot survive its environment is not necessarily an improvement.

It may simply be a temporary demonstration of what would work under better conditions.

The Real Test Comes After Implementation

We tend to evaluate changes at the moment they are completed.

The feature works.

The new workflow is faster.

The migration succeeds.

The dashboard looks clearer.

The script runs.

We call the improvement successful.

But implementation is only the first test.

The more interesting questions appear later.

Who maintains it?

What happens when the original developer is unavailable?

Can someone understand it after three months?

Does it still work when a dependency changes?

Can it survive unstable infrastructure?

Does it require a level of attention the team cannot sustain?

Can users recover when something fails?

Does the process remain useful after the novelty disappears?

A system can pass the implementation test and fail the survival test.

The second test is usually more important.

Better Is Not Enough

Imagine two solutions.

Solution A reduces a recurring task from twenty minutes to two minutes.

It is technically sophisticated, depends on several services, requires special credentials, and occasionally fails in ways only one person knows how to repair.

Solution B reduces the same task from twenty minutes to eight minutes.

It is simple, transparent, documented, and can be operated by anyone on the team.

Which is better?

If we measure only speed, the answer appears obvious.

If we measure reliability, maintainability, recovery cost, and dependence on specialized knowledge, the comparison changes.

This does not mean we should always choose the simpler option.

It means “better” needs a wider definition.

Performance is one dimension.

Survivability is another.

Improvement Has a Maintenance Cost

Every improvement adds something.

Code.

Rules.

Infrastructure.

Documentation.

Training.

Monitoring.

Dependencies.

Configuration.

Even when a change removes manual work, it may create maintenance work elsewhere.

This is not a reason to avoid automation or architecture.

It is a reason to count maintenance honestly.

Suppose an automation saves five hours per month.

Excellent.

But it also requires:

two hours of monthly troubleshooting,

occasional credential renewal,

someone to monitor failures,

and a specialized environment that must remain available.

The improvement may still be worth it.

But the calculation should include the full operating cost.

An improvement is not free simply because the user no longer performs the old task manually.

The work may have moved.

Design for the Team You Actually Have

Systems are often designed for an imaginary future organization.

More people.

More specialists.

More reliable infrastructure.

More operational maturity.

More time for maintenance.

Sometimes that future arrives.

Sometimes it does not.

The current system must survive the present.

If a team has one person who understands a critical component, that is an architectural fact.

If production access is unreliable, that is an operational fact.

If documentation is difficult to maintain, that is a process fact.

If a platform will be used in unstable network conditions, that is an environmental fact.

Good design does not ignore these constraints because they are inconvenient.

It incorporates them.

A technically elegant system that requires resources the organization does not possess may be less mature than a simpler design built around reality.

Small Changes Expose Less Surface Area

Large changes are attractive because they promise coherence.

Sometimes a full redesign is exactly what a system needs.

But large changes also alter many assumptions at once.

Data changes.

User behavior changes.

Interfaces change.

Dependencies move.

Operational procedures change.

Training changes.

Failures become harder to localize because so much changed together.

Small improvements reduce the surface area of uncertainty.

Change one thing.

Observe.

Learn.

Then change the next thing.

This creates a feedback loop.

The system teaches you as you improve it.

That is valuable because our understanding before implementation is always incomplete.

Make the Smallest Change That Solves the Real Problem

Small does not mean cosmetic.

A tiny change to the wrong problem is still wasted effort.

The goal is not to minimize effort blindly.

The goal is to find the smallest coherent change that solves the real problem.

Suppose users repeatedly submit the same request because they are uncertain whether Save succeeded.

Possible responses include:

redesign the entire editor,

replace the persistence architecture,

rewrite the user interface,

or add a clear saving state, duplicate prevention, and confirmed revision indicator.

If the real problem is uncertainty about the operation, the last option may be enough.

That is not under-engineering.

It is precision.

The sophistication lies in identifying the actual failure mode before deciding how much system to change.

Avoid Solving Imaginary Future Problems

Software makes speculation easy.

While solving today’s problem, we can imagine ten future requirements.

Perhaps the system will eventually support five countries.

Perhaps there will be millions of users.

Perhaps another department will need the feature.

Perhaps we will replace the database.

Perhaps the workflow will become real-time.

Some anticipation is healthy.

Architecture needs room to grow.

But every imagined future requirement can also become an excuse for complexity today.

A useful question is:

What future possibility is probable enough to influence the current design?

Not everything that could happen deserves infrastructure now.

Sometimes the best way to prepare for the future is not to build the future early.

It is to keep today’s design understandable enough that it can change later.

Reversibility Is Valuable

Small improvements often have another advantage.

They are easier to reverse.

This matters because not every idea works.

Suppose we change a workflow and users behave differently than expected.

If the change is isolated, we can adjust or remove it.

If it required a broad migration across several systems, reversing becomes expensive.

Reversibility lowers the cost of learning.

This can justify trying improvements earlier.

You do not need absolute certainty when the downside of being wrong is small.

By contrast, irreversible changes deserve stronger evidence.

Database migrations that discard information.

Public contracts.

Deep architectural dependencies.

Major platform consolidations.

These deserve more careful analysis because learning afterward may be expensive.

Durable Improvements Leave the System Easier to Understand

There is another test I find useful.

After the improvement, is the system easier or harder to explain?

Not every sophisticated system can be simple.

But complexity should buy something.

If a small feature requires a new service, new queue, new database, new permission model, and new deployment process, ask what value that complexity is purchasing.

Sometimes the answer is compelling.

Sometimes it is not.

A durable improvement should ideally leave behind a system whose responsibilities remain understandable.

This connects directly to the earlier principle:

Define the purpose before you build the tool.

An improvement should strengthen the purpose of the system, not quietly expand it into several new responsibilities.

Remove Before You Add

Improvement is often associated with addition.

Add a feature.

Add automation.

Add validation.

Add reporting.

Add monitoring.

But subtraction is one of the most durable forms of improvement.

Remove a duplicate field.

Remove a manual step.

Remove an obsolete configuration.

Remove a second source of truth.

Remove a report nobody uses.

Remove an unnecessary dependency.

Remove a choice users should never have needed to make.

Every removed moving part reduces something that can fail, require explanation, or demand maintenance.

Subtraction may not look innovative.

It often produces unusually stable systems.

Standardize Repeated Improvements

A one-time fix is useful.

A reusable pattern is better.

Suppose one application needs a clearer save state.

You fix it.

Later, another application has the same problem.

Then another.

At some point, the real improvement may be to create a shared save-state pattern in the design system.

Now the improvement survives beyond the original screen.

This is where small local improvements can gradually become system-level capability.

The sequence matters.

First observe the recurring problem.

Then solve it locally enough to understand it.

Then, when the pattern becomes clear, move the solution to the right shared layer.

Standardization should follow understanding.

Otherwise we risk creating a generalized solution to a problem we do not yet understand well enough.

Documentation Should Be Proportional

Durable changes need documentation.

But documentation itself must be maintainable.

A ten-line change probably does not need a twenty-page manual.

A critical architectural decision should not live only in a chat message.

The amount and type of documentation should match the cost of rediscovery.

This connects naturally to yesterday’s article about decision trails.

For a small improvement, perhaps we need:

what changed,

why,

and any condition that would cause us to revisit it.

That may be enough.

The objective is not documentation volume.

It is continuity.

Improvement Should Reduce Future Effort

One useful way to evaluate an improvement is to ask:

Does this make the next similar task easier?

Suppose we fix one deployment problem.

Good.

But did we also create a repeatable deployment check?

Did we make the error easier to diagnose?

Did we remove the cause?

Did we document the decision?

Did we improve the shared script?

A strong improvement often creates leverage.

It solves the immediate problem and lowers the cost of future work.

This is different from merely closing a ticket.

A ticket can be closed while the underlying system remains equally difficult to operate.

Stability Is a Feature

Product discussions naturally focus on visible capabilities.

What can the system do now that it could not do before?

That is important.

But mature systems gain value from qualities that are less visible.

Predictability.

Recoverability.

Understandability.

Consistency.

Low maintenance cost.

These do not always appear in screenshots.

Users still feel them.

A platform that behaves consistently earns trust.

A workflow that survives interruption becomes easier to rely on.

A process that another person can understand becomes less dependent on one individual.

Stability is not the absence of progress.

It is one form of progress.

Improvements Need an Owner

Some changes fail because they enter the system without ownership.

An automation is deployed.

A dashboard is created.

A script is added.

Then nobody knows who is responsible when it stops working.

The original creator may assume operations owns it.

Operations may assume development owns it.

Development may assume it is self-maintaining.

Nothing is self-maintaining forever.

Even highly reliable systems eventually encounter:

expired credentials,

dependency changes,

format changes,

new requirements,

or infrastructure failures.

For improvements that matter, ownership should be clear enough that someone knows what to do when reality changes.

Make Failure Cheap

A durable improvement does not assume it will never fail.

It makes failure manageable.

Can the old workflow be used temporarily?

Can the operation be retried safely?

Can the current state be inspected?

Can the system recover without specialist intervention?

Can we roll back?

Can the failure be detected quickly?

This connects to the earlier article on designing work that survives interruption.

The important question is not only:

Does the improvement work?

It is also:

What happens when it does not?

If failure is cheap, experimentation becomes safer.

If failure is catastrophic, even small improvements become risky.

Measure After the Change

We often justify an improvement using assumptions.

This automation should save time.

This redesign should reduce confusion.

This cache should improve performance.

This process should reduce errors.

After implementation, verify.

Did the improvement actually create the expected result?

Perhaps the automation saves less time than expected.

Perhaps it saves more.

Perhaps users work around the new interface.

Perhaps errors moved rather than disappeared.

Perhaps maintenance cost is higher than predicted.

Improvement should include observation after change.

Otherwise we measure intention rather than outcome.

Some Good Improvements Should Stay Small

There is a tendency to scale every successful idea.

A useful internal script becomes a platform.

A small workflow becomes a product.

A simple component becomes a framework.

A local process becomes organization-wide policy.

Scaling can create enormous value.

It can also destroy the property that made the original solution effective.

Some tools are good precisely because they are small.

They serve one narrow purpose.

They require little maintenance.

They can be understood in minutes.

Not everything successful needs to become infrastructure.

Sometimes maturity means resisting expansion.

Survival Depends on Fit

A cactus survives in conditions where many other plants struggle.

Not because it is universally superior.

Because its structure fits its environment.

Systems work the same way.

The most advanced architecture is not automatically the most suitable architecture.

The most automated process is not automatically the most efficient process.

The richest product is not automatically the most useful product.

Fit matters.

A durable improvement fits:

the users,

the infrastructure,

the available skills,

the maintenance capacity,

the operating environment,

and the actual problem.

When those change, the design may need to change too.

Progress Can Be Quiet

The last several articles in this series have focused on meaning, decisions, and continuity.

We distinguished zero from missing.

We chose the right unit before comparing.

We turned observations into questions and decisions.

We made weekly reviews end with direction.

We preserved the reasoning behind important choices.

Today’s idea is quieter:

Make improvements that can remain improvements after you leave them alone for a while.

Not every meaningful change needs to be large.

Sometimes progress is:

one less manual step,

one clearer state,

one safer retry,

one removed dependency,

one documented decision,

one piece of knowledge moved out of someone’s head,

one repeated problem solved at the right shared layer.

These changes accumulate.

And because they are small enough to understand, maintain, and adapt, they often survive.

Build What You Can Keep

There is a natural temptation to ask:

What is the best solution we could design?

A more grounded question is:

What is the best solution we can keep working?

That does not mean lowering ambition.

It means including maintenance in the definition of success.

A system should not depend on permanent heroics.

A process should not require perfect conditions.

An improvement should not need its original creator standing beside it forever.

Build things that can be handed over.

Build changes that can be understood.

Build automation that can fail safely.

Build processes that match available capacity.

Build improvements that still make sense after the excitement of building them has passed.

Because the most valuable improvement is rarely the one that looks most impressive on the day it ships.

It is the one that is still quietly making the system better months later.

Filed under

  • Building What Matters
  • Systems Thinking
  • Product Development
  • Decision Making
  • Continuous Improvement
  • Resilience
  • Maintenance