<?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>GitHub · 仁才德</title>
    <link>https://jared.lynskey.co.nz/zh-cn/tags/github/</link>
    <description>关于软件工程与研发团队领导力的短文——绩效评估、招聘与团队扩张、CI/CD、DevOps 监控、智能体 AI。写于首尔。</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <copyright>© 2026 仁才德</copyright>
    <lastBuildDate>Mon, 26 Oct 2026 00:00:00 +1200</lastBuildDate>
    <atom:link href="https://jared.lynskey.co.nz/zh-cn/tags/github/index.xml" rel="self" type="application/rss+xml" />
    <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>

<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>
  </channel>
</rss>
