REFINE method to propose changes in the system
This REFINE framework gives you six lean steps—scaled to the size of your idea—that ensure every proposal is grounded in real problems, history, and impact.
Introduction
I've noticed that sometimes, even experienced developers propose solutions that could benefit from additional refinement. They might make assumptions about past decisions or suggest that adopting a new tool will solve everything without fully exploring the context.
Even if you're not writing a full-fledged proposal document, this framework will help you clarify your idea and make it stronger. Each step requires work that should, of course, be proportional to the "size" of the proposal. If you're proposing a small change, you don't need to do extensive research, but it's useful to spend a few minutes on each step so you can explain your idea better.
Here’s the REFINE method for proposing system changes, a structured framework that helps developers create stronger proposals:
- R - Recognize the problem: Clearly define the issue with concrete examples and metrics when possible
- E - Examine why it exists: Research the history and context of the current implementation to understand original rationale
- F - Formulate your solution: Start with a high-level explanation, then provide technical details with examples or demos
- I - Investigate impact: Assess implementation effort against expected benefits, considering both short and long-term implications
- N - Negate it: Challenge your own proposal by considering the strongest arguments against it
- E - Encourage criticism: Present your proposal with humility and welcome feedback as a means to improve the solution
R – Recognize the problem
First, as developers, we solve problems—so let's start there.
What exactly is the problem? Why is it problematic? How is it affecting us or our users?
Focus solely on the problem here—not the solution. Avoid comparisons and discuss only the specific issues causing difficulties. Present tangible problems with objective evidence, not opinions. When possible, include metrics (e.g., "this causes us to spend an extra hour of work every time we change X"). Or describe objective consequences (e.g., "this makes the design more complex due to coupling/obscurity/etc.").
Be prepared to defend your problem statement! What you perceive as a problem, others might view as a desired behavior. In such cases, be ready to explain why it's problematic from your perspective.
Examples:
- "Our team spends 20 minutes in each sprint planning session debating how to categorize tasks because our current tagging system is inconsistent."
- "The CI pipeline takes an average of 15 minutes to complete, but fails 30% of the time due to flaky tests, requiring manual intervention."
- "Developers need to modify code in 3 different places when implementing a new API endpoint, leading to frequent bugs and inconsistencies."
- "Our documentation is difficult to navigate because information is scattered across multiple locations without a consistent structure."
- "The current onboarding process confuses new team members because it lacks clear sequencing and contains outdated information."
- "Debugging production issues is challenging because our logging system doesn't provide enough context about user actions leading up to errors."
E – Examine why it's this way today
Second, why is it this way now?
Perhaps we decided to use Pydantic four years ago because it was trendy, or maybe it was a choice made with careful consideration of the context.
Try to find the original discussion—the PRs that introduced it might help—so you can see if the context has changed since then.
If you cannot find the original discussion, ask! Asking why a choice was made is an exceptional way to learn. And if nobody knows, then there's a good chance that your proposal will stick.
You might discover there's actually a good reason for the current implementation.
Finding historical discussions or PRs isn't always feasible. Relying on memory or anecdotal evidence from team members can introduce bias. Without proper context, you risk proposing solutions that repeat past mistakes or fail to address the underlying reasons for the current implementation. If documentation is lacking, speak with multiple team members to triangulate the most accurate historical perspective.
Here are some useful questions to facilitate the conversation:
- Which aspects of the current approach have served us well so far?
- What trade-offs did we consciously accept when making the original decision?
F – Formulate your solution (high‑level → detail)
Next, it's time for what we're all accustomed to doing: proposing a solution.
Describe your solution in simple terms and explain why you're proposing this specific approach rather than alternatives. Clarify why you believe this is the best way to address the problem. Does it offer additional benefits? If so, are they relevant to our needs? (e.g., "This will allow us to convert objects to JSON"—but do we actually need that capability?) If not, omit mentioning these peripheral benefits, as they might derail the discussion from the main problem we're trying to solve.
Then detail how the solution could be implemented—include technical specifics, perhaps with a draft PR, demo code, or similar examples. If creating these would require significant time, acknowledge this in your proposal and offer to provide examples if needed. Remember that "seeing is believing"—tangible examples make your solution much more compelling.
If you're hesitant to invest substantial effort into something that might be rejected, that's understandable. However, remember that even "rejected" proposals often contribute valuable insights to the team's thinking. Consider starting with a simplified version of your proposal to gauge interest before diving deeper. This doesn't mean skipping steps—just making them lighter—while still demonstrating that you thoroughly understand the problem.
If you're aware of alternative solutions, acknowledge them and clearly explain your reasoning for not selecting them.
I – Investigate impact (cost/benefit, short & long term)
Every change requires effort. Why should we make that effort? What would be the benefit?
What is the benefit of the proposed solution? Make it tangible—all the hints given to describe the problem are also valid here. Remember that the benefits might come from both user and business perspectives!
How much will it cost now to change the code?
How much will it cost in the long run? Is it adding a burden to future development?
Don't overestimate the benefits—be realistic.
Be honest about downsides. You shouldn't "sell" your idea; you should prove it's valid. If certain things will become more difficult, acknowledge them. It can be useful to mention even non-relevant downsides to prevent unnecessary side discussions (e.g., "Pydantic will make X more difficult, but we're not doing X at the moment").
Consider the current system architecture and constraints. A solution might look good on paper but could be impractical due to existing technical debt or infrastructure limitations.
Also remember that change can be iterative—perhaps the solution can be made smaller to reduce costs and risks.
Assessing cost/benefit is a huge topic—I'm sure there are plenty of essays on how to do it—but here are some hints to consider both quantitative and qualitative factors:
- Development time: Estimate hours required for implementation, testing, documentation, and training
- Technical debt: Will this solution increase or decrease maintenance burden?
- Learning curve: How much time will team members need to become proficient?
- Opportunity cost: What other improvements could be made with the same resources?
- Risk assessment: What could go wrong, and how likely are those scenarios?
- Technical compatibility: Will the new solution integrate smoothly with existing systems?
- Performance impact: Could the change create performance bottlenecks or resource issues?
- Security implications: Does the solution introduce any new security vulnerabilities?
- Reliability concerns: Will the change affect system stability or introduce new failure modes?
- Rollback capability: How easily can we revert if serious problems emerge post-implementation?
- Dependency risks: Does the solution create new external dependencies that could become problematic?
- Scalability considerations: Will the solution continue to work effectively as usage or data volumes grow?
What about intuition?
Some people might feel the proposed solution is right based on their experience.
I would suggest trying to understand where that intuition comes from: there might be some bias, or you might discover an objective reason behind it.
In any case, this framework won't prevent you from proposing ideas, but being aware that your proposal stems from a "gut feeling" is important when trying to convince the team.
N – Negate it (play devil's advocate)
After all this work, you might discover that you struggle to find compelling reasons for the change. In this case, you'll likely conclude it was a decent idea but not worth pursuing.
If you still feel it's a good idea, examine why. Is it simply because it's cool or because you personally like it? While exploring innovative approaches is part of our job, it must happen at the right place and time. Not all teams have the capacity for experimentation that might create additional work or introduce risks.
Try taking the opposite position (devil's advocate)—and do this sincerely, not mockingly. You need to genuinely believe the counterargument for this exercise to work. Consider what the smartest people you know would argue against this solution. If their reasoning would convince you, it's probably best to move on.
Another question you can ask yourself is: what would make me change my proposal? E.g. if someone showed me benchmark data proving my solution would be slower, or if there were compliance issues I hadn't considered, would I be willing to revise or abandon my approach? Being able to articulate your own threshold for changing direction demonstrates intellectual honesty.
If you're uncertain, start by discussing your idea with someone you trust. They'll provide a valuable "reality check." Ideally, choose someone familiar with the system who can help you gather relevant information.
E – Encourage criticism and iteration
You're finally ready to present your idea.
It's useful to start discussing your idea with someone on the team, as mentioned in the "negate it" step. This will help build consensus or further refine the idea.
Even when pitching your idea to someone you trust, it's crucial to maintain openness.
Encourage colleagues to share how they'd tweak or extend your proposal.
It's okay if you don't see the whole picture.
You're not perfect—nobody is—and neither is your solution.
There are many things you don't know, and your choices might change based on information others share with you.
Don't fall in love with your idea. This isn't a competition to determine who has the best idea. Remember: we're here to solve problems, and every decision will impact the entire team, so it must be a team decision.
Finally, this guide assumes rational participants, though even a well-crafted proposal can turn into a debate driven by status, ego, or prior preferences. It's important to distinguish between rational and irrational arguments (from both sides!) and maintain a civil conversation. The ultimate goal is to solve problems.
How to present the proposal
Although you should understand the current setup, your tone might still come across as "the current state is bad, let me fix it," especially when viewed through the lens of team dynamics or ego.
- Acknowledge and thank the team for their existing work before suggesting changes.
- Start by highlighting what has worked well: "The existing schema has given us strong validation guarantees for two years..."
Here are strategies to handle feedback effectively
- Listen actively: When someone offers criticism, focus on understanding their perspective completely before formulating a response.
- Separate identity from ideas: Remember that criticism of your proposal is not criticism of you personally. Maintaining this distinction helps keep discussions productive.
- Ask clarifying questions: "Can you elaborate on your concern about X?" or "What specific part of the proposal seems most problematic to you?" helps ensure you fully understand the feedback. Sometimes people don’t understand each other because they use the same term for different things. Maybe find a different, clearer, more specific term in that case.
- Focus on shared objectives: Remind everyone involved that you're working toward the same goals, even if you differ on approaches. The goal is to solve the problem.
- Use data and evidence: Shift discussions from opinion-based to evidence-based by conducting small experiments or gathering relevant metrics.
- Propose time-bounded trials: For controversial changes, suggest a limited trial period with clear evaluation criteria set in advance.
- Seek third-party perspectives: When deadlocked, bring in colleagues who aren't emotionally invested in the decision but understand the technical context.
- Know when to defer: Sometimes the best response is to step back and accept that your proposal needs significant rethinking or that timing isn't right.
- Use "yes, and" instead of "but": Acknowledge others' points before adding your perspective, rather than immediately contradicting them.
- Summarize discussions: Periodically summarize where the discussion stands, highlighting points of agreement and remaining open questions.
- Document evolving thoughts: Keep a visible record of how the proposal is changing based on feedback, showing that input is valued and incorporated.
- Provide space for reflection: Sometimes the best outcomes emerge when people have time to process information. Consider scheduling follow-up discussions rather than pushing for immediate consensus.
Remember that the ultimate goal is not to "win" an argument, but to collaboratively arrive at the best solution. The most successful proposals often emerge through multiple iterations informed by diverse perspectives.
Conclusion
This is not a perfect method, but I think it addresses the major problems I see whenever proposals are presented. While it might seem daunting at first, I encourage you to try it and share your feedback. With practice, this approach will likely become second nature, and you won't even need to consciously review the steps.