BACK

1. Releasing Software in Phases
- Breaking a big feature into phases and preparing a multi-month roadmap can bias teams to continue even if initial phases fail.
- Teams often ignore negative customer feedback and persist with the original plan, resulting in wasted effort and poor products.
- It is vital to build an organizational culture where it is acceptable and encouraged to pivot or throw away work based on early feedback.
- Five key questions for teams to ask:
• How is the success of each phase measured?
• What defines success for the feature?
• What happens if success criteria are not met?
• How is the scope of the next phase decided? Is customer feedback incorporated?
• Under what conditions would work on the feature be stopped completely?
- Changing mindset is hard, especially for engineers emotionally attached to their code.
- Example: Honda’s pivot from unsuccessful big bikes to successful small bikes illustrates difficulty but importance of pivoting.

Actionable items:
- Create a culture open to pivoting and discontinuing work based on clear metrics and feedback.
- Regularly ask and document the five key questions around each phased release.
- Prepare the team to accept discarding work when it is not valuable to customers.

2. Feature Flags
- Feature flags started simply as developer-controlled toggles to release code without exposing to customers.
- They evolved to support per-user toggling, ops team controls, premium features, and safety nets for bug fixes.
- Overuse of feature flags brings problems:
• Codebase complexity making debugging and onboarding new engineers difficult.
• Exponentially increasing number of test scenarios, often leading to less thorough testing.
• Dead code accumulation when unused flags or features remain indefinitely.
• Avoidance of hard decisions because features remain toggled off for some users.
- Four types of feature flags should be recognized and managed differently:
• Release Toggles: short-lived, developer controlled.
• Ops Toggles: longer-lived, used by operations team.
• Experiment Toggles: for A/B testing, short-lived.
• Permission Toggles: dynamic, for premium or user-specific features, potentially long-lived.
- Flags should be removed systematically and automatically, not just based on tickets.
- Examples include using “time bombs” to force flag removal or limiting max number of existing feature flags.

Actionable items:
- Classify feature flags into the four categories to manage appropriately.
- Build automated systems or processes to ensure timely removal of old feature flags.
- Educate teams about the complexity feature flags add and prevent overuse as a catch-all solution.

3. Refactoring
- Refactoring can cause more harm than good if done without deep understanding.
- Story analogy: Attempting to clean a yard without knowing the purpose of items led to unintended consequences.
- Engineers often want to rewrite code because it is easier to read code they didn’t write than understand it.
- New or freshly refactored code is often less stable than older, battle-tested code.
- Example: A 10-year-old messy codebase worked well with few problems over years after resisting premature refactoring.
- Recommendations:
• Don’t start refactoring projects impulsively based on perceived messiness.
• Spend time reading and understanding the code fully before deciding on refactoring.
• Require engineers to spend at least a full day understanding unfamiliar code before complaining or refactoring.
• Prioritize refactoring for code that will be actively worked on in the future rather than code without upcoming work.

Actionable items:
- Enforce policies for mandatory deep code understanding before refactoring.
- Prioritize refactoring tasks based on future work to avoid unnecessary effort.
- Educate engineers on the value of battle-tested code and cautious refactoring.

Overall Summary:
- When releasing features in phases, prepare to pivot based on real customer feedback and measure success clearly.
- Use feature flags carefully, understand their types, manage them properly, and have automated removal systems to prevent technical debt.
- Refactor only after deeply understanding the code and when justified by upcoming work, avoiding premature refactoring that leads to instability.

Best practices that are ruining software teams

Share:

14:40 - 15:10, 28th of May (Wednesday) 2025 / DEV ARCHITECTURE STAGE

We will go over 3 'best' practices, and how each can become quite a mess:

1. Why having a 'Phase 2 of feature X' in your roadmap is a big warning sign
2. How refactoring almost ruined my marriage (and why I'm against it in 99% of the cases)
3. Why feature flags can be a disaster (this part requires prior understanding of feature flags)

LEVEL:
Basic Advanced Expert
TRACK:
Dev Software Software Architecture
TOPICS:
Agile ITarchitecture ProductDev SoftwareEngineering

Anton Zaides

manager.dev