<?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 · Nhân Tài Đức</title>
    <link>https://jared.lynskey.co.nz/vi/tags/project-management/</link>
    <description>Những câu chuyện ngắn về kỹ thuật phần mềm và lãnh đạo đội ngũ kỹ sư — performance review, tuyển dụng và mở rộng team, CI/CD, giám sát DevOps và AI agent. Viết từ Seoul.</description>
    <generator>Hugo</generator>
    <language>vi</language>
    <copyright>© 2026 Nhân Tài Đức</copyright>
    <lastBuildDate>Wed, 28 Oct 2026 00:00:00 +1300</lastBuildDate>
    <atom:link href="https://jared.lynskey.co.nz/vi/tags/project-management/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Dùng GitHub Issues để ra quyết định và quản lý dự án: cách làm của Alan, kèm mẫu issue</title>
      <link>https://jared.lynskey.co.nz/vi/posts/2024/2024-01-04-githubforprojectmanagement/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/vi/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>Cách Alan thay gần hết các cuộc họp bằng GitHub issue viết thành văn: quyết định nào mới đáng mở issue, các vai trò trong mô hình LOCI, những quy tắc khi viết, một mẫu issue bạn có thể bỏ ngay vào thư mục .github/ISSUE_TEMPLATE, và khi nào nên dựng thêm một GitHub Project bên trên các issue.</description>
      <content:encoded><![CDATA[<p>Có một <a href="https://alan.com/en/healthybusiness/media/a/asynchronous-decisions"  target="_blank" rel="noreferrer">bài viết</a> mà tôi cứ đọc đi đọc lại, của Alan, một công ty bảo hiểm sức khỏe ở Pháp, kể về cách họ ra quyết định. Nói ngắn gọn: thay vì đặt lịch họp, họ mở một GitHub issue rồi tranh luận bằng chữ. Giờ chính tôi cũng đang quản lý một đội, nên lần này tôi ngồi ghi chép cẩn thận. Dưới đây là phần tóm lược hệ thống của họ, có xen vài nhận xét của riêng tôi.</p>

<h2 class="relative group">Vì sao họ bỏ họp
    <div id="vì-sao-họ-bỏ-họp" 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="#v%c3%ac-sao-h%e1%bb%8d-b%e1%bb%8f-h%e1%bb%8dp" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Điểm xuất phát của họ chắc bạn cũng thấy quen. Không ai chuẩn bị gì, họp thì bắt đầu muộn, và ai nói to nhất thì người đó thắng, bất kể đúng hay sai. Một tiếng sau bạn bước ra còn rối hơn lúc bước vào, và bắt đầu lục ngăn kéo xem còn viên paracetamol nào không.</p>
<p>Ban đầu Alan thử sửa lại cách họp: tối đa 15 phút, chương trình họp rõ ràng, họp xong bắt buộc phải có quyết định. Nhưng không duy trì được. Thảo luận cứ lan man, chẳng ai nhớ ai đã nói gì, còn người vắng mặt hay làm việc từ xa thì coi như chịu thiệt. Thế là họ chuyển hẳn sang viết.</p>
<p>Những lợi ích họ nêu ra, tôi thấy đều đúng. Viết buộc bạn phải chậm lại và suy nghĩ thật sự, nên cuộc thảo luận sâu hơn và lập luận chặt chẽ hơn. Mọi thứ được ghi lại rõ ràng, thay vì mỗi người nhớ một ít. Tranh luận không còn là cuộc thi xem ai ăn nói giỏi hơn. Và vì diễn đàn mở cho cả công ty, ai cũng có thể góp ý, chứ không chỉ những người tình cờ có mặt trong phòng họp.</p>

<h2 class="relative group">GitHub làm diễn đàn chung của công ty
    <div id="github-làm-diễn-đàn-chung-của-công-ty" 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-l%c3%a0m-di%e1%bb%85n-%c4%91%c3%a0n-chung-c%e1%bb%a7a-c%c3%b4ng-ty" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Diễn đàn đó chính là GitHub, một nền tảng vốn sinh ra để rà soát mã (code review), và Alan cứ thế vui vẻ &ldquo;mượn&rdquo; nó cho việc khác. Cách thiết lập đơn giản đến mức hơi ngại:</p>
<ol>
<li>Tạo một tài khoản GitHub.</li>
<li>Tạo một kho mã (repository) riêng tư không chứa dòng mã nào (kho của họ tên là &ldquo;Topics&rdquo;).</li>
<li>Thêm một hệ thống nhãn (label) để phân loại các cuộc thảo luận.</li>
<li>Dùng tab Issues: issue đang mở là thảo luận đang diễn ra, issue đã đóng là quyết định đã chốt.</li>
</ol>
<p>Họ đã vượt mốc 17,000 issue. Tức là có ngần ấy cuộc họp không bao giờ phải diễn ra, và, phần tôi thích nhất, họ có cả một lịch sử tra cứu được về lý do vì sao mỗi quyết định lại đi theo hướng đó. Nếu muốn lật lại một quyết định cũ, bạn có thể đọc trước xem lần trước những lập luận nào đã thắng.</p>

<h2 class="relative group">Khi nào nên mở issue
    <div id="khi-nào-nên-mở-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="#khi-n%c3%a0o-n%c3%aan-m%e1%bb%9f-issue" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Không phải quyết định nào cũng đáng mở một issue. Họ lọc bằng bốn câu hỏi: ai sẽ bị ảnh hưởng? có dễ quay lại không? gấp đến mức nào? mình có cần thêm bối cảnh trước khi quyết không?</p>
<p><figure><span class="mc-img"><img
    class="my-0 rounded-md"
    loading="lazy"
    decoding="async"
    fetchpriority="auto"
    alt="hình minh họa"
    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>Đại khái, quyết định nào tác động lớn và khó quay lại thì đưa lên diễn đàn, còn lại cứ để trên Slack. Họ dựa vào cách phân biệt &ldquo;cửa một chiều&rdquo; và &ldquo;cửa hai chiều&rdquo;. Quyết định một chiều là loại muốn quay lại thì quá tốn kém hoặc quá đau (ví dụ của họ là tăng giá), nên được xử lý đầy đủ bằng văn bản. Quyết định hai chiều thì dễ quay lại, tệ nhất cũng chỉ mất chút công sức, nên không cần thủ tục rườm rà.</p>

<h2 class="relative group">LOCI: ai làm gì
    <div id="loci-ai-làm-gì" 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-ai-l%c3%a0m-g%c3%ac" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Mỗi cuộc thảo luận đều phân vai theo mô hình LOCI: Lead, Owner, Consulted, Informed.</p>
<p>Lead chịu trách nhiệm về thành công của quyết định và đảm bảo cả đội hiểu rõ bối cảnh. Ngay từ đầu, Lead nói rõ mình muốn tham gia sâu đến đâu, sau đó tin tưởng giao cho Owner, chịu trách nhiệm về những gì đội làm ra, và chỉ lên tiếng khi thực sự không đồng ý. Mỗi thảo luận chỉ có đúng một Lead.</p>
<p>Owner là người chốt quyết định cuối cùng và kéo dự án đi tới. Owner giữ cho những người tham gia luôn nắm được tình hình và góp ý đúng hạn, tìm hiểu vấn đề, mở và đóng issue, rồi thông báo quyết định. Nếu vướng một bức tường không tự vượt qua được thì Owner tìm đến Lead. Mỗi quyết định chỉ có đúng một Owner.</p>
<p>Consulted là những người mà ý kiến của họ thực sự ảnh hưởng tới việc cân nhắc được mất. Họ phải góp ý kịp thời, dù chỉ để nói &ldquo;tôi không có gì thêm&rdquo;, và phải lên tiếng cảnh báo (đẩy lên Lead nếu cần) khi thấy quyết định đang sai nghiêm trọng. Alan giới hạn nhóm này khoảng sáu người, vì càng thêm người góp ý thì càng tốn thêm thời gian.</p>
<p>Informed thì đơn giản là những người được báo tin, thường là sau khi quyết định đã chốt. Đây là giao tiếp một chiều, không ai chờ họ phản hồi. Owner là người quyết định ai bị ảnh hưởng đủ nhiều để cần được thông báo.</p>

<h2 class="relative group">Một issue gồm những gì
    <div id="một-issue-gồm-những-gì" 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="#m%e1%bb%99t-issue-g%e1%bb%93m-nh%e1%bb%afng-g%c3%ac" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Issue nào cũng dùng chung một mẫu (template). Mẫu này vừa giúp suy nghĩ rõ ràng hơn, vừa ngầm dạy các bạn mới vào nghề cách bóc tách một vấn đề:</p>
<ul>
<li>Phạm vi (Scope): lý do có cuộc thảo luận này, kèm một dòng hay bị xem nhẹ là &ldquo;issue này KHÔNG bàn về…&rdquo;</li>
<li>Bối cảnh và tài liệu: đường dẫn tới các thảo luận và tài liệu trước đó</li>
<li>LOCI: ai là Lead, Owner, Consulted, Informed</li>
<li>Hạn chót: góp ý trước khi nào, khi nào đóng issue, khi nào cần có giải pháp</li>
<li>Đề xuất giải pháp: một phương án cụ thể, hoặc vài lựa chọn để cân nhắc</li>
<li>Câu hỏi: hỏi thẳng từng người cụ thể để xác nhận hoặc bác bỏ từng giả định cụ thể, để issue không thành lá thư bỏ vào chai thả trôi</li>
</ul>
<p><figure><span class="mc-img"><img
    class="my-0 rounded-md"
    loading="lazy"
    decoding="async"
    fetchpriority="auto"
    alt="hình minh họa"
    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">Quy tắc viết để mọi thứ không bị ì
    <div id="quy-tắc-viết-để-mọi-thứ-không-bị-ì" 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="#quy-t%e1%ba%afc-vi%e1%ba%bft-%c4%91%e1%bb%83-m%e1%bb%8di-th%e1%bb%a9-kh%c3%b4ng-b%e1%bb%8b-%c3%ac" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Tranh luận bằng chữ cũng có thể lê thê y như tranh luận bằng miệng, nên họ đặt ra quy tắc. Viết ngắn gọn. Họ trích lời Boileau: &ldquo;Điều gì đã nghĩ thấu thì sẽ nói ra rõ ràng.&rdquo; Nếu bạn không viết được nó ra một cách đơn giản, tức là bạn vẫn chưa thực sự chắc. Mọi thứ viết ra đều phải qua phép thử &ldquo;Thì sao?&rdquo;: nếu bình luận của bạn dẫn tới hệ quả gì mà người đọc chưa thấy ngay, hãy nói thẳng ra.</p>
<p>Với Owner, việc theo sát về sau quan trọng không kém lúc mở đầu. Phải giữ cho cuộc thảo luận bám vào &ldquo;câu hỏi triệu đô&rdquo;, tức đúng cái điểm vướng thực sự quan trọng, thay vì để nó tan vào tiểu tiết. Thường xuyên tóm tắt lại những gì đã thống nhất và những gì còn bỏ ngỏ. Còn nhắc nhở qua Slack thì chỉ là phương án cuối cùng, dành cho những phần góp ý đã quá hạn hoặc chuyện thực sự gấp.</p>
<p><figure><span class="mc-img"><img
    class="my-0 rounded-md"
    loading="lazy"
    decoding="async"
    fetchpriority="auto"
    alt="hình minh họa"
    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 cũng ẩn đi những bình luận không giúp cuộc thảo luận tiến lên. Ai cũng phải thạo cách định dạng trên GitHub, từ tiêu đề, chú thích cuối trang, bảng cho tới phím tắt, vì khi viết thì hình thức gần như quan trọng ngang nội dung.</p>

<h2 class="relative group">Không cần đồng thuận, không có khán giả
    <div id="không-cần-đồng-thuận-không-có-khán-giả" 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="#kh%c3%b4ng-c%e1%ba%a7n-%c4%91%e1%bb%93ng-thu%e1%ba%adn-kh%c3%b4ng-c%c3%b3-kh%c3%a1n-gi%e1%ba%a3" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Có hai quy tắc giữ cho cách làm này không biến thành kiểu quyết định theo hội đồng.</p>
<p>Thứ nhất, Owner ra quyết định theo kiểu mà Alan gọi là &ldquo;nhà độc tài sáng suốt&rdquo;. Họ tìm hiểu các ý tưởng, cân nhắc rủi ro, chất vấn đồng nghiệp, nhưng không đi tìm sự đồng thuận và cũng không bắt buộc phải làm theo mọi điều người khác nói. Alan nói thẳng họ không phải một nền dân chủ: nhân viên nào cũng là cổ đông, và lợi ích của công ty đặt trên lợi ích của một đội hay một cá nhân. Khi Owner đã khá chắc về một hướng đi, họ quyết, mọi người cùng làm thử, và khi đã thấy được tác động thì cùng nhìn lại xem quyết định đó đúng hay sai.</p>
<p>Thứ hai, số người tham gia được kiểm soát. Quy tắc &ldquo;hai chiếc pizza&rdquo; của Jeff Bezos cũng đúng với cách làm việc bất đồng bộ (async): issue càng đông người thì mỗi người càng góp ít. Quá khoảng sáu người là hiệu ứng khán giả xuất hiện, và chất lượng góp ý đi xuống. Chuyện thông báo cũng theo cùng tinh thần đó. Alan tin rằng ai cũng đã tự cấu hình thông báo GitHub cho mình (vào Settings, rồi tick &ldquo;Web and Mobile&rdquo; ở cả &ldquo;Participating&rdquo; lẫn &ldquo;Watching&rdquo;), nên việc gắn thẻ (tag) thẳng tên người trong phần Câu hỏi được giữ ở mức tối thiểu.</p>

<h2 class="relative group">Những gì tôi học được
    <div id="những-gì-tôi-học-được" 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="#nh%e1%bb%afng-g%c3%ac-t%c3%b4i-h%e1%bb%8dc-%c4%91%c6%b0%e1%bb%a3c" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Bạn không bao giờ kể lại được trọn vẹn một cuộc họp cho người vắng mặt, nhưng một quyết định đã viết ra thì ai cũng đọc được. Alan không nói đây là hệ thống tốt nhất hay duy nhất, chỉ là hệ thống hợp với họ: ít bị ngắt quãng hơn, ít hiệu ứng khán giả hơn, và quyết định được đưa ra sau khi đã lùi lại một bước để nhìn, với đầy đủ dữ kiện trên giấy. Tôi chưa định chuyển mọi quyết định của đội mình sang GitHub issue, nhưng cái mẫu dưới đây thì sẽ vào thẳng kho mã của chúng tôi.</p>

<h3 class="relative group">Mẫu đề xuất, dùng làm mẫu issue (issue template) trên GitHub
    <div id="mẫu-đề-xuất-dùng-làm-mẫu-issue-issue-template-trên-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="#m%e1%ba%abu-%c4%91%e1%bb%81-xu%e1%ba%a5t-d%c3%b9ng-l%c3%a0m-m%e1%ba%abu-issue-issue-template-tr%c3%aan-github" aria-label="Cọc dấu">#</a>
    </span>
    
</h3>
<p>Hãy lưu nội dung dưới đây thành tệp <code>.github/ISSUE_TEMPLATE/decision.md</code> trong kho mã mà bạn dùng làm diễn đàn, và mỗi lần có người mở issue mới, GitHub sẽ gợi ý sẵn mẫu này. Các mục trong mẫu là của Alan; phần LOCI và nhãn là tôi thêm vào.</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">Quyết định</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">Đề xuất một quyết định và thu thập góp ý bằng văn bản</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;[Quyết định] &#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">## Phạm vi
</span></span></span><span class="line"><span class="cl"><span class="k">-</span> Mục tiêu của issue này là ...
</span></span><span class="line"><span class="cl"><span class="k">-</span> Issue này KHÔNG bàn về ...
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Vì sao tôi mở issue này
</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">## Mốc thời gian
</span></span></span><span class="line"><span class="cl"><span class="k">-</span> Góp ý trước ngày:
</span></span><span class="line"><span class="cl"><span class="k">-</span> Chốt quyết định trước ngày:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Bối cảnh và tài liệu
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Đề xuất
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Câu hỏi</span></span></code></pre></div></div>

<h2 class="relative group">Nên dùng GitHub Issues hay GitHub Projects?
    <div id="nên-dùng-github-issues-hay-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="#n%c3%aan-d%c3%b9ng-github-issues-hay-github-projects" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Nếu bạn đang tính dùng GitHub để quản lý dự án theo nghĩa rộng hơn, thì nên biết hai phần này làm hai việc khác nhau. GitHub Issues là nơi diễn ra cuộc thảo luận, và khi issue đã đóng thì là nơi lưu lại quyết định. Còn một GitHub Project là một bảng công việc, ở dạng cột kiểu Kanban (board) hoặc dạng bảng tính (table), đặt chồng lên các issue của một hay nhiều kho mã, với các trường (field) do bạn tự định nghĩa như trạng thái, người phụ trách hay hạn chót. Với một diễn đàn ra quyết định như của Alan, chỉ cần nhãn và danh sách issue là đủ. Hãy thêm một Project khi bạn muốn thấy mọi quyết định đang mở trên cùng một màn hình, sắp xếp theo ngày phải chốt, và khi bạn bắt đầu theo dõi cả các đầu việc phát triển, bàn giao sản phẩm ở cùng chỗ đó. Đó cũng là lúc phần lớn các đội rốt cuộc dùng cả hai.</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>Kế hoạch truyền thông dự án (communication plan): mẫu và ví dụ cho đội phát triển phần mềm</title>
      <link>https://jared.lynskey.co.nz/vi/posts/2023/2023-06-02-project-frameworks-for-future-cto/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/vi/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>Kế hoạch truyền thông dự án cho biết ai cần biết gì, bao lâu một lần, qua kênh nào và ai chịu trách nhiệm báo cho họ. Trong đó cần có những gì, một mẫu kế hoạch cho dự án phần mềm mà bạn có thể sao chép, và những thói quen giúp nó vận hành được.</description>
      <content:encoded><![CDATA[<p>Kế hoạch truyền thông dự án, hay kế hoạch giao tiếp (communication plan), là một bảng ngắn ghi rõ ai cần biết gì về dự án, bao lâu một lần, qua kênh nào, và ai chịu trách nhiệm báo cho họ. Kế hoạch của tôi gói gọn trong một trang, mỗi nhóm đối tượng một dòng, từ đội lập trình cho tới CEO. Dưới đây là bản tôi sẽ dùng khi bắt đầu một dự án phần mềm, cùng những ghi chép tôi tích góp được về điều gì khiến việc giao tiếp trong dự án thực sự hiệu quả.</p>
<p>Phần lớn những dự án rối như canh hẹ mà tôi từng bị kéo vào đều không phải do mã nguồn tệ. Nguyên nhân là thông tin cần thiết không đến được đúng người, cho tới khi đã quá muộn. Từ khi nhận vai trò trưởng dự án (project lead) ở công ty, tôi bắt đầu ghi lại cách mình muốn điều phối giao tiếp, nếu có ngày ngồi vào ghế CTO. Đây là những ghi chép đó.</p>

<h4 class="relative group">Xác định ai cần biết gì
    <div id="xác-định-ai-cần-biết-gì" 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="#x%c3%a1c-%c4%91%e1%bb%8bnh-ai-c%e1%ba%a7n-bi%e1%ba%bft-g%c3%ac" aria-label="Cọc dấu">#</a>
    </span>
    
</h4>
<p>Nền móng thì chẳng có gì hào nhoáng: một kế hoạch giao tiếp ghi rõ ai cần được báo, họ cần biết gì, bao lâu báo một lần và qua kênh nào. Tôi sẽ đòi có kế hoạch này ngay từ đầu mỗi dự án, kèm tên người phụ trách cụ thể, vì việc gì cũng giao cho &ldquo;cả đội&rdquo; thì rốt cuộc chẳng ai làm. Với các bên liên quan (stakeholder) cũng vậy: tìm ra ai thực sự quan tâm đến dự án, hiểu mỗi người thích được cập nhật theo cách nào, và đừng gửi cho CEO nguyên cái tin cập nhật bạn vừa đăng trong kênh của đội lập trình. Cuối cùng là đặt ra vài quy ước rõ ràng: bao lâu thì nên phản hồi, thế nào mới tính là gấp, kênh nào dùng cho việc gì. Phần lớn cái gọi là &ldquo;vấn đề giao tiếp&rdquo; thật ra chỉ là những kỳ vọng chưa ai nói ra thành lời.</p>

<h4 class="relative group">Ví dụ về kế hoạch truyền thông cho một dự án phần mềm
    <div id="ví-dụ-về-kế-hoạch-truyền-thông-cho-một-dự-án-phần-mềm" 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="#v%c3%ad-d%e1%bb%a5-v%e1%bb%81-k%e1%ba%bf-ho%e1%ba%a1ch-truy%e1%bb%81n-th%c3%b4ng-cho-m%e1%bb%99t-d%e1%bb%b1-%c3%a1n-ph%e1%ba%a7n-m%e1%bb%81m" aria-label="Cọc dấu">#</a>
    </span>
    
</h4>
<p>Đây là kế hoạch tôi sẽ dùng làm điểm xuất phát rồi điều chỉnh dần. Mỗi dòng là một nhóm đối tượng cần được báo, chứ không phải một cuộc họp:</p>
<table>
	<thead>
			<tr>
					<th>Đối tượng</th>
					<th>Họ cần biết gì</th>
					<th>Bao lâu một lần</th>
					<th>Kênh</th>
					<th>Ai báo cho họ</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Đội lập trình</td>
					<td>Việc gì đang làm, việc gì đang bị chặn, những quyết định làm thay đổi mã nguồn</td>
					<td>Hằng ngày</td>
					<td>Họp nhanh (stand-up) và kênh chat của đội</td>
					<td>Trưởng nhóm kỹ thuật (tech lead)</td>
			</tr>
			<tr>
					<td>Product owner</td>
					<td>Tiến độ so với mục tiêu của sprint, các câu hỏi về phạm vi (scope), rủi ro mới phát sinh</td>
					<td>Hai lần mỗi tuần, và mỗi khi phạm vi thay đổi</td>
					<td>Một cuộc gọi ngắn hoặc một luồng chat</td>
					<td>Trưởng dự án</td>
			</tr>
			<tr>
					<td>Ban lãnh đạo</td>
					<td>Tình hình tóm gọn trong một dòng, rủi ro ảnh hưởng tới hạn chót hoặc ngân sách, những quyết định họ cần đưa ra</td>
					<td>Hằng tuần</td>
					<td>Một bản cập nhật viết, dài một đoạn</td>
					<td>Trưởng dự án</td>
			</tr>
			<tr>
					<td>Kinh doanh, chăm sóc khách hàng và vận hành</td>
					<td>Sắp phát hành gì, khi nào, và khách hàng sẽ thấy gì thay đổi</td>
					<td>Mỗi lần phát hành</td>
					<td>Ghi chú phát hành (release notes)</td>
					<td>Product owner</td>
			</tr>
			<tr>
					<td>Người dùng hoặc khách hàng</td>
					<td>Có gì mới và sắp có gì</td>
					<td>Mỗi lần phát hành</td>
					<td>Nhật ký thay đổi (changelog) hoặc thông báo trong ứng dụng</td>
					<td>Product owner</td>
			</tr>
			<tr>
					<td>Tất cả mọi người</td>
					<td>Đã quyết định gì, và vì sao</td>
					<td>Ngay khi có quyết định</td>
					<td>Nhật ký quyết định (decision log) trong công cụ quản lý issue hoặc wiki</td>
					<td>Người đưa ra quyết định</td>
			</tr>
	</tbody>
</table>
<p>Bên dưới bảng là các quy ước, viết càng đơn giản càng tốt: gấp nghĩa là việc đó đang chặn một lần phát hành hoặc khiến khách hàng bị kẹt, nên hãy gọi điện thay vì nhắn tin; câu hỏi thì đưa vào chat, quyết định thì ghi vào công cụ quản lý công việc; phản hồi trong vòng một ngày làm việc. Với nhật ký quyết định, tôi dùng <a href="https://jared.lynskey.co.nz/vi/posts/2024/2024-12-03-decision-docs/" >tài liệu ra quyết định</a>, lưu dưới dạng <a href="https://jared.lynskey.co.nz/vi/posts/2024/2024-01-04-githubforprojectmanagement/" >GitHub Issues</a> để chúng nằm ngay cạnh công việc.</p>
<p>Có hai điều giúp một kế hoạch như thế này thực sự vận hành. Dòng nào cũng có tên một người cụ thể ở cột cuối, và bản cập nhật cho ban lãnh đạo được viết ra chứ không chỉ nói miệng, nên có thể chuyển tiếp cho người khác mà không rơi rớt thông tin nào.</p>

<h4 class="relative group">Công cụ và nhịp làm việc
    <div id="công-cụ-và-nhịp-làm-việc" 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="#c%c3%b4ng-c%e1%bb%a5-v%c3%a0-nh%e1%bb%8bp-l%c3%a0m-vi%e1%bb%87c" aria-label="Cọc dấu">#</a>
    </span>
    
</h4>
<p>Công cụ không quan trọng bằng mức người ta hay cãi nhau về nó. Slack để nhắn tin, Trello để quản lý công việc, Zoom khi cần nhìn mặt nhau mà nói chuyện. Chọn cái hợp với đội mình rồi đi tiếp. Nhịp làm việc mới quan trọng hơn: họp nhanh hằng ngày (daily stand-up) nếu đội làm theo Agile, cập nhật hằng tuần nếu chu kỳ dài hơn, và quan trọng là giữ đúng nhịp đó. Rồi hãy ghi chép lại mọi thứ. Quyết định, thay đổi, đầu việc cần làm (action item), tất cả đều đưa vào Notion hay Jira, như một phần của quy trình chứ không phải chuyện tiện thì làm. Sáu tháng sau, tài liệu là thứ duy nhất còn nhớ chuyện gì đã xảy ra.</p>

<h4 class="relative group">Phần &ldquo;mềm&rdquo; mới là phần khó
    <div id="phần-mềm-mới-là-phần-khó" 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="#ph%e1%ba%a7n-m%e1%bb%81m-m%e1%bb%9bi-l%c3%a0-ph%e1%ba%a7n-kh%c3%b3" aria-label="Cọc dấu">#</a>
    </span>
    
</h4>
<p>Tất cả những gì ở trên chỉ là cơ chế. Việc khó hơn là hỏi cả đội xem cách giao tiếp hiện tại có thực sự hiệu quả không, và thay đổi khi nó không hiệu quả. Rồi còn chuyện đào tạo nữa: mỗi người trong đội đến từ một nền tảng khác nhau, và không phải ai cũng từng làm trong một dự án được vận hành tử tế. Còn phải biết lắng nghe cho đàng hoàng thay vì chỉ ngồi chờ đến lượt mình nói, và xử lý mâu thuẫn từ sớm, khi nó còn nhỏ. Mà chẳng có gì trong số này giải quyết một lần là xong: cách làm hiệu quả ở quý trước có thể lặng lẽ hết tác dụng, nên cứ phải kiểm tra lại thường xuyên.</p>

<h3 class="relative group">Làm việc trong một đội phát triển phân tán/bất đồng bộ
    <div id="làm-việc-trong-một-đội-phát-triển-phân-tánbất-đồng-bộ" 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="#l%c3%a0m-vi%e1%bb%87c-trong-m%e1%bb%99t-%c4%91%e1%bb%99i-ph%c3%a1t-tri%e1%bb%83n-ph%c3%a2n-t%c3%a1nb%e1%ba%a5t-%c4%91%e1%bb%93ng-b%e1%bb%99" aria-label="Cọc dấu">#</a>
    </span>
    
</h3>
<p>Nếu đội của bạn làm việc từ xa (remote) hoặc chủ yếu trao đổi bất đồng bộ (async), bài nói này rất đáng để bạn bỏ thời gian ra xem:
<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>Tôi không làm hoàn hảo được hết những điều này, mà cũng chẳng ai làm được. Nhưng nhìn lại thì dự án nào suôn sẻ cũng có phần lớn những thứ trên, còn dự án nào khiến tôi khổ sở thì đều thiếu ít nhất ba thứ.</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>Xem git graph trong terminal và VS Code: theo dõi tiến độ mà không quản lý vi mô</title>
      <link>https://jared.lynskey.co.nz/vi/posts/2023/2023-06-02-project-progress-git-graph/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/vi/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>Cách xem git graph: lệnh git log --graph và alias cho nó, so sánh hai nhánh, các chế độ xem biểu đồ trong VS Code, rồi cách tôi dùng nó để nắm tiến độ mà không quản lý vi mô cả đội.</description>
      <content:encoded><![CDATA[<p>Cách nhanh nhất để xem git graph (biểu đồ lịch sử Git) là dùng cửa sổ dòng lệnh (terminal): lệnh <code>git log --graph --oneline --all --decorate</code> vẽ tất cả các nhánh thành những đường kẻ bằng ký tự, mỗi commit nằm trên một dòng, tên nhánh và tag hiện ngay cạnh commit mà chúng trỏ tới. Còn trong VS Code, bạn có thể dùng Source Control Graph có sẵn trong khung Source Control, hoặc cài tiện ích mở rộng (extension) Git Graph để có biểu đồ lớn hơn và bấm vào được. Cả hai cách đều được hướng dẫn chi tiết ở cuối bài.</p>
<p>Chẳng ai thích bị hỏi &ldquo;việc đến đâu rồi?&rdquo;, nhưng đã là người dẫn dắt dự án ở công ty thì tôi vẫn phải nắm được tình hình. Cách dung hòa của tôi là biểu đồ lịch sử Git (git graph): trước khi hỏi ai điều gì, tôi mở nó ra xem trước, và phần lớn thời gian câu trả lời đã nằm sẵn ở đó. Chỉ cần liếc qua là thấy được hoạt động commit, các nhánh được tạo ra và hợp nhất (merge) vào ra sao, mà chẳng ai phải ngồi họp vì chuyện đó.</p>

<h3 class="relative group">Biểu đồ thực sự nói lên điều gì
    <div id="biểu-đồ-thực-sự-nói-lên-điều-gì" 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="#bi%e1%bb%83u-%c4%91%e1%bb%93-th%e1%bb%b1c-s%e1%bb%b1-n%c3%b3i-l%c3%aan-%c4%91i%e1%bb%81u-g%c3%ac" aria-label="Cọc dấu">#</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="Biểu đồ lịch sử Git"
    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>Nếu bạn chưa từng nhìn kỹ loại biểu đồ này: mỗi nút là một commit, mỗi đường tách ra là một nhánh, và cả biểu đồ đọc lên giống như dòng thời gian của dự án. Cách trình bày này chứa nhiều thông tin hơn bạn tưởng:</p>
<ul>
<li>Liếc một cái là biết đang có bao nhiêu nhánh hoạt động và commit được đẩy lên đều đặn cỡ nào.</li>
<li>Một nhánh bỗng dưng im ắng, hay một nhánh mấy tuần rồi chưa hợp nhất, thường có nghĩa là ai đó đang bị kẹt. Đây là tín hiệu cảnh báo sớm rất đáng giá.</li>
<li>Tần suất hợp nhất cho bạn biết cả đội đang phối hợp với nhau thế nào. Hợp nhất thường xuyên nghĩa là phần việc của mọi người thực sự đang được ghép lại với nhau; còn nhánh tồn tại quá lâu thường là dấu hiệu có người đang làm một mình một cõi.</li>
</ul>

<h3 class="relative group">Ít làm phiền hơn, trao đổi chất lượng hơn
    <div id="ít-làm-phiền-hơn-trao-đổi-chất-lượng-hơn" 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="#%c3%adt-l%c3%a0m-phi%e1%bb%81n-h%c6%a1n-trao-%c4%91%e1%bb%95i-ch%e1%ba%a5t-l%c6%b0%e1%bb%a3ng-h%c6%a1n" aria-label="Cọc dấu">#</a>
    </span>
    
</h3>
<p>Cái lợi dễ thấy nhất là tôi không phải làm phiền ai mới nắm được tình hình. Nhưng cái lợi lớn hơn nằm ở những lúc <em>thật sự</em> cần nói chuyện: cuộc trao đổi bắt đầu từ những gì biểu đồ cho thấy, chứ không phải từ phỏng đoán. &ldquo;Nhánh này đứng yên từ thứ Ba rồi, có gì đang vướng không?&rdquo; là câu mở đầu tốt hơn nhiều so với &ldquo;có gì mới không?&rdquo;</p>
<p>Nói rõ thói quen này cho mọi người biết cũng giúp ích. Tôi thường liếc nhanh vào hầu hết các buổi sáng, và xem kỹ mỗi tuần một lần. Cả đội đều biết nhịp đó, nên không ai bị bất ngờ.</p>

<h3 class="relative group">Đừng biến nó thành công cụ theo dõi nhân viên
    <div id="đừng-biến-nó-thành-công-cụ-theo-dõi-nhân-viên" 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="#%c4%91%e1%bb%abng-bi%e1%ba%bfn-n%c3%b3-th%c3%a0nh-c%c3%b4ng-c%e1%bb%a5-theo-d%c3%b5i-nh%c3%a2n-vi%c3%aan" aria-label="Cọc dấu">#</a>
    </span>
    
</h3>
<p>Đây là điều tôi phải tự nhắc mình hoài. Số lượng commit không đồng nghĩa với giá trị: một commit chỉn chu có khi đáng giá hơn năm mươi commit lặt vặt. Thấy được mọi commit không có nghĩa là bạn có quyền chất vấn mọi quyết định. Hãy tin đội của mình, và chỉ nhảy vào khi thấy một xu hướng thật sự có vấn đề. Còn khi đem biểu đồ ra trong một buổi trao đổi, hãy dùng nó làm điểm khởi đầu để góp ý, chứ không phải làm bằng chứng để buộc tội ai.</p>

<h3 class="relative group">Xem biểu đồ trong terminal
    <div id="xem-biểu-đồ-trong-terminal" 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="#xem-bi%e1%bb%83u-%c4%91%e1%bb%93-trong-terminal" aria-label="Cọc dấu">#</a>
    </span>
    
</h3>
<p>Chỉ cần có Git là đủ, không phải cài thêm gì:</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>Ý nghĩa của từng tùy chọn:</p>
<ul>
<li><code>--graph</code>: vẽ các đường nhánh và đường hợp nhất (merge) ở phía bên trái.</li>
<li><code>--oneline</code>: mỗi commit gói gọn trong một dòng, gồm mã hash rút gọn và dòng đầu tiên của thông điệp commit.</li>
<li><code>--all</code>: hiện tất cả các nhánh và tag, kể cả nhánh trên remote, chứ không chỉ nhánh bạn đang đứng.</li>
<li><code>--decorate</code>: in tên nhánh và tag cạnh commit mà chúng trỏ tới. Các bản Git gần đây đã tự làm việc này khi kết quả hiện ra terminal, nhưng thêm tùy chọn này thì khi bạn chuyển kết quả sang lệnh khác qua pipe, tên nhánh vẫn còn.</li>
</ul>
<p>Sáng nào cũng gõ nguyên câu lệnh dài như vậy thì mệt, nên hãy tạo một alias:</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>Với một kho mã (repository) đã chạy lâu năm, biểu đồ đầy đủ sẽ dài cuộn mãi không hết. Vài cách để thu gọn lại:</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"># chỉ hai tuần gần nhất</span>
</span></span><span class="line"><span class="cl">git graph -20                      <span class="c1"># chỉ 20 commit gần nhất</span>
</span></span><span class="line"><span class="cl">git log --graph --oneline main..feature                <span class="c1"># có ở feature, chưa có ở main</span>
</span></span><span class="line"><span class="cl">git log --graph --oneline --left-right main...feature  <span class="c1"># cả hai phía, đánh dấu &lt; và &gt;</span></span></span></code></pre></div></div>
<p>Hai dòng cuối dùng để so sánh hai nhánh. Ở đây tôi dùng <code>git log</code> thường chứ không dùng alias, vì alias có <code>--all</code> sẽ kéo tất cả các nhánh khác vào lại. Hai dấu chấm cho bạn thấy những gì <code>feature</code> có mà <code>main</code> chưa có. Ba dấu chấm kèm <code>--left-right</code> thì hiện cả hai phía, mỗi bên có gì mà bên kia không có, nên đây là cách nhanh để xem một nhánh tồn tại lâu đã đi lệch xa đến đâu.</p>

<h3 class="relative group">Xem biểu đồ trong VS Code
    <div id="xem-biểu-đồ-trong-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="#xem-bi%e1%bb%83u-%c4%91%e1%bb%93-trong-vs-code" aria-label="Cọc dấu">#</a>
    </span>
    
</h3>
<p>VS Code có sẵn biểu đồ. Mở khung Source Control (Ctrl+Shift+G), bạn sẽ thấy Source Control Graph là một phần trong khung đó; tính năng này có từ phiên bản 1.93 (tháng 8 năm 2024). Mặc định, biểu đồ chỉ bám theo nhánh hiện tại và nhánh remote tương ứng, nhưng bạn có thể thêm các nhánh khác bằng bộ chọn nhánh trên thanh tiêu đề của biểu đồ. Nếu chỉ cần liếc qua thì như vậy là đủ.</p>
<p>Muốn xem tất cả các nhánh cùng lúc thì cài extension Git Graph của tác giả mhutchie (tìm &ldquo;Git Graph&rdquo; trong khung Extensions). Bạn có thể mở nó bằng mục Git Graph trên thanh trạng thái (status bar), biểu tượng Git Graph ở đầu khung Source Control, hoặc lệnh <em>Git Graph: View Git Graph (git log)</em> trong Command Palette. Bấm vào một commit để xem các tệp đã thay đổi, hoặc bấm vào một commit rồi giữ Ctrl/Cmd bấm vào commit khác để so sánh hai commit với nhau. Extension này không có bản phát hành mới nào từ năm 2021, nên biết thêm cách dùng biểu đồ có sẵn của VS Code cũng không thừa.</p>
<p>Nếu không thấy nút Git Graph đâu, nhiều khả năng extension chưa tìm thấy repository nào. Theo mặc định, nó chỉ kiểm tra đúng thư mục bạn mở, không tìm vào các thư mục con. Hãy mở thẳng thư mục của repository, hoặc tăng giá trị <code>git-graph.maxDepthOfRepoSearch</code> trong phần cài đặt.</p>

<h3 class="relative group">Các công cụ khác
    <div id="các-công-cụ-khác" 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="#c%c3%a1c-c%c3%b4ng-c%e1%bb%a5-kh%c3%a1c" aria-label="Cọc dấu">#</a>
    </span>
    
</h3>
<p>Hầu hết công cụ Git đều có biểu đồ ở đâu đó. <code>gitk --all</code> là trình duyệt lịch sử commit có sẵn của chính Git. GitHub, GitLab và Bitbucket đều có chế độ xem &ldquo;network&rdquo; hoặc &ldquo;graph&rdquo; ngay trong trang repository. Các ứng dụng desktop như SourceTree (miễn phí, của Atlassian), GitKraken, Tower và TortoiseGit trên Windows cũng đều vẽ được biểu đồ.</p>
<p>Chọn công cụ nào cũng được, mục tiêu vẫn chỉ có một: hiểu tiến độ, chứ không phải đi đếm commit.</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>
