Technical Leadership Patterns & Decision Making

📖 Concept

Staff engineers are force-multipliers. Your impact isn't measured by how much code you write, but by how much you enable the entire team to move faster and make better decisions.

The 4 pillars of Staff engineering:

  1. Technical Direction — Setting the architectural vision and ensuring consistent technical decisions across teams.
  2. Execution Excellence — Unblocking others, reviewing complex PRs, identifying and mitigating technical risks before they become crises.
  3. Knowledge Sharing — Writing ADRs, giving tech talks, mentoring senior engineers toward staff-level, creating runbooks.
  4. Organizational Influence — Translating technical tradeoffs into business terms, influencing roadmap prioritization, building consensus across teams.

Architecture Decision Records (ADRs): ADRs document WHY a technical decision was made — the context, options considered, trade-offs, and the final decision. Without ADRs, new engineers ask "why did we choose Redux over Zustand?" and nobody remembers.

ADR Template:

# ADR-001: State Management Strategy

## Status: Accepted
## Date: 2024-03-15

## Context
Our app has grown to 50 screens with 10 engineers. We're experiencing:
- Excessive re-renders due to single Redux store
- 40% of Redux code is boilerplate for API data
- New engineers take 2 weeks to understand the state architecture

## Options Considered
1. Refactor Redux — Better selectors, split stores
2. Migrate to Zustand — Simpler API, selector-based
3. Hybrid — React Query for server state + Zustand for client state

## Decision: Option 3 — Hybrid approach

## Rationale
- 70% of our Redux slices are API data → React Query handles this with less code
- Client state (theme, auth) is simple → Zustand is sufficient
- Incremental migration — new features use new stack, old features migrate over time

## Consequences
- Team needs React Query training (2-day workshop)
- Migration will take ~3 months (incremental, per-feature)
- Dual systems during migration (acceptable, well-documented boundaries)

Code Review Excellence: At the staff level, your code reviews teach patterns, catch architectural issues, and raise the team's overall quality. Review checklist:

  • Does this change align with our architectural patterns?
  • Are error cases handled? What happens when the API fails?
  • Will this scale? What if the list has 10K items?
  • Is this testable? Can we write a unit test without complex mocking?
  • Does this introduce a dependency we'll regret? (bundle size, maintenance)

💻 Code Example

codeTap to expand ⛶
1// === TECHNICAL LEADERSHIP IN PRACTICE ===
2
3// 1. RFC (Request for Comments) for significant changes
4/*
5# RFC: Migrate to React Navigation 7
6
7## Background
8We're on React Navigation 5 (2 major versions behind). Benefits of v7:
9- Type-safe navigation (reduces runtime crashes by ~15%)
10- Static API (better tree-shaking, faster builds)
11- Preloading screens (faster navigation transitions)
12
13## Proposed Approach
14Phase 1 (Week 1-2): Upgrade to v6 (smaller jump, intermediate step)
15Phase 2 (Week 3-4): Upgrade to v7
16Phase 3 (Week 5): Enable type-safe navigation for all screens
17
18## Risk Assessment
19- Risk: Third-party navigation libraries may be incompatible
20 Mitigation: Audit dependencies before starting
21
22- Risk: Custom navigators may break
23 Mitigation: Identify and update in Phase 1
24
25## Rollback Plan
26If critical issues found: revert commit. Navigation state is ephemeral —
27no data migration needed.
28
29## Open Questions
301. Do we adopt the static API for new screens immediately or after full migration?
312. Should we take this opportunity to restructure our navigator hierarchy?
32*/
33
34// 2. Mentoring pattern: Pull Request as teaching moment
35/*
36REVIEW COMMENT on a PR that uses useEffect for derived state:
37
38> Instead of:
39> useEffect(() => {
40> setFilteredItems(items.filter(i => i.active));
41> }, [items]);
42>
43> Consider using useMemo:
44> const filteredItems = useMemo(
45> () => items.filter(i => i.active),
46> [items]
47> );
48>
49> **Why:** useEffect for derived state is an anti-pattern because:
50> 1. It causes an extra render cycle (render → effect → setState → render again)
51> 2. There's a brief moment where filteredItems is stale/empty
52> 3. useMemo computes during render — no extra cycle, always consistent
53>
54> Reference: https://react.dev/learn/you-might-not-need-an-effect
55*/
56
57// 3. Technical decision framework
58function evaluateTechnicalDecision(options) {
59 const criteria = {
60 // Weight: 1-5 (5 = most important)
61 teamExpertise: { weight: 4, description: 'Team can use it effectively' },
62 maintenanceBurden: { weight: 5, description: 'Long-term maintenance cost' },
63 communitySupport: { weight: 3, description: 'Active community & docs' },
64 performanceImpact: { weight: 4, description: 'Runtime performance' },
65 migrationCost: { weight: 3, description: 'Cost to adopt/migrate' },
66 bundleSizeImpact: { weight: 2, description: 'Impact on app size' },
67 };
68
69 // Score each option on each criterion (1-5)
70 // Calculate weighted score
71 // Decision = highest weighted score + team consensus
72
73 // Document in ADR with scores visible
74}
75
76// 4. On-call runbook template
77/*
78# Runbook: High Crash Rate Alert
79
80## Trigger
81Crash-free rate drops below 99% (normal: 99.7%)
82
83## Immediate Actions (within 15 minutes)
841. Check Sentry for top crash
852. Determine if crash is in JS or Native
863. Check if crash correlates with recent release (within 48h)
874. If yes: consider rollback or CodePush fix
885. If no: investigate root cause
89
90## Escalation
91- JS crash: Mobile team lead
92- Native crash: Platform engineer on-call
93- Backend-caused: Backend team lead
94- If > 5% crash rate: VP of Engineering (potential app store removal)
95
96## Communication
97- Post in #incidents Slack channel
98- Update status page if user-facing
99*/

🏋️ Practice Exercise

Leadership Exercises:

  1. Write an ADR for a real technical decision you made (or would make) in your project
  2. Write an RFC for introducing a new library or pattern to your team
  3. Review 3 open-source PRs and write constructive, teaching-oriented review comments
  4. Create a runbook for a common production incident (API outage, crash spike)
  5. Give a 15-minute tech talk to your team on a topic from this roadmap
  6. Identify the top 3 pieces of tech debt in your codebase and write a prioritized remediation plan

⚠️ Common Mistakes

  • Making unilateral technical decisions without team buy-in — Staff engineers build consensus, not dictate

  • Not documenting decisions in ADRs — 6 months later nobody remembers why a choice was made

  • Writing code reviews that only say 'nit' or 'LGTM' — senior reviews should teach patterns and catch structural issues

  • Not investing in mentoring — Staff engineers who don't develop others are senior engineers with a fancier title

  • Over-engineering the architecture — the simplest solution that meets requirements is almost always the best choice

💼 Interview Questions

🎤 Mock Interview

Mock interview is powered by AI for Technical Leadership Patterns & Decision Making. Login to unlock this feature.