Sample content: This article exists to exercise the publishing system. It is not presented as Patrick’s writing.
What Still Matters After the Framework Changes
A practical sample essay about separating durable software design from the replaceable conventions of any particular framework.

Frameworks change quickly because they package hard-won lessons into easier defaults. That is useful. Trouble begins when the shape of one tool becomes indistinguishable from the shape of the product.
A durable system does not ignore its framework. It uses the framework well while keeping the most important decisions visible enough to survive a future change.
Find the parts the framework does not own
Copy link to section “Find the parts the framework does not own”Users do not care which lifecycle hook loads their data. They care that the page is fast, their work is preserved, and the interface behaves predictably. Those product contracts should be legible outside the framework’s vocabulary.
The same is true of core business rules. A pricing rule, permission boundary, or state transition may be invoked through a framework, but it should not require a maintainer to understand rendering internals before reasoning about the rule itself.
Useful durable layers often include:
- domain rules with explicit inputs and outputs;
- data ownership and retention boundaries;
- public URLs and API contracts;
- accessibility and performance expectations;
- tests that describe observable behavior;
- operational signals and recovery procedures.
These do not need elaborate abstraction. They need names and boundaries clear enough that a future implementation can recognize them.
Do not build an imaginary portable framework
Copy link to section “Do not build an imaginary portable framework”Fear of change can produce its own complexity. Teams sometimes wrap every useful feature behind a custom interface in case they migrate someday. The result is a private, poorly documented framework that carries the limitations of the current tool without its community knowledge.
Portability should follow credible risk. Keep data exportable, public contracts stable, and business logic testable. Let ordinary framework code remain ordinary when replacing it would be straightforward.
A good boundary reduces the cost of understanding today even if migration never happens. If it exists only for a hypothetical rewrite, it may be premature.
Use upgrades as a pressure test
Copy link to section “Use upgrades as a pressure test”A major upgrade reveals where assumptions leaked across boundaries. Treat the friction as information.
| Upgrade friction | Question worth asking |
|---|---|
| Many files repeat the same workaround | Is a local component or policy missing? |
| Business behavior changes with rendering code | Is the product contract explicit? |
| Tests fail for implementation details only | Are they protecting behavior or structure? |
| Data cannot move without application code | Is ownership too tightly coupled? |
| Nobody knows which pages matter most | Are usage and operational priorities visible? |
The goal is not zero upgrade effort. A framework earns its place by providing capability, and capability has a surface area. The goal is to keep incidental changes from forcing a redesign of unrelated product decisions.
Learn the new model before recreating the old one
Copy link to section “Learn the new model before recreating the old one”When adopting a new framework, there is a temptation to rebuild familiar patterns immediately. That can erase the very benefits that justified the change. Start by understanding the new tool’s native model and constraints. Then decide which existing boundaries remain important.
Some patterns should disappear. Others encode years of product and operating knowledge. The distinction requires more than translating APIs line by line.
Framework fluency is valuable, but it is not the end state of engineering judgment. The durable skill is recognizing which decisions belong to the tool, which belong to the product, and which belong to the people who will operate the result.
The framework will eventually change. Clear contracts, understandable data, useful tests, and humane interfaces will still matter when it does.


