<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Engineering Process on VividMap Blog</title><link>https://blog.vividmap.io/categories/engineering-process/</link><description>Recent content in Engineering Process on VividMap Blog</description><image><title>VividMap Blog</title><url>https://blog.vividmap.io/og-image.png</url><link>https://blog.vividmap.io/og-image.png</link></image><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 29 Apr 2026 20:14:09 -0600</lastBuildDate><atom:link href="https://blog.vividmap.io/categories/engineering-process/index.xml" rel="self" type="application/rss+xml"/><item><title>How to Run Effective Engineering Meetings</title><link>https://blog.vividmap.io/posts/how-to-run-effective-engineering-meetings/</link><pubDate>Mon, 17 Aug 2026 00:00:00 +0000</pubDate><guid>https://blog.vividmap.io/posts/how-to-run-effective-engineering-meetings/</guid><description>Most engineering meetings are longer than they need to be, accomplish less than they could, and leave people unsure what was decided. Here&amp;#39;s how to run the meetings that actually move technical work forward.</description><content:encoded><![CDATA[<p>Engineering meetings have a bad reputation, and much of it is earned. Too many meetings are called when an async message would suffice, run without a clear purpose, and end without decisions or next steps. The people who attend feel their time was wasted. The people who called the meeting often didn&rsquo;t accomplish what they intended.</p>
<p>This post is specifically about the meetings that matter at the staff engineer level: design reviews, architectural decision meetings, technical alignment sessions, and cross-team coordination. These are meetings worth doing well — they&rsquo;re how complex technical work gets coordinated. The goal is not to eliminate them but to make them actually work.</p>
<h2 id="the-first-question-should-this-be-a-meeting">The First Question: Should This Be a Meeting?</h2>
<p>Before scheduling anything, ask whether a meeting is actually the right format. The most valuable thing you can do to improve your meeting culture is to cancel the meetings that shouldn&rsquo;t exist.</p>
<p><strong>Hold a meeting when:</strong></p>
<ul>
<li>A decision requires input from multiple perspectives that are hard to capture async</li>
<li>There&rsquo;s genuine ambiguity that benefits from real-time discussion</li>
<li>The stakes are high enough that you need to build shared understanding, not just transmit information</li>
<li>You need to detect and resolve conflicting positions in real time</li>
</ul>
<p><strong>Use async instead when:</strong></p>
<ul>
<li>You&rsquo;re sharing information (a design doc, status update, proposal)</li>
<li>You need feedback but don&rsquo;t need it in real time</li>
<li>The decision can be made by one person with input from others</li>
<li>The question can be answered in writing</li>
</ul>
<p>The &ldquo;let&rsquo;s get everyone together to discuss&rdquo; instinct often reflects discomfort with async alignment rather than genuine need for synchronous discussion. Getting comfortable with async-first is one of the highest-leverage changes an engineering team can make.</p>
<h2 id="define-the-purpose-before-scheduling">Define the Purpose Before Scheduling</h2>
<p>Every meeting should have a clear, specific purpose that answers one question: what decision will be made or what shared understanding will be built by the end?</p>
<p>Vague purposes produce vague meetings:</p>
<ul>
<li>❌ &ldquo;Discuss the database migration&rdquo;</li>
<li>✅ &ldquo;Decide between Option A and Option B for the migration approach, given the constraints from the platform team&rdquo;</li>
</ul>
<p>The purpose determines the invite list, the required pre-read, and the structure. If you can&rsquo;t write a clear purpose, the meeting isn&rsquo;t ready to be scheduled.</p>
<h2 id="pre-reads-are-not-optional">Pre-Reads Are Not Optional</h2>
<p>For any meeting with a decision component, a pre-read is required. The pre-read might be a design doc, a proposal with alternatives, or a brief written summary of the options being evaluated.</p>
<p>The pre-read serves several functions:</p>
<ul>
<li>People arrive with context, so you&rsquo;re not spending the first 20 minutes establishing background</li>
<li>Written proposals surface questions before the meeting, which improves discussion quality</li>
<li>It forces the meeting organizer to clarify their own thinking before asking others to engage</li>
</ul>
<p>A meeting where everyone is seeing the proposal for the first time is not a decision meeting — it&rsquo;s an information transfer session that should have been an email.</p>
<p><strong>How to enforce pre-reads:</strong> Include the pre-read link in the invite with an explicit note: &ldquo;Please review [link] before the meeting. The first 5 minutes will not be used for summary.&rdquo; When you actually skip the summary, people learn to read the pre-read.</p>
<h2 id="the-right-invite-list">The Right Invite List</h2>
<p>Invite size has a nonlinear effect on meeting quality. Every additional person increases the time required, reduces the percentage of people actively contributing, and increases the chance that no one speaks up because everyone is waiting for someone else to.</p>
<p>For decision meetings:</p>
<ul>
<li><strong>Required:</strong> The people whose input is needed to make a good decision, and the person who will make the final call</li>
<li><strong>Optional / silent observer:</strong> People who need to know the outcome but don&rsquo;t need to weigh in</li>
</ul>
<p>For technical alignment meetings:</p>
<ul>
<li>Include one representative from each affected team</li>
<li>Avoid inviting multiple people from the same team to represent the same perspective</li>
</ul>
<p>If you&rsquo;re not sure whether someone should be included, ask yourself: &ldquo;Does this person need to hear the discussion live, or would a written summary of the outcome be sufficient?&rdquo; If written summary works, make them optional.</p>
<h2 id="meeting-structure-the-three-parts">Meeting Structure: The Three Parts</h2>
<p>Almost every effective engineering meeting follows the same structure:</p>
<p><strong>1. Setup (5–10 minutes)</strong>
Restate the purpose and desired outcome. Reference the pre-read. Name any constraints that shape the decision. Answer brief clarifying questions about context — but not design questions, those come in part 2.</p>
<p>The setup should be short. If you&rsquo;ve sent a good pre-read and people have read it, you need to orient the group, not re-present the material.</p>
<p><strong>2. Discussion (majority of time)</strong>
This is where the actual work happens. Structure it to surface disagreement and resolve it — not to achieve surface-level consensus while leaving real disagreements unaddressed.</p>
<p>Techniques that work:</p>
<ul>
<li>Ask for objections specifically, not just agreement: &ldquo;Does anyone see a risk with option A that we haven&rsquo;t addressed?&rdquo;</li>
<li>Name the crux when discussion is going in circles: &ldquo;It sounds like the disagreement comes down to how we weigh X versus Y — is that right?&rdquo;</li>
<li>Use quiet rounds for decisions with power dynamics: ask everyone to write down their preference before anyone speaks aloud</li>
</ul>
<p><strong>3. Close (5–10 minutes)</strong>
Before leaving the meeting room (physical or virtual), capture:</p>
<ul>
<li>What was decided, specifically</li>
<li>What was explicitly not decided (just as important)</li>
<li>Next steps with assigned owners and deadlines</li>
<li>Who needs to be informed of the outcome</li>
</ul>
<p>If you can&rsquo;t state the decision clearly at the end of the meeting, either more discussion is needed or the decision was already implicit and you&rsquo;re doing alignment theater. Reopen the discussion.</p>
<h2 id="running-design-reviews">Running Design Reviews</h2>
<p>Design reviews are a specific type of meeting with their own patterns. The purpose: to improve the design before implementation begins, not to approve it.</p>
<p><strong>What makes design reviews fail:</strong></p>
<ul>
<li>The author presents the design and asks &ldquo;any questions?&rdquo; — this produces polite nodding, not useful feedback</li>
<li>Reviewers engage with implementation details instead of design decisions</li>
<li>No one challenges the fundamental framing because they don&rsquo;t want to be difficult</li>
</ul>
<p><strong>What makes them work:</strong></p>
<ul>
<li>Assign reviewers specific review areas in advance (&ldquo;focus on security model,&rdquo; &ldquo;focus on failure modes and recovery&rdquo;)</li>
<li>Ask for the hardest objections explicitly: &ldquo;What would need to be true for this design to fail?&rdquo;</li>
<li>Separate &ldquo;this is wrong&rdquo; from &ldquo;I would have done it differently&rdquo; — both are valid but require different responses</li>
</ul>
<p>The best design reviews improve designs that were already good. The output is a better document, not just a greenlighted one.</p>
<h2 id="making-decisions-in-meetings">Making Decisions in Meetings</h2>
<p>Many meetings end without a decision because the decision-making structure was never established. Before the discussion starts, clarify:</p>
<ul>
<li><strong>Who makes the final call?</strong> One person, typically the tech lead or owner of the system. Decisions made &ldquo;by the group&rdquo; with no named owner tend to not stick or get relitigated.</li>
<li><strong>What&rsquo;s the decision-making process?</strong> Is this &ldquo;advice process&rdquo; (the owner decides after hearing input) or consensus (everyone must agree)? Consensus is rarely appropriate for technical decisions at scale.</li>
<li><strong>What are the constraints that can&rsquo;t be negotiated?</strong> If some options are off the table, say so early — it prevents people from investing energy in proposals that won&rsquo;t be considered.</li>
</ul>
<p>When you reach a decision, state it out loud clearly before moving on. &ldquo;So the decision is X. [Owner] will proceed with that approach. Does anyone have a blocking concern we haven&rsquo;t addressed?&rdquo; Getting explicit confirmation closes the loop.</p>
<h2 id="the-meeting-note">The Meeting Note</h2>
<p>Someone needs to take a decision-focused note during the meeting. Not a transcript — a record of what was decided, what was explicitly deferred, and what the next steps are.</p>
<p>A good meeting note:</p>
<pre tabindex="0"><code>Meeting: [title and date]
Attendees: [names]
Decision: [specific, unambiguous statement]
Not decided: [things that were discussed but explicitly deferred]
Next steps:
  - [Owner 1]: [action item] by [date]
  - [Owner 2]: [action item] by [date]
To notify: [list of people to inform of the outcome]
</code></pre><p>Send it within a few hours of the meeting to everyone who attended plus anyone who needs to know the outcome. This surfaces misunderstandings before they calcify and creates a durable record for anyone who questions the decision later.</p>
<h2 id="recurring-engineering-meetings">Recurring Engineering Meetings</h2>
<p>The recurring meetings staff engineers typically own or participate in deserve specific attention:</p>
<p><strong>Architecture review:</strong> Should surface the highest-risk or most consequential design decisions being made. Requires mandatory pre-reads. Keeps attendance tight. Produces decisions, not just discussions.</p>
<p><strong>Tech lead sync:</strong> Horizontal alignment across tech leads on cross-cutting concerns. Stays at the dependency and coordination level — not a status report meeting.</p>
<p><strong>Incident review / postmortem:</strong> Focused on systemic improvement, not blame. Produces action items with owners. Published to the organization.</p>
<p><strong>Engineering all-hands:</strong> Information sharing, not decisions. If you&rsquo;re making decisions in all-hands, you have the wrong format.</p>
<p>Every recurring meeting should be audited quarterly: Is this meeting still worth the time it takes? Has the problem it solves changed? Could it move to less frequently or to async?</p>
<h2 id="what-staff-engineers-do-differently">What Staff Engineers Do Differently</h2>
<p>The difference between staff engineers and senior engineers in meetings is often not what they know — it&rsquo;s how they manage the room.</p>
<p><strong>They name the thing:</strong> &ldquo;We&rsquo;ve been in this discussion for 20 minutes and I think we&rsquo;re stuck on a false dichotomy. The actual question is X.&rdquo; Naming what&rsquo;s happening in a meeting is a skill.</p>
<p><strong>They call for closure:</strong> &ldquo;We have 10 minutes left. I want to make sure we come out of this with a decision. Can we commit to option A or B, or is there a third path someone wants to propose?&rdquo; Pushing toward closure is uncomfortable but necessary.</p>
<p><strong>They distinguish levels:</strong> &ldquo;This is an implementation question that we don&rsquo;t need to decide in this room. Can we table it and focus on the architectural decision?&rdquo;</p>
<p><strong>They protect the meeting&rsquo;s purpose:</strong> When a meeting drifts toward a different topic, staff engineers redirect it. &ldquo;That&rsquo;s worth discussing, but it&rsquo;s a different question. Can we note it and come back after we&rsquo;ve addressed what we&rsquo;re here for?&rdquo;</p>
<p>None of this requires formal authority. It requires clarity about what the meeting is for and the willingness to say so.</p>
]]></content:encoded></item><item><title>How to Write a Technical Design Document</title><link>https://blog.vividmap.io/posts/how-to-write-a-technical-design-document/</link><pubDate>Mon, 03 Aug 2026 00:00:00 +0000</pubDate><guid>https://blog.vividmap.io/posts/how-to-write-a-technical-design-document/</guid><description>Most technical design documents fail before they&amp;#39;re read: too long, written after the decision, or pitched at the wrong audience. Here&amp;#39;s how to write TDDs that actually drive good technical decisions.</description><content:encoded><![CDATA[<p>Technical design documents (TDDs) — sometimes called design docs, RFCs, or tech specs — are one of the most valuable tools available to staff engineers. When done well, they create alignment before implementation, surface risks early, and create a durable record of why decisions were made.</p>
<p>When done poorly, they&rsquo;re ignored, debated endlessly, or written as formalities after the decision is already made.</p>
<p>This post is about writing TDDs that work: getting the right people to the right decision with minimum friction.</p>
<h2 id="when-to-write-a-tdd-and-when-not-to">When to Write a TDD (and When Not To)</h2>
<p>Not every technical change needs a design document. Writing an unnecessary TDD creates process overhead without benefit. A useful heuristic:</p>
<p><strong>Write a TDD when:</strong></p>
<ul>
<li>The change affects more than one team or system</li>
<li>There are multiple viable approaches with real trade-offs</li>
<li>The change is hard or expensive to reverse</li>
<li>The implementation will take more than 1–2 weeks</li>
<li>Stakeholders outside engineering need to understand the approach</li>
</ul>
<p><strong>Don&rsquo;t write a TDD when:</strong></p>
<ul>
<li>The approach is already obvious to everyone involved</li>
<li>It&rsquo;s a well-understood pattern you&rsquo;ve applied before</li>
<li>The cost of getting it wrong is low and easy to fix</li>
<li>You&rsquo;re implementing exactly what was already decided in a previous TDD</li>
</ul>
<p>The signal for skipping a TDD: if you sat down to write one and there&rsquo;s nothing non-obvious to decide, you don&rsquo;t need it.</p>
<p>One exception: when you&rsquo;re new to a team, writing a TDD even for straightforward work builds trust and gives reviewers a window into your thinking. The value there isn&rsquo;t the document — it&rsquo;s the review conversation.</p>
<h2 id="the-sections-that-actually-matter">The Sections That Actually Matter</h2>
<p>Design documents have a lot of conventional sections. Most of them are useful. A few are often missing.</p>
<h3 id="problem-statement">Problem Statement</h3>
<p>This section is frequently too thin. Engineers jump to the solution before establishing the problem clearly enough. A strong problem statement answers:</p>
<ul>
<li>What is broken, missing, or insufficient today?</li>
<li>What is the impact of the current state? (User impact, system impact, operational cost)</li>
<li>What evidence establishes that this problem is real and worth solving?</li>
<li>What is the scope of the problem? (One team? The whole platform? A specific user segment?)</li>
</ul>
<p>If readers don&rsquo;t understand the problem deeply, they can&rsquo;t evaluate proposed solutions. Invest more time here than you think you need.</p>
<h3 id="goals-and-non-goals">Goals and Non-Goals</h3>
<p>Goals should be specific and testable, not vague aspirations. &ldquo;Improve reliability&rdquo; is not a goal. &ldquo;Reduce p99 latency for the checkout API from 2s to 400ms under 1,000 RPS&rdquo; is a goal.</p>
<p>Non-goals are equally important and often omitted. Non-goals:</p>
<ul>
<li>Set scope explicitly (prevents the review from expanding into adjacent problems)</li>
<li>Signal that you&rsquo;ve thought about what you&rsquo;re deliberately not solving</li>
<li>Protect the design from being evaluated against requirements you never intended to meet</li>
</ul>
<p>Write non-goals as explicit statements, not silence. &ldquo;We are not solving X in this proposal&rdquo; is useful. Leaving X unmentioned is not.</p>
<h3 id="background-and-context">Background and Context</h3>
<p>What does a reviewer need to know to evaluate this document who isn&rsquo;t deep in this area? Include:</p>
<ul>
<li>How the relevant systems currently work (high-level)</li>
<li>Prior attempts to solve this problem and why they failed or were abandoned</li>
<li>Constraints that shape the solution space (regulatory, contractual, legacy dependencies)</li>
<li>Why now — what changed that makes this worth solving today</li>
</ul>
<p>This section is easy to underwrite if you assume shared context. Assume less than you think you should.</p>
<h3 id="proposed-solution">Proposed Solution</h3>
<p>The meat of the document. Structure it to answer:</p>
<ul>
<li>What is the approach at a high level?</li>
<li>What are the key components or changes?</li>
<li>How does it satisfy each of the stated goals?</li>
<li>How do the pieces interact? (A sequence diagram or system diagram often conveys this better than prose)</li>
</ul>
<p>Resist the urge to write this section before the others. Engineers who jump to the solution first often write problem statements that are shaped to justify the solution they already want. Write the problem clearly first, then write the solution.</p>
<h3 id="alternatives-considered">Alternatives Considered</h3>
<p>This section is not filler. It&rsquo;s evidence that you explored the space seriously.</p>
<p>For each alternative:</p>
<ul>
<li>What is the approach?</li>
<li>Why might it be preferable?</li>
<li>Why are you recommending against it?</li>
</ul>
<p>The alternatives section also protects you. When a reviewer proposes what you considered and rejected, you can point here instead of relitigating it in the review. It also signals to leadership that you didn&rsquo;t pick the first thing that worked.</p>
<p>Don&rsquo;t list alternatives you didn&rsquo;t seriously consider. One sentence strawmen waste everyone&rsquo;s time.</p>
<h3 id="risks-and-open-questions">Risks and Open Questions</h3>
<p>Name the risks explicitly:</p>
<ul>
<li>What assumptions does this design rely on?</li>
<li>What could go wrong during implementation?</li>
<li>What dependencies could block or invalidate this approach?</li>
<li>What happens to existing users/systems during the transition?</li>
</ul>
<p>Open questions deserve a section because they&rsquo;re honest. Not everything is decided when you write the document. Naming open questions tells reviewers where you need input, and it triggers the right conversations.</p>
<p>Mark open questions with an owner when possible: &ldquo;Decision needed from platform team: [question].&rdquo; Unowned open questions don&rsquo;t get resolved.</p>
<h3 id="implementation-plan-and-rollout">Implementation Plan and Rollout</h3>
<p>Cover:</p>
<ul>
<li>What&rsquo;s the phased rollout plan? (Especially important for changes with production impact)</li>
<li>What&rsquo;s the rollback plan?</li>
<li>What observability will you add to know if it&rsquo;s working?</li>
<li>What&rsquo;s the migration path for existing data or users?</li>
<li>What&rsquo;s the timeline and what are the dependencies?</li>
</ul>
<p>The implementation section separates documents that drive action from documents that sit in a wiki. Reviewers want to know not just what you&rsquo;re building but how you&rsquo;ll build it safely.</p>
<h2 id="writing-for-the-right-audience">Writing for the Right Audience</h2>
<p>Most TDDs have multiple audiences with different needs:</p>
<p><strong>Technical reviewers</strong> (the engineers who will implement this or maintain related systems) need the depth: specific design choices, data models, API contracts, failure modes.</p>
<p><strong>Cross-functional stakeholders</strong> (product, data, security, legal) need the impact and the trade-offs, not the implementation details. If you&rsquo;re sharing a doc with this group, a one-page executive summary at the top saves everyone time.</p>
<p><strong>Future engineers</strong> reading this six months later need context they don&rsquo;t have: why was this chosen over alternatives, what was the state of the system at the time, what constraints applied.</p>
<p>Write with all three in mind. Structure the document so reviewers can navigate to the parts relevant to them. Bury the deeply technical detail in sections that cross-functional stakeholders can skip.</p>
<h2 id="the-review-process">The Review Process</h2>
<p>A TDD with no review process is a document, not a decision mechanism. Structure the review deliberately.</p>
<p><strong>Set a deadline.</strong> &ldquo;Please review by Friday EOD&rdquo; produces responses. &ldquo;Let me know when you&rsquo;ve had a chance to look&rdquo; produces silence.</p>
<p><strong>Designate required reviewers vs. optional.</strong> Required reviewers must sign off. Optional reviewers get to weigh in but can&rsquo;t block. Be explicit about who is in each category.</p>
<p><strong>Time-box the comment period.</strong> Two weeks of open-ended review often results in more confusion than a focused 3-day window. Scope creep in review is a real problem.</p>
<p><strong>Hold a synchronous review meeting for high-stakes designs.</strong> Async comment threads are efficient for small details. For designs that affect multiple teams or have significant architectural implications, a 1-hour synchronous review often resolves more than 2 weeks of async back-and-forth.</p>
<p><strong>Distinguish blocking feedback from non-blocking.</strong> Reviewers should label comments: &ldquo;blocking&rdquo; (must be addressed before approval), &ldquo;suggestion&rdquo; (take or leave), &ldquo;question&rdquo; (just curious). This prevents good-faith questions from becoming approval blockers.</p>
<h2 id="common-failure-modes">Common Failure Modes</h2>
<p><strong>Written after the decision.</strong> The TDD is created to document what&rsquo;s already been decided, not to make the decision. Reviewers are asked to ratify, not evaluate. This produces rubber-stamp reviews and skips the alignment that makes TDDs valuable. The fix: write the TDD before writing code, not after.</p>
<p><strong>Too long to read.</strong> A 30-page design document gets skimmed or skipped. If your TDD is over 10 pages, it&rsquo;s probably covering too much scope or including implementation details that belong in code comments. Aim for 3–6 pages of substantive content.</p>
<p><strong>Pitched at the wrong level.</strong> A highly technical document sent to a VP-level audience, or a high-level document sent to engineers who need to implement it. Write the right document for the right audience, or write a document with a layered structure.</p>
<p><strong>Alternatives section that&rsquo;s a formality.</strong> One-line alternatives that obviously weren&rsquo;t seriously considered signal that you&rsquo;ve already decided and are going through the motions. If you can&rsquo;t write a genuine case for each alternative, remove it — or go back and do the exploration.</p>
<p><strong>Never updated.</strong> The design changes during implementation but the document doesn&rsquo;t. Later engineers read the original document and draw wrong conclusions. Either keep the document updated or add a prominent note: &ldquo;Implementation diverged from this design in the following ways: [link to followup doc].&rdquo;</p>
<h2 id="living-documents-vs-archived-decisions">Living Documents vs. Archived Decisions</h2>
<p>Some TDDs stay relevant long after implementation — architectural decisions, data model choices, API contracts. These should be kept in a stable location and updated when the design evolves.</p>
<p>Others are point-in-time decisions that become irrelevant after implementation. For these, mark them clearly: &ldquo;This design was implemented in Q3 2026. The system now works as described. For current architecture, see [link].&rdquo;</p>
<p>The worst outcome is a design document that describes something that no longer exists, sitting in the same location as current documentation with no indication that it&rsquo;s outdated.</p>
<h2 id="a-minimal-tdd-template">A Minimal TDD Template</h2>
<pre tabindex="0"><code>Title: [What this designs]
Status: Draft / In Review / Approved / Implemented
Author: [Name]
Reviewers: [Required] / [Optional]
Created: [Date]
Last Updated: [Date]

---

## Problem Statement
[What is broken, missing, or insufficient? What&#39;s the impact?]

## Goals
- [Specific, testable goal 1]
- [Specific, testable goal 2]

## Non-Goals
- [Explicitly out of scope: X]
- [Explicitly out of scope: Y]

## Background
[Context reviewers need. Prior attempts. Constraints.]

## Proposed Solution
[High-level approach. Key components. How it satisfies the goals.]

## Alternatives Considered
### Option A: [Name]
[Description, pros, why rejected]

### Option B: [Name]
[Description, pros, why rejected]

## Risks
- [Risk 1: impact, likelihood, mitigation]
- [Risk 2: ...]

## Open Questions
- [Question] — Owner: [Name], Needed by: [Date]

## Implementation Plan
- Phase 1: [...]
- Phase 2: [...]
- Rollback plan: [...]
- Observability: [...]
</code></pre><p>The template is a starting point. Add sections when your design needs them. Remove sections when they&rsquo;d be empty. A TDD that follows a template perfectly but says nothing useful is worse than no TDD at all.</p>
]]></content:encoded></item></channel></rss>