<?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>Project Management · 仁才德</title>
    <link>https://jared.lynskey.co.nz/zh-cn/tags/project-management/</link>
    <description>关于软件工程与研发团队领导力的短文——绩效评估、招聘与团队扩张、CI/CD、DevOps 监控、智能体 AI。写于首尔。</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <copyright>© 2026 仁才德</copyright>
    <lastBuildDate>Wed, 28 Oct 2026 00:00:00 +1300</lastBuildDate>
    <atom:link href="https://jared.lynskey.co.nz/zh-cn/tags/project-management/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>
    <item>
      <title>项目沟通计划模板：一份软件团队可以照着用的示例</title>
      <link>https://jared.lynskey.co.nz/zh-cn/posts/2023/2023-06-02-project-frameworks-for-future-cto/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/zh-cn/posts/2023/2023-06-02-project-frameworks-for-future-cto/</guid>
      <pubDate>Fri, 02 Jun 2023 11:30:03 +0000</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>Project Management</category>
      <category>Communication Plan</category>
      <category>Communication</category>
      <category>Stakeholder Management</category>
      <category>Engineering Management</category>
      <category>Remote Work</category>
      <description>项目沟通计划写清楚谁需要知道什么、多久一次、走哪个渠道、由谁来说。这篇讲沟通计划里该有什么，给出一份可以直接照抄的软件项目沟通计划表，以及让它真正运转起来的几个习惯。</description>
      <content:encoded><![CDATA[<p>项目沟通计划就是一张简短的表，写清楚项目的哪些事该让谁知道、多久一次、走哪个渠道、由谁负责去说。我的这份一页纸就装得下，每类受众占一行，从开发团队一直到CEO。下面是我开一个软件项目时会先拿出来的版本，还有我一直在记的、关于项目沟通怎样才真正管用的笔记。</p>
<p>我被拉去救火的那些项目，烂摊子多半不是烂代码造成的，而是该知道的信息没能及时传到该知道的人那里。在公司开始带项目之后，我一直在记笔记：如果哪天坐上CTO的位置，沟通该怎么管。这里整理出来。</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%85%88%e5%ae%9a%e5%a5%bd%e8%b0%81%e9%9c%80%e8%a6%81%e7%9f%a5%e9%81%93%e4%bb%80%e4%b9%88" aria-label="锚点">#</a>
    </span>
    
</h4>
<p>不起眼但打底的东西是沟通计划：谁需要被告知、需要什么信息、多久一次、走哪个渠道。每个项目开始时就该定下来，而且要落到具体人头上——沟通一旦成了&quot;大家的事&quot;，就成了没人管的事。利益相关方也一样：理清谁真正关心这个项目，摸清每个人喜欢的汇报方式。发给CEO的更新，不能跟发到开发频道的一模一样。再定几条明文规则：多久之内该回复、什么算紧急、哪个渠道干什么用。所谓&quot;沟通问题&quot;，多半只是没说出口的期待对不上。</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="#%e4%b8%80%e4%bb%bd%e8%bd%af%e4%bb%b6%e9%a1%b9%e7%9b%ae%e7%9a%84%e6%b2%9f%e9%80%9a%e8%ae%a1%e5%88%92%e7%a4%ba%e4%be%8b" aria-label="锚点">#</a>
    </span>
    
</h4>
<p>这是我会先拿来用、再按项目调整的版本。每一行是一类受众，不是一场会议：</p>
<table>
	<thead>
			<tr>
					<th>受众</th>
					<th>需要知道什么</th>
					<th>多久一次</th>
					<th>渠道</th>
					<th>由谁来说</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>开发团队</td>
					<td>正在做什么、卡在哪、会改动代码的决定</td>
					<td>每天</td>
					<td>站会和团队的聊天频道</td>
					<td>技术负责人</td>
			</tr>
			<tr>
					<td>产品负责人</td>
					<td>离Sprint目标还差多少、范围上的疑问、新出现的风险</td>
					<td>每周两次，范围一变就说</td>
					<td>简短通话或聊天里单开一个话题</td>
					<td>项目负责人</td>
			</tr>
			<tr>
					<td>管理层</td>
					<td>一句话的现状、工期或预算上的风险、需要他们拍板的决定</td>
					<td>每周</td>
					<td>一段话的书面更新</td>
					<td>项目负责人</td>
			</tr>
			<tr>
					<td>销售、客服和运维</td>
					<td>要上线什么、什么时候上、对客户有什么变化</td>
					<td>每次发版</td>
					<td>发版说明</td>
					<td>产品负责人</td>
			</tr>
			<tr>
					<td>用户或客户</td>
					<td>有什么新东西、接下来要做什么</td>
					<td>每次发版</td>
					<td>更新日志或应用内通知</td>
					<td>产品负责人</td>
			</tr>
			<tr>
					<td>所有人</td>
					<td>定了什么、为什么这么定</td>
					<td>定下来的时候</td>
					<td>任务跟踪系统或wiki里的决策日志</td>
					<td>做决定的人</td>
			</tr>
	</tbody>
</table>
<p>表格下面写规则，越直白越好：紧急指的是挡住了发版或者影响到客户，这时候直接打电话，别发消息；问题在聊天里问，决定记进任务跟踪系统；一个工作日内回复。决策日志我用的是<a href="https://jared.lynskey.co.nz/zh-cn/posts/2024/2024-12-03-decision-docs/" >决策文档</a>，以<a href="https://jared.lynskey.co.nz/zh-cn/posts/2024/2024-01-04-githubforprojectmanagement/" >GitHub Issues</a>的形式保存，跟具体的工作放在一起。</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%b7%a5%e5%85%b7%e5%92%8c%e8%8a%82%e5%a5%8f" aria-label="锚点">#</a>
    </span>
    
</h4>
<p>工具没有大家争论的那么重要。聊天用Slack，任务用Trello，需要见面聊就开Zoom——选个适合团队的，赶紧翻篇。更要紧的是节奏：敏捷团队就每日站会，周期长的项目就每周同步，然后真的坚持下去。还有，把东西写下来。决定、变更、待办事项，记进Notion或Jira，当成流程的一部分，而不是事后补的作业。半年之后，大家唯一的记忆就是那份文档。</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%bd%af%e7%9a%84%e9%83%a8%e5%88%86%e6%89%8d%e6%98%af%e7%a1%ac%e9%aa%a8%e5%a4%b4" aria-label="锚点">#</a>
    </span>
    
</h4>
<p>上面说的都是机械层面。更难的在后头：问问团队现在的沟通方式到底管不管用，不管用就改。还有培养人——团队成员背景各异，有的人还没见过一个运转良好的项目长什么样。认真听别人说话，而不是等着轮到自己说；冲突要趁小趁早处理。而且这些问题解决一次不算完，上个季度好使的办法会悄悄失灵，只能定期回头检查。</p>

<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%88%86%e5%b8%83%e5%bc%8f%e5%bc%82%e6%ad%a5%e5%bc%80%e5%8f%91%e5%9b%a2%e9%98%9f%e6%80%8e%e4%b9%88%e5%8d%8f%e4%bd%9c" aria-label="锚点">#</a>
    </span>
    
</h3>
<p>如果你的团队是远程或以异步为主，这个演讲值得一看：
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
			<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/5lVijFaXaKs?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
		</div>
</p>
<p>这些我自己也没全做到——没人能全做到。但回头看，进展顺利的项目大都占齐了这几条，而让人头疼的项目至少缺了三条。</p>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2023/2023-06-02-project-frameworks-for-future-cto/featured.jpeg" medium="image" type="image/jpeg" />
    </item>
    <item>
      <title>终端和VS Code里查看Git分支图：用它追进度，不搞微观管理</title>
      <link>https://jared.lynskey.co.nz/zh-cn/posts/2023/2023-06-02-project-progress-git-graph/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/zh-cn/posts/2023/2023-06-02-project-progress-git-graph/</guid>
      <pubDate>Fri, 02 Jun 2023 11:30:03 +0000</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>Git</category>
      <category>Git Graph</category>
      <category>VS Code</category>
      <category>Project Management</category>
      <category>Engineering Manager</category>
      <description>git log --graph命令怎么用、怎么设成别名、怎么对比两个分支，VS Code里的Git Graph插件和自带的提交图。再说说我怎么用它掌握进度，又不盯人。</description>
      <content:encoded><![CDATA[<p>想看Git分支图，最快的办法是在终端里运行<code>git log --graph --oneline --all --decorate</code>：所有分支都会画成字符线条，一行一个提交，分支名和标签名标在它们指向的提交旁边。在VS Code里，可以直接用源代码管理视图里自带的Source Control Graph，也可以装Git Graph插件，得到一张更大、能点击的图。两种方法在文末都有详细说明。</p>
<p>没人喜欢被问&quot;进展怎么样了？&quot;。可作为在公司带项目的人，我又不能不知道进展。我的折中办法是Git提交图：先看图，再决定要不要问人。大多数时候，答案已经在图里了。提交活动、分支、合并一眼可见，谁也不用为此开会。</p>

<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%8e%e5%9b%be%e9%87%8c%e5%88%b0%e5%ba%95%e8%83%bd%e7%9c%8b%e5%87%ba%e4%bb%80%e4%b9%88" aria-label="锚点">#</a>
    </span>
    
</h3>
<p><figure><span class="mc-img" style="--lqip:url('data:image/webp;base64,UklGRqoAAABXRUJQVlA4IJ4AAAAQBgCdASogABgAPw1yrE0mIyIhKAqoxiGJ5QC3uywCxQFpuHEPXSkTd6B0z2RWZa4T7Y8RfsruOsAA/vd8+2CpyheBOdEz3RjVNYlC9RtFoqjOvb/UUWB572vAmnOtzv/AnG5mtp9GYAzXQce5Jk69dXACVLuYiXixGTwngnNtwm/gJSEGWEDi7N2CT1vDSW68w98W/Qmb3QPw7xAAAA==')"><img
    class="my-0 rounded-md"
    loading="lazy"
    decoding="async"
    fetchpriority="auto"
    alt="Git Graphs"
    width="2560"
    height="1920"
    src="https://jared.lynskey.co.nz/img/posts/gitgraphs/image_hu_4be8d7d2144dd617.webp"
    srcset="https://jared.lynskey.co.nz/img/posts/gitgraphs/image_hu_4be8d7d2144dd617.webp 800w, https://jared.lynskey.co.nz/img/posts/gitgraphs/image_hu_b6056380eece4a86.webp 1280w"
    sizes="(min-width: 768px) 50vw, 65vw"
    data-zoom-src="https://jared.lynskey.co.nz/img/posts/gitgraphs/image_hu_1c52b3c34db54258.webp"></span></figure>
</p>
<p>如果你没仔细看过：图上每个节点是一次提交，每条岔开的线是一个分支，整张图就是项目的时间线。这个布局里的信息量出乎意料地大：</p>
<ul>
<li>扫一眼就知道有几个活跃分支、提交频率如何。</li>
<li>突然安静下来的分支，或者几个星期没合并的分支，多半是有人卡住了。这种预警很值钱。</li>
<li>合并频率反映团队的协作方式。合并勤快，说明工作在持续集成；分支活得太久，往往意味着有人在孤军奋战。</li>
</ul>

<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="#%e6%89%93%e6%89%b0%e6%9b%b4%e5%b0%91%e5%af%b9%e8%af%9d%e6%9b%b4%e5%a5%bd" aria-label="锚点">#</a>
    </span>
    
</h3>
<p>明面上的好处是：不打断任何人也能掌握进度。更大的好处在真需要谈的时候：谈话从图出发，而不是从猜测出发。&ldquo;这个分支从周二就没动过，有什么卡住了吗？&ldquo;比&quot;有什么进展吗？&ldquo;强太多了。</p>
<p>把节奏挑明也有帮助。我的习惯是大多数早上扫一眼，每周认真看一次。团队知道这个节奏，所以谁也不会觉得突然。</p>

<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%88%ab%e6%8a%8a%e5%ae%83%e5%8f%98%e6%88%90%e7%9b%91%e6%8e%a7" aria-label="锚点">#</a>
    </span>
    
</h3>
<p>这一条我得反复提醒自己。提交数不等于价值——一次深思熟虑的提交可能顶五十次刷存在感的提交。能看到每次提交，不代表有资格质疑每个决定；要信任团队，只在模式真正不对劲时才介入。而且把图带进谈话时，它是反馈的起点，不是起诉的证据。</p>

<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%9c%a8%e7%bb%88%e7%ab%af%e9%87%8c%e7%9c%8b%e5%9b%be" aria-label="锚点">#</a>
    </span>
    
</h3>
<p>只要装了Git就行：</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git log --graph --oneline --all --decorate</span></span></code></pre></div></div>
<p>各个参数的作用：</p>
<ul>
<li><code>--graph</code>：在左侧画出分支和合并的线。</li>
<li><code>--oneline</code>：每个提交只占一行，显示短哈希和提交信息的第一行。</li>
<li><code>--all</code>：显示所有分支和标签，包括远程分支，而不只是当前所在的分支。</li>
<li><code>--decorate</code>：把分支名和标签名标在它们指向的提交旁边。新版Git在输出到终端时默认就会显示，但加上这个参数，用管道传给别的命令时名字也不会丢。</li>
</ul>
<p>每天早上敲一遍这么长的命令太累，设个别名：</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git config --global alias.graph <span class="s2">&#34;log --graph --oneline --all --decorate&#34;</span>
</span></span><span class="line"><span class="cl">git graph</span></span></code></pre></div></div>
<p>历史长的仓库，整张图怎么滚都滚不到头。几种缩小范围的办法：</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git graph --since<span class="o">=</span><span class="s2">&#34;2 weeks ago&#34;</span>    <span class="c1"># 只看最近两周</span>
</span></span><span class="line"><span class="cl">git graph -20                      <span class="c1"># 只看最近20个提交</span>
</span></span><span class="line"><span class="cl">git log --graph --oneline main..feature                <span class="c1"># feature有、main还没有的提交</span>
</span></span><span class="line"><span class="cl">git log --graph --oneline --left-right main...feature  <span class="c1"># 两边都显示，用 &lt; 和 &gt; 区分</span></span></span></code></pre></div></div>
<p>最后两条是对比两个分支。这里用的是普通的<code>git log</code>而不是别名，因为别名里的<code>--all</code>会把其他分支全都带回来。两个点显示<code>feature</code>有而<code>main</code>没有的提交；三个点加上<code>--left-right</code>，会把两边各自独有的提交都列出来，一眼就能看出一个长期分支已经跑偏了多远。</p>

<h3 class="relative group">在VS Code里看图
    <div id="在vs-code里看图" 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%9c%a8vs-code%e9%87%8c%e7%9c%8b%e5%9b%be" aria-label="锚点">#</a>
    </span>
    
</h3>
<p>VS Code自带提交图。打开源代码管理视图（Ctrl+Shift+G），里面有一个Source Control Graph分区，这是1.93版（2024年8月）加入的。默认只跟踪当前分支和对应的远程分支，用图标题栏上的分支选择器可以加上别的分支。随手看一眼的话，这就够了。</p>
<p>想一次看全所有分支，就装mhutchie开发的Git Graph插件（在扩展视图里搜&quot;Git Graph&rdquo;）。打开方式有三种：状态栏上的Git Graph按钮、源代码管理视图顶部的Git Graph图标，或者在命令面板里运行 <em>Git Graph: View Git Graph (git log)</em> 。点一个提交可以看它改了哪些文件；先点一个提交，再按住Ctrl/Cmd点另一个，就能对比这两个提交。不过这个插件从2021年起就没有发过新版本，所以自带的提交图也值得会用。</p>
<p>如果看不到Git Graph按钮，多半是插件没找到仓库。它默认只检查你打开的那个文件夹本身，不会往子文件夹里找。直接打开仓库所在的文件夹，或者在设置里调大<code>git-graph.maxDepthOfRepoSearch</code>就行。</p>

<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%85%b6%e4%bb%96%e5%b7%a5%e5%85%b7" aria-label="锚点">#</a>
    </span>
    
</h3>
<p>大多数Git工具都能看图。<code>gitk --all</code>是Git自带的历史浏览器。GitHub、GitLab、Bitbucket的仓库页面都有&quot;network&quot;或&quot;graph&quot;视图。桌面客户端里，SourceTree（Atlassian出的免费工具）、GitKraken、Tower，以及Windows上的TortoiseGit，也都能画提交图。</p>
<p>选哪个都行，目的只有一个：看懂进度，而不是数提交。</p>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2023/2023-06-02-project-progress-git-graph/featured.jpeg" medium="image" type="image/jpeg" />
    </item>
  </channel>
</rss>
