<?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>ADR · Nhân Tài Đức</title>
    <link>https://jared.lynskey.co.nz/vi/tags/adr/</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/adr/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Tài liệu ra quyết định (decision document) là gì? Hướng dẫn thực tế kèm mẫu</title>
      <link>https://jared.lynskey.co.nz/vi/posts/2024/2024-12-03-decision-docs/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/vi/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>Tài liệu ra quyết định (decision document) ghi lại một lựa chọn ngay lúc đưa ra: bối cảnh, các phương án đã cân nhắc và lý do chọn, để sáu tháng sau không ai phải tranh luận lại. Cách viết ADR và RFC mà mọi người thật sự dùng, kèm ADR mẫu và mẫu tài liệu.</description>
      <content:encoded><![CDATA[<p>Đội nào cũng phải ra quyết định. Nhưng phần lớn các đội lại quên mất vì sao mình đã quyết như vậy. Sáu tháng sau, có người hỏi &ldquo;sao hồi đó mình chọn PostgreSQL mà không chọn MongoDB?&rdquo;, chẳng ai còn nhớ những ràng buộc lúc ấy, thế là cả cuộc tranh luận lại diễn ra từ đầu, mà thường còn ít người tham gia hơn lần trước.</p>
<p>Tài liệu ra quyết định sinh ra để giải quyết đúng chuyện đó. Gọi là ADR, RFC hay decision log cũng được, cái tên không quan trọng. Quan trọng là ghi lại bối cảnh, các phương án và lập luận ngay tại thời điểm lựa chọn. Năm nay, khi quản lý một đội lập trình viên, tôi càng thấm giá trị của loại tài liệu này hơn bao giờ hết: có nó thì tổ chức có trí nhớ thật, không có thì chỉ còn lại những lời truyền miệng.</p>
<hr>

<h3 class="relative group">Vì sao đáng bỏ công
    <div id="vì-sao-đáng-bỏ-công" 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-%c4%91%c3%a1ng-b%e1%bb%8f-c%c3%b4ng" aria-label="Cọc dấu">#</a>
    </span>
    
</h3>
<p>Cái lợi dễ thấy nhất là không phải cãi nhau về cùng một chuyện hai lần. &ldquo;Ơ, chiến lược quản lý phiên bản (versioning) cho API mình chốt rồi mà nhỉ?&rdquo; Khi có một bản ghi rõ ràng về điều đã quyết và lý do, chuyện gì đã xong sẽ nằm yên, và cả đội dồn sức vào làm thay vì quay lại đi con đường cũ.</p>
<p>Cái lợi âm thầm hơn thì phải một thời gian mới lộ ra. Dự án kéo dài hàng tháng, hàng năm, người đến rồi người đi, thứ còn lại chỉ là mã nguồn. Mã nguồn cho bạn biết <em>điều gì</em> đã được quyết, nhưng không bao giờ cho biết <em>vì sao</em>. Tài liệu ra quyết định thì giữ lại được lập luận: lúc đó có những ràng buộc gì, phương án nào đã bị loại, ai là người chốt. Người mới vào có bối cảnh để hiểu, thay vì chỉ nghe kể lại. Những quyết định liên quan tới nhiều đội cũng nhận được sự đồng thuận thật, vì ai cũng thấy các yếu tố đã được cân nhắc thế nào, chứ không chỉ thấy kết luận cuối cùng. Và khi tài liệu ghi rõ ai ra quyết định, ai đóng góp ý kiến, thì phần việc tiếp theo sẽ có người thật sự chịu trách nhiệm.</p>
<hr>

<h3 class="relative group">Khi nào nên viết
    <div id="khi-nào-nên-viết" 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-vi%e1%ba%bft" aria-label="Cọc dấu">#</a>
    </span>
    
</h3>
<p>Không phải quyết định nào cũng đáng một tài liệu. Tôi chỉ viết khi quyết định đó:</p>
<ul>
<li><strong>Tốn kém nếu muốn quay đầu</strong>: chọn bộ công nghệ (tech stack) như framework, cơ sở dữ liệu hay nhà cung cấp điện toán đám mây; chọn mẫu kiến trúc (vi dịch vụ (microservices) hay nguyên khối (monolith), hướng sự kiện hay yêu cầu-phản hồi); chọn nhà cung cấp bên thứ ba; hay cách tiếp cận về bảo mật và tuân thủ</li>
<li><strong>Có tác động lâu dài</strong>: hợp đồng API mà các hệ thống bên ngoài phụ thuộc vào, mô hình dữ liệu trải qua nhiều dịch vụ, hoặc những thay đổi phá vỡ các mẫu thiết kế đã thành nếp</li>
<li><strong>Liên quan tới nhiều đội</strong>: bất cứ thứ gì cần nhiều đội hoặc các bên liên quan không làm kỹ thuật cùng đồng ý, các quyết định về phân bổ nguồn lực và thứ tự ưu tiên</li>
<li><strong>Là kết quả của một đợt <a href="https://jared.lynskey.co.nz/vi/posts/2023/2023-10-18-spike/" >spike</a></strong>: khi một đợt tìm hiểu có giới hạn thời gian vừa kết thúc, hãy ghi lại những gì tìm được và quyết định rút ra trước khi mọi người quên sạch</li>
</ul>
<p>Với những quyết định dễ đảo ngược, những chi tiết triển khai nội bộ trong đội, hay những thứ gần như không ảnh hưởng ra ngoài phạm vi trực tiếp của bạn, thì bỏ qua thủ tục. Một tài liệu không ai cần tới thì chỉ là bài tập về nhà.</p>
<hr>

<h3 class="relative group">Vòng đời
    <div id="vòng-đời" 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%b2ng-%c4%91%e1%bb%9di" aria-label="Cọc dấu">#</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">│   Draft     │ ──► │   Review    │ ──► │  Approved   │ ──► │ Implemented │
</span></span><span class="line"><span class="cl">│  Proposed   │     │  Feedback   │     │  Accepted   │     │  Completed  │
</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">                    │  Rejected/  │
</span></span><span class="line"><span class="cl">                    │  Superseded │
</span></span><span class="line"><span class="cl">                    └─────────────┘</span></span></code></pre></div></div>
<p>Người viết phác thảo vấn đề và các giải pháp có thể chọn. Sau đó các bên liên quan đọc và góp ý. Đây là giai đoạn làm nên giá trị của cả quá trình, vì đây là lúc các giả định bị chất vấn và những điểm mù lộ ra. Người ra quyết định (thường là trưởng nhóm kỹ thuật, kiến trúc sư hoặc người phụ trách sản phẩm) chốt lần cuối, đội bắt tay triển khai, và nếu thực tế buộc phải thay đổi giữa chừng thì tài liệu được cập nhật theo. Có tài liệu chết ngay ở vòng góp ý, có tài liệu về sau bị thay thế khi hoàn cảnh đổi khác. Trường hợp nào cũng phải đánh dấu cho rõ, vì một tài liệu &ldquo;accepted&rdquo; đã lỗi thời chính là cái bẫy cho người tiếp theo tìm thấy nó.</p>
<hr>

<h3 class="relative group">Tài liệu thế nào thì đáng đọc
    <div id="tài-liệu-thế-nào-thì-đáng-đọ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="#t%c3%a0i-li%e1%bb%87u-th%e1%ba%bf-n%c3%a0o-th%c3%ac-%c4%91%c3%a1ng-%c4%91%e1%bb%8dc" aria-label="Cọc dấu">#</a>
    </span>
    
</h3>
<p>Bắt đầu từ vấn đề, đừng bắt đầu từ giải pháp bạn thích nhất. Mình đang giải quyết chuyện gì, vì sao lúc này chuyện đó quan trọng, và nếu không làm gì thì sẽ ra sao? Khi mọi người còn chưa thống nhất vấn đề là gì, thì tranh luận về giải pháp chỉ là diễn kịch.</p>
<p>Tiếp theo, đưa ra các phương án thật sự, ít nhất hai hoặc ba, kể cả khi bạn đã nghiêng hẳn về một cái. Mỗi phương án cần có: mô tả ngắn, ưu và nhược điểm, ước lượng công sức sơ bộ (ước theo cỡ áo S/M/L/XL là đủ), cùng các rủi ro và cách bạn sẽ giảm thiểu chúng. Có ghi lại các phương án thay thế thì người đọc sau này mới hiểu vì sao phương án được chọn lại thắng.</p>
<p>Nói thẳng ra những đánh đổi. &ldquo;Chúng tôi chọn ra thị trường nhanh hơn, chấp nhận kiến trúc không được đẹp.&rdquo; &ldquo;Chúng tôi chấp nhận vận hành phức tạp hơn để đổi lấy khả năng mở rộng quy mô tốt hơn.&rdquo; &ldquo;Chúng tôi ưu tiên trải nghiệm của lập trình viên hơn hiệu năng thuần.&rdquo; Chỉ vài câu như vậy thôi đã giúp người đọc sau này nhiều hơn cả chục trang phân tích.</p>
<p>Neo cuộc thảo luận vào những thứ cụ thể: đoạn mã minh hoạ giải pháp sẽ trông ra sao, sơ đồ tương tác giữa các hệ thống, liên kết tới các bản thử nghiệm khái niệm (proof of concept) từ những đợt <a href="https://jared.lynskey.co.nz/vi/posts/2023/2023-10-18-spike/" >spike</a>. Thảo luận chung chung thì chỉ sinh ra quyết định chung chung.</p>
<p>Cuối cùng, đặt hạn chót: khi nào phải ra quyết định, ai phải góp ý trước ngày nào, và những việc gì đang bị kẹt lại trong lúc chờ. Quyết định mà không có hạn chót thì sẽ bị treo mãi.</p>
<hr>

<h3 class="relative group">Ví dụ: Architecture Decision Record (ADR)
    <div id="ví-dụ-architecture-decision-record-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="#v%c3%ad-d%e1%bb%a5-architecture-decision-record-adr" aria-label="Cọc dấu">#</a>
    </span>
    
</h3>
<p>Dưới đây là một ví dụ thực tế về tài liệu ra quyết định:</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">Mẫu tài liệu, cứ lấy về mà dùng
    <div id="mẫu-tài-liệu-cứ-lấy-về-mà-dùng" 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-t%c3%a0i-li%e1%bb%87u-c%e1%bb%a9-l%e1%ba%a5y-v%e1%bb%81-m%c3%a0-d%c3%b9ng" aria-label="Cọc dấu">#</a>
    </span>
    
</h3>
<p>Lấy mẫu (template) này làm điểm xuất phát, rồi cắt gọt cho vừa với đội của bạn:</p>
<table>
	<thead>
			<tr>
					<th><strong>Mục</strong></th>
					<th><strong>Nội dung</strong></th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><strong>Tên quyết định/vấn đề</strong></td>
					<td>[Tiêu đề ngắn gọn, nói rõ nội dung]</td>
			</tr>
			<tr>
					<td><strong>Trạng thái</strong></td>
					<td>[Draft / In Review / Accepted / Rejected / Superseded]</td>
			</tr>
			<tr>
					<td><strong>Mức độ ảnh hưởng</strong></td>
					<td>[Cao / Trung bình / Thấp]</td>
			</tr>
			<tr>
					<td><strong>Người phụ trách</strong></td>
					<td>[Người dẫn dắt quá trình ra quyết định]</td>
			</tr>
			<tr>
					<td><strong>Người ra quyết định</strong></td>
					<td>[Người có quyền quyết cuối cùng]</td>
			</tr>
			<tr>
					<td><strong>Hạn chót</strong></td>
					<td>[Ngày phải ra quyết định]</td>
			</tr>
	</tbody>
</table>

<h4 class="relative group">Mô tả vấn đề
    <div id="mô-tả-vấ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="#m%c3%b4-t%e1%ba%a3-v%e1%ba%a5n-%c4%91%e1%bb%81" aria-label="Cọc dấu">#</a>
    </span>
    
</h4>
<p><em>Mình đang giải quyết vấn đề gì? Vì sao nó quan trọng? Không làm gì thì phải trả giá thế nào?</em></p>

<h4 class="relative group">Bối cảnh
    <div id="bối-cảnh" 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="#b%e1%bb%91i-c%e1%ba%a3nh" aria-label="Cọc dấu">#</a>
    </span>
    
</h4>
<p><em>Nêu bối cảnh, lịch sử và các chi tiết liên quan. Dẫn liên kết tới những tài liệu liên quan, các quyết định trước đó, hoặc kết quả spike.</em></p>

<h4 class="relative group">Ràng buộc
    <div id="ràng-buộ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="#r%c3%a0ng-bu%e1%bb%99c" aria-label="Cọc dấu">#</a>
    </span>
    
</h4>
<p><em>Giải pháp nào cũng phải tuân theo những giới hạn hay yêu cầu gì?</em></p>
<ul>
<li>Ràng buộc về ngân sách</li>
<li>Yêu cầu về tiến độ</li>
<li>Ràng buộc kỹ thuật (hệ thống hiện có, kỹ năng của đội)</li>
<li>Yêu cầu về tuân thủ hoặc bảo mật</li>
</ul>

<h4 class="relative group">Các giải pháp đã cân nhắc
    <div id="các-giải-pháp-đã-cân-nhắ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-gi%e1%ba%a3i-ph%c3%a1p-%c4%91%c3%a3-c%c3%a2n-nh%e1%ba%afc" aria-label="Cọc dấu">#</a>
    </span>
    
</h4>
<table>
	<thead>
			<tr>
					<th><strong>Phương án</strong></th>
					<th><strong>Mô tả</strong></th>
					<th><strong>Ưu điểm</strong></th>
					<th><strong>Nhược điểm</strong></th>
					<th><strong>Công sức</strong></th>
					<th><strong>Rủi ro</strong></th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><strong>Phương án 1</strong></td>
					<td><em>Mô tả</em></td>
					<td><em>Ưu A, Ưu B</em></td>
					<td><em>Nhược A, Nhược B</em></td>
					<td><em>S/M/L/XL</em></td>
					<td><em>Thấp/TB/Cao</em></td>
			</tr>
			<tr>
					<td><strong>Phương án 2</strong></td>
					<td><em>Mô tả</em></td>
					<td><em>Ưu A, Ưu B</em></td>
					<td><em>Nhược A, Nhược B</em></td>
					<td><em>S/M/L/XL</em></td>
					<td><em>Thấp/TB/Cao</em></td>
			</tr>
			<tr>
					<td><strong>Phương án 3</strong></td>
					<td><em>Mô tả</em></td>
					<td><em>Ưu A, Ưu B</em></td>
					<td><em>Nhược A, Nhược B</em></td>
					<td><em>S/M/L/XL</em></td>
					<td><em>Thấp/TB/Cao</em></td>
			</tr>
	</tbody>
</table>

<h4 class="relative group">Đề xuất
    <div id="đề-xuất" 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%81-xu%e1%ba%a5t" aria-label="Cọc dấu">#</a>
    </span>
    
</h4>
<p><em>Nêu phương án bạn đề xuất, và tóm tắt vì sao với các ràng buộc và đánh đổi hiện có, đó là lựa chọn tốt nhất.</em></p>

<h4 class="relative group">Quyết định
    <div id="quyết-định" 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%e1%ba%bft-%c4%91%e1%bb%8bnh" aria-label="Cọc dấu">#</a>
    </span>
    
</h4>
<p><em>Chốt xong thì ghi lại quyết định cuối cùng. Nếu khác với đề xuất, giải thích lý do.</em></p>

<h4 class="relative group">Hệ quả
    <div id="hệ-quả" 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="#h%e1%bb%87-qu%e1%ba%a3" aria-label="Cọc dấu">#</a>
    </span>
    
</h4>
<p><em>Quyết định này kéo theo những gì? Cần làm tiếp những việc gì?</em></p>

<h4 class="relative group">Việc cần làm
    <div id="việc-cần-là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="#vi%e1%bb%87c-c%e1%ba%a7n-l%c3%a0m" aria-label="Cọc dấu">#</a>
    </span>
    
</h4>
<table>
	<thead>
			<tr>
					<th><strong>Việc cần làm</strong></th>
					<th><strong>Người phụ trách</strong></th>
					<th><strong>Hạn chót</strong></th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><em>Việc 1</em></td>
					<td><em>Tên</em></td>
					<td><em>Ngày</em></td>
			</tr>
			<tr>
					<td><em>Việc 2</em></td>
					<td><em>Tên</em></td>
					<td><em>Ngày</em></td>
			</tr>
	</tbody>
</table>

<h4 class="relative group">Tài liệu tham khảo
    <div id="tài-liệu-tham-khảo" 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="#t%c3%a0i-li%e1%bb%87u-tham-kh%e1%ba%a3o" aria-label="Cọc dấu">#</a>
    </span>
    
</h4>
<p><em>Liên kết tới các tài liệu liên quan, nguồn bên ngoài, kết quả spike, hoặc các quyết định trước đó.</em></p>
<hr>

<h3 class="relative group">Làm sao để thói quen này bám rễ
    <div id="làm-sao-để-thói-quen-này-bám-rễ" 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-sao-%c4%91%e1%bb%83-th%c3%b3i-quen-n%c3%a0y-b%c3%a1m-r%e1%bb%85" aria-label="Cọc dấu">#</a>
    </span>
    
</h3>
<p>Lưu tài liệu ở một chỗ cố định, chẳng hạn một thư mục riêng trong kho mã nguồn (repo) hay một không gian trên wiki, vì một quyết định không ai tìm thấy thì cũng như chưa từng có. Viết thật gọn nhẹ thôi; tài liệu mà mất cả mấy ngày mới viết xong thì sẽ chẳng bao giờ có ai viết. Nhắc tới chúng trong chú thích trong mã, thông điệp commit và pull request, để phần &ldquo;vì sao&rdquo; luôn đi liền với phần &ldquo;cái gì&rdquo;. Khi một quyết định bị thay thế, đừng xoá tài liệu cũ, mà hãy đánh dấu nó là superseded rồi dẫn liên kết sang tài liệu mới; giữ lại lịch sử mới là mục đích. Và hãy mang các quyết định cũ ra xem lại trong những <a href="https://jared.lynskey.co.nz/vi/posts/2023/2023-09-01-retrospecs/" >buổi họp nhìn lại (retrospective)</a>: cái nào vẫn còn đứng vững, cái nào bây giờ bạn sẽ quyết khác đi.</p>
<p>Những kiểu thất bại thì cũng dễ đoán y như vậy. Phân tích mãi mà không quyết được: hãy đặt hạn chót, quyết dựa trên thông tin đang có, và nhớ rằng phần lớn quyết định đều có thể xem xét lại. Góp ý cho có, chỉ để đóng dấu mà không bao giờ có phản biện thật, thì chỉ thêm quy trình chứ không thêm giá trị. Tài liệu viết xong rồi bỏ đó, không dẫn tới hành động nào, còn tệ hơn là không có tài liệu. Quá nhiều chi tiết cũng là một lỗi: tài liệu nên nói về vì sao và cái gì, không phải làm thế nào; phần triển khai là việc của bản đặc tả kỹ thuật. Và khi các bên liên quan bất đồng, hãy ghi lại ý kiến phản đối. Quyết định có thể vẫn giữ nguyên, nhưng chính lời phản đối đó là bối cảnh mà một năm sau sẽ có người cần tới.</p>
<p>Hãy bắt đầu từ quyết định quan trọng tiếp theo của bạn. Cứ viết ra, dù còn thô, rồi vừa làm vừa chỉnh lại quy trình. Mỗi cuộc họp &ldquo;sao hồi đó mình chọn X?&rdquo; không cần diễn ra nữa vì ai đó chỉ việc mở ADR ra đọc, là thêm một tiếng đồng hồ đội bạn lấy lại được.</p>
<hr>

<h3 class="relative group">Đọc thêm
    <div id="đọc-thê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="#%c4%91%e1%bb%8dc-th%c3%aam" aria-label="Cọc dấu">#</a>
    </span>
    
</h3>
<p><strong>Bài viết liên quan trên blog này:</strong></p>
<ul>
<li><a href="https://jared.lynskey.co.nz/vi/posts/2023/2023-10-18-spike/" >Tìm hiểu về spike trong phát triển phần mềm Agile</a> - làm một đợt spike để thu thập thông tin trước khi chốt quyết định lớn</li>
<li><a href="https://jared.lynskey.co.nz/vi/posts/2023/2023-09-01-retrospecs/" >Họp nhìn lại: sức mạnh của vòng lặp phản hồi</a> - xem lại các quyết định cũ như một phần của quá trình cải tiến liên tục</li>
<li><a href="https://jared.lynskey.co.nz/vi/posts/2023/2023-10-08-planning-an-api/" >Lên kế hoạch cho một API</a> - áp dụng tư duy tài liệu ra quyết định vào thiết kế API</li>
<li><a href="https://jared.lynskey.co.nz/vi/posts/2024/2024-01-04-githubforprojectmanagement/" >Dùng GitHub để quản lý dự án</a> - để tài liệu ra quyết định nằm ngay cạnh mã nguồn</li>
</ul>
<p><strong>Tài liệu bên ngoài:</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> - bài viết gốc đã giúp ADR trở nên phổ biến</li>
<li><a href="https://adr.github.io/"  target="_blank" rel="noreferrer">ADR GitHub Organization</a> - công cụ, mẫu tài liệu và ví dụ cho Architecture Decision Record</li>
<li><a href="https://www.industrialempathy.com/posts/design-docs-at-google/"  target="_blank" rel="noreferrer">Design Docs at Google</a> - cách Google viết tài liệu thiết kế</li>
<li><a href="https://rust-lang.github.io/rfcs/"  target="_blank" rel="noreferrer">Quy trình RFC của Rust</a> - quy trình RFC của ngôn ngữ Rust, được ghi chép rất kỹ</li>
<li><a href="https://engineering.atspotify.com/2020/04/when-should-i-write-an-architecture-decision-record/"  target="_blank" rel="noreferrer">Mẫu Decision Record của Spotify</a> - góc nhìn của Spotify về chuyện khi nào nên viết 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>
  </channel>
</rss>
