<?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/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Decision Making · 仁才德</title>
    <link>https://jared.lynskey.co.nz/zh-cn/tags/decision-making/</link>
    <description>关于软件工程与研发团队领导力的短文——绩效评估、招聘与团队扩张、CI/CD、DevOps 监控、智能体 AI。写于首尔。</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <copyright>© 2026 仁才德</copyright>
    <lastBuildDate>Sun, 01 Nov 2026 00:00:00 +1300</lastBuildDate>
    <atom:link href="https://jared.lynskey.co.nz/zh-cn/tags/decision-making/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>决策文档是什么？附模板的实用指南</title>
      <link>https://jared.lynskey.co.nz/zh-cn/posts/2024/2024-12-03-decision-docs/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/zh-cn/posts/2024/2024-12-03-decision-docs/</guid>
      <pubDate>Tue, 03 Dec 2024 00:00:00 +0000</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>decision-making</category>
      <category>documentation</category>
      <category>ADR</category>
      <category>architecture</category>
      <category>team alignment</category>
      <description>决策文档就是在做决定的那一刻，把背景、考虑过的方案和最终选它的理由记下来，免得半年后又从头争一遍。怎么写出真正有人用的 ADR 和 RFC，附一份 ADR 示例和可以直接拿走的模板。</description>
      <content:encoded><![CDATA[<p>每个团队都在做决策，而大多数团队会忘记当初为什么这么决定。半年后有人问“我们为什么选了 PostgreSQL 而不是 MongoDB？”，没有人记得当时的约束条件，于是同一场争论从头再来一遍——而且到场的人通常比上次还少。</p>
<p>决策文档就是解这个问题的。叫 ADR、RFC 还是决策日志都无所谓，关键是在做选择的那一刻，把背景、备选方案和推理写下来。今年开始带开发团队之后，我对它的价值体会得更深了：它决定了团队拥有的是组织记忆，还是组织传说。</p>
<hr>

<h3 class="relative group">为什么值得花这个功夫
    <div id="为什么值得花这个功夫" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e5%80%bc%e5%be%97%e8%8a%b1%e8%bf%99%e4%b8%aa%e5%8a%9f%e5%a4%ab" aria-label="锚点">#</a>
    </span>
    
</h3>
<p>最直接的回报是不用把同一场架吵两遍。“API 版本策略不是已经定了吗？”只要决定了什么、为什么决定有清楚的记录，尘埃落定的问题就能保持落定，团队可以把力气花在执行上，而不是原路折返。</p>
<p>更安静的回报要过一段时间才显现。项目一跑就是几个月甚至几年，人来人往，最后留下的只有代码——代码能告诉你决定了“什么”，却永远不会告诉你“为什么”。决策文档保存的正是推理本身：当时存在的约束、被否掉的备选方案、拍板的人是谁。新人得到的是上下文而不是传说；跨团队的决策因为所有人都能看到权衡的因素而更容易获得真正的认同；决策者和参与者都写着名字，后续落实也就有了明确的主人。</p>
<hr>

<h3 class="relative group">什么时候写
    <div id="什么时候写" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%bb%80%e4%b9%88%e6%97%b6%e5%80%99%e5%86%99" aria-label="锚点">#</a>
    </span>
    
</h3>
<p>不是每个决策都配得上一份文档。我会在决策属于以下情况时动笔：</p>
<ul>
<li><strong>回头代价高的</strong> — 技术栈选择（框架、数据库、云服务商）、架构模式（微服务还是单体、事件驱动还是请求-响应）、第三方供应商选型、安全与合规方案</li>
<li><strong>影响长期存在的</strong> — 外部系统依赖的 API 契约、跨多个服务的数据模型、对既定模式的破坏性变更</li>
<li><strong>需要跨团队的</strong> — 需要多个团队或非技术相关方认同的事项、资源分配和优先级取舍</li>
<li><strong><a href="https://jared.lynskey.co.nz/zh-cn/posts/2023/2023-10-18-spike/" >Spike</a>（技术预研）的结论</strong> — 限时调研结束后，趁发现和决定还没蒸发，赶紧落成文档</li>
</ul>
<p>反过来，容易撤销的决定、团队内部的实现细节、对自己范围之外几乎没有影响的选择，就别走形式了。没人需要的文档只是作业。</p>
<hr>

<h3 class="relative group">生命周期
    <div id="生命周期" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e7%94%9f%e5%91%bd%e5%91%a8%e6%9c%9f" aria-label="锚点">#</a>
    </span>
    
</h3>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">┌─────────────┐     ┌─────────────┐     ┌─────────────┐     ┌─────────────┐
</span></span><span class="line"><span class="cl">│    草稿     │ ──► │    评审     │ ──► │    批准     │ ──► │    实施     │
</span></span><span class="line"><span class="cl">│    提议     │     │   反馈      │     │    接受     │     │    完成     │
</span></span><span class="line"><span class="cl">└─────────────┘     └─────────────┘     └─────────────┘     └─────────────┘
</span></span><span class="line"><span class="cl">                           │
</span></span><span class="line"><span class="cl">                           ▼
</span></span><span class="line"><span class="cl">                    ┌─────────────┐
</span></span><span class="line"><span class="cl">                    │   否决/     │
</span></span><span class="line"><span class="cl">                    │   取代      │
</span></span><span class="line"><span class="cl">                    └─────────────┘</span></span></code></pre></div></div>
<p>作者起草问题和候选方案，相关方进行评审——整套流程的价值主要就在评审这一步，因为假设被挑战、盲点被暴露都发生在这里。然后由决策者（通常是技术负责人、架构师或产品负责人）拍板，团队实施；实施中如果现实逼着改了方案，文档也要跟着更新。有的文档死在评审里，有的日后随情况变化被取代——两种都要清楚标记，一份过期却还挂着“已批准”的文档，是给下一个发现它的人挖的坑。</p>
<hr>

<h3 class="relative group">什么样的文档才值得读
    <div id="什么样的文档才值得读" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%bb%80%e4%b9%88%e6%a0%b7%e7%9a%84%e6%96%87%e6%a1%a3%e6%89%8d%e5%80%bc%e5%be%97%e8%af%bb" aria-label="锚点">#</a>
    </span>
    
</h3>
<p>从问题开始，而不是从你心仪的方案开始。我们在解决什么？为什么是现在？什么都不做会怎样？如果大家对问题本身都没有共识，讨论方案就是演戏。</p>
<p>然后给出真正的备选项——哪怕你已有强烈倾向，也至少写两三个。每个选项配上简短描述、优缺点、粗略的工作量估算（T 恤尺码就够用：S/M/L/XL），以及风险和应对办法。把落选方案写下来，未来的读者才能明白胜者为什么胜出。</p>
<p>把取舍大声说出来。“我们选择上市速度，放弃架构纯粹性。”“我们接受运维复杂度上升，换取更好的扩展性。”“我们把开发者体验放在原始性能之前。”这样的句子对未来读者的帮助，超过几页纸的分析。</p>
<p>让讨论落在具体的东西上：展示方案实现样子的代码片段、系统交互图、指向 <a href="https://jared.lynskey.co.nz/zh-cn/posts/2023/2023-10-18-spike/" >Spike</a> 概念验证的链接。抽象的讨论只会产出抽象的决定。</p>
<p>最后，给它一个期限：什么时候必须定下来，谁在什么时间前要给意见，拖着不决会卡住什么。没有期限的决策会永远飘着。</p>
<hr>

<h3 class="relative group">示例：架构决策记录（ADR）
    <div id="示例架构决策记录adr" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e7%a4%ba%e4%be%8b%e6%9e%b6%e6%9e%84%e5%86%b3%e7%ad%96%e8%ae%b0%e5%bd%95adr" aria-label="锚点">#</a>
    </span>
    
</h3>
<p>下面是一个实际的决策文档示例：</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gh"># ADR-001: API Authentication Strategy
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**Status:**</span> Accepted
</span></span><span class="line"><span class="cl"><span class="gs">**Date:**</span> 2024-11-15
</span></span><span class="line"><span class="cl"><span class="gs">**Decision Maker:**</span> Sarah Chen (Platform Architect)
</span></span><span class="line"><span class="cl"><span class="gs">**Contributors:**</span> Backend Team, Security Team, Mobile Team
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Context
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Our public API currently uses API keys for authentication. As we expand to
</span></span><span class="line"><span class="cl">support third-party integrations and mobile apps, we need a more robust
</span></span><span class="line"><span class="cl">authentication mechanism that supports:
</span></span><span class="line"><span class="cl"><span class="k">-</span> Token expiration and refresh
</span></span><span class="line"><span class="cl"><span class="k">-</span> Scoped permissions
</span></span><span class="line"><span class="cl"><span class="k">-</span> User-level authentication (not just service-level)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Decision
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">We will implement OAuth 2.0 with JWT tokens for API authentication.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Options Considered
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### Option 1: OAuth 2.0 with JWT (Recommended)
</span></span></span><span class="line"><span class="cl">**Description:** Industry-standard protocol with self-contained tokens
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">| Pros | Cons |
</span></span><span class="line"><span class="cl">|------|------|
</span></span><span class="line"><span class="cl">| Industry standard, well-documented | More complex initial implementation |
</span></span><span class="line"><span class="cl">| Self-contained tokens reduce database lookups | Tokens cannot be revoked instantly |
</span></span><span class="line"><span class="cl">| Broad library support | Requires refresh token management |
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**Effort:**</span> Medium (2-3 sprints)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### Option 2: Session-based Authentication
</span></span></span><span class="line"><span class="cl">**Description:** Traditional server-side sessions with cookies
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">| Pros | Cons |
</span></span><span class="line"><span class="cl">|------|------|
</span></span><span class="line"><span class="cl">| Simple to implement | Not suitable for mobile apps |
</span></span><span class="line"><span class="cl">| Easy to revoke sessions | Requires sticky sessions or shared session store |
</span></span><span class="line"><span class="cl">| Familiar to most developers | Doesn&#39;t scale as well |
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**Effort:**</span> Small (1 sprint)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### Option 3: Custom Token System
</span></span></span><span class="line"><span class="cl">**Description:** Build our own token-based authentication
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">| Pros | Cons |
</span></span><span class="line"><span class="cl">|------|------|
</span></span><span class="line"><span class="cl">| Fully customizable | Reinventing the wheel |
</span></span><span class="line"><span class="cl">| No external dependencies | Security risks from custom implementation |
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**Effort:**</span> Large (4+ sprints)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Consequences
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">-</span> Mobile team can implement standard OAuth flows
</span></span><span class="line"><span class="cl"><span class="k">-</span> We&#39;ll need to set up a token refresh mechanism
</span></span><span class="line"><span class="cl"><span class="k">-</span> API documentation will need updates for OAuth flows
</span></span><span class="line"><span class="cl"><span class="k">-</span> Existing API key users will need a migration path (6-month deprecation)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## References
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">-</span> [<span class="nt">OAuth 2.0 RFC 6749</span>](<span class="na">https://tools.ietf.org/html/rfc6749</span>)
</span></span><span class="line"><span class="cl"><span class="k">-</span> Internal spike document: [<span class="nt">Authentication Options Spike</span>](<span class="na">/spikes/auth-spike-2024</span>)
</span></span><span class="line"><span class="cl">- Security team review: SEC-2024-042</span></span></code></pre></div></div>
<hr>

<h3 class="relative group">一份可以直接拿走的模板
    <div id="一份可以直接拿走的模板" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%b8%80%e4%bb%bd%e5%8f%af%e4%bb%a5%e7%9b%b4%e6%8e%a5%e6%8b%bf%e8%b5%b0%e7%9a%84%e6%a8%a1%e6%9d%bf" aria-label="锚点">#</a>
    </span>
    
</h3>
<p>把它当起点，按团队需要往下删：</p>
<table>
	<thead>
			<tr>
					<th><strong>属性</strong></th>
					<th><strong>详情</strong></th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><strong>决策/议题名称</strong></td>
					<td>[清晰、描述性的标题]</td>
			</tr>
			<tr>
					<td><strong>状态</strong></td>
					<td>[草稿 / 评审中 / 已批准 / 已否决 / 已取代]</td>
			</tr>
			<tr>
					<td><strong>影响度</strong></td>
					<td>[高 / 中 / 低]</td>
			</tr>
			<tr>
					<td><strong>负责人</strong></td>
					<td>[推动决策的人]</td>
			</tr>
			<tr>
					<td><strong>决策者</strong></td>
					<td>[拥有最终决定权的人]</td>
			</tr>
			<tr>
					<td><strong>截止日期</strong></td>
					<td>[做出决策的截止时间]</td>
			</tr>
	</tbody>
</table>

<h4 class="relative group">问题描述
    <div id="问题描述" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e9%97%ae%e9%a2%98%e6%8f%8f%e8%bf%b0" aria-label="锚点">#</a>
    </span>
    
</h4>
<p><em>我们要解决什么问题？为什么重要？不采取行动的代价是什么？</em></p>

<h4 class="relative group">背景
    <div id="背景" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e8%83%8c%e6%99%af" aria-label="锚点">#</a>
    </span>
    
</h4>
<p><em>提供上下文、历史和相关细节。链接到相关文档、过去的决策或Spike结果。</em></p>

<h4 class="relative group">约束条件
    <div id="约束条件" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e7%ba%a6%e6%9d%9f%e6%9d%a1%e4%bb%b6" aria-label="锚点">#</a>
    </span>
    
</h4>
<p><em>所有方案必须遵守哪些限制或要求？</em></p>
<ul>
<li>预算约束</li>
<li>时间线要求</li>
<li>技术约束（现有系统、技能储备）</li>
<li>合规或安全要求</li>
</ul>

<h4 class="relative group">考虑的方案
    <div id="考虑的方案" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e8%80%83%e8%99%91%e7%9a%84%e6%96%b9%e6%a1%88" aria-label="锚点">#</a>
    </span>
    
</h4>
<table>
	<thead>
			<tr>
					<th><strong>选项</strong></th>
					<th><strong>描述</strong></th>
					<th><strong>优点</strong></th>
					<th><strong>缺点</strong></th>
					<th><strong>工作量</strong></th>
					<th><strong>风险</strong></th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><strong>选项 1</strong></td>
					<td><em>描述</em></td>
					<td><em>优点A，优点B</em></td>
					<td><em>缺点A，缺点B</em></td>
					<td><em>S/M/L/XL</em></td>
					<td><em>低/中/高</em></td>
			</tr>
			<tr>
					<td><strong>选项 2</strong></td>
					<td><em>描述</em></td>
					<td><em>优点A，优点B</em></td>
					<td><em>缺点A，缺点B</em></td>
					<td><em>S/M/L/XL</em></td>
					<td><em>低/中/高</em></td>
			</tr>
			<tr>
					<td><strong>选项 3</strong></td>
					<td><em>描述</em></td>
					<td><em>优点A，优点B</em></td>
					<td><em>缺点A，缺点B</em></td>
					<td><em>S/M/L/XL</em></td>
					<td><em>低/中/高</em></td>
			</tr>
	</tbody>
</table>

<h4 class="relative group">建议
    <div id="建议" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%bb%ba%e8%ae%ae" aria-label="锚点">#</a>
    </span>
    
</h4>
<p><em>说明推荐的选项，并总结在约束和取舍条件下为什么它是最佳选择。</em></p>

<h4 class="relative group">决定
    <div id="决定" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%86%b3%e5%ae%9a" aria-label="锚点">#</a>
    </span>
    
</h4>
<p><em>做出决定后记录最终决策。如果与建议不同，说明原因。</em></p>

<h4 class="relative group">后果
    <div id="后果" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%90%8e%e6%9e%9c" aria-label="锚点">#</a>
    </span>
    
</h4>
<p><em>这个决策有什么影响？需要哪些后续工作？</em></p>

<h4 class="relative group">行动项
    <div id="行动项" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e8%a1%8c%e5%8a%a8%e9%a1%b9" aria-label="锚点">#</a>
    </span>
    
</h4>
<table>
	<thead>
			<tr>
					<th><strong>行动</strong></th>
					<th><strong>负责人</strong></th>
					<th><strong>截止日期</strong></th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><em>行动 1</em></td>
					<td><em>姓名</em></td>
					<td><em>日期</em></td>
			</tr>
			<tr>
					<td><em>行动 2</em></td>
					<td><em>姓名</em></td>
					<td><em>日期</em></td>
			</tr>
	</tbody>
</table>

<h4 class="relative group">参考资料
    <div id="参考资料" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" aria-label="锚点">#</a>
    </span>
    
</h4>
<p><em>相关文档、外部资源、Spike结果或过去决策的链接。</em></p>
<hr>

<h3 class="relative group">让习惯扎根
    <div id="让习惯扎根" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e8%ae%a9%e4%b9%a0%e6%83%af%e6%89%8e%e6%a0%b9" aria-label="锚点">#</a>
    </span>
    
</h3>
<p>文档放在固定的地方——仓库里的专用文件夹也好，Wiki 空间也好——找不到的决策等于不存在。保持轻量：一份要写好几天的文档根本不会被写出来。在代码注释、提交信息和 PR 里引用决策文档，让“为什么”一直贴着“是什么”。决策被取代时别删旧文档，标记为已取代并链接到新决策，历史本身就是价值。另外，在<a href="https://jared.lynskey.co.nz/zh-cn/posts/2023/2023-09-01-retrospecs/" >回顾会</a>上时不时翻翻过去的决策：哪些经受住了考验，哪些换成今天你会做得不一样。</p>
<p>失败的方式也同样好预测。分析瘫痪：定个期限，用手头的信息做决定，大多数决策以后都能再议。橡皮图章式评审从来提不出真正的批评，只加流程不加价值。写了却从未落地的孤儿文档，比没有文档更糟。细节过多也是病：文档管“为什么”和“是什么”，不管“怎么做”，实现细节属于技术规格书。还有，当有人不同意时，把反对意见也写进去——决定也许照旧，但那条异议恰恰是一年后某个人最需要的上下文。</p>
<p>从你的下一个重要决策开始吧。写得糙一点没关系，流程边用边磨。每一场因为有人直接读了 ADR 而没开成的“我们当初为什么选 X”会议，都是还给团队的时间。</p>
<hr>

<h3 class="relative group">延伸阅读
    <div id="延伸阅读" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%bb%b6%e4%bc%b8%e9%98%85%e8%af%bb" aria-label="锚点">#</a>
    </span>
    
</h3>
<p><strong>本站相关文章：</strong></p>
<ul>
<li><a href="https://jared.lynskey.co.nz/zh-cn/posts/2023/2023-10-18-spike/" >理解敏捷软件开发中的Spike</a> - 在做重大决策前用 Spike 收集信息</li>
<li><a href="https://jared.lynskey.co.nz/zh-cn/posts/2023/2023-09-01-retrospecs/" >回顾会：反馈循环的力量</a> - 把审视过去的决策纳入持续改进</li>
<li><a href="https://jared.lynskey.co.nz/zh-cn/posts/2023/2023-10-08-planning-an-api/" >API规划</a> - 把决策文档的思路用在 API 设计上</li>
<li><a href="https://jared.lynskey.co.nz/zh-cn/posts/2024/2024-01-04-githubforprojectmanagement/" >用GitHub做项目管理</a> - 让决策文档和代码放在一起</li>
</ul>
<p><strong>外部资源：</strong></p>
<ul>
<li><a href="https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions"  target="_blank" rel="noreferrer">Documenting Architecture Decisions - Michael Nygard</a> - 让 ADR 流行起来的那篇经典博文</li>
<li><a href="https://adr.github.io/"  target="_blank" rel="noreferrer">ADR GitHub Organization</a> - 架构决策记录的工具、模板和示例</li>
<li><a href="https://www.industrialempathy.com/posts/design-docs-at-google/"  target="_blank" rel="noreferrer">Design Docs at Google</a> - Google 的设计文档实践</li>
<li><a href="https://rust-lang.github.io/rfcs/"  target="_blank" rel="noreferrer">RFC Process at Rust</a> - Rust 语言完善的 RFC 流程</li>
<li><a href="https://engineering.atspotify.com/2020/04/when-should-i-write-an-architecture-decision-record/"  target="_blank" rel="noreferrer">Spotify&rsquo;s Decision Record Template</a> - Spotify 关于何时写 ADR 的思考</li>
</ul>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2024/2024-12-03-decision-docs/featured.jpg" medium="image" type="image/jpeg" />
    </item>
    <item>
      <title>用 GitHub Issues 做决策和项目管理：Alan 的方法，附模板</title>
      <link>https://jared.lynskey.co.nz/zh-cn/posts/2024/2024-01-04-githubforprojectmanagement/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/zh-cn/posts/2024/2024-01-04-githubforprojectmanagement/</guid>
      <pubDate>Tue, 09 Apr 2024 00:30:03 +0000</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>GitHub</category>
      <category>GitHub Issues</category>
      <category>Project Management</category>
      <category>Decision Making</category>
      <category>Async Communication</category>
      <category>Remote Work</category>
      <category>Team</category>
      <description>法国公司 Alan 怎么用书面的 GitHub issue 取代大部分会议：什么样的决策值得开 issue、LOCI 角色分工、写作规矩、一份可以直接放进 .github/ISSUE_TEMPLATE 的 issue 模板，以及什么时候该在上面再加一个 GitHub Project。</description>
      <content:encoded><![CDATA[<p>法国健康保险公司 Alan 写过<a href="https://alan.com/en/healthybusiness/media/a/asynchronous-decisions"  target="_blank" rel="noreferrer">一篇讲他们如何做决策的文章</a>，我反反复复看了好几遍。一句话概括：他们不订会议室，而是开一个 GitHub issue，把争论摆到文字里打。如今我自己也开始带团队了，这次是认认真真做了笔记。下面是我对他们这套系统的消化，夹带一些我自己的看法。</p>

<h2 class="relative group">Alan 为什么放弃了开会
    <div id="alan-为什么放弃了开会" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#alan-%e4%b8%ba%e4%bb%80%e4%b9%88%e6%94%be%e5%bc%83%e4%ba%86%e5%bc%80%e4%bc%9a" aria-label="锚点">#</a>
    </span>
    
</h2>
<p>他们的起点你一定不陌生：没人做准备，会议迟迟开不起来，嗓门最大的人不管对错总能拍板。一小时后，你比进会议室之前更糊涂，开始琢磨抽屉里还有没有止痛药。</p>
<p>Alan 一开始也想修好会议这台机器——最长 15 分钟、议程明确、必须产出决策。没用。讨论照样跑题，说过什么没人记得，缺席的和远程的同事干脆被排除在外。于是他们干脆把整件事搬进了文字里。</p>
<p>他们列举的好处我基本都认。写作逼你停下来真正思考，讨论因此更细致、论证更扎实；一切都有记录，不用靠七零八落的记忆；也不再是一场口才竞赛。而且论坛对全公司公开，谁都能参与讨论——不再只属于碰巧坐在会议室里的那几个人。</p>

<h2 class="relative group">把 GitHub 当公司论坛用
    <div id="把-github-当公司论坛用" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%8a%8a-github-%e5%bd%93%e5%85%ac%e5%8f%b8%e8%ae%ba%e5%9d%9b%e7%94%a8" aria-label="锚点">#</a>
    </span>
    
</h2>
<p>这个&quot;论坛&quot;就是 GitHub。一个本为代码评审而生的平台，被 Alan 理直气壮地挪作他用。搭建过程简单得有点不好意思：</p>
<ol>
<li>注册一个 GitHub 账号。</li>
<li>建一个没有代码的私有仓库（他们的叫&quot;Topics&quot;）。</li>
<li>建一套标签体系，给对话分类。</li>
<li>用 Issues 标签页：open 的是进行中的讨论，closed 的是已定的决策。</li>
</ol>
<p>他们的 issue 已经超过 17,000 个。这意味着 17,000 场没必要开的会，而最让我心动的是：每一个决策为什么这么定，都留下了可搜索的历史。想推翻一个老决定？先去读读上次是哪些论据赢了。</p>

<h2 class="relative group">什么时候开 issue
    <div id="什么时候开-issue" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%bb%80%e4%b9%88%e6%97%b6%e5%80%99%e5%bc%80-issue" aria-label="锚点">#</a>
    </span>
    
</h2>
<p>不是每个决策都配得上一个 issue。他们的过滤器是四个问题：谁会受影响？可逆性如何？急不急？做决定前还需要更多背景吗？</p>
<p><figure><span class="mc-img"><img
    class="my-0 rounded-md"
    loading="lazy"
    decoding="async"
    fetchpriority="auto"
    alt="image"
    width="1390"
    height="1213"
    src="https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/decisionchart_hu_9ca1837f8ecdf619.webp"
    srcset="https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/decisionchart_hu_9ca1837f8ecdf619.webp 800w, https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/decisionchart_hu_8ecbad24825e93ec.webp 1280w"
    sizes="(min-width: 768px) 50vw, 65vw"
    data-zoom-src="https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/decisionchart_hu_c84e7ceb7d35c8e2.webp"></span></figure>
</p>
<p>大体上，影响大、难回头的决策进论坛，其余留在 Slack。他们也用&quot;单向门/双向门&quot;的说法：单向决策（撤销代价太大，他们举的例子是涨价）走完整的书面流程；双向决策（撤销便宜，最坏不过损失点精力）就不必兴师动众。</p>

<h2 class="relative group">LOCI：谁干什么
    <div id="loci谁干什么" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#loci%e8%b0%81%e5%b9%b2%e4%bb%80%e4%b9%88" aria-label="锚点">#</a>
    </span>
    
</h2>
<p>每场讨论都按 LOCI 模型分配角色——Lead、Owner、Consulted、Informed。</p>
<p>Lead 对决策的成败负责，确保决策背后的来龙去脉在团队里讲清楚。他会在讨论开头说明自己想介入到什么程度，之后信任 Owner、为团队的产出兜底，只在强烈反对时才出声。每场讨论只有一个 Lead。</p>
<p>Owner 拍最终的板，推着项目往目标走。他要保证每个参与者知情并按时发言，调查问题、收集答案、跟进进展，负责开 issue 也负责关 issue，最后做出决定并公之于众。碰到自己迈不过去的坎，就去找 Lead。每个决策也只有一个 Owner。</p>
<p>Consulted 是那些意见真正影响权衡的人。他们必须按时发言——哪怕只是一句&quot;我没有补充&quot;——如果认为决策错得离谱，就要拉响警报，最坏的情况上报给 Lead。Alan 把这个群体控制在六人左右，再多，进度就要付出代价。</p>
<p>Informed 通常在决策定了之后才被告知。沟通是单向的，不需要他们做任何事。通知谁，由 Owner 根据影响范围来定。</p>
<p>这是针对单个决策的做法。放到整个项目上，我会把同样的事一次性写成一份<a href="https://jared.lynskey.co.nz/zh-cn/posts/2023/2023-06-02-project-frameworks-for-future-cto/" >项目沟通计划</a>：谁需要知道什么、多久一次、由谁来告诉他们。</p>

<h2 class="relative group">一个 issue 的解剖图
    <div id="一个-issue-的解剖图" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%b8%80%e4%b8%aa-issue-%e7%9a%84%e8%a7%a3%e5%89%96%e5%9b%be" aria-label="锚点">#</a>
    </span>
    
</h2>
<p>每个 issue 都用同一套模板。这既能磨利思路，也悄悄教会了初级同事怎么拆解问题：</p>
<ul>
<li>范围——讨论的&quot;为什么&quot;，其中最被低估的一行是&quot;这个 issue 不讨论……&quot;</li>
<li>背景和材料——链接到之前的讨论和文档</li>
<li>LOCI——谁是 Lead、Owner、Consulted、Informed</li>
<li>截止时间——发言截止日、issue 关闭日、必须拿出方案的日期</li>
<li>方案提议——推荐一个方案，或列几个供选择</li>
<li>提问——把具体的问题抛给具体的人，去证实或推翻具体的假设，免得 issue 变成一只&quot;漂流瓶&quot;</li>
</ul>
<p><figure><span class="mc-img"><img
    class="my-0 rounded-md"
    loading="lazy"
    decoding="async"
    fetchpriority="auto"
    alt="image"
    width="1390"
    height="715"
    src="https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/gitpreview_hu_154de40eb6124f02.webp"
    srcset="https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/gitpreview_hu_154de40eb6124f02.webp 800w, https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/gitpreview_hu_ab103b11817c0ef0.webp 1280w"
    sizes="(min-width: 768px) 50vw, 65vw"
    data-zoom-src="https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/gitpreview_hu_aada79d3a582942a.webp"></span></figure>
</p>

<h2 class="relative group">让讨论不拖沓的写作规矩
    <div id="让讨论不拖沓的写作规矩" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e8%ae%a9%e8%ae%a8%e8%ae%ba%e4%b8%8d%e6%8b%96%e6%b2%93%e7%9a%84%e5%86%99%e4%bd%9c%e8%a7%84%e7%9f%a9" aria-label="锚点">#</a>
    </span>
    
</h2>
<p>文字辩论拖起来一点不比口头的差，所以他们有规矩。首先是简洁——他们引用布瓦洛：&ldquo;构思清晰的内容，表达也清晰。&ldquo;写不简单，说明你自己还没想清楚。其次，每写一段都做一次&quot;那又怎样？&ldquo;测试：如果你这条评论的言下之意不明显，就把它写明白。</p>
<p>对 Owner 来说，开完 issue 之后的经营同样重要。让讨论始终对准那个&quot;百万美元问题&rdquo;——真正要紧的那一个卡点——别让它溶解在细节的海洋里；定期总结哪些已达成一致、哪些还悬着；Slack 提醒留作最后手段，只用于发言逾期或真正紧急的情况。</p>
<p><figure><span class="mc-img"><img
    class="my-0 rounded-md"
    loading="lazy"
    decoding="async"
    fetchpriority="auto"
    alt="image"
    width="1390"
    height="910"
    src="https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/slackmessage_hu_b208cd2844b5ba3a.webp"
    srcset="https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/slackmessage_hu_b208cd2844b5ba3a.webp 800w, https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/slackmessage_hu_f44bfed068b95993.webp 1280w"
    sizes="(min-width: 768px) 50vw, 65vw"
    data-zoom-src="https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/slackmessage_hu_3f37871d11c679c.webp"></span></figure>
</p>
<p>Owner 还可以隐藏那些没有推动对话的评论。另外，标题、脚注、表格、键盘快捷键这些 GitHub 排版功能，默认人人都要会用——在书面世界里，形式和内容几乎同等重要。</p>

<h2 class="relative group">不搞共识，不养观众
    <div id="不搞共识不养观众" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%b8%8d%e6%90%9e%e5%85%b1%e8%af%86%e4%b8%8d%e5%85%bb%e8%a7%82%e4%bc%97" aria-label="锚点">#</a>
    </span>
    
</h2>
<p>有两条规矩防止这套系统沦为&quot;委员会决策&rdquo;。</p>
<p>第一，Owner 以 Alan 所说的&quot;开明专制者&quot;身份做决定。他去调研新想法、衡量风险、分析数据、追问同事——但不寻求共识，也没义务采纳听到的每一条建议。Alan 说得很直白：公司不是民主制。人人都是股东，公司利益排在团队和个人之前。当然他们也不要孤立、仓促、拍脑袋的决定。当 Owner 对这一注有了足够把握，就拍板，大家一起试；等影响逐渐清晰，再回头复盘，看下次怎么做得更好。</p>
<p>第二，控制参与人数。贝佐斯的&quot;两个披萨&quot;规则在异步世界照样成立：人越多，每个人的贡献越少。超过六个参与者，旁观者效应就开始冒头，参与质量随之下滑。通知也遵循同样的哲学，渐进式来——Alan 信任每个人都配置好了自己的 GitHub 通知（Settings 里把&quot;Participating&quot;和&quot;Watching&quot;下的&quot;Web and Mobile&quot;勾上），所以 issue 提问区里的 @ 能省则省。</p>

<h2 class="relative group">我打算带走什么
    <div id="我打算带走什么" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%88%91%e6%89%93%e7%ae%97%e5%b8%a6%e8%b5%b0%e4%bb%80%e4%b9%88" aria-label="锚点">#</a>
    </span>
    
</h2>
<p>一场会议的内容，永远没法向缺席的人复述完整；但一份写下来的决策，谁都能读。Alan 自己也说，这不是最好的、更不是唯一的方案，只是最合他们脾性的那一个：打断变少了，旁观者效应变淡了，做决策时能先退一步，事实也都写在纸面上。我不打算把团队的每个决定都搬进 GitHub issue，但下面这个模板，马上就进我们的仓库。</p>

<h3 class="relative group">做成 GitHub issue 模板
    <div id="做成-github-issue-模板" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%81%9a%e6%88%90-github-issue-%e6%a8%a1%e6%9d%bf" aria-label="锚点">#</a>
    </span>
    
</h3>
<p>把下面这段存成 <code>.github/ISSUE_TEMPLATE/decision.md</code>，放进你拿来当论坛的那个仓库，以后每次有人新建 issue，GitHub 都会把它列出来供选择。各个部分是 Alan 的，LOCI 那几行和标签是我加的。</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">决策</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">about</span><span class="p">:</span><span class="w"> </span><span class="l">提出一个决策，以书面形式收集意见</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;[决策] &#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">labels</span><span class="p">:</span><span class="w"> </span><span class="l">decision</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## 范围
</span></span></span><span class="line"><span class="cl"><span class="k">-</span> 这个 issue 的目标是……
</span></span><span class="line"><span class="cl"><span class="k">-</span> 这个 issue **不**讨论……
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## 我为什么开这个 issue
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## LOCI
</span></span></span><span class="line"><span class="cl"><span class="k">-</span> Lead：
</span></span><span class="line"><span class="cl"><span class="k">-</span> Owner：
</span></span><span class="line"><span class="cl"><span class="k">-</span> Consulted：
</span></span><span class="line"><span class="cl"><span class="k">-</span> Informed：
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## 时间线
</span></span></span><span class="line"><span class="cl"><span class="k">-</span> 发言截止日：
</span></span><span class="line"><span class="cl"><span class="k">-</span> 决策截止日：
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## 背景和材料
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## 方案提议
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## 提问</span></span></code></pre></div></div>

<h2 class="relative group">GitHub Issues 还是 GitHub Projects？
    <div id="github-issues-还是-github-projects" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#github-issues-%e8%bf%98%e6%98%af-github-projects" aria-label="锚点">#</a>
    </span>
    
</h2>
<p>如果你在更大的范围里考虑拿 GitHub 做项目管理，这两样东西分工不同。Issues 承载讨论，关闭之后承载的就是决策本身。GitHub Project 则是铺在一个或多个仓库的 issue 之上的看板或表格，状态、负责人、截止日期这些字段都可以自己定义。像 Alan 这样的决策论坛，标签加上 issue 列表就够了。等你想把所有还没定的决策放在一个屏幕上、按必须拍板的日期排好序，或者开始在同一个地方跟踪交付工作时，再加一个 Project。大多数团队最后都是走到这一步，两样一起用。</p>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2024/2024-01-04-githubforprojectmanagement/featured.jpg" medium="image" type="image/jpeg" />
    </item>
    <item>
      <title>什么是“合意性”（Desirability）？怎样的产品才让人想要</title>
      <link>https://jared.lynskey.co.nz/zh-cn/posts/2023/2023-09-27-what-is-desirable/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/zh-cn/posts/2023/2023-09-27-what-is-desirable/</guid>
      <pubDate>Wed, 27 Sep 2023 00:30:03 +0000</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>Desirability</category>
      <category>Decision-Making</category>
      <category>Personal Taste</category>
      <category>Irresistibility</category>
      <category>Appeal</category>
      <category>Influence</category>
      <description>合意性（desirability）指的是人们有多想要一样东西，而不只是需不需要。它在产品设计里是什么意思，哪些特质会让人想要一样东西，以及动手做之前怎么验证。</description>
      <content:encoded><![CDATA[<p>合意性（desirability）说的是人们有多想要一样东西：在“是不是真的需要”之外，它对人的那股吸引力。一样东西让人想要，意味着它值得拥有、值得惦记；就算有更便宜、更省事的选择，人们还是会选它、为它掏钱，或者愿意等它。在产品设计里，这个词的意思要窄一些。它是一个产品创意必须通过的三项检验之一，另外两项是技术可行性（我们做得出来吗？）和商业可持续性（它撑得起一门生意吗？）。合意性问的是：这个东西的目标用户，真的想要它吗？</p>
<p>人为什么想要自己想要的那些东西？这个问题我想得比自己预期的多。最早写这篇的时候，我在做一个大家整天讨论化妆品的平台。两件几乎一样的产品，为什么一件被人惦记、另一件无人问津，这基本就是整个生意的核心。品味当然因人而异，但底下的规律出奇地一致。</p>

<h4 class="relative group">合意性、可行性和可持续性
    <div id="合意性可行性和可持续性" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%90%88%e6%84%8f%e6%80%a7%e5%8f%af%e8%a1%8c%e6%80%a7%e5%92%8c%e5%8f%af%e6%8c%81%e7%bb%ad%e6%80%a7" aria-label="锚点">#</a>
    </span>
    
</h4>
<p>这三个视角出自设计思维，如今已经是产品团队在拍板之前检验一个想法的常用方法。它有用的地方在于，三者失败的方式各不相同。一个做得出来、也赚得了钱、却没人想要的产品，是最典型的创业失败：工程扎实，定价合理，然后无人问津。一个让人想要、却做不出来或者赚不了钱的产品，至少败得明明白白，你早就能看到它会栽在哪儿。</p>
<p>合意性是团队最常跳过的一项，因为它最难衡量，也最容易想当然。团队里每个人本来就想要自己在做的东西。这说明不了别人想不想要。</p>
<p>这篇剩下的部分，先讲合意性由什么构成，再讲怎么去验证它。</p>

<h4 class="relative group">得管用，而且一直管用
    <div id="得管用而且一直管用" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%be%97%e7%ae%a1%e7%94%a8%e8%80%8c%e4%b8%94%e4%b8%80%e7%9b%b4%e7%ae%a1%e7%94%a8" aria-label="锚点">#</a>
    </span>
    
</h4>
<p>想要的念头，通常从朴素的实用开始：真能帮你省下十分钟的厨房小工具，一直稳稳保持在线的手机。但光有实用，只能到“还行”为止。真正被人惦记的东西，把自己的活儿干得出奇地好，而且一直干下去。让一次购买变成一件舍不得撒手的私藏，靠的是质量和耐用：一辆老爷车，一把比主人还长寿的刀。没有人会渴望一件自己觉得快要坏掉的东西。</p>

<h4 class="relative group">得让人心里动一下
    <div id="得让人心里动一下" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%be%97%e8%ae%a9%e4%ba%ba%e5%bf%83%e9%87%8c%e5%8a%a8%e4%b8%80%e4%b8%8b" aria-label="锚点">#</a>
    </span>
    
</h4>
<p>审美的拉力比我们愿意承认的大得多。跑车的线条、一道菜的摆盘，在理性来得及投票之前就先抓住了你。而最强烈的想要，都是情绪上的：快乐、怀旧、归属感。一只破旧的童年玩具，任何实用指标都不及格，却怎么也扔不掉。个性化戳的是同一根神经。为你量身定制的东西，会给你一种“这是我的”的感觉，量产版永远给不了。</p>

<h4 class="relative group">别人替我们做的决定，比想象中多
    <div id="别人替我们做的决定比想象中多" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%88%ab%e4%ba%ba%e6%9b%bf%e6%88%91%e4%bb%ac%e5%81%9a%e7%9a%84%e5%86%b3%e5%ae%9a%e6%af%94%e6%83%b3%e8%b1%a1%e4%b8%ad%e5%a4%9a" aria-label="锚点">#</a>
    </span>
    
</h4>
<p>想不想要，一部分是社会建构出来的。潮流、同伴的认可、文化习惯，都在悄悄给我们的欲望掌舵。稀缺也一样：限量版、稀有宝石、独一无二的物件。稀有传递的信号是，想要这件东西，本身就等于加入了一个小圈子。然后声誉把这一切再放大一层：清一色的好评和口碑，让人觉得想要它是安全的。在那个化妆品平台上，我每天都看着这个循环转一圈：一位人气很高的测评博主，一款限量产品，一周后就卖断货了。</p>

<h4 class="relative group">账还是得算得过来
    <div id="账还是得算得过来" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e8%b4%a6%e8%bf%98%e6%98%af%e5%be%97%e7%ae%97%e5%be%97%e8%bf%87%e6%9d%a5" aria-label="锚点">#</a>
    </span>
    
</h4>
<p>价格杀不死欲望，但“不划算”可以。人们愿意为奢侈品掏溢价，却会毫不犹豫地放弃任何让辛苦钱显得不值的东西。而且越来越多的人把价值观也放进了同一笔账里：一样东西是不是以可持续、合乎道德的方式生产出来的，如今会直接影响它在愿望清单上的位置。我自己也算一个。</p>

<h4 class="relative group">怎么验证一样东西让不让人想要
    <div id="怎么验证一样东西让不让人想要" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%80%8e%e4%b9%88%e9%aa%8c%e8%af%81%e4%b8%80%e6%a0%b7%e4%b8%9c%e8%a5%bf%e8%ae%a9%e4%b8%8d%e8%ae%a9%e4%ba%ba%e6%83%b3%e8%a6%81" aria-label="锚点">#</a>
    </span>
    
</h4>
<p>合意性的陷阱在于，直接问是问不出来的。“你会用这个吗？”几乎每个人都会客客气气地说会，因为说“会”不花任何代价。真正管用的测试，都是让人放弃点什么，比如时间、钱、一个邮箱地址或者一个习惯，然后看他们肯不肯。</p>
<p>问过去，别问将来。“说说你上一次遇到这个问题是什么时候，当时是怎么办的”，这样能问出真实的行为。如果谁都想不起上一次是什么时候，说明这个问题还没痛到让人想要一个解决办法。</p>
<p>摆一扇假门。为一个还不存在的东西做个落地页，或者在现有产品里加个按钮，然后数数有多少人点进来、留下邮箱。这么做感觉有点狡猾，但它是你能拿到的最便宜、也最诚实的信号。门后面要老老实实写清楚：这个功能即将推出。</p>
<p>要一个承诺。候补名单是弱信号，预购或者交定金是强信号。人们什么都肯报名，但只会为真正想要的东西掏钱。</p>
<p>如果是大家已经在用的东西，就问他们：要是以后再也用不了，会是什么感觉。产品圈里有条常见的经验法则：如果大约 40% 的用户会“非常失望”，你手里的东西就是大家真心想要的。这个衡量方式很粗糙，但比问人家喜不喜欢强多了。</p>
<p>还有，看人们做了什么，而不是听他们说了什么。哪些功能会被用第二次，哪些功能不用提醒大家也会回来用，东西坏了的时候大家抱怨什么。抱怨在这件事上被严重低估了。没有人会为失去一样自己本来就不想要的东西而抱怨。</p>

<h4 class="relative group">把这些放在一起
    <div id="把这些放在一起" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%8a%8a%e8%bf%99%e4%ba%9b%e6%94%be%e5%9c%a8%e4%b8%80%e8%b5%b7" aria-label="锚点">#</a>
    </span>
    
</h4>
<p>这些特质，单拎哪一条都撑不起一件产品。但叠上几条，真有用、做工好、好看、稍微难买到、还有你信任的人背书，就成了让人排队的东西。剩下的部分，大多是营销的活儿。</p>

<h4 class="relative group">简单来说
    <div id="简单来说" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e7%ae%80%e5%8d%95%e6%9d%a5%e8%af%b4" aria-label="锚点">#</a>
    </span>
    
</h4>
<p>合意性就是人们有多想要一样东西，而不只是需不需要。放到产品上，它是“大家想不想要这个？”这个视角，和技术可行性、商业可持续性并列。它来自经久耐用的实用性、情感或审美上的吸引力、社会认同和稀缺性，以及让人觉得公道的价格。靠问人家会不会用，是找不到它的。要验证它，就让人放弃一点真实的东西，然后看他们怎么做。</p>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2023/2023-09-27-what-is-desirable/featured.jpeg" medium="image" type="image/jpeg" />
    </item>
  </channel>
</rss>
