<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://tiennhm.io.vn/blog</id>
    <title>TienNHM - Fullstack Developer Blog Blog</title>
    <updated>2026-09-12T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://tiennhm.io.vn/blog"/>
    <subtitle>TienNHM - Fullstack Developer Blog Blog</subtitle>
    <icon>https://tiennhm.io.vn/https://github.com/TienNHM.png</icon>
    <entry>
        <title type="html"><![CDATA[Vì sao .NET ngốn 96% RAM container dù app đang rảnh? Server GC và cách giảm 65% bộ nhớ]]></title>
        <id>https://tiennhm.io.vn/blog/dotnet-workstation-gc-giam-ram-container</id>
        <link href="https://tiennhm.io.vn/blog/dotnet-workstation-gc-giam-ram-container"/>
        <updated>2026-09-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Một container .NET 9 chiếm 987 MiB trên trần 1 GiB dù suốt 2 giờ không có request nào. Thủ phạm không phải rò rỉ bộ nhớ mà là Server GC — mặc định của ASP.NET Core. Bài viết ghi lại toàn bộ quá trình chẩn đoán bằng cgroup v2, cách phân biệt retained heap với memory leak, và kết quả đo thật sau khi chuyển sang Workstation GC: bộ nhớ anon giảm từ 822 MB xuống 280 MB.]]></summary>
        <content type="html"><![CDATA[<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p>Một container ASP.NET Core 9 chiếm 987 MiB trên trần 1 GiB (96%) dù suốt 2 giờ không nhận request nào. Đây <strong>không phải rò rỉ bộ nhớ</strong>: mức RAM đứng yên tuyệt đối qua nhiều lần đo, dấu hiệu của heap bị giữ lại chứ không phải rò rỉ. Nguyên nhân là <strong>Server GC</strong> — mặc định của ASP.NET Core, tạo một heap cho mỗi CPU core và rất ít trả bộ nhớ về hệ điều hành. Đặt <code>DOTNET_gcServer=0</code> và <code>DOTNET_GCConserveMemory=5</code> giảm bộ nhớ anon từ <strong>822 MB xuống 280 MB (−65%)</strong>, đo ổn định sau 30 phút. Đánh đổi: Workstation GC cho throughput thấp hơn khi tải cao và nhiều core.</p></div></div>
<p>Bài này ghi lại một buổi chẩn đoán thật trên VPS 4 core / 8 GB RAM đang chạy song song 9 site WordPress và một API .NET. Mọi con số bên dưới là số đo thật, không phải ví dụ minh hoạ.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="triệu-chứng">Triệu chứng<a href="https://tiennhm.io.vn/blog/dotnet-workstation-gc-giam-ram-container#tri%E1%BB%87u-ch%E1%BB%A9ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến Triệu chứng" title="Đường dẫn trực tiếp đến Triệu chứng" translate="no">​</a></h2>
<p><code>docker stats</code> cho con số đáng báo động:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> stats --no-stream </span><span class="token parameter variable" style="color:#36acaa">--format</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{{.Name}} {{.MemUsage}} {{.MemPerc}}'</span><span class="token plain"> vievent-api</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">vievent-api </span><span class="token number" style="color:#36acaa">987</span><span class="token plain">.6MiB / 1GiB </span><span class="token number" style="color:#36acaa">96.45</span><span class="token plain">%</span><br></span></code></pre></div></div>
<p>Container đã chạy 2 tuần, <code>RestartCount=2</code>, trạng thái <code>healthy</code>. Ứng dụng là ABP 9.2 trên .NET 9.0.17, database PostgreSQL, cache Redis.</p>
<p>Phản xạ đầu tiên của hầu hết chúng ta: <em>"rò rỉ bộ nhớ rồi"</em>. Phản xạ đó sai, và mất khá nhiều thời gian mới nhận ra.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bẫy-thứ-nhất-docker-stats-không-nói-cho-bạn-con-số-quan-trọng">Bẫy thứ nhất: <code>docker stats</code> không nói cho bạn con số quan trọng<a href="https://tiennhm.io.vn/blog/dotnet-workstation-gc-giam-ram-container#b%E1%BA%ABy-th%E1%BB%A9-nh%E1%BA%A5t-docker-stats-kh%C3%B4ng-n%C3%B3i-cho-b%E1%BA%A1n-con-s%E1%BB%91-quan-tr%E1%BB%8Dng" class="hash-link" aria-label="Đường dẫn trực tiếp đến bẫy-thứ-nhất-docker-stats-không-nói-cho-bạn-con-số-quan-trọng" title="Đường dẫn trực tiếp đến bẫy-thứ-nhất-docker-stats-không-nói-cho-bạn-con-số-quan-trọng" translate="no">​</a></h2>
<p><code>MemUsage</code> trong <code>docker stats</code> <strong>bao gồm cả page cache</strong> — phần bộ nhớ kernel dùng đệm file, và kernel sẵn sàng thu hồi bất cứ lúc nào khi thiếu RAM. Nó không phải áp lực bộ nhớ thật.</p>
<p>Con số thật nằm trong cgroup v2:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> </span><span class="token builtin class-name">exec</span><span class="token plain"> vievent-api </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-lc</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'grep -E "^(anon|file) " /sys/fs/cgroup/memory.stat'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">anon </span><span class="token number" style="color:#36acaa">862392320</span><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 822 MB — bộ nhớ thật của tiến trình, KHÔNG thu hồi được</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">file</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">169017344</span><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 161 MB — page cache, kernel tự nhả khi cần</span><br></span></code></pre></div></div>
<p>Vậy áp lực thật là <strong>822 MB / 1024 MB = 80%</strong>, không phải 96%. Vẫn cao, nhưng khoảng đệm trước khi bị OOM kill rộng hơn con số ban đầu gợi ý.</p>
<p>Bài học đầu tiên: khi điều tra bộ nhớ container, <strong>luôn đọc <code>anon</code> trong <code>memory.stat</code></strong>, đừng dừng ở <code>docker stats</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bẫy-thứ-hai-ram-cao-không-đồng-nghĩa-rò-rỉ">Bẫy thứ hai: RAM cao không đồng nghĩa rò rỉ<a href="https://tiennhm.io.vn/blog/dotnet-workstation-gc-giam-ram-container#b%E1%BA%ABy-th%E1%BB%A9-hai-ram-cao-kh%C3%B4ng-%C4%91%E1%BB%93ng-ngh%C4%A9a-r%C3%B2-r%E1%BB%89" class="hash-link" aria-label="Đường dẫn trực tiếp đến Bẫy thứ hai: RAM cao không đồng nghĩa rò rỉ" title="Đường dẫn trực tiếp đến Bẫy thứ hai: RAM cao không đồng nghĩa rò rỉ" translate="no">​</a></h2>
<p>Đây mới là chỗ quyết định. Hai dữ kiện lật ngược chẩn đoán ban đầu:</p>
<p><strong>Thứ nhất — ứng dụng đang hoàn toàn rảnh.</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> logs </span><span class="token parameter variable" style="color:#36acaa">--since</span><span class="token plain"> 2h vievent-api </span><span class="token operator file-descriptor important" style="color:#393A34">2</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token file-descriptor important">&amp;1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">wc</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">0</span><br></span></code></pre></div></div>
<p>Không một dòng log nào trong 2 giờ. Không có request, không có background job nào ghi log.</p>
<p><strong>Thứ hai — mức RAM đứng yên tuyệt đối.</strong></p>
<p>Ba lần đo cách nhau 5 giây cho <strong>cùng một con số đến từng chữ số thập phân</strong>: <code>987.6MiB</code>, <code>987.6MiB</code>, <code>987.6MiB</code>.</p>
<p>Rò rỉ bộ nhớ thì phải <em>tăng</em>. Một ứng dụng rảnh mà giữ 822 MB bất động không phải đang rò rỉ — nó đang <strong>giữ lại heap đã cấp phát</strong> và không trả về hệ điều hành.</p>
<p>Phân biệt được hai thứ này quyết định toàn bộ hướng xử lý. Nếu đi theo hướng "rò rỉ", bạn sẽ mất hàng giờ soi memory dump, tìm sự kiện chưa hủy đăng ký, tìm <code>IDisposable</code> chưa dispose — trong khi vấn đề nằm ở một dòng cấu hình.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nguyên-nhân-server-gc-là-mặc-định-của-aspnet-core">Nguyên nhân: Server GC là mặc định của ASP.NET Core<a href="https://tiennhm.io.vn/blog/dotnet-workstation-gc-giam-ram-container#nguy%C3%AAn-nh%C3%A2n-server-gc-l%C3%A0-m%E1%BA%B7c-%C4%91%E1%BB%8Bnh-c%E1%BB%A7a-aspnet-core" class="hash-link" aria-label="Đường dẫn trực tiếp đến Nguyên nhân: Server GC là mặc định của ASP.NET Core" title="Đường dẫn trực tiếp đến Nguyên nhân: Server GC là mặc định của ASP.NET Core" translate="no">​</a></h2>
<p>Kiểm tra biến môi trường trong container:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> </span><span class="token builtin class-name">exec</span><span class="token plain"> vievent-api </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-lc</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'env | grep -i "^DOTNET_"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">DOTNET_RUNNING_IN_CONTAINER</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">DOTNET_VERSION</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">9.0</span><span class="token plain">.17</span><br></span></code></pre></div></div>
<p>Không có một dòng cấu hình GC nào. Tức là runtime đang chạy với <strong>toàn bộ mặc định</strong>, và mặc định của ASP.NET Core là <code>ServerGarbageCollection=true</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="server-gc-khác-workstation-gc-ở-đâu">Server GC khác Workstation GC ở đâu<a href="https://tiennhm.io.vn/blog/dotnet-workstation-gc-giam-ram-container#server-gc-kh%C3%A1c-workstation-gc-%E1%BB%9F-%C4%91%C3%A2u" class="hash-link" aria-label="Đường dẫn trực tiếp đến Server GC khác Workstation GC ở đâu" title="Đường dẫn trực tiếp đến Server GC khác Workstation GC ở đâu" translate="no">​</a></h3>
<p><strong>Server GC</strong> được thiết kế cho máy chủ nhiều core, tải cao, ưu tiên <strong>throughput</strong>:</p>
<ul>
<li class="">Tạo <strong>một heap riêng cho mỗi CPU core</strong>, kèm một luồng GC riêng</li>
<li class="">Cho phép heap phình to hơn để <strong>giảm số lần GC</strong></li>
<li class=""><strong>Rất ít trả bộ nhớ về hệ điều hành</strong> — giữ lại để lần cấp phát sau không phải xin lại kernel</li>
</ul>
<p><strong>Workstation GC</strong> ưu tiên <strong>độ trễ thấp và tiết kiệm bộ nhớ</strong>:</p>
<ul>
<li class="">Một heap dùng chung</li>
<li class="">GC thường xuyên hơn, mỗi lần nhẹ hơn</li>
<li class="">Trả bộ nhớ về hệ điều hành sớm hơn nhiều</li>
</ul>
<p>Với một API lưu lượng thấp nằm trong container 1 GiB, Server GC là lãng phí thuần: bạn trả bằng RAM cho một throughput mà bạn không hề dùng tới.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="vì-sao-con-số-dừng-lại-quanh-800-mb">Vì sao con số dừng lại quanh 800 MB<a href="https://tiennhm.io.vn/blog/dotnet-workstation-gc-giam-ram-container#v%C3%AC-sao-con-s%E1%BB%91-d%E1%BB%ABng-l%E1%BA%A1i-quanh-800-mb" class="hash-link" aria-label="Đường dẫn trực tiếp đến Vì sao con số dừng lại quanh 800 MB" title="Đường dẫn trực tiếp đến Vì sao con số dừng lại quanh 800 MB" translate="no">​</a></h3>
<p>Khi phát hiện đang chạy trong container có giới hạn bộ nhớ, .NET tự đặt <strong>GC heap hard limit bằng 75% giới hạn cgroup</strong>. Với trần 1 GiB, heap được phép dùng tới khoảng <strong>768 MB</strong>.</p>
<p>Server GC thoải mái phình tới sát ngưỡng đó rồi giữ nguyên. Con số 822 MB anon — gồm GC heap cộng bộ nhớ native, stack các luồng, JIT code — khớp chính xác với hành vi này. Runtime không hề sai; nó đang làm đúng thứ nó được thiết kế để làm.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cách-sửa">Cách sửa<a href="https://tiennhm.io.vn/blog/dotnet-workstation-gc-giam-ram-container#c%C3%A1ch-s%E1%BB%ADa" class="hash-link" aria-label="Đường dẫn trực tiếp đến Cách sửa" title="Đường dẫn trực tiếp đến Cách sửa" translate="no">​</a></h2>
<div class="checklist_dRdd"><h3 class="checklist__title_Ujfb">Các bước áp dụng</h3><ul class="checklist__unordered_umVo"><li class="checklistItem_Vvkv"><span class="checklistItem__marker_jYCF">•</span><span class="checklistItem__text_I1h0">Đọc anon trong /sys/fs/cgroup/memory.stat để có con số thật, đừng tin docker stats</span></li><li class="checklistItem_Vvkv"><span class="checklistItem__marker_jYCF">•</span><span class="checklistItem__text_I1h0">Đo nhiều lần cách quãng — đứng yên là retained heap, tăng dần mới là rò rỉ</span></li><li class="checklistItem_Vvkv"><span class="checklistItem__marker_jYCF">•</span><span class="checklistItem__text_I1h0">Kiểm tra env trong container xem đã có cấu hình GC nào chưa</span></li><li class="checklistItem_Vvkv"><span class="checklistItem__marker_jYCF">•</span><span class="checklistItem__text_I1h0">Đặt DOTNET_gcServer=0 và DOTNET_GCConserveMemory=5</span></li><li class="checklistItem_Vvkv"><span class="checklistItem__marker_jYCF">•</span><span class="checklistItem__text_I1h0">Nâng trần RAM làm đệm — bổ sung chứ không thay thế việc đổi GC</span></li><li class="checklistItem_Vvkv"><span class="checklistItem__marker_jYCF"><input type="checkbox" readonly="" class="checklistItem__checkbox_aMgn" aria-label="Recreate container rồi đo lại ở nhiều mốc thời gian, không kết luận ngay lúc vừa khởi động" checked=""></span><span class="checklistItem__text_I1h0">Recreate container rồi đo lại ở nhiều mốc thời gian, không kết luận ngay lúc vừa khởi động</span></li></ul></div>
<p>Trong <code>docker-compose.yml</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">services</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">api</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ASPNETCORE_URLS=http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//+</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Chuyển từ Server GC sang Workstation GC</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> DOTNET_gcServer=0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Thang 0-9, càng cao GC càng tích cực nén và nhả bộ nhớ</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> DOTNET_GCConserveMemory=5</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">deploy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 1.5G</span><br></span></code></pre></div></div>
<p>Hoặc khai trong <code>.csproj</code> nếu muốn gắn vào chính ứng dụng:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">PropertyGroup</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">ServerGarbageCollection</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">false</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">ServerGarbageCollection</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">ConcurrentGarbageCollection</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">true</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">ConcurrentGarbageCollection</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">PropertyGroup</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p>Biến môi trường có lợi thế là đổi được mà <strong>không cần build lại image</strong> — hợp với việc dò tìm cấu hình tối ưu trên môi trường thật.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kết-quả-đo-được">Kết quả đo được<a href="https://tiennhm.io.vn/blog/dotnet-workstation-gc-giam-ram-container#k%E1%BA%BFt-qu%E1%BA%A3-%C4%91o-%C4%91%C6%B0%E1%BB%A3c" class="hash-link" aria-label="Đường dẫn trực tiếp đến Kết quả đo được" title="Đường dẫn trực tiếp đến Kết quả đo được" translate="no">​</a></h2>
<p>Recreate container rồi đo ở nhiều mốc, vì con số ngay sau khởi động luôn đẹp một cách vô nghĩa:</p>
<table><thead><tr><th>Thời điểm</th><th>docker stats</th><th>anon (thật)</th><th>Ghi chú</th></tr></thead><tbody><tr><td><strong>Trước khi sửa</strong></td><td>987.6 MiB / 1 GiB — <strong>96%</strong></td><td><strong>822 MB</strong></td><td>app rảnh, đứng yên</td></tr><tr><td>Vừa khởi động</td><td>414.2 MiB / 1.5 GiB — 27%</td><td>—</td><td>chưa kết luận được</td></tr><tr><td>Sau 10 phút</td><td>458.2 MiB — 30%</td><td>285 MB</td><td></td></tr><tr><td>Sau 20 phút</td><td>452.2 MiB — 29%</td><td>274 MB</td><td></td></tr><tr><td>Sau 30 phút</td><td>469.5 MiB — 31%</td><td><strong>288 MB</strong></td><td>ổn định</td></tr></tbody></table>
<p><strong>Bộ nhớ anon giảm từ 822 MB xuống khoảng 280 MB — giảm 65%.</strong></p>
<p>Quan trọng không kém con số: dãy <code>285 → 274 → 288 MB</code> là <strong>dao động quanh một mức ổn định</strong>, không phải đường đi lên. Điều đó xác nhận chẩn đoán ban đầu — không có rò rỉ nào cả.</p>
<p>Container giữ <code>healthy</code> suốt cả ba mốc đo. Khoảng đệm cho lúc có tải thật tăng từ 36 MiB lên hơn 1 GiB.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="khi-nào-không-nên-dùng-workstation-gc">Khi nào KHÔNG nên dùng Workstation GC<a href="https://tiennhm.io.vn/blog/dotnet-workstation-gc-giam-ram-container#khi-n%C3%A0o-kh%C3%B4ng-n%C3%AAn-d%C3%B9ng-workstation-gc" class="hash-link" aria-label="Đường dẫn trực tiếp đến Khi nào KHÔNG nên dùng Workstation GC" title="Đường dẫn trực tiếp đến Khi nào KHÔNG nên dùng Workstation GC" translate="no">​</a></h2>
<p>Phần này quan trọng hơn phần khoe kết quả, và hay bị bỏ qua trong các bài "mẹo tối ưu".</p>
<p>Server GC tồn tại vì nó <strong>thật sự tốt hơn</strong> trong đúng hoàn cảnh của nó. Đừng áp dụng bừa:</p>
<ul>
<li class=""><strong>Dịch vụ throughput cao, nhiều core, tải liên tục</strong> — Server GC giảm đáng kể thời gian tạm dừng tổng thể. Đổi sang Workstation ở đây là tự bắn vào chân.</li>
<li class=""><strong>Container được cấp nhiều RAM và nhiều core</strong> — nếu đã cho 8 GB và 8 core thì Server GC đang dùng đúng thứ bạn trả tiền.</li>
<li class=""><strong>Workload nặng cấp phát</strong> — API xử lý payload lớn, xử lý ảnh, batch job. Số lần GC tăng lên sẽ thấy rõ trong latency.</li>
</ul>
<p>Workstation GC phù hợp khi: <strong>container nhỏ (1-2 GB), ít core, lưu lượng thấp đến trung bình, và RAM là tài nguyên khan hiếm hơn CPU</strong> — đúng mô tả của phần lớn API nội bộ, admin panel, side project, và mọi thứ chạy trên VPS giá rẻ.</p>
<p>Nguyên tắc chung: <strong>đo trước khi đổi, đo lại sau khi đổi, và đo ở nhiều mốc thời gian.</strong> Một con số duy nhất lấy ngay sau khởi động không chứng minh được gì.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="các-lệnh-chẩn-đoán-nên-thuộc">Các lệnh chẩn đoán nên thuộc<a href="https://tiennhm.io.vn/blog/dotnet-workstation-gc-giam-ram-container#c%C3%A1c-l%E1%BB%87nh-ch%E1%BA%A9n-%C4%91o%C3%A1n-n%C3%AAn-thu%E1%BB%99c" class="hash-link" aria-label="Đường dẫn trực tiếp �đến Các lệnh chẩn đoán nên thuộc" title="Đường dẫn trực tiếp đến Các lệnh chẩn đoán nên thuộc" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Con số thật: anon = không thu hồi được, file = page cache</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> </span><span class="token builtin class-name">exec</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">container</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-lc</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'grep -E "^(anon|file) " /sys/fs/cgroup/memory.stat'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Trần bộ nhớ và mức đang dùng theo cgroup v2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> </span><span class="token builtin class-name">exec</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">container</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-lc</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'cat /sys/fs/cgroup/memory.max /sys/fs/cgroup/memory.current'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Đã từng bị kernel giết vì hết RAM chưa</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> inspect </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">container</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--format</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'OOMKilled={{.State.OOMKilled}} Restarts={{.RestartCount}}'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Runtime đang chạy với cấu hình GC nào</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> </span><span class="token builtin class-name">exec</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">container</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-lc</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'env | grep -i "^DOTNET_"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># App có thật sự đang rảnh không</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> logs </span><span class="token parameter variable" style="color:#36acaa">--since</span><span class="token plain"> 2h </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">container</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token operator file-descriptor important" style="color:#393A34">2</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token file-descriptor important">&amp;1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">wc</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-l</span><br></span></code></pre></div></div>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"DOTNET_gcServer=0 có làm chậm ứng dụng không?","acceptedAnswer":{"@type":"Answer","text":"Có thể, nhưng tuỳ tải. Workstation GC chạy GC thường xuyên hơn với mỗi lần nhẹ hơn, nên độ trễ từng request thường ổn định hơn, còn throughput tổng thể khi tải cao và nhiều core thì thấp hơn Server GC. Với API lưu lượng thấp trong container nhỏ, khác biệt gần như không đo được, trong khi RAM tiết kiệm là thấy ngay. Với dịch vụ tải cao, phải benchmark trước khi đổi."}},{"@type":"Question","name":"Làm sao phân biệt rò rỉ bộ nhớ với heap bị giữ lại?","acceptedAnswer":{"@type":"Answer","text":"Đo nhiều lần cách quãng và xem xu hướng. Rò rỉ thì bộ nhớ TĂNG DẦN theo thời gian và không giảm kể cả khi ứng dụng rảnh. Heap bị giữ lại thì ĐỨNG YÊN ở một mức. Trong ca này, ba lần đo cách nhau 5 giây cho cùng con số 987.6 MiB, và app không nhận request nào suốt 2 giờ — đó là heap bị giữ, không phải rò rỉ. Nếu nghi rò rỉ thật thì mới cần tới dotnet-counters, dotnet-dump và phân tích heap."}},{"@type":"Question","name":"GCConserveMemory=5 nghĩa là gì, đặt bao nhiêu là đúng?","acceptedAnswer":{"@type":"Answer","text":"Đây là thang từ 0 đến 9 điều chỉnh mức độ tích cực của GC trong việc nén heap và trả bộ nhớ về hệ điều hành. 0 là mặc định, 9 là tiết kiệm bộ nhớ tối đa nhưng tốn CPU nhất. Giá trị 5 là điểm cân bằng hợp lý để bắt đầu. Nên tăng dần và đo, đừng nhảy thẳng lên 9."}},{"@type":"Question","name":"Vì sao docker stats báo 96% mà anon chỉ 80%?","acceptedAnswer":{"@type":"Answer","text":"Vì MemUsage trong docker stats bao gồm cả page cache — bộ nhớ kernel dùng đệm file. Phần đó kernel thu hồi được bất cứ lúc nào khi thiếu RAM, nên nó không tạo áp lực thật và không gây OOM kill. Con số quyết định là anon trong /sys/fs/cgroup/memory.stat, phần bộ nhớ thật của tiến trình mà kernel không thu hồi được."}},{"@type":"Question","name":"Vì sao .NET dừng quanh 768 MB trong container 1 GiB?","acceptedAnswer":{"@type":"Answer","text":"Khi phát hiện đang chạy trong container có giới hạn bộ nhớ, .NET tự đặt GC heap hard limit bằng 75% giới hạn cgroup. Với trần 1 GiB thì heap được phép dùng tới khoảng 768 MB. Cộng thêm bộ nhớ native, stack các luồng và JIT code sẽ ra con số anon khoảng 820 MB quan sát được. Muốn đổi tỷ lệ này thì dùng DOTNET_GCHeapHardLimitPercent."}},{"@type":"Question","name":"Nâng trần RAM lên có phải là cách sửa không?","acceptedAnswer":{"@type":"Answer","text":"Không, đó chỉ là đệm. Nâng trần mà giữ Server GC thì GC heap hard limit cũng tăng theo 75%, và ứng dụng sẽ phình lên lấp đầy chỗ mới. Trong ca này trần được nâng từ 1G lên 1.5G nhưng đó là biện pháp bổ sung, thứ thật sự tạo ra mức giảm 65% là việc đổi sang Workstation GC."}}]}</script><section class="faqSection_zOXH" aria-labelledby="faq-title"><h2 id="faq-title" class="faqSection__title_DW7j">Câu hỏi thường gặp</h2><div class="faqSection__list_l32o"><div class="faqItem_VIRn" itemscope="" itemtype="https://schema.org/Question"><h3 class="faqItem__question_YLV2" itemprop="name">DOTNET_gcServer=0 có làm chậm ứng dụng không?</h3><div class="faqItem__answer_iTmX" itemscope="" itemtype="https://schema.org/Answer" itemprop="acceptedAnswer"><div itemprop="text"><p>Có thể, nhưng tuỳ tải. Workstation GC chạy GC thường xuyên hơn với mỗi lần nhẹ hơn, nên độ trễ từng request thường ổn định hơn, còn throughput tổng thể khi tải cao và nhiều core thì thấp hơn Server GC. Với API lưu lượng thấp trong container nhỏ, khác biệt gần như không đo được, trong khi RAM tiết kiệm là thấy ngay. Với dịch vụ tải cao, phải benchmark trước khi đổi.</p></div></div></div><div class="faqItem_VIRn" itemscope="" itemtype="https://schema.org/Question"><h3 class="faqItem__question_YLV2" itemprop="name">Làm sao phân biệt rò rỉ bộ nhớ với heap bị giữ lại?</h3><div class="faqItem__answer_iTmX" itemscope="" itemtype="https://schema.org/Answer" itemprop="acceptedAnswer"><div itemprop="text"><p>Đo nhiều lần cách quãng và xem xu hướng. Rò rỉ thì bộ nhớ TĂNG DẦN theo thời gian và không giảm kể cả khi ứng dụng rảnh. Heap bị giữ lại thì ĐỨNG YÊN ở một mức. Trong ca này, ba lần đo cách nhau 5 giây cho cùng con số 987.6 MiB, và app không nhận request nào suốt 2 giờ — đó là heap bị giữ, không phải rò rỉ. Nếu nghi rò rỉ thật thì mới cần tới dotnet-counters, dotnet-dump và phân tích heap.</p></div></div></div><div class="faqItem_VIRn" itemscope="" itemtype="https://schema.org/Question"><h3 class="faqItem__question_YLV2" itemprop="name">GCConserveMemory=5 nghĩa là gì, đặt bao nhiêu là đúng?</h3><div class="faqItem__answer_iTmX" itemscope="" itemtype="https://schema.org/Answer" itemprop="acceptedAnswer"><div itemprop="text"><p>Đây là thang từ 0 đến 9 điều chỉnh mức độ tích cực của GC trong việc nén heap và trả bộ nhớ về hệ điều hành. 0 là mặc định, 9 là tiết kiệm bộ nhớ tối đa nhưng tốn CPU nhất. Giá trị 5 là điểm cân bằng hợp lý để bắt đầu. Nên tăng dần và đo, đừng nhảy thẳng lên 9.</p></div></div></div><div class="faqItem_VIRn" itemscope="" itemtype="https://schema.org/Question"><h3 class="faqItem__question_YLV2" itemprop="name">Vì sao docker stats báo 96% mà anon chỉ 80%?</h3><div class="faqItem__answer_iTmX" itemscope="" itemtype="https://schema.org/Answer" itemprop="acceptedAnswer"><div itemprop="text"><p>Vì MemUsage trong docker stats bao gồm cả page cache — bộ nhớ kernel dùng đệm file. Phần đó kernel thu hồi được bất cứ lúc nào khi thiếu RAM, nên nó không tạo áp lực thật và không gây OOM kill. Con số quyết định là anon trong /sys/fs/cgroup/memory.stat, phần bộ nhớ thật của tiến trình mà kernel không thu hồi được.</p></div></div></div><div class="faqItem_VIRn" itemscope="" itemtype="https://schema.org/Question"><h3 class="faqItem__question_YLV2" itemprop="name">Vì sao .NET dừng quanh 768 MB trong container 1 GiB?</h3><div class="faqItem__answer_iTmX" itemscope="" itemtype="https://schema.org/Answer" itemprop="acceptedAnswer"><div itemprop="text"><p>Khi phát hiện đang chạy trong container có giới hạn bộ nhớ, .NET tự đặt GC heap hard limit bằng 75% giới hạn cgroup. Với trần 1 GiB thì heap được phép dùng tới khoảng 768 MB. Cộng thêm bộ nhớ native, stack các luồng và JIT code sẽ ra con số anon khoảng 820 MB quan sát được. Muốn đổi tỷ lệ này thì dùng DOTNET_GCHeapHardLimitPercent.</p></div></div></div><div class="faqItem_VIRn" itemscope="" itemtype="https://schema.org/Question"><h3 class="faqItem__question_YLV2" itemprop="name">Nâng trần RAM lên có phải là cách sửa không?</h3><div class="faqItem__answer_iTmX" itemscope="" itemtype="https://schema.org/Answer" itemprop="acceptedAnswer"><div itemprop="text"><p>Không, đó chỉ là đệm. Nâng trần mà giữ Server GC thì GC heap hard limit cũng tăng theo 75%, và ứng dụng sẽ phình lên lấp đầy chỗ mới. Trong ca này trần được nâng từ 1G lên 1.5G nhưng đó là biện pháp bổ sung, thứ thật sự tạo ra mức giảm 65% là việc đổi sang Workstation GC.</p></div></div></div></div></section>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kết-luận">Kết luận<a href="https://tiennhm.io.vn/blog/dotnet-workstation-gc-giam-ram-container#k%E1%BA%BFt-lu%E1%BA%ADn" class="hash-link" aria-label="Đường dẫn trực tiếp đến Kết luận" title="Đường dẫn trực tiếp đến Kết luận" translate="no">​</a></h2>
<p>Ba điều rút ra từ ca này:</p>
<ol>
<li class=""><strong><code>docker stats</code> không đủ.</strong> <code>MemUsage</code> gồm page cache. Con số cần nhìn là <code>anon</code> trong <code>/sys/fs/cgroup/memory.stat</code>.</li>
<li class=""><strong>RAM cao mà đứng yên không phải rò rỉ.</strong> Đo nhiều lần cách quãng trước khi mở memory dump. Xu hướng quan trọng hơn giá trị tuyệt đối.</li>
<li class=""><strong>Mặc định của framework được chọn cho hoàn cảnh khác hoàn cảnh của bạn.</strong> ASP.NET Core mặc định Server GC vì nó nhắm tới máy chủ nhiều core tải cao. Trong container 1 GiB trên VPS giá rẻ, mặc định đó là lãng phí — và sửa chỉ tốn hai dòng biến môi trường.</li>
</ol>
<p>Trường hợp cụ thể ở đây: <strong>822 MB xuống 280 MB, giảm 65%, không đổi một dòng code nào.</strong></p>
<hr>
<p><strong>Cập nhật lần cuối</strong>: Tháng 9, 2026</p>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="dotnet" term="dotnet"/>
        <category label="net9" term="net9"/>
        <category label="docker" term="docker"/>
        <category label="performance" term="performance"/>
        <category label="garbage-collection" term="garbage-collection"/>
        <category label="aspnetcore" term="aspnetcore"/>
        <category label="devops" term="devops"/>
        <category label="csharp" term="csharp"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Scalar là gì? Tại sao nên dùng Scalar thay Swagger UI trong ASP.NET Core 10]]></title>
        <id>https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui</id>
        <link href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui"/>
        <updated>2026-08-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Scalar là open-source API Reference UI hiện đại thay thế Swagger UI. Tìm hiểu lý do Microsoft loại bỏ Swashbuckle khỏi .NET 9/10, so sánh Scalar vs Swagger UI, và hướng dẫn setup Scalar trên ASP.NET Core 10 từng bước.]]></summary>
        <content type="html"><![CDATA[<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p><strong>Scalar</strong> là open-source API Reference UI thay thế Swagger UI, được Microsoft khuyến nghị cho ASP.NET Core từ .NET 9 trở đi. Kể từ .NET 9, Microsoft loại bỏ Swashbuckle (Swagger UI) khỏi template mặc định của Web API và thay bằng <code>Microsoft.AspNetCore.OpenApi</code> kết hợp với Scalar. Bài viết này giải thích lý do thay đổi đó, so sánh tính năng Scalar vs Swagger UI, và hướng dẫn thiết lập Scalar trong ASP.NET Core 10 từng bước - từ project mới lẫn migration từ dự án cũ.</p></div></div>
<p>Nếu bạn tạo một project ASP.NET Core Web API mới với .NET 9 hoặc .NET 10 và ngạc nhiên khi không thấy Swagger UI nữa - bạn không phải người duy nhất. Microsoft đã chủ động thay thế Swashbuckle bằng một pipeline OpenAPI native, và <strong>Scalar</strong> là UI được khuyến nghị đi kèm.</p>
<p><img decoding="async" loading="lazy" src="https://scalar.com/app-docs-animated.svg" alt="Giao diện Scalar API Reference trên scalar.com" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tldr">Tóm tắt nhanh (TL;DR)<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#tldr" class="hash-link" aria-label="Đường dẫn trực tiếp đến Tóm tắt nhanh (TL;DR)" title="Đường dẫn trực tiếp đến Tóm tắt nhanh (TL;DR)" translate="no">​</a></h2>
<ul>
<li class=""><strong>.NET 9+</strong>: Microsoft loại bỏ Swashbuckle khỏi template <code>dotnet new webapi</code></li>
<li class=""><strong>Thay thế</strong>: <code>Microsoft.AspNetCore.OpenApi</code> (sinh document) + <code>Scalar.AspNetCore</code> (UI)</li>
<li class=""><strong>OpenAPI JSON</strong> giờ ở <code>/openapi/v1.json</code> thay vì <code>/swagger/v1/swagger.json</code></li>
<li class=""><strong>Scalar UI</strong> truy cập tại <code>/scalar/v1</code></li>
<li class="">Migration từ Swashbuckle mất khoảng 15-30 phút</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ly-do-microsoft-bo-swagger">Tại sao Microsoft bỏ Swagger UI (Swashbuckle)?<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#ly-do-microsoft-bo-swagger" class="hash-link" aria-label="Đường dẫn trực tiếp đến Tại sao Microsoft bỏ Swagger UI (Swashbuckle)?" title="Đường dẫn trực tiếp đến Tại sao Microsoft bỏ Swagger UI (Swashbuckle)?" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="swashbuckle-là-thư-viện-bên-thứ-ba-không-còn-được-maintain-tích-cực">Swashbuckle là thư viện bên thứ ba, không còn được maintain tích cực<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#swashbuckle-l%C3%A0-th%C6%B0-vi%E1%BB%87n-b%C3%AAn-th%E1%BB%A9-ba-kh%C3%B4ng-c%C3%B2n-%C4%91%C6%B0%E1%BB%A3c-maintain-t%C3%ADch-c%E1%BB%B1c" class="hash-link" aria-label="Đường dẫn trực tiếp đến Swashbuckle là thư viện bên thứ ba, không còn được maintain tích cực" title="Đường dẫn trực tiếp đến Swashbuckle là thư viện bên thứ ba, không còn được maintain tích cực" translate="no">​</a></h3>
<p>Swashbuckle.AspNetCore là package của cộng đồng, không phải của Microsoft. Từ .NET 9, Microsoft quyết định cần một giải pháp <strong>first-party</strong> tích hợp sâu vào pipeline ASP.NET Core thay vì phụ thuộc vào package ngoài với vòng đời bảo trì không đảm bảo.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="microsoftopenapi-v2-là-breaking-change-khiến-swashbuckle-không-tương-thích">Microsoft.OpenApi v2 là breaking change khiến Swashbuckle không tương thích<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#microsoftopenapi-v2-l%C3%A0-breaking-change-khi%E1%BA%BFn-swashbuckle-kh%C3%B4ng-t%C6%B0%C6%A1ng-th%C3%ADch" class="hash-link" aria-label="Đường dẫn trực tiếp đến Microsoft.OpenApi v2 là breaking change khiến Swashbuckle không tương thích" title="Đường dẫn trực tiếp đến Microsoft.OpenApi v2 là breaking change khiến Swashbuckle không tương thích" translate="no">​</a></h3>
<p><code>Microsoft.OpenApi</code> phiên bản 2.x đi kèm .NET 10 có breaking change hoàn toàn so với v1.x mà Swashbuckle 6.x - 9.x phụ thuộc. Swashbuckle không thể build sạch trên .NET 10 vì object model mới không tương thích ngược.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="native-openapi-pipeline-sinh-openapi-31-chuẩn-hơn">Native OpenAPI pipeline sinh OpenAPI 3.1 chuẩn hơn<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#native-openapi-pipeline-sinh-openapi-31-chu%E1%BA%A9n-h%C6%A1n" class="hash-link" aria-label="Đường dẫn trực tiếp đến Native OpenAPI pipeline sinh OpenAPI 3.1 chuẩn hơn" title="Đường dẫn trực tiếp đến Native OpenAPI pipeline sinh OpenAPI 3.1 chuẩn hơn" translate="no">​</a></h3>
<p><code>Microsoft.AspNetCore.OpenApi</code> - package đi kèm từ .NET 9 - sinh ra OpenAPI 3.1 trực tiếp từ metadata của endpoint. Không cần reflection phức tạp, hỗ trợ Native AOT đầy đủ, tích hợp hoàn hảo với Minimal APIs và Controller-based APIs.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Swashbuckle có bị xóa hoàn toàn không?</div><div class="admonitionContent_BuS1"><p>Không. Swashbuckle vẫn là community package và vẫn hoạt động trên .NET 10. Điều thay đổi là nó <strong>không còn nằm trong template mặc định</strong> nữa - bạn phải tự opt-in nếu muốn dùng.</p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="scalar-la-gi">Scalar là gì?<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#scalar-la-gi" class="hash-link" aria-label="Đường dẫn trực tiếp đến Scalar là gì?" title="Đường dẫn trực tiếp đến Scalar là gì?" translate="no">​</a></h2>
<p><strong>Scalar</strong> là open-source API Reference UI, đọc OpenAPI 3.1 và render thành giao diện tài liệu API tương tác. Scalar được tích hợp vào ASP.NET Core qua NuGet package <code>Scalar.AspNetCore</code>.</p>
<p>Scalar không chỉ là "Swagger UI đẹp hơn" mà có thêm nhiều tính năng nổi bật:</p>
<ul>
<li class=""><strong>Dark mode tích hợp sẵn</strong> - không cần theme tùy chỉnh</li>
<li class=""><strong>11 built-in themes</strong> (<code>moon</code>, <code>purple</code>, <code>solarized</code>, <code>deepSpace</code>, <code>laserwave</code>...)</li>
<li class=""><strong>API Client tích hợp</strong>: lịch sử request, environment variables, code snippet 25+ ngôn ngữ</li>
<li class=""><strong>Sidebar navigation</strong> cho API có nhiều endpoint</li>
<li class=""><strong>Full-text search</strong> tích hợp sẵn (Swagger UI cần plugin riêng)</li>
<li class=""><strong>CORS Proxy</strong> để tránh lỗi khi test cross-origin API</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="so-sanh-scalar-vs-swagger-ui">So sánh Scalar vs Swagger UI<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#so-sanh-scalar-vs-swagger-ui" class="hash-link" aria-label="Đường dẫn trực tiếp đến So sánh Scalar vs Swagger UI" title="Đường dẫn trực tiếp đến So sánh Scalar vs Swagger UI" translate="no">​</a></h2>
<table><thead><tr><th>Tính năng</th><th style="text-align:center">Scalar</th><th style="text-align:center">Swagger UI</th></tr></thead><tbody><tr><td>OpenAPI 3.1</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td></tr><tr><td>OpenAPI 3.2</td><td style="text-align:center">🔄 đang phát triển</td><td style="text-align:center">❌ không có kế hoạch</td></tr><tr><td>.NET 9/10 native pipeline</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td></tr><tr><td>Dark mode</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td></tr><tr><td>Built-in themes</td><td style="text-align:center">11 themes</td><td style="text-align:center">❌</td></tr><tr><td>Sidebar navigation</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td></tr><tr><td>Full-text search</td><td style="text-align:center">✅ tích hợp sẵn</td><td style="text-align:center">⚠️ cần plugin</td></tr><tr><td>Code snippet generation</td><td style="text-align:center">25+ ngôn ngữ</td><td style="text-align:center">⚠️ hạn chế</td></tr><tr><td>Vue component</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td></tr><tr><td>CORS Proxy</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td></tr><tr><td>Desktop API Client</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td></tr><tr><td>PRs merged 2025</td><td style="text-align:center"><strong>2.075</strong></td><td style="text-align:center">176</td></tr></tbody></table>
<blockquote>
<p>Nguồn: <a href="https://scalar.com/resources/migration/swagger-ui" target="_blank" rel="noopener noreferrer" class="">scalar.com/resources/migration/swagger-ui</a></p>
</blockquote>
<p><strong>Kết luận</strong>: Scalar có community hoạt động tích cực hơn (~12x số PR merged trong 2025), nhiều tính năng hơn, và được Microsoft chọn làm UI mặc định cho ASP.NET Core từ .NET 9.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setup-scalar-aspnetcore-10">Cách thiết lập Scalar trên ASP.NET Core 10 (từ đầu)<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#setup-scalar-aspnetcore-10" class="hash-link" aria-label="Đường dẫn trực tiếp đến Cách thiết lập Scalar trên ASP.NET Core 10 (từ đầu)" title="Đường dẫn trực tiếp đến Cách thiết lập Scalar trên ASP.NET Core 10 (từ đầu)" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bước-1-tạo-project-web-api-mới">Bước 1: Tạo project Web API mới<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#b%C6%B0%E1%BB%9Bc-1-t%E1%BA%A1o-project-web-api-m%E1%BB%9Bi" class="hash-link" aria-label="Đường dẫn trực tiếp đến Bước 1: Tạo project Web API mới" title="Đường dẫn trực tiếp đến Bước 1: Tạo project Web API mới" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">dotnet new webapi </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> MyApi</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> MyApi</span><br></span></code></pre></div></div>
<p>Với .NET 10, template đã tích hợp sẵn <code>Microsoft.AspNetCore.OpenApi</code>. Chỉ cần thêm Scalar:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">dotnet </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> package Scalar.AspNetCore</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bước-2-cấu-hình-programcs">Bước 2: Cấu hình <code>Program.cs</code><a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#b%C6%B0%E1%BB%9Bc-2-c%E1%BA%A5u-h%C3%ACnh-programcs" class="hash-link" aria-label="Đường dẫn trực tiếp đến bước-2-cấu-hình-programcs" title="Đường dẫn trực tiếp đến bước-2-cấu-hình-programcs" translate="no">​</a></h3>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">Scalar</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">AspNetCore</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> builder </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> WebApplication</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">CreateBuilder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">args</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Đăng ký OpenAPI document generation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">builder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Services</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">AddOpenApi</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> app </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Chỉ expose docs trong môi trường Development</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Environment</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">IsDevelopment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">MapOpenApi</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">              </span><span class="token comment" style="color:#999988;font-style:italic">// sinh /openapi/v1.json</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">MapScalarApiReference</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">// render UI tại /scalar/v1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">UseHttpsRedirection</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Ví dụ Minimal API</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">MapGet</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/products"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Results</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> Id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Laptop"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Price </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">25_000_000</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> Id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Mouse"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  Price </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">350_000</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"GetProducts"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithSummary</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Lấy danh sách sản phẩm"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithDescription</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Trả về toàn bộ danh sách sản phẩm hiện có trong hệ thống."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Sau khi chạy, truy cập:</p>
<table><thead><tr><th>URL</th><th>Mô tả</th></tr></thead><tbody><tr><td><code>https://localhost:{port}/openapi/v1.json</code></td><td>File OpenAPI JSON</td></tr><tr><td><code>https://localhost:{port}/scalar/v1</code></td><td>Scalar UI</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bước-3-cập-nhật-launchsettingsjson">Bước 3: Cập nhật <code>launchSettings.json</code><a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#b%C6%B0%E1%BB%9Bc-3-c%E1%BA%ADp-nh%E1%BA%ADt-launchsettingsjson" class="hash-link" aria-label="Đường dẫn trực tiếp đến bước-3-cập-nhật-launchsettingsjson" title="Đường dẫn trực tiếp đến bước-3-cập-nhật-launchsettingsjson" translate="no">​</a></h3>
<p>Để F5 tự mở Scalar thay vì trang trống, sửa <code>Properties/launchSettings.json</code>:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"profiles"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"https"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"commandName"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Project"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"dotnetRunMessages"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"launchBrowser"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"launchUrl"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"scalar/v1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"applicationUrl"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://localhost:7001;http://localhost:5001"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"environmentVariables"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"ASPNETCORE_ENVIRONMENT"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Development"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bước-4-tùy-chỉnh-giao-diện-scalar-tùy-chọn">Bước 4: Tùy chỉnh giao diện Scalar (tùy chọn)<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#b%C6%B0%E1%BB%9Bc-4-t%C3%B9y-ch%E1%BB%89nh-giao-di%E1%BB%87n-scalar-t%C3%B9y-ch%E1%BB%8Dn" class="hash-link" aria-label="Đường dẫn trực tiếp đến Bước 4: Tùy chỉnh giao diện Scalar (tùy chọn)" title="Đường dẫn trực tiếp đến Bước 4: Tùy chỉnh giao diện Scalar (tùy chọn)" translate="no">​</a></h3>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">MapScalarApiReference</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">options </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    options</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Title </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"My API Reference"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    options</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Theme </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ScalarTheme</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Moon</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    options</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">DefaultHttpClient </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ScalarTarget</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CSharp</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ScalarClient</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">HttpClient</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    options</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">DarkMode </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p><strong>Các theme có sẵn</strong>: <code>Default</code>, <code>Alternate</code>, <code>Moon</code>, <code>Purple</code>, <code>Solarized</code>, <code>BluePlanet</code>, <code>Saturn</code>, <code>Kepler</code>, <code>Mars</code>, <code>DeepSpace</code>, <code>Laserwave</code>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="migration-swashbuckle-scalar">Migration từ Swashbuckle sang Scalar<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#migration-swashbuckle-scalar" class="hash-link" aria-label="Đường dẫn trực tiếp đến Migration từ Swashbuckle sang Scalar" title="Đường dẫn trực tiếp đến Migration từ Swashbuckle sang Scalar" translate="no">​</a></h2>
<p>Nếu bạn có project .NET 8 hoặc cũ hơn đang dùng Swashbuckle, đây là các bước migration đầy đủ:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bước-1-xóa-swashbuckle">Bước 1: Xóa Swashbuckle<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#b%C6%B0%E1%BB%9Bc-1-x%C3%B3a-swashbuckle" class="hash-link" aria-label="Đường dẫn trực tiếp đến Bước 1: Xóa Swashbuckle" title="Đường dẫn trực tiếp đến Bước 1: Xóa Swashbuckle" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">dotnet remove package Swashbuckle.AspNetCore</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dotnet remove package Swashbuckle.AspNetCore.Annotations  </span><span class="token comment" style="color:#999988;font-style:italic"># nếu có</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dotnet remove package Swashbuckle.AspNetCore.Filters       </span><span class="token comment" style="color:#999988;font-style:italic"># nếu có</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bước-2-thêm-package-mới">Bước 2: Thêm package mới<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#b%C6%B0%E1%BB%9Bc-2-th%C3%AAm-package-m%E1%BB%9Bi" class="hash-link" aria-label="Đường dẫn trực tiếp đến Bước 2: Thêm package mới" title="Đường dẫn trực tiếp đến Bước 2: Thêm package mới" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">dotnet </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> package Microsoft.AspNetCore.OpenApi</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dotnet </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> package Scalar.AspNetCore</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bước-3-cập-nhật-programcs">Bước 3: Cập nhật <code>Program.cs</code><a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#b%C6%B0%E1%BB%9Bc-3-c%E1%BA%ADp-nh%E1%BA%ADt-programcs" class="hash-link" aria-label="Đường dẫn trực tiếp đến bước-3-cập-nhật-programcs" title="Đường dẫn trực tiếp đến bước-3-cập-nhật-programcs" translate="no">​</a></h3>
<p><strong>Trước - Swashbuckle:</strong></p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">builder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Services</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">AddEndpointsApiExplorer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">builder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Services</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">AddSwaggerGen</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">c </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    c</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SwaggerDoc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"v1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">OpenApiInfo</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> Title </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"My API"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Version </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"v1"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Environment</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">IsDevelopment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">UseSwagger</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">UseSwaggerUI</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>Sau - Microsoft.AspNetCore.OpenApi + Scalar:</strong></p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">builder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Services</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">AddOpenApi</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Environment</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">IsDevelopment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">MapOpenApi</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">MapScalarApiReference</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bước-4-cập-nhật-url">Bước 4: Cập nhật URL<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#b%C6%B0%E1%BB%9Bc-4-c%E1%BA%ADp-nh%E1%BA%ADt-url" class="hash-link" aria-label="Đường dẫn trực tiếp đến Bước 4: Cập nhật URL" title="Đường dẫn trực tiếp đến Bước 4: Cập nhật URL" translate="no">​</a></h3>
<table><thead><tr><th>Trước (Swashbuckle)</th><th>Sau (Scalar)</th></tr></thead><tbody><tr><td><code>/swagger/v1/swagger.json</code></td><td><code>/openapi/v1.json</code></td></tr><tr><td><code>/swagger</code></td><td><code>/scalar/v1</code></td></tr></tbody></table>
<p>Cập nhật tất cả nơi hardcode URL cũ: CI pipeline, API gateway import, client generator config.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Migration an toàn - chạy song song</div><div class="admonitionContent_BuS1"><p>Nếu cần zero-downtime migration, chạy song song cả hai trong một release: giữ Swashbuckle phục vụ <code>/swagger/...</code> đồng thời thêm Scalar phục vụ <code>/openapi/...</code>. Sau khi mọi consumer chuyển sang URL mới, xóa Swashbuckle.</p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="them-metadata-api">Thêm metadata API với Document Transformer<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#them-metadata-api" class="hash-link" aria-label="Đường dẫn trực tiếp đến Thêm metadata API với Document Transformer" title="Đường dẫn trực tiếp đến Thêm metadata API với Document Transformer" translate="no">​</a></h2>
<p>Để Scalar hiển thị thông tin đầy đủ (title, version, contact), thêm document transformer:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">builder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Services</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">AddOpenApi</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">options </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    options</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">AddDocumentTransformer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">document</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cancellationToken</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Info </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Title </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"My API"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Version </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"v1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Description </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"API documentation sinh tự động bởi ASP.NET Core 10"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Contact </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                Name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Tien NHM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                Url </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">Uri</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"https://tiennhm.github.io"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            License </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                Name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MIT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                Url </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">Uri</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"https://opensource.org/licenses/MIT"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> Task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CompletedTask</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bao-mat-scalar-endpoint">Bảo mật endpoint <code>/openapi</code> và <code>/scalar</code> trong Production<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#bao-mat-scalar-endpoint" class="hash-link" aria-label="Đường dẫn trực tiếp đến bao-mat-scalar-endpoint" title="Đường dẫn trực tiếp đến bao-mat-scalar-endpoint" translate="no">​</a></h2>
<p>Mặc định chỉ expose docs trong môi trường Development. Nếu cần dùng trong Production (ví dụ internal portal), thêm authorization:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Chỉ user có role "Admin" mới được truy cập docs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">MapOpenApi</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RequireAuthorization</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"AdminOnly"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">MapScalarApiReference</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RequireAuthorization</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"AdminOnly"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="faq">Câu hỏi thường gặp (FAQ)<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#faq" class="hash-link" aria-label="Đường dẫn trực tiếp đến Câu hỏi thường gặp (FAQ)" title="Đường dẫn trực tiếp đến Câu hỏi thường gặp (FAQ)" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scalar-có-miễn-phí-không">Scalar có miễn phí không?<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#scalar-c%C3%B3-mi%E1%BB%85n-ph%C3%AD-kh%C3%B4ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến Scalar có miễn phí không?" title="Đường dẫn trực tiếp đến Scalar có miễn phí không?" translate="no">​</a></h3>
<p>Có. Scalar là open-source (MIT license) và hoàn toàn miễn phí. Package <code>Scalar.AspNetCore</code> trên NuGet cũng miễn phí.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="swagger-có-bị-xóa-hoàn-toàn-trong-net-10-không">Swagger có bị xóa hoàn toàn trong .NET 10 không?<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#swagger-c%C3%B3-b%E1%BB%8B-x%C3%B3a-ho%C3%A0n-to%C3%A0n-trong-net-10-kh%C3%B4ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến Swagger có bị xóa hoàn toàn trong .NET 10 không?" title="Đường dẫn trực tiếp đến Swagger có bị xóa hoàn toàn trong .NET 10 không?" translate="no">​</a></h3>
<p>Không. Swashbuckle vẫn là community package và hoạt động trên .NET 10. Điều thay đổi là nó không còn nằm trong template mặc định <code>dotnet new webapi</code> từ .NET 9 trở đi.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scalar-có-hỗ-trợ-controller-based-api-không-hay-chỉ-minimal-api">Scalar có hỗ trợ Controller-based API không, hay chỉ Minimal API?<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#scalar-c%C3%B3-h%E1%BB%97-tr%E1%BB%A3-controller-based-api-kh%C3%B4ng-hay-ch%E1%BB%89-minimal-api" class="hash-link" aria-label="Đường dẫn trực tiếp đến Scalar có hỗ trợ Controller-based API không, hay chỉ Minimal API?" title="Đường dẫn trực tiếp đến Scalar có hỗ trợ Controller-based API không, hay chỉ Minimal API?" translate="no">​</a></h3>
<p>Scalar hỗ trợ cả hai. <code>Microsoft.AspNetCore.OpenApi</code> sinh document từ cả Minimal APIs lẫn Controller-based APIs. Scalar chỉ đọc file OpenAPI JSON nên không phân biệt cách API được định nghĩa.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="tôi-có-thể-dùng-scalar-với-swagger-ui-cùng-lúc-không">Tôi có thể dùng Scalar với Swagger UI cùng lúc không?<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#t%C3%B4i-c%C3%B3-th%E1%BB%83-d%C3%B9ng-scalar-v%E1%BB%9Bi-swagger-ui-c%C3%B9ng-l%C3%BAc-kh%C3%B4ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến Tôi có thể dùng Scalar với Swagger UI cùng lúc không?" title="Đường dẫn trực tiếp đến Tôi có thể dùng Scalar với Swagger UI cùng lúc không?" translate="no">​</a></h3>
<p>Có. Hai UI này hoàn toàn độc lập, cùng đọc file OpenAPI JSON. Đây là cách migration an toàn: chạy cả hai song song, rồi tắt cái cũ sau khi chuyển xong.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="openapi-json-bây-giờ-ở-đường-dẫn-nào">OpenAPI JSON bây giờ ở đường dẫn nào?<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#openapi-json-b%C3%A2y-gi%E1%BB%9D-%E1%BB%9F-%C4%91%C6%B0%E1%BB%9Dng-d%E1%BA%ABn-n%C3%A0o" class="hash-link" aria-label="Đường dẫn trực tiếp đến OpenAPI JSON bây giờ ở đường dẫn nào?" title="Đường dẫn trực tiếp đến OpenAPI JSON bây giờ ở đường dẫn nào?" translate="no">​</a></h3>
<p>Từ .NET 9 với <code>Microsoft.AspNetCore.OpenApi</code>, document nằm tại <code>/openapi/v1.json</code> (thay vì <code>/swagger/v1/swagger.json</code> của Swashbuckle). Đây là điều hay bị bỏ qua khi migration, làm hỏng CI pipeline và API gateway import.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scalar-có-hỗ-trợ-xác-thực-oauth2-không">Scalar có hỗ trợ xác thực OAuth2 không?<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#scalar-c%C3%B3-h%E1%BB%97-tr%E1%BB%A3-x%C3%A1c-th%E1%BB%B1c-oauth2-kh%C3%B4ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến Scalar có hỗ trợ xác thực OAuth2 không?" title="Đường dẫn trực tiếp đến Scalar có hỗ trợ xác thực OAuth2 không?" translate="no">​</a></h3>
<p>Có. Scalar hỗ trợ OAuth2 với PKCE flow, API Key, và Bearer token. Bạn có thể cấu hình pre-fill authentication credentials thông qua options <code>Authentication</code>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ket-luan">Kết luận<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#ket-luan" class="hash-link" aria-label="Đường dẫn trực tiếp đến Kết luận" title="Đường dẫn trực tiếp đến Kết luận" translate="no">​</a></h2>
<p>Việc Microsoft loại bỏ Swashbuckle khỏi template mặc định là dấu hiệu ecosystem .NET đang trưởng thành hơn với giải pháp first-party. Bộ đôi <strong><code>Microsoft.AspNetCore.OpenApi</code> + <code>Scalar.AspNetCore</code></strong> là lựa chọn tối ưu cho ASP.NET Core 10:</p>
<ul>
<li class="">Sinh OpenAPI 3.1 chuẩn, hỗ trợ Native AOT</li>
<li class="">Giao diện hiện đại, dark mode, 11 theme phong phú</li>
<li class="">API Client tích hợp với code snippet 25+ ngôn ngữ</li>
<li class="">Ít dependency bên ngoài, first-party support từ Microsoft</li>
<li class="">Community hoạt động tích cực (2.075 PR merged trong 2025)</li>
</ul>
<p>Nếu bạn bắt đầu project mới với .NET 10, hãy dùng Scalar ngay từ đầu. Với dự án cũ đang dùng Swashbuckle, migration chỉ tốn khoảng 15-30 phút theo hướng dẫn trong bài.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tai-lieu-tham-khao">Tài liệu tham khảo<a href="https://tiennhm.io.vn/blog/gioi-thieu-scalar-api-reference-thay-the-swagger-ui#tai-lieu-tham-khao" class="hash-link" aria-label="Đường dẫn trực tiếp đến Tài liệu tham khảo" title="Đường dẫn trực tiếp đến Tài liệu tham khảo" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://scalar.com/" target="_blank" rel="noopener noreferrer" class="">Scalar - Official Website</a></li>
<li class=""><a href="https://scalar.com/resources/migration/swagger-ui" target="_blank" rel="noopener noreferrer" class="">Migrate from Swagger UI to Scalar</a></li>
<li class=""><a href="https://learn.microsoft.com/en-us/aspnet/core/fundamentals/openapi/using-openapi-documents" target="_blank" rel="noopener noreferrer" class="">Microsoft Docs - Using OpenAPI documents in ASP.NET Core</a></li>
<li class=""><a href="https://devblogs.microsoft.com/dotnet/api-versioning-in-dotnet-10-applications/" target="_blank" rel="noopener noreferrer" class="">Combining API versioning with OpenAPI in .NET 10 - .NET Blog</a></li>
<li class=""><a href="https://dev.to/jfmeyers/swashbuckle-is-dead-heres-how-to-migrate-to-scalar-in-net-10-155d" target="_blank" rel="noopener noreferrer" class="">Swashbuckle Is Dead. Here's How to Migrate to Scalar in .NET 10</a></li>
<li class=""><a href="https://codewithmukesh.com/blog/dotnet-swagger-alternatives-openapi/" target="_blank" rel="noopener noreferrer" class="">ASP.NET Core Dropped Swagger - Here's What Replaced It in .NET 10</a></li>
</ul>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="scalar" term="scalar"/>
        <category label="swagger" term="swagger"/>
        <category label="openapi" term="openapi"/>
        <category label="dotnet" term="dotnet"/>
        <category label="aspnetcore" term="aspnetcore"/>
        <category label="api" term="api"/>
        <category label="net10" term="net10"/>
        <category label="csharp" term="csharp"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Cách mình giảm build time Angular 50% chỉ bằng 1 thay đổi đơn giản]]></title>
        <id>https://tiennhm.io.vn/blog/improve-angular-build-time</id>
        <link href="https://tiennhm.io.vn/blog/improve-angular-build-time"/>
        <updated>2025-11-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Chia sẻ kinh nghiệm thực tế về cách migrate Angular project từ browser builder sang application builder giúp giảm build time từ 52 phút xuống 26 phút (giảm 50%). Đặc biệt hiệu quả cho hotfix và deploy, tăng năng suất và độ hài lòng của team. Hướng dẫn chi tiết với code examples và best practices.]]></summary>
        <content type="html"><![CDATA[<p align="right"><img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2FTienNHM.github.io%2Fblog%2Fimprove-angular-build-time&amp;label=%E2%9A%AAView&amp;labelColor=%2337d67a&amp;countColor=%23555555&amp;style=flat&amp;labelStyle=upper" loading="lazy" decoding="async"></p>
<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p>Bài viết chia sẻ kinh nghiệm thực tế về cách migrate Angular project từ browser builder sang application builder, giúp giảm build time từ 52 phút xuống 26 phút (giảm 50%). Chỉ cần sửa vài dòng trong <code>angular.json</code>, không cần thay đổi code hay dependencies. Đặc biệt hiệu quả cho hotfix khẩn cấp và deploy thường xuyên, giúp tăng năng suất developer và độ hài lòng của team. Bài viết bao gồm hướng dẫn chi tiết từng bước, giải thích kỹ thuật, và best practices để tối ưu build time đến mức tối đa.</p></div></div>
<p>Bạn có từng rơi vào tình huống này không? Chạy lệnh <code>ng build --configuration production</code> rồi... đi uống cà phê, ăn trưa, rồi quay lại mà build vẫn chưa xong? 😅</p>
<p>Đó chính xác là vấn đề mà mình đã gặp phải với một Angular project lớn. Mỗi lần build production mất <strong>52 phút</strong> - đúng là một cơn ác mộng cho developer, đặc biệt khi cần hotfix khẩn cấp! Nhưng giờ đây, sau một thay đổi đơn giản, build time đã giảm xuống còn <strong>26 phút</strong> - tiết kiệm được đúng <strong>50% thời gian</strong>!</p>
<p>Hãy cùng mình xem cách làm thế nào nhé! 🚀</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="câu-chuyện-bắt-đầu-khi-build-time-là-nỗi-ám-ảnh">Câu chuyện bắt đầu: Khi build time là nỗi ám ảnh<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#c%C3%A2u-chuy%E1%BB%87n-b%E1%BA%AFt-%C4%91%E1%BA%A7u-khi-build-time-l%C3%A0-n%E1%BB%97i-%C3%A1m-%E1%BA%A3nh" class="hash-link" aria-label="Đường dẫn trực tiếp đến Câu chuyện bắt đầu: Khi build time là nỗi ám ảnh" title="Đường dẫn trực tiếp đến Câu chuyện bắt đầu: Khi build time là nỗi ám ảnh" translate="no">​</a></h2>
<p>Dự án mình đang làm là một <strong>webapp enterprise</strong> được code bằng <strong>Angular 18</strong>, với quy mô khá lớn: hàng trăm components, hàng ngàn files, và nhiều features phức tạp. Mọi thứ đều ổn cho đến khi... build production.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="vấn-đề-thực-tế---đặc-biệt-nghiêm-trọng-với-hotfix">Vấn đề thực tế - Đặc biệt nghiêm trọng với hotfix<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#v%E1%BA%A5n-%C4%91%E1%BB%81-th%E1%BB%B1c-t%E1%BA%BF---%C4%91%E1%BA%B7c-bi%E1%BB%87t-nghi%C3%AAm-tr%E1%BB%8Dng-v%E1%BB%9Bi-hotfix" class="hash-link" aria-label="Đường dẫn trực tiếp đến Vấn đề thực tế - Đặc biệt nghiêm trọng với hotfix" title="Đường dẫn trực tiếp đ�ến Vấn đề thực tế - Đặc biệt nghiêm trọng với hotfix" translate="no">​</a></h3>
<p>Mỗi lần build, mình phải chờ <strong>52 phút</strong>. Đúng vậy - <strong>gần 1 giờ đồng hồ</strong> cho mỗi lần deploy! 😱</p>
<p><img decoding="async" loading="lazy" alt="Thời gian build trước khi improve" src="https://tiennhm.io.vn/assets/images/before-improve-build-angular-a653fc829b06ceb1739b9e3bdd99552b.png" width="372" height="492" class="img_ev3q"></p>
<p>Điều này gây ra những hệ quả <strong>rất nghiêm trọng</strong>, đặc biệt trong các tình huống:</p>
<p><strong>🔥 Hotfix khẩn cấp - Tình huống tồi tệ nhất:</strong></p>
<ul>
<li class="">🚨 Bug production cần fix ngay → Build mất 52 phút → Khách hàng phải chờ → Stress level tăng vọt!</li>
<li class="">💼 <strong>Độ hài lòng của các bên giảm</strong>: Product owner, stakeholders phải chờ quá lâu để fix một bug đơn giản</li>
<li class="">😰 <strong>Áp lực cao</strong>: Developer phải ngồi đợi build trong khi khách hàng đang gặp vấn đề</li>
</ul>
<p><strong>📊 Ảnh hưởng hàng ngày:</strong></p>
<ul>
<li class="">🕐 <strong>Developer frustration</strong>: Mỗi lần deploy là một bài test kiên nhẫn. Bạn fix bug, commit, push, rồi... chờ. Chờ mãi không thấy kết quả.</li>
<li class="">🐌 <strong>CI/CD pipeline chậm chạp</strong>: Build chạy trên CI server cũng mất gần 1 tiếng, làm chậm toàn bộ release cycle.</li>
<li class="">💸 <strong>Chi phí tăng cao</strong>: Với cloud CI/CD, thời gian build lâu = tiền bị đốt nhiều hơn.</li>
<li class="">😫 <strong>Năng suất giảm</strong>: Thay vì code tiếp, mình phải ngồi đợi build xong.</li>
</ul>
<p>"Phải làm gì đó thôi!" - mình nghĩ vậy và bắt đầu tìm hiểu.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bước-ngoặt-phát-hiện-application-builder">Bước ngoặt: Phát hiện Application Builder<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#b%C6%B0%E1%BB%9Bc-ngo%E1%BA%B7t-ph%C3%A1t-hi%E1%BB%87n-application-builder" class="hash-link" aria-label="Đường dẫn trực tiếp đến Bước ngoặt: Phát hiện Application Builder" title="Đường dẫn trực tiếp đến Bước ngoặt: Phát hiện Application Builder" translate="no">​</a></h2>
<p>Sau một thời gian research và đọc documentation, mình phát hiện ra rằng từ Angular 17+, Angular team đã giới thiệu một builder mới tên là <strong>Application Builder</strong> - được thiết kế để thay thế cho Browser Builder cũ kỹ.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="browser-builder-vs-application-builder-cuộc-chiến-giữa-cũ-và-mới">Browser Builder vs Application Builder: Cuộc chiến giữa cũ và mới<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#browser-builder-vs-application-builder-cu%E1%BB%99c-chi%E1%BA%BFn-gi%E1%BB%AFa-c%C5%A9-v%C3%A0-m%E1%BB%9Bi" class="hash-link" aria-label="Đường dẫn trực tiếp đến Browser Builder vs Application Builder: Cuộc chiến giữa cũ và mới" title="Đường dẫn trực tiếp đến Browser Builder vs Application Builder: Cuộc chiến giữa cũ và mới" translate="no">​</a></h3>
<p>Để hiểu rõ hơn, mình sẽ giải thích sự khác biệt giữa hai builder này:</p>
<p><strong>Browser Builder</strong> (bạn cũ) - <code>@angular-devkit/build-angular:browser</code>:</p>
<ul>
<li class="">👴 Builder "ông nội" đã có từ những ngày đầu của Angular</li>
<li class="">📦 Dựa trên Webpack với nhiều plugin và loader phức tạp</li>
<li class="">🐢 Build process nhiều bước, không được tối ưu tốt</li>
<li class="">⏳ Chậm, đặc biệt với project lớn</li>
</ul>
<p><strong>Application Builder</strong> (người mới) - <code>@angular-devkit/build-angular:application</code>:</p>
<ul>
<li class="">🚀 Builder mới được thiết kế lại từ đầu (từ Angular 17+)</li>
<li class="">⚡ Sử dụng công nghệ hiện đại: esbuild (viết bằng Go, siêu nhanh!), Vite-like architecture</li>
<li class="">🎯 Build process được tối ưu, ít bước xử lý hơn</li>
<li class="">💾 Caching thông minh hơn - rebuild chỉ build phần thay đổi</li>
<li class="">✂️ Tree-shaking và code splitting hiệu quả hơn nhiều</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="hành-trình-migrate-chỉ-cần-sửa-vài-dòng-code">Hành trình migrate: Chỉ cần sửa vài dòng code!<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#h%C3%A0nh-tr%C3%ACnh-migrate-ch%E1%BB%89-c%E1%BA%A7n-s%E1%BB%ADa-v%C3%A0i-d%C3%B2ng-code" class="hash-link" aria-label="Đường dẫn trực tiếp đến Hành trình migrate: Chỉ cần sửa vài dòng code!" title="Đường dẫn trực tiếp đến Hành trình migrate: Chỉ cần sửa vài dòng code!" translate="no">​</a></h2>
<p>Sau khi quyết định migrate, mình bắt đầu thực hiện. Và tin vui là... nó <strong>đơn giản hơn mình nghĩ rất nhiều</strong>!</p>
<p>Chỉ cần sửa file <code>angular.json</code> - không cần thay đổi code, không cần migrate dependencies phức tạp. Đúng là một cú hích (quick win) đáng giá! 🎯</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bước-1-thay-đổi-builder">Bước 1: Thay đổi Builder<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#b%C6%B0%E1%BB%9Bc-1-thay-%C4%91%E1%BB%95i-builder" class="hash-link" aria-label="Đường dẫn trực tiếp đến Bước 1: Thay đổi Builder" title="Đường dẫn trực tiếp đến Bước 1: Thay đổi Builder" translate="no">​</a></h3>
<p>Đầu tiên, mở file <code>angular.json</code> và tìm phần <code>architect.build</code>. Đây là những gì bạn cần thay đổi:</p>
<p><strong>Trước khi migrate (Browser Builder):</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"projects"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"your-project-name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"architect"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"build"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"builder"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@angular-devkit/build-angular:browser"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"options"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"main"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"projects/your-project/src/main.ts"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"polyfills"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"projects/your-project/src/polyfills.ts"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>Sau khi migrate (Application Builder):</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"projects"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"your-project-name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"architect"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"build"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"builder"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@angular-devkit/build-angular:application"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"options"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"browser"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"projects/your-project/src/main.ts"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"polyfills"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token string" style="color:#e3116c">"projects/your-project/src/polyfills.ts"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>Những thay đổi chính:</strong></p>
<ol>
<li class="">✅ <code>builder</code>: Đổi từ <code>browser</code> → <code>application</code></li>
<li class="">✅ <code>main</code> → <code>browser</code>: Tên option thay đổi (nhưng vẫn trỏ đến cùng file)</li>
<li class="">✅ <code>polyfills</code>: Từ string đơn → array (cho phép thêm nhiều polyfills sau này)</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="b�ước-2-tối-ưu-development-configuration-optional-nhưng-khuyến-khích">Bước 2: Tối ưu Development Configuration (Optional nhưng khuyến khích)<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#b%C6%B0%E1%BB%9Bc-2-t%E1%BB%91i-%C6%B0u-development-configuration-optional-nh%C6%B0ng-khuy%E1%BA%BFn-kh%C3%ADch" class="hash-link" aria-label="Đường dẫn trực tiếp đến Bước 2: Tối ưu Development Configuration (Optional nhưng khuyến khích)" title="Đường dẫn trực tiếp đến Bước 2: Tối ưu Development Configuration (Optional nhưng khuyến khích)" translate="no">​</a></h3>
<p>Trong phần <code>configurations.development</code>, bạn có thể đơn giản hóa config:</p>
<p><strong>Trước:</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"configurations"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"development"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"buildOptimizer"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"optimization"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"vendorChunk"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"extractLicenses"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"sourceMap"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"namedChunks"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>Sau (đơn giản hơn):</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"configurations"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"development"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"optimization"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"extractLicenses"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"sourceMap"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"namedChunks"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>Tại sao bỏ đi?</strong></p>
<ul>
<li class="">🎯 Application Builder tự động xử lý <code>buildOptimizer</code> và <code>vendorChunk</code> tốt hơn</li>
<li class="">🚀 Cơ chế caching và optimization được tích hợp sẵn, không cần config thủ công</li>
<li class="">✨ Đơn giản hóa config = dễ maintain hơn</li>
</ul>
<p><strong>Lưu ý:</strong> Bạn có thể giữ nguyên config cũ, nhưng để tận dụng tối đa performance của Application Builder, mình khuyến khích bỏ những dòng không cần thiết.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kết-quả-từ-ác-mộng-thành-giấc-mơ">Kết quả: Từ ác mộng thành giấc mơ!<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#k%E1%BA%BFt-qu%E1%BA%A3-t%E1%BB%AB-%C3%A1c-m%E1%BB%99ng-th%C3%A0nh-gi%E1%BA%A5c-m%C6%A1" class="hash-link" aria-label="Đường dẫn trực tiếp đến Kết quả: Từ ác mộng thành giấc mơ!" title="Đường dẫn trực tiếp đến Kết quả: Từ ác mộng thành giấc mơ!" translate="no">​</a></h2>
<p>Sau khi migrate xong, mình chạy build và... <strong>WOW!</strong> 🤩</p>
<p><img decoding="async" loading="lazy" alt="Thời gian build sau khi improve" src="https://tiennhm.io.vn/assets/images/after-improve-build-angular-e786238076ebd864c8034672f6513d8d.png" width="385" height="498" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="số-liệu-thực-tế-cải-thiện-đáng-kinh-ngạc">Số liệu thực tế: Cải thiện đáng kinh ngạc!<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#s%E1%BB%91-li%E1%BB%87u-th%E1%BB%B1c-t%E1%BA%BF-c%E1%BA%A3i-thi%E1%BB%87n-%C4%91%C3%A1ng-kinh-ng%E1%BA%A1c" class="hash-link" aria-label="Đường dẫn trực tiếp đến Số liệu thực tế: Cải thiện đáng kinh ngạc!" title="Đường dẫn trực tiếp đến Số liệu thực tế: Cải thiện đáng kinh ngạc!" translate="no">​</a></h3>
<p>Mình đã test và đo lại thời gian build, và đây là kết quả:</p>
<table><thead><tr><th>Metric</th><th>Trước</th><th>Sau</th><th>Cải thiện</th></tr></thead><tbody><tr><td><strong>Build Time</strong></td><td>~52 phút</td><td>~26 phút</td><td><strong>-50%</strong> 🎉</td></tr><tr><td><strong>Rebuild Time</strong></td><td>~40 phút</td><td>~18 phút</td><td><strong>-55%</strong> 🚀</td></tr><tr><td><strong>Initial Build</strong></td><td>~52 phút</td><td>~26 phút</td><td><strong>-50%</strong> ⚡</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="những-lợi-ích-thực-tế-mình-cảm-nhận-được">Những lợi ích thực tế mình cảm nhận được<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#nh%E1%BB%AFng-l%E1%BB%A3i-%C3%ADch-th%E1%BB%B1c-t%E1%BA%BF-m%C3%ACnh-c%E1%BA%A3m-nh%E1%BA%ADn-%C4%91%C6%B0%E1%BB%A3c" class="hash-link" aria-label="Đường dẫn trực tiếp đến Những lợi ích thực tế mình cảm nhận được" title="Đường dẫn trực tiếp đến Những lợi ích thực tế mình cảm nhận được" translate="no">​</a></h3>
<p>✅ <strong>Tiết kiệm 26 phút mỗi lần build</strong>: Từ 52 phút xuống 26 phút - <strong>giảm đúng 50%</strong>! Đủ thời gian để giải quyết vấn đề khác thay vì chờ đợi.</p>
<p>✅ <strong>Hotfix trở nên khả thi</strong>: Khi có bug production khẩn cấp, giờ đây chỉ mất <strong>26 phút</strong> thay vì 52 phút để deploy fix. Đây là <strong>game changer</strong> thực sự! 🚨</p>
<p>✅ <strong>Rebuild cực nhanh</strong>: Lần build thứ 2 chỉ mất 18 phút nhờ caching thông minh - giảm <strong>55%</strong> so với trước! Đặc biệt hữu ích khi test nhiều lần.</p>
<p>✅ <strong>Tăng năng suất đáng kể</strong>: Developer không còn phải "giết thời gian" chờ build, có thể focus vào code và giải quyết vấn đề khác.</p>
<p>✅ <strong>Độ hài lòng của các bên tăng cao</strong>:</p>
<ul>
<li class="">Product Owner/Stakeholders: Fix bug nhanh hơn → hài lòng hơn</li>
<li class="">Customer: Vấn đề được giải quyết nhanh chóng → trải nghiệm tốt hơn</li>
<li class="">Team: Ít stress, nhiều thời gian hơn cho quality work</li>
</ul>
<p>✅ <strong>CI/CD pipeline "sống lại"</strong>: Release cycle nhanh hơn rất nhiều, team deploy được thường xuyên hơn, không còn sợ deploy nữa!</p>
<p>✅ <strong>Bundle size giữ nguyên</strong>: Không có trade-off - vẫn giữ nguyên kích thước output, chỉ build nhanh hơn thôi!</p>
<p>✅ <strong>Chi phí CI/CD giảm</strong>: Với cloud CI/CD tính theo thời gian, tiết kiệm được <strong>50% chi phí</strong> cho mỗi lần build!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="giải-thích-kỹ-thuật-vì-sao-application-builder-nhanh-hơn">Giải thích kỹ thuật: Vì sao Application Builder nhanh hơn?<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#gi%E1%BA%A3i-th%C3%ADch-k%E1%BB%B9-thu%E1%BA%ADt-v%C3%AC-sao-application-builder-nhanh-h%C6%A1n" class="hash-link" aria-label="Đường dẫn trực tiếp đến Giải thích kỹ thuật: Vì sao Application Builder nhanh hơn?" title="Đường dẫn trực tiếp đến Giải thích kỹ thuật: Vì sao Application Builder nhanh hơn?" translate="no">​</a></h2>
<p>Bạn có thể thắc mắc: "Sao chỉ đổi builder mà nhanh được nhiều vậy?" Câu trả lời nằm ở những cải tiến kỹ thuật bên dưới! 🔍</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-build-pipeline-được-tối-ưu-từ-đầu">1. Build Pipeline được tối ưu từ đầu<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#1-build-pipeline-%C4%91%C6%B0%E1%BB%A3c-t%E1%BB%91i-%C6%B0u-t%E1%BB%AB-%C4%91%E1%BA%A7u" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1. Build Pipeline được tối ưu từ đầu" title="Đường dẫn trực tiếp đến 1. Build Pipeline được tối ưu từ đầu" translate="no">​</a></h3>
<p>Application Builder không phải là "nâng cấp" Browser Builder - nó là một <strong>kiến trúc hoàn toàn mới</strong>:</p>
<ul>
<li class="">⚡ <strong>esbuild</strong>: JavaScript bundler viết bằng Go (không phải JavaScript!), nhanh gấp 10-100 lần Webpack trong một số trường hợp</li>
<li class="">🚀 <strong>Vite-like architecture</strong>: Sử dụng ESM (ES Modules) native, không cần bundle trong development</li>
<li class="">🔄 <strong>Parallel processing</strong>: Xử lý nhiều task song song thay vì tuần tự</li>
</ul>
<p><strong>So sánh đơn giản:</strong> Browser Builder giống như đi xe đạp, còn Application Builder như đi xe máy! 🏍️</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-caching-thông-minh---nhớ-những-gì-đã-build">2. Caching thông minh - "Nhớ" những gì đã build<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#2-caching-th%C3%B4ng-minh---nh%E1%BB%9B-nh%E1%BB%AFng-g%C3%AC-%C4%91%C3%A3-build" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2. Caching thông minh - &quot;Nhớ&quot; những gì đã build" title="Đường dẫn trực tiếp đến 2. Caching thông minh - &quot;Nhớ&quot; những gì đã build" translate="no">​</a></h3>
<p>Đây là điểm mình thích nhất - Application Builder có bộ nhớ tốt hơn nhiều:</p>
<ul>
<li class="">💾 <strong>Persistent cache</strong>: Cache được lưu trên disk, không mất khi tắt terminal</li>
<li class="">🔍 <strong>Incremental builds</strong>: Chỉ build lại phần code thay đổi (không phải toàn bộ!)</li>
<li class="">📦 <strong>Metadata cache</strong>: Cache cả thông tin về dependencies, không cần resolve lại mỗi lần</li>
</ul>
<p><strong>Ví dụ thực tế:</strong> Bạn sửa 1 file component nhỏ → Browser Builder build lại 1000+ files, Application Builder chỉ build lại file đó + dependencies liên quan!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-tree-shaking-và-code-splitting-siêu-hiệu-quả">3. Tree-shaking và Code Splitting siêu hiệu quả<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#3-tree-shaking-v%C3%A0-code-splitting-si%EF%BF%BD%C3%AAu-hi%E1%BB%87u-qu%E1%BA%A3" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3. Tree-shaking và Code Splitting siêu hiệu quả" title="Đường dẫn trực tiếp đến 3. Tree-shaking và Code Splitting siêu hiệu quả" translate="no">​</a></h3>
<ul>
<li class="">✂️ <strong>Better tree-shaking</strong>: Loại bỏ dead code chính xác hơn, bundle nhẹ hơn</li>
<li class="">📊 <strong>Optimized code splitting</strong>: Tự động chia bundle hợp lý - load code khi cần</li>
<li class="">🎯 <strong>Lazy loading</strong>: Hỗ trợ lazy loading routes tốt hơn, giảm initial bundle size</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-giảm-số-bước-xử-lý-fewer-steps--faster-build">4. Giảm số bước xử lý (Fewer Steps = Faster Build)<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#4-gi%E1%BA%A3m-s%E1%BB%91-b%C6%B0%E1%BB%9Bc-x%E1%BB%AD-l%C3%BD-fewer-steps--faster-build" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4. Giảm số bước xử lý (Fewer Steps = Faster Build)" title="Đường dẫn trực tiếp đến 4. Giảm số bước xử lý (Fewer Steps = Faster Build)" translate="no">​</a></h3>
<p>Browser Builder phải đi qua một hành trình dài:</p>
<ol>
<li class="">🔨 TypeScript compilation</li>
<li class="">📝 Template compilation</li>
<li class="">📦 Module bundling</li>
<li class="">🖼️ Asset processing</li>
<li class="">⚙️ Optimization</li>
<li class="">🔀 Chunk splitting</li>
<li class="">📤 Output generation</li>
</ol>
<p>Application Builder gộp nhiều bước lại và tối ưu từng bước, giảm overhead đáng kể. Kết quả? Build nhanh hơn mà vẫn giữ nguyên chất lượng output!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lưu-ý-quan-trọng-trước-khi-migrate">Lưu ý quan trọng trước khi migrate<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#l%C6%B0u-%C3%BD-quan-tr%E1%BB%8Dng-tr%C6%B0%E1%BB%9Bc-khi-migrate" class="hash-link" aria-label="Đường dẫn trực tiếp đến Lưu ý quan trọng trước khi migrate" title="Đường dẫn trực tiếp đến Lưu ý quan trọng trước khi migrate" translate="no">​</a></h2>
<p>Mình muốn chia sẻ những điều cần lưu ý để bạn migrate một cách an toàn và hiệu quả nhất! ⚠️</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-kiểm-tra-compatibility---điều-kiện-tiên-quyết">1. Kiểm tra Compatibility - Điều kiện tiên quyết<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#1-ki%E1%BB%83m-tra-compatibility---%C4%91i%E1%BB%81u-ki%E1%BB%87n-ti%C3%AAn-quy%E1%BA%BFt" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1. Kiểm tra Compatibility - Điều kiện tiên quyết" title="Đường dẫn trực tiếp đến 1. Kiểm tra Compatibility - Điều kiện tiên quyết" translate="no">​</a></h3>
<p>Không phải project nào cũng migrate được ngay. Hãy đảm bảo:</p>
<ul>
<li class="">✅ <strong>Angular version &gt;= 17</strong>: Tốt nhất là &gt;= 18 (như project của mình)</li>
<li class="">✅ <strong>Dependencies tương thích</strong>: Kiểm tra xem các thư viện bạn dùng có support Application Builder không</li>
<li class="">⚠️ <strong>Custom webpack config</strong>: Nếu bạn có custom webpack config, có thể cần điều chỉnh hoặc bỏ đi (Application Builder không dùng Webpack nữa!)</li>
</ul>
<p><strong>Mẹo:</strong> Nếu không chắc, hãy tạo một branch riêng để test migrate trước, đừng migrate trực tiếp trên main branch nhé!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-test-kỹ-lưỡng-sau-khi-migrate">2. Test kỹ lưỡng sau khi migrate<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#2-test-k%E1%BB%B9-l%C6%B0%E1%BB%A1ng-sau-khi-migrate" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2. Test kỹ lưỡng sau khi migrate" title="Đường dẫn trực tiếp đến 2. Test kỹ lưỡng sau khi migrate" translate="no">​</a></h3>
<p>Sau khi migrate, <strong>NHẤT ĐỊNH</strong> phải test kỹ:</p>
<ul>
<li class="">✅ Build production: <code>ng build --configuration production</code></li>
<li class="">✅ Build development: <code>ng build --configuration development</code></li>
<li class="">✅ Serve và HMR: <code>ng serve</code> - kiểm tra hot reload có hoạt động không</li>
<li class="">✅ Bundle size: So sánh với build cũ, đảm bảo không tăng đột biến</li>
<li class="">✅ Runtime testing: Test các tính năng chính của app, đảm bảo không có lỗi</li>
</ul>
<p><strong>Quy trình mình làm:</strong></p>
<ol>
<li class="">Migrate trên branch riêng</li>
<li class="">Build và test local</li>
<li class="">Deploy lên staging environment</li>
<li class="">Test kỹ trên staging</li>
<li class="">Mới merge vào main và deploy production</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-tối-ưu-thêm-sau-khi-migrate-bonus">3. Tối ưu thêm sau khi migrate (Bonus!)<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#3-t%E1%BB%91i-%C6%B0u-th%C3%AAm-sau-khi-migrate-bonus" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3. Tối ưu thêm sau khi migrate (Bonus!)" title="Đường dẫn trực tiếp đến 3. Tối ưu thêm sau khi migrate (Bonus!)" translate="no">​</a></h3>
<p>Sau khi migrate xong và mọi thứ hoạt động ổn, bạn có thể tối ưu thêm:</p>
<ul>
<li class="">💾 <strong>Enable Angular cache</strong>: Thường đã có sẵn trong config, nhưng kiểm tra lại:<!-- -->
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"cli"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"cache"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"enabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"environment"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"all"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
</li>
<li class="">🧹 <strong>Clean up dependencies</strong>: Loại bỏ các package không dùng đến</li>
<li class="">🎯 <strong>Code splitting</strong>: Review lại lazy loading routes, tối ưu nếu cần</li>
<li class="">🖼️ <strong>Asset optimization</strong>: Compress images, sử dụng WebP khi có thể</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-environment-variables---lưu-ý-nhỏ">4. Environment Variables - Lưu ý nhỏ<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#4-environment-variables---l%C6%B0u-%C3%BD-nh%E1%BB%8F" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4. Environment Variables - Lưu ý nhỏ" title="Đường dẫn trực tiếp đến 4. Environment Variables - Lưu ý nhỏ" translate="no">​</a></h3>
<p>Application Builder xử lý environment variables hơi khác một chút so với Browser Builder. Nếu project bạn có nhiều environment files (dev, staging, prod), hãy kiểm tra lại để đảm bảo chúng được load đúng.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices-tối-ưu-build-time-đến-mức-tối-đa">Best Practices: Tối ưu build time đến mức tối đa<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#best-practices-t%E1%BB%91i-%C6%B0u-build-time-%C4%91%E1%BA%BFn-m%E1%BB%A9c-t%E1%BB%91i-%C4%91a" class="hash-link" aria-label="Đường dẫn trực tiếp đến Best Practices: Tối ưu build time đến mức tối đa" title="Đường dẫn trực tiếp đến Best Practices: Tối ưu build time đến mức tối đa" translate="no">​</a></h2>
<p>Ngoài việc migrate sang Application Builder, mình cũng áp dụng một số best practices này để build càng nhanh càng tốt! 🚀</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-bật-angular-cache---quan-trọng-nhất">1. Bật Angular Cache - Quan trọng nhất!<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#1-b%E1%BA%ADt-angular-cache---quan-tr%E1%BB%8Dng-nh%E1%BA%A5t" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1. Bật Angular Cache - Quan trọng nhất!" title="Đường dẫn trực tiếp đến 1. Bật Angular Cache - Quan trọng nhất!" translate="no">​</a></h3>
<p>Đây là tính năng mình recommend <strong>100%</strong> - nó giúp rebuild nhanh hơn rất nhiều:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"cli"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"cache"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"enabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"environment"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"all"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"path"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">".angular/cache"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>Lưu ý:</strong> Thêm <code>.angular/cache</code> vào <code>.gitignore</code> nhé, không cần commit cache lên git!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-dọn-dẹp-dependencies---bớt-gánh-nặng">2. Dọn dẹp Dependencies - Bớt gánh nặng<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#2-d%E1%BB%8Dn-d%E1%BA%B9p-dependencies---b%E1%BB%9Bt-g%C3%A1nh-n%E1%BA%B7ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2. Dọn dẹp Dependencies - Bớt gánh nặng" title="Đường dẫn trực tiếp đến 2. Dọn dẹp Dependencies - Bớt gánh nặng" translate="no">​</a></h3>
<p>Dependencies không dùng đến = thời gian build lãng phí:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Kiểm tra dependencies có thực sự được dùng không</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ls</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--depth</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Loại bỏ packages không dùng (nhưng cẩn thận!)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> prune</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Bonus: Sử dụng npm-check để tìm unused packages</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">npx npm-check </span><span class="token parameter variable" style="color:#36acaa">-u</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-code-splitting-strategy---chia-để-trị">3. Code Splitting Strategy - Chia để trị<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#3-code-splitting-strategy---chia-%C4%91%E1%BB%83-tr%E1%BB%8B" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3. Code Splitting Strategy - Chia để trị" title="Đường dẫn trực tiếp đến 3. Code Splitting Strategy - Chia để trị" translate="no">​</a></h3>
<p>Lazy load routes giúp initial bundle nhỏ hơn, build cũng nhanh hơn:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Tối ưu lazy loading routes</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> routes</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Routes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    path</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'dashboard'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">loadChildren</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">import</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'./features/dashboard/dashboard.module'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">then</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">m </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">DashboardModule</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    path</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'settings'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">loadChildren</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">import</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'./features/settings/settings.module'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">then</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">m </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">SettingsModule</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p><strong>Pro tip:</strong> Không lazy load routes nhỏ, chỉ lazy load các feature modules lớn!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-asset-optimization---giảm-kích-thước">4. Asset Optimization - Giảm kích thước<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#4-asset-optimization---gi%E1%BA%A3m-k%C3%ADch-th%C6%B0%E1%BB%9Bc" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4. Asset Optimization - Giảm kích thước" title="Đường dẫn trực tiếp đến 4. Asset Optimization - Giảm kích thước" translate="no">​</a></h3>
<p>Assets lớn = build chậm:</p>
<ul>
<li class="">🖼️ <strong>Compress images</strong>: Sử dụng tools như <code>imagemin</code> hoặc online tools</li>
<li class="">📸 <strong>WebP format</strong>: Nếu browser support, dùng WebP thay vì PNG/JPG (nhẹ hơn 25-30%)</li>
<li class="">🎬 <strong>Lazy load images</strong>: Không load tất cả images ngay, chỉ load khi cần:</li>
</ul>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Lazy load images với Intersection Observer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> imageObserver </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">IntersectionObserver</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">entries</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  entries</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">forEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">entry </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">entry</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">isIntersecting</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> img </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> entry</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">target </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> HTMLImageElement</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      img</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">src </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> img</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">dataset</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'src'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">''</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      imageObserver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">unobserve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">img</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-typescript-configuration---compile-nhanh-hơn">5. TypeScript Configuration - Compile nhanh hơn<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#5-typescript-configuration---compile-nhanh-h%C6%A1n" class="hash-link" aria-label="Đường dẫn trực tiếp đến 5. TypeScript Configuration - Compile nhanh hơn" title="Đường dẫn trực tiếp đến 5. TypeScript Configuration - Compile nhanh hơn" translate="no">​</a></h3>
<p>Tối ưu <code>tsconfig.json</code> để TypeScript compile nhanh hơn:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"compilerOptions"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"incremental"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Lưu cache compilation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"skipLibCheck"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">       </span><span class="token comment" style="color:#999988;font-style:italic">// Bỏ qua check type của node_modules</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"isolatedModules"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Tối ưu cho build tools</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"sourceMap"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// Tắt sourcemap trong production (nếu không cần)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>Lưu ý:</strong> Chỉ tắt <code>sourceMap</code> trong production nếu bạn không cần debug trên production!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kết-luận-một-thay-đổi-nhỏ-kết-quả-lớn---đặc-biệt-với-hotfix">Kết luận: Một thay đổi nhỏ, kết quả lớn - Đặc biệt với hotfix!<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#k%E1%BA%BFt-lu%E1%BA%ADn-m%E1%BB%99t-thay-%C4%91%E1%BB%95i-nh%E1%BB%8F-k%E1%BA%BFt-qu%E1%BA%A3-l%E1%BB%9Bn---%C4%91%E1%BA%B7c-bi%E1%BB%87t-v%E1%BB%9Bi-hotfix" class="hash-link" aria-label="Đường dẫn trực tiếp đến Kết luận: Một thay đổi nhỏ, kết quả lớn - Đặc biệt với hotfix!" title="Đường dẫn trực tiếp đến Kết luận: Một thay đổi nhỏ, kết quả lớn - Đặc biệt với hotfix!" translate="no">​</a></h2>
<p>Migrate sang Application Builder không chỉ là một "technical upgrade" - nó thực sự thay đổi cách mình làm việc với Angular project. Từ một project mỗi lần build phải chờ <strong>52 phút</strong>, giờ đây chỉ còn <strong>26 phút</strong> - một cải thiện đáng kể!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="tổng-kết-những-gì-đạt-được">Tổng kết những gì đạt được<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#t%E1%BB%95ng-k%E1%BA%BFt-nh%E1%BB%AFng-g%C3%AC-%C4%91%E1%BA%A1t-%C4%91%C6%B0%E1%BB%A3c" class="hash-link" aria-label="Đường dẫn trực tiếp đến Tổng kết những gì đạt được" title="Đường dẫn trực tiếp đến Tổng kết những gì đạt được" translate="no">​</a></h3>
<ul>
<li class="">⚡ <strong>Giảm 50% build time</strong>: Từ 52 phút → 26 phút</li>
<li class="">🚀 <strong>Rebuild nhanh hơn 55%</strong>: Từ 40 phút → 18 phút</li>
<li class="">🔥 <strong>Hotfix khả thi hơn</strong>: Giảm thời gian deploy hotfix từ 52 phút xuống 26 phút - giải quyết vấn đề khẩn cấp nhanh chóng hơn!</li>
<li class="">💰 <strong>Tiết kiệm chi phí CI/CD</strong>: Giảm 50% thời gian build = tiết kiệm đáng kể với cloud CI/CD</li>
<li class="">😊 <strong>Developer experience tốt hơn</strong>: Không còn phải chờ đợi, tập trung vào code và giải quyết vấn đề</li>
<li class="">🎯 <strong>Tăng độ hài lòng của các bên</strong>: Stakeholders, customers, và team đều hài lòng hơn nhờ deploy nhanh hơn</li>
<li class="">📦 <strong>Bundle size không đổi</strong>: Không có trade-off về performance - vẫn giữ nguyên chất lượng output</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="khuyến-nghị-cho-bạn">Khuyến nghị cho bạn<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#khuy%E1%BA%BFn-ngh%E1%BB%8B-cho-b%E1%BA%A1n" class="hash-link" aria-label="Đường dẫn trực tiếp đến Khuyến nghị cho bạn" title="Đường dẫn trực tiếp đến Khuyến nghị cho bạn" translate="no">​</a></h3>
<p>Đặc biệt nếu bạn đang:</p>
<ul>
<li class="">✅ Sử dụng Angular 17+ (tốt nhất là 18+)</li>
<li class="">✅ Gặp vấn đề về build time quá lâu (đặc biệt khi deploy hotfix khẩn cấp!)</li>
<li class="">✅ Muốn cải thiện developer experience và độ hài lòng của các bên</li>
<li class="">✅ Cần deploy thường xuyên hoặc có nhiều hotfix production</li>
</ul>
<p>Thì <strong>đây chính là lúc</strong> để migrate sang Application Builder!</p>
<p><strong>Use case đặc biệt quan trọng: Hotfix Production</strong>
Với build time 52 phút, mỗi lần hotfix là một cơn ác mộng. Stakeholders hỏi "Bao giờ fix xong?" và bạn phải trả lời "Khoảng 1 tiếng nữa" chỉ để build! Giờ đây với 26 phút, bạn có thể tự tin hơn rất nhiều. Đây không chỉ là vấn đề kỹ thuật, mà còn là vấn đề về <strong>business impact</strong> và <strong>customer satisfaction</strong>!</p>
<p><strong>Action plan đơn giản:</strong></p>
<ol>
<li class="">✅ Tạo branch mới để test</li>
<li class="">✅ Sửa <code>angular.json</code> như mình hướng dẫn</li>
<li class="">✅ Test build và chạy app</li>
<li class="">✅ So sánh build time trước/sau</li>
<li class="">✅ Nếu OK → merge và enjoy! 🎉</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="lời-khuyên-cuối-cùng">Lời khuyên cuối cùng<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#l%E1%BB%9Di-khuy%C3%AAn-cu%E1%BB%91i-c%C3%B9ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến Lời khuyên cuối cùng" title="Đường dẫn trực tiếp đến Lời khuyên cuối cùng" translate="no">​</a></h3>
<ul>
<li class="">🔍 <strong>Đọc kỹ documentation</strong> trước khi migrate, đặc biệt nếu project có custom webpack config</li>
<li class="">🧪 <strong>Test kỹ lưỡng</strong> trên staging trước khi deploy production</li>
<li class="">📊 <strong>Monitor metrics</strong>: Theo dõi build time và bundle size sau khi migrate</li>
<li class="">💬 <strong>Share với team</strong>: Nếu bạn thấy hiệu quả, hãy share với team để mọi người cùng benefit!</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tài-liệu-tham-khảo-và-tài-nguyên-hữu-ích">Tài liệu tham khảo và tài nguyên hữu ích<a href="https://tiennhm.io.vn/blog/improve-angular-build-time#t%C3%A0i-li%E1%BB%87u-tham-kh%E1%BA%A3o-v%C3%A0-t%C3%A0i-nguy%C3%AAn-h%E1%BB%AFu-%C3%ADch" class="hash-link" aria-label="Đường dẫn trực tiếp đến Tài liệu tham khảo và tài nguyên hữu ích" title="Đường dẫn trực tiếp đến Tài liệu tham khảo và tài nguyên hữu ích" translate="no">​</a></h2>
<ul>
<li class="">📚 <a href="https://angular.dev/reference/configs/application" target="_blank" rel="noopener noreferrer" class="">Angular Application Builder Documentation</a> - Official docs về Application Builder</li>
<li class="">⚙️ <a href="https://angular.dev/guide/build-optimization" target="_blank" rel="noopener noreferrer" class="">Angular Build Optimization Guide</a> - Hướng dẫn tối ưu build từ Angular team</li>
<li class="">💾 <a href="https://angular.dev/reference/configs/cache" target="_blank" rel="noopener noreferrer" class="">Angular Cache Configuration</a> - Cách cấu hình cache để build nhanh hơn</li>
<li class="">🔧 <a href="https://esbuild.github.io/" target="_blank" rel="noopener noreferrer" class="">esbuild Documentation</a> - Tài liệu về esbuild (bundler được dùng trong Application Builder)</li>
</ul>
<hr>
<p><em>Bài viết này được cập nhật lần cuối vào tháng 11/2025 dựa trên kinh nghiệm thực tế với Angular 18.</em></p>
<p><strong>Bạn có câu hỏi hay kinh nghiệm riêng về Angular build optimization? Hãy chia sẻ ở phần comment bên dưới nhé! 🚀</strong></p>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="angular" term="angular"/>
        <category label="build-optimization" term="build-optimization"/>
        <category label="performance" term="performance"/>
        <category label="angular-cli" term="angular-cli"/>
        <category label="webpack" term="webpack"/>
        <category label="build-time" term="build-time"/>
        <category label="angular-18" term="angular-18"/>
        <category label="esbuild" term="esbuild"/>
        <category label="vite" term="vite"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Giới thiệu UUID (Universally Unique Identifier) - Định danh duy nhất toàn cầu]]></title>
        <id>https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier</id>
        <link href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier"/>
        <updated>2025-10-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[UUID (Universally Unique Identifier) là chuẩn định danh 128-bit được sử dụng rộng rãi trong lập trình và cơ sở dữ liệu để tạo ID duy nhất toàn cầu mà không cần cơ quan trung tâm quản lý. Bài viết giới thiệu 5 phiên bản UUID (v1 time-based, v4 random, v3/v5 name-based), ưu nhược điểm của từng loại, cách sử dụng trong các ngôn ngữ lập trình phổ biến, và các use case thực tế trong distributed systems, microservices và database design.]]></summary>
        <content type="html"><![CDATA[<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p>UUID (Universally Unique Identifier) là chuẩn định danh 128-bit được sử dụng rộng rãi trong lập trình và cơ sở dữ liệu để tạo ID duy nhất toàn cầu mà không cần cơ quan trung tâm quản lý. Bài viết giới thiệu 5 phiên bản UUID (v1 time-based, v4 random, v3/v5 name-based), ưu nhược điểm của từng loại, cách sử dụng trong các ngôn ngữ lập trình phổ biến, và các use case thực tế trong distributed systems, microservices và database design.</p></div></div>
<p>UUID (Universally Unique Identifier) là một chuẩn định danh duy nhất được sử dụng rộng rãi trong lập trình và cơ sở dữ liệu. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết về UUID, tại sao nên sử dụng nó, ưu nhược điểm và các ví dụ thực tế.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="uuid-là-gì">UUID là gì?<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#uuid-l%C3%A0-g%C3%AC" class="hash-link" aria-label="Đường dẫn trực tiếp đến UUID là gì?" title="Đường dẫn trực tiếp đến UUID là gì?" translate="no">​</a></h2>
<p>UUID là một chuỗi 128-bit được biểu diễn dưới dạng 32 ký tự hexadecimal, được chia thành 5 nhóm và ngăn cách bởi dấu gạch ngang. Ví dụ:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">550e8400-e29b-41d4-a716-446655440000</span><br></span></code></pre></div></div>
<p>UUID được thiết kế để đảm bảo tính duy nhất trên toàn cầu mà không cần một cơ quan trung tâm nào quản lý.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="các-phiên-bản-uuid-chi-tiết">Các phiên bản UUID chi tiết<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#c%C3%A1c-phi%C3%AAn-b%E1%BA%A3n-uuid-chi-ti%E1%BA%BFt" class="hash-link" aria-label="Đường dẫn trực tiếp đến Các phiên bản UUID chi tiết" title="Đường dẫn trực tiếp đến Các phiên bản UUID chi tiết" translate="no">​</a></h2>
<p>UUID có 5 phiên bản chính, mỗi phiên bản có cách tạo và mục đích sử dụng khác nhau:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="uuid-version-1-time-based">UUID Version 1 (Time-based)<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#uuid-version-1-time-based" class="hash-link" aria-label="Đường dẫn trực tiếp đến UUID Version 1 (Time-based)" title="Đường dẫn trực tiếp đến UUID Version 1 (Time-based)" translate="no">​</a></h3>
<p><strong>Cấu trúc:</strong></p>
<ul>
<li class="">60 bits: Timestamp (số giây từ 15/10/1582)</li>
<li class="">12 bits: Clock sequence (để tránh trùng lặp)</li>
<li class="">48 bits: MAC address của máy tạo UUID</li>
</ul>
<p><strong>Đặc điểm:</strong></p>
<ul>
<li class="">✅ Có thể sắp xếp theo thời gian</li>
<li class="">✅ Đảm bảo tính duy nhất cao</li>
<li class="">❌ Tiết lộ thông tin về máy tạo</li>
<li class="">❌ Có thể dự đoán được thời gian tạo</li>
<li class="">❌ Có thể trùng lặp nếu tạo cùng lúc</li>
</ul>
<p><strong>Ví dụ:</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">550e8400-e29b-11d4-a716-446655440000</span><br></span></code></pre></div></div>
<p><strong>Khi nào sử dụng:</strong></p>
<ul>
<li class="">Cần sắp xếp theo thời gian tạo</li>
<li class="">Hệ thống đơn lẻ, không quan tâm bảo mật</li>
<li class="">Cần trace được thời điểm tạo UUID</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="uuid-version-2-dce-security">UUID Version 2 (DCE Security)<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#uuid-version-2-dce-security" class="hash-link" aria-label="Đường dẫn trực tiếp đến UUID Version 2 (DCE Security)" title="Đường dẫn trực tiếp đến UUID Version 2 (DCE Security)" translate="no">​</a></h3>
<p><strong>Đặc điểm:</strong></p>
<ul>
<li class="">Dựa trên Version 1 nhưng thay thế một phần bằng user/group ID</li>
<li class="">Ít được sử dụng trong thực tế</li>
<li class="">Chủ yếu dành cho DCE (Distributed Computing Environment)</li>
</ul>
<p><strong>Khi nào sử dụng:</strong></p>
<ul>
<li class="">Hệ thống DCE</li>
<li class="">Cần liên kết UUID với user/group</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="uuid-version-3-name-based-with-md5">UUID Version 3 (Name-based with MD5)<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#uuid-version-3-name-based-with-md5" class="hash-link" aria-label="Đường dẫn trực tiếp đến UUID Version 3 (Name-based with MD5)" title="Đường dẫn trực tiếp đến UUID Version 3 (Name-based with MD5)" translate="no">​</a></h3>
<p><strong>Cấu trúc:</strong></p>
<ul>
<li class="">Sử dụng MD5 hash của namespace + name</li>
<li class="">Namespace phải là UUID hợp lệ</li>
<li class="">Name là chuỗi tùy ý</li>
</ul>
<p><strong>Đặc điểm:</strong></p>
<ul>
<li class="">✅ Cùng input luôn tạo ra cùng UUID</li>
<li class="">✅ Deterministic (xác định)</li>
<li class="">❌ MD5 đã lỗi thời về mặt bảo mật</li>
<li class="">❌ Không được khuyến khích sử dụng</li>
</ul>
<p><strong>Ví dụ:</strong></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> uuid</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Tạo UUID v3 từ namespace và name</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">namespace </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NAMESPACE_DNS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"example.com"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uuid3 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">uuid3</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">namespace</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uuid3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 6fa459ea-ee8a-3ca4-894e-db77e160355e</span><br></span></code></pre></div></div>
<p><strong>Khi nào sử dụng:</strong></p>
<ul>
<li class="">Cần tạo UUID từ dữ liệu có sẵn</li>
<li class="">Không quan tâm đến bảo mật</li>
<li class="">Legacy systems</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="uuid-version-4-random">UUID Version 4 (Random)<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#uuid-version-4-random" class="hash-link" aria-label="Đường dẫn trực tiếp đến UUID Version 4 (Random)" title="Đường dẫn trực tiếp đến UUID Version 4 (Random)" translate="no">​</a></h3>
<p><strong>Cấu trúc:</strong></p>
<ul>
<li class="">122 bits: Số ngẫu nhiên</li>
<li class="">4 bits: Version (0100)</li>
<li class="">2 bits: Variant (10)</li>
</ul>
<p><strong>Đặc điểm:</strong></p>
<ul>
<li class="">✅ Hoàn toàn ngẫu nhiên</li>
<li class="">✅ Không thể dự đoán</li>
<li class="">✅ Bảo mật cao</li>
<li class="">✅ Được sử dụng phổ biến nhất</li>
<li class="">❌ Không thể sắp xếp theo thời gian</li>
<li class="">❌ Không deterministic</li>
</ul>
<p><strong>Ví dụ:</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">550e8400-e29b-41d4-a716-446655440000</span><br></span></code></pre></div></div>
<p><strong>Khi nào sử dụng:</strong></p>
<ul>
<li class="">Hầu hết các trường hợp</li>
<li class="">Cần bảo mật cao</li>
<li class="">Hệ thống phân tán</li>
<li class="">API public</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="uuid-version-5-name-based-with-sha-1">UUID Version 5 (Name-based with SHA-1)<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#uuid-version-5-name-based-with-sha-1" class="hash-link" aria-label="Đường dẫn trực tiếp đến UUID Version 5 (Name-based with SHA-1)" title="Đường dẫn trực tiếp đến UUID Version 5 (Name-based with SHA-1)" translate="no">​</a></h3>
<p><strong>Cấu trúc:</strong></p>
<ul>
<li class="">Sử dụng SHA-1 hash của namespace + name</li>
<li class="">Namespace phải là UUID hợp lệ</li>
<li class="">Name là chuỗi tùy ý</li>
</ul>
<p><strong>Đặc điểm:</strong></p>
<ul>
<li class="">✅ Cùng input luôn tạo ra cùng UUID</li>
<li class="">✅ Deterministic (xác định)</li>
<li class="">✅ SHA-1 an toàn hơn MD5</li>
<li class="">✅ Được khuyến khích thay thế v3</li>
<li class="">❌ Vẫn có thể dự đoán được</li>
</ul>
<p><strong>Ví dụ:</strong></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> uuid</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Tạo UUID v5 từ namespace và name</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">namespace </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NAMESPACE_DNS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"example.com"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uuid5 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">uuid5</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">namespace</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uuid5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 886313e1-3b8a-5372-9b90-0c9aee199e5d</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Cùng input sẽ tạo ra cùng UUID</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uuid5_2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">uuid5</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">namespace</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uuid5 </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> uuid5_2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># True</span><br></span></code></pre></div></div>
<p><strong>Khi nào sử dụng:</strong></p>
<ul>
<li class="">Cần tạo UUID từ dữ liệu có sẵn</li>
<li class="">Cần deterministic UUID</li>
<li class="">Thay thế cho UUID v3</li>
<li class="">Tạo UUID từ URL, email, tên file</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="so-sánh-các-phiên-bản-uuid">So sánh các phiên bản UUID<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#so-s%C3%A1nh-c%C3%A1c-phi%C3%AAn-b%E1%BA%A3n-uuid" class="hash-link" aria-label="Đường dẫn trực tiếp đến So sánh các phiên bản UUID" title="Đường dẫn trực tiếp đến So sánh các phiên bản UUID" translate="no">​</a></h2>
<table><thead><tr><th>Version</th><th>Tính duy nhất</th><th>Bảo mật</th><th>Deterministic</th><th>Sắp xếp được</th><th>Sử dụng phổ biến</th></tr></thead><tbody><tr><td>v1</td><td>Cao</td><td>Thấp</td><td>Không</td><td>Có</td><td>Trung bình</td></tr><tr><td>v2</td><td>Cao</td><td>Thấp</td><td>Không</td><td>Có</td><td>Thấp</td></tr><tr><td>v3</td><td>Cao</td><td>Thấp</td><td>Có</td><td>Không</td><td>Thấp</td></tr><tr><td>v4</td><td>Cao</td><td>Cao</td><td>Không</td><td>Không</td><td>Cao</td></tr><tr><td>v5</td><td>Cao</td><td>Trung bình</td><td>Có</td><td>Không</td><td>Trung bình</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="namespace-uuids-chuẩn">Namespace UUIDs chuẩn<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#namespace-uuids-chu%E1%BA%A9n" class="hash-link" aria-label="Đường dẫn trực tiếp đến Namespace UUIDs chuẩn" title="Đường dẫn trực tiếp đến Namespace UUIDs chuẩn" translate="no">​</a></h2>
<p>Khi sử dụng UUID v3 hoặc v5, bạn có thể sử dụng các namespace chuẩn:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> uuid</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Các namespace chuẩn</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NAMESPACE_DNS</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 6ba7b810-9dad-11d1-80b4-00c04fd430c8</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NAMESPACE_URL</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 6ba7b811-9dad-11d1-80b4-00c04fd430c8</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NAMESPACE_OID</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 6ba7b812-9dad-11d1-80b4-00c04fd430c8</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NAMESPACE_X500</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic"># 6ba7b814-9dad-11d1-80b4-00c04fd430c8</span><br></span></code></pre></div></div>
<p><strong>Ví dụ sử dụng namespace:</strong></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Tạo UUID từ URL</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">url_uuid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">uuid5</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NAMESPACE_URL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://example.com"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url_uuid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 6ba7b811-9dad-51d1-80b4-00c04fd430c8</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Tạo UUID từ email</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">email_uuid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">uuid5</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NAMESPACE_DNS</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"user@example.com"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">email_uuid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Tạo UUID từ tên file</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">file_uuid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">uuid5</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NAMESPACE_OID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/path/to/file.txt"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">file_uuid</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tại-sao-sử-dụng-uuid">Tại sao sử dụng UUID?<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#t%E1%BA%A1i-sao-s%E1%BB%AD-d%E1%BB%A5ng-uuid" class="hash-link" aria-label="Đường dẫn trực tiếp đến Tại sao sử dụng UUID?" title="Đường dẫn trực tiếp đến Tại sao sử dụng UUID?" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-tính-duy-nhất-toàn-cầu">1. Tính duy nhất toàn cầu<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#1-t%C3%ADnh-duy-nh%E1%BA%A5t-to%C3%A0n-c%E1%BA%A7u" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1. Tính duy nhất toàn cầu" title="Đường dẫn trực tiếp đến 1. Tính duy nhất toàn cầu" translate="no">​</a></h3>
<p>UUID đảm bảo không có xung đột giữa các hệ thống khác nhau, ngay cả khi chúng hoạt động độc lập.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-không-cần-server-trung-tâm">2. Không cần server trung tâm<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#2-kh%C3%B4ng-c%E1%BA%A7n-server-trung-t%C3%A2m" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2. Không cần server trung tâm" title="Đường dẫn trực tiếp đến 2. Không cần server trung tâm" translate="no">​</a></h3>
<p>Không cần một server để quản lý và phân phối ID như auto-increment.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-bảo-mật">3. Bảo mật<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#3-b%E1%BA%A3o-m%E1%BA%ADt" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3. Bảo mật" title="Đường dẫn trực tiếp đến 3. Bảo mật" translate="no">​</a></h3>
<p>UUID khó đoán được, giúp bảo vệ thông tin nhạy cảm.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-phân-tán-dữ-liệu">4. Phân tán dữ liệu<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#4-ph%C3%A2n-t%C3%A1n-d%E1%BB%AF-li%E1%BB%87u" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4. Phân tán dữ liệu" title="Đường dẫn trực tiếp đến 4. Phân tán dữ liệu" translate="no">​</a></h3>
<p>Hỗ trợ tốt cho các hệ thống phân tán và microservices.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ưu-điểm-của-uuid">Ưu điểm của UUID<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#%C6%B0u-%C4%91i%E1%BB%83m-c%E1%BB%A7a-uuid" class="hash-link" aria-label="Đường dẫn trực tiếp đến Ưu điểm của UUID" title="Đường dẫn trực tiếp đến Ưu điểm của UUID" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-ưu-điểm">✅ Ưu điểm<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#-%C6%B0u-%C4%91i%E1%BB%83m" class="hash-link" aria-label="Đường dẫn trực tiếp đến ✅ Ưu điểm" title="Đường dẫn trực tiếp đến ✅ Ưu điểm" translate="no">​</a></h3>
<ul>
<li class=""><strong>Tính duy nhất cao</strong>: Xác suất trùng lặp cực kỳ thấp</li>
<li class=""><strong>Không cần đồng bộ</strong>: Có thể tạo ở nhiều nơi khác nhau</li>
<li class=""><strong>Bảo mật</strong>: Khó đoán được nội dung</li>
<li class=""><strong>Hỗ trợ phân tán</strong>: Lý tưởng cho hệ thống phân tán</li>
<li class=""><strong>Không tiết lộ thông tin</strong>: Không cho biết số lượng record</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-nhược-điểm">❌ Nhược điểm<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#-nh%C6%B0%E1%BB%A3c-%C4%91i%E1%BB%83m" class="hash-link" aria-label="Đường dẫn trực tiếp đến ❌ Nhược điểm" title="Đường dẫn trực tiếp đến ❌ Nhược điểm" translate="no">​</a></h3>
<ul>
<li class=""><strong>Kích thước lớn</strong>: 16 bytes so với 4-8 bytes của integer</li>
<li class=""><strong>Hiệu suất</strong>: Chậm hơn integer trong indexing và sorting</li>
<li class=""><strong>Khó đọc</strong>: Không thân thiện với con người</li>
<li class=""><strong>Memory overhead</strong>: Tốn nhiều bộ nhớ hơn</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ví-dụ-thực-tế-trong-các-ngôn-ngữ-lập-trình">Ví dụ thực tế trong các ngôn ngữ lập trình<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#v%C3%AD-d%E1%BB%A5-th%E1%BB%B1c-t%E1%BA%BF-trong-c%C3%A1c-ng%C3%B4n-ng%E1%BB%AF-l%E1%BA%ADp-tr%C3%ACnh" class="hash-link" aria-label="Đường dẫn trực tiếp đến Ví dụ thực tế trong các ngôn ngữ lập trình" title="Đường dẫn trực tiếp đến Ví dụ thực tế trong các ngôn ngữ lập trình" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="javascriptnodejs">JavaScript/Node.js<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#javascriptnodejs" class="hash-link" aria-label="Đường dẫn trực tiếp đến JavaScript/Node.js" title="Đường dẫn trực tiếp đến JavaScript/Node.js" translate="no">​</a></h3>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Sử dụng crypto API (Node.js)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> crypto </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'crypto'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> uuid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> crypto</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">randomUUID</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uuid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 550e8400-e29b-41d4-a716-446655440000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Sử dụng thư viện uuid</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">v4</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> uuidv4 </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'uuid'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">uuidv4</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Trong browser</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> browserUuid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> crypto</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">randomUUID</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="python">Python<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#python" class="hash-link" aria-label="Đường dẫn trực tiếp đến Python" title="Đường dẫn trực tiếp đến Python" translate="no">​</a></h3>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> uuid</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Tạo UUID version 4 (random)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uuid4 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">uuid4</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uuid4</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 550e8400-e29b-41d4-a716-446655440000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Tạo UUID version 1 (time-based)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uuid1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">uuid1</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uuid1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Tạo UUID version 5 (name-based)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">namespace </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NAMESPACE_DNS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"example.com"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uuid5 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">uuid5</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">namespace</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uuid5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Chuyển đổi sang string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uuid_string </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uuid4</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="java">Java<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#java" class="hash-link" aria-label="Đường dẫn trực tiếp đến Java" title="Đường dẫn trực tiếp đến Java" translate="no">​</a></h3>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token import namespace" style="opacity:0.7">java</span><span class="token import namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token import namespace" style="opacity:0.7">util</span><span class="token import namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token import class-name">UUID</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">UUIDExample</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> args</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Tạo UUID random</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">UUID</span><span class="token plain"> uuid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">UUID</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">randomUUID</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">System</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">out</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">println</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">toString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Tạo UUID từ string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">UUID</span><span class="token plain"> fromString </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">UUID</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">fromString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"550e8400-e29b-41d4-a716-446655440000"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Tạo UUID version 3 (name-based with MD5)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">UUID</span><span class="token plain"> nameBased </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">UUID</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">nameUUIDFromBytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"example"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getBytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="c">C#<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#c" class="hash-link" aria-label="Đường dẫn trực tiếp đến C#" title="Đường dẫn trực tiếp đến C#" translate="no">​</a></h3>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">System</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">Program</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Tạo UUID mới</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Guid</span><span class="token plain"> uuid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Guid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewGuid</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WriteLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ToString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Tạo UUID từ string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Guid</span><span class="token plain"> fromString </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Guid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Parse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"550e8400-e29b-41d4-a716-446655440000"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Tạo UUID empty</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Guid</span><span class="token plain"> empty </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Guid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Empty</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="go">Go<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#go" class="hash-link" aria-label="Đường dẫn trực tiếp đến Go" title="Đường dẫn trực tiếp đến Go" translate="no">​</a></h3>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">package</span><span class="token plain"> main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"fmt"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"github.com/google/uuid"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Tạo UUID version 4</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    id </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    fmt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Println</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">String</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Tạo UUID version 1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    id1 </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewUUID</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    fmt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Println</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">String</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Parse UUID từ string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    parsed</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Parse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"550e8400-e29b-41d4-a716-446655440000"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">panic</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    fmt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Println</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">parsed</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sử-dụng-uuid-trong-database">Sử dụng UUID trong Database<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#s%E1%BB%AD-d%E1%BB%A5ng-uuid-trong-database" class="hash-link" aria-label="Đường dẫn trực tiếp đến Sử dụng UUID trong Database" title="Đường dẫn trực tiếp đến Sử dụng UUID trong Database" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="postgresql">PostgreSQL<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#postgresql" class="hash-link" aria-label="Đường dẫn trực tiếp đến PostgreSQL" title="Đường dẫn trực tiếp đến PostgreSQL" translate="no">​</a></h3>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">-- Tạo bảng với UUID</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">CREATE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">TABLE</span><span class="token plain"> users </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    id UUID </span><span class="token keyword" style="color:#00009f">PRIMARY</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">KEY</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">DEFAULT</span><span class="token plain"> gen_random_uuid</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    email </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">-- Chèn dữ liệu</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INTO</span><span class="token plain"> users </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> email</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">VALUES</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'John Doe'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'john@example.com'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">-- Tạo UUID trong query</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> gen_random_uuid</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> new_id</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">-- Index trên UUID</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">CREATE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INDEX</span><span class="token plain"> idx_users_id </span><span class="token keyword" style="color:#00009f">ON</span><span class="token plain"> users</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mysql">MySQL<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#mysql" class="hash-link" aria-label="Đường dẫn trực tiếp đến MySQL" title="Đường dẫn trực tiếp đến MySQL" translate="no">​</a></h3>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">-- Tạo bảng với UUID</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">CREATE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">TABLE</span><span class="token plain"> users </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    id </span><span class="token keyword" style="color:#00009f">CHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">36</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">PRIMARY</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">KEY</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    email </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">-- Chèn dữ liệu với UUID</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INTO</span><span class="token plain"> users </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> email</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">VALUES</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">UUID</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'John Doe'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'john@example.com'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">-- Tạo UUID trong query</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> UUID</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> new_id</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mongodb">MongoDB<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#mongodb" class="hash-link" aria-label="Đường dẫn trực tiếp đến MongoDB" title="Đường dẫn trực tiếp đến MongoDB" translate="no">​</a></h3>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Tạo document với UUID</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">db</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">users</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">insertOne</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">_id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#d73a49">ObjectId</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// MongoDB ObjectId</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">uuid</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">UUID</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Hoặc sử dụng UUID</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"John Doe"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">email</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"john@example.com"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Tìm kiếm theo UUID</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">db</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">users</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">findOne</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token literal-property property" style="color:#36acaa">uuid</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"550e8400-e29b-41d4-a716-446655440000"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="so-sánh-uuid-với-các-phương-pháp-khác">So sánh UUID với các phương pháp khác<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#so-s%C3%A1nh-uuid-v%E1%BB%9Bi-c%C3%A1c-ph%C6%B0%C6%A1ng-ph%C3%A1p-kh%C3%A1c" class="hash-link" aria-label="Đường dẫn trực tiếp đến So sánh UUID với các phương pháp khác" title="Đường dẫn trực tiếp đến So sánh UUID với các phương pháp khác" translate="no">​</a></h2>
<table><thead><tr><th>Phương pháp</th><th>Kích thước</th><th>Tính duy nhất</th><th>Hiệu suất</th><th>Bảo mật</th></tr></thead><tbody><tr><td>Auto-increment</td><td>4-8 bytes</td><td>Trong DB</td><td>Cao</td><td>Thấp</td></tr><tr><td>UUID v4</td><td>16 bytes</td><td>Toàn cầu</td><td>Trung bình</td><td>Cao</td></tr><tr><td>Snowflake ID</td><td>8 bytes</td><td>Toàn cầu</td><td>Cao</td><td>Trung bình</td></tr><tr><td>ULID</td><td>16 bytes</td><td>Toàn cầu</td><td>Cao</td><td>Trung bình</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="khi-nào-nên-sử-dụng-uuid">Khi nào nên sử dụng UUID?<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#khi-n%C3%A0o-n%C3%AAn-s%E1%BB%AD-d%E1%BB%A5ng-uuid" class="hash-link" aria-label="Đường dẫn trực tiếp đến Khi nào nên sử dụng UUID?" title="Đường dẫn trực tiếp đến Khi nào nên sử dụng UUID?" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-nên-sử-dụng-khi">✅ Nên sử dụng khi:<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#-n%C3%AAn-s%E1%BB%AD-d%E1%BB%A5ng-khi" class="hash-link" aria-label="Đường dẫn trực tiếp đến ✅ Nên sử dụng khi:" title="Đường dẫn trực tiếp đến ✅ Nên sử dụng khi:" translate="no">​</a></h3>
<ul>
<li class="">Xây dựng hệ thống phân tán</li>
<li class="">Cần bảo mật cao</li>
<li class="">Merge dữ liệu từ nhiều nguồn</li>
<li class="">API public</li>
<li class="">Microservices architecture</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-không-nên-sử-dụng-khi">❌ Không nên sử dụng khi:<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#-kh%C3%B4ng-n%C3%AAn-s%E1%BB%AD-d%E1%BB%A5ng-khi" class="hash-link" aria-label="Đường dẫn trực tiếp đến ❌ Không nên sử dụng khi:" title="Đường dẫn trực tiếp đến ❌ Không nên sử dụng khi:" translate="no">​</a></h3>
<ul>
<li class="">Database nhỏ, ít dữ liệu</li>
<li class="">Cần hiệu suất cao nhất</li>
<li class="">Primary key thường xuyên được join</li>
<li class="">Cần ID ngắn gọn, dễ đọc</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices">Best Practices<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#best-practices" class="hash-link" aria-label="Đường dẫn trực tiếp đến Best Practices" title="Đường dẫn trực tiếp đến Best Practices" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-chọn-đúng-version">1. Chọn đúng version<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#1-ch%E1%BB%8Dn-%C4%91%C3%BAng-version" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1. Chọn đúng version" title="Đường dẫn trực tiếp đến 1. Chọn đúng version" translate="no">​</a></h3>
<ul>
<li class=""><strong>UUID v4</strong>: Cho hầu hết trường hợp</li>
<li class=""><strong>UUID v1</strong>: Khi cần timestamp</li>
<li class=""><strong>UUID v5</strong>: Khi cần tạo UUID từ dữ liệu có sẵn</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-database-optimization">2. Database optimization<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#2-database-optimization" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2. Database optimization" title="Đường dẫn trực tiếp đến 2. Database optimization" translate="no">​</a></h3>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">-- PostgreSQL: Sử dụng UUID extension</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">CREATE</span><span class="token plain"> EXTENSION </span><span class="token keyword" style="color:#00009f">IF</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">EXISTS</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"uuid-ossp"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">-- Tạo index cho UUID</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">CREATE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INDEX</span><span class="token plain"> CONCURRENTLY idx_users_uuid </span><span class="token keyword" style="color:#00009f">ON</span><span class="token plain"> users </span><span class="token keyword" style="color:#00009f">USING</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">btree</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-application-level">3. Application level<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#3-application-level" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3. Application level" title="Đường dẫn trực tiếp đến 3. Application level" translate="no">​</a></h3>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Cache UUID để tránh tạo lại</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> userId </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">useMemo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">uuidv4</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Validate UUID format</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">isValidUUID</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">str</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> uuidRegex </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-source language-regex anchor function" style="color:#d73a49">^</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">[</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">0</span><span class="token regex regex-source language-regex char-class range range-punctuation operator" style="color:#393A34">-</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">9</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">a</span><span class="token regex regex-source language-regex char-class range range-punctuation operator" style="color:#393A34">-</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">f</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">]</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">{8}</span><span class="token regex regex-source language-regex" style="color:#36acaa">-</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">[</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">0</span><span class="token regex regex-source language-regex char-class range range-punctuation operator" style="color:#393A34">-</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">9</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">a</span><span class="token regex regex-source language-regex char-class range range-punctuation operator" style="color:#393A34">-</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">f</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">]</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">{4}</span><span class="token regex regex-source language-regex" style="color:#36acaa">-</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">[</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">1</span><span class="token regex regex-source language-regex char-class range range-punctuation operator" style="color:#393A34">-</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">5</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">]</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">[</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">0</span><span class="token regex regex-source language-regex char-class range range-punctuation operator" style="color:#393A34">-</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">9</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">a</span><span class="token regex regex-source language-regex char-class range range-punctuation operator" style="color:#393A34">-</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">f</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">]</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">{3}</span><span class="token regex regex-source language-regex" style="color:#36acaa">-</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">[</span><span class="token regex regex-source language-regex char-class" style="color:#36acaa">89ab</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">]</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">[</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">0</span><span class="token regex regex-source language-regex char-class range range-punctuation operator" style="color:#393A34">-</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">9</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">a</span><span class="token regex regex-source language-regex char-class range range-punctuation operator" style="color:#393A34">-</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">f</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">]</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">{3}</span><span class="token regex regex-source language-regex" style="color:#36acaa">-</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">[</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">0</span><span class="token regex regex-source language-regex char-class range range-punctuation operator" style="color:#393A34">-</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">9</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">a</span><span class="token regex regex-source language-regex char-class range range-punctuation operator" style="color:#393A34">-</span><span class="token regex regex-source language-regex char-class range" style="color:#36acaa">f</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">]</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">{12}</span><span class="token regex regex-source language-regex anchor function" style="color:#d73a49">$</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-flags" style="color:#36acaa">i</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> uuidRegex</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">test</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">str</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kết-luận">Kết luận<a href="https://tiennhm.io.vn/blog/gioi-thieu-uuid-universally-unique-identifier#k%E1%BA%BFt-lu%E1%BA%ADn" class="hash-link" aria-label="Đường dẫn trực tiếp đến Kết luận" title="Đường dẫn trực tiếp đến Kết luận" translate="no">​</a></h2>
<p>UUID là một công cụ mạnh mẽ cho việc tạo định danh duy nhất trong các ứng dụng hiện đại. Mặc dù có một số nhược điểm về hiệu suất và kích thước, nhưng lợi ích về tính duy nhất, bảo mật và khả năng phân tán làm cho nó trở thành lựa chọn lý tưởng cho nhiều trường hợp sử dụng.</p>
<p>Khi quyết định sử dụng UUID, hãy cân nhắc kỹ lưỡng về yêu cầu của hệ thống, đặc biệt là về hiệu suất và bảo mật. Với sự hiểu biết đúng đắn, UUID sẽ giúp bạn xây dựng các hệ thống robust và scalable.</p>
<hr>
<p><strong>Tài liệu tham khảo:</strong></p>
<ul>
<li class=""><a href="https://tools.ietf.org/html/rfc4122" target="_blank" rel="noopener noreferrer" class="">RFC 4122 - UUID Specification</a></li>
<li class=""><a href="https://en.wikipedia.org/wiki/Universally_unique_identifier" target="_blank" rel="noopener noreferrer" class="">UUID Wikipedia</a></li>
<li class=""><a href="https://www.postgresql.org/docs/current/datatype-uuid.html" target="_blank" rel="noopener noreferrer" class="">PostgreSQL UUID Documentation</a></li>
</ul>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="uuid" term="uuid"/>
        <category label="database" term="database"/>
        <category label="programming" term="programming"/>
        <category label="identifier" term="identifier"/>
        <category label="unique-id" term="unique-id"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Giới thiệu DBML - Database Markup Language]]></title>
        <id>https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language</id>
        <link href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language"/>
        <updated>2025-10-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[DBML (Database Markup Language) là một ngôn ngữ DSL mã nguồn mở được thiết kế để định nghĩa và tài liệu hóa cấu trúc cơ sở dữ liệu. Với cú pháp đơn giản, dễ đọc và độc lập với hệ quản trị cơ sở dữ liệu, DBML giúp developers quản lý schema hiệu quả, tạo ER diagrams tự động và tích hợp tốt với version control. Bài viết giới thiệu khái niệm, lợi ích, cú pháp cơ bản và các công cụ hỗ trợ DBML.]]></summary>
        <content type="html"><![CDATA[<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p>DBML (Database Markup Language) là một ngôn ngữ DSL mã nguồn mở được thiết kế để định nghĩa và tài liệu hóa cấu trúc cơ sở dữ liệu. Với cú pháp đơn giản, dễ đọc và độc lập với hệ quản trị cơ sở dữ liệu, DBML giúp developers quản lý schema hiệu quả, tạo ER diagrams tự động và tích hợp tốt với version control. Bài viết giới thiệu khái niệm, lợi ích, cú pháp cơ bản và các công cụ hỗ trợ DBML.</p></div></div>
<p>Trong thế giới phát triển phần mềm hiện đại, việc quản lý và tài liệu hóa cấu trúc cơ sở dữ liệu (database schema) là một thách thức không nhỏ. DBML (Database Markup Language) ra đời như một giải pháp hiệu quả để giải quyết vấn đề này.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dbml-là-gì">DBML là gì?<a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#dbml-l%C3%A0-g%C3%AC" class="hash-link" aria-label="Đường dẫn trực tiếp đến DBML là gì?" title="Đường dẫn trực tiếp đến DBML là gì?" translate="no">​</a></h2>
<p>DBML là một ngôn ngữ DSL (Domain Specific Language) mã nguồn mở được thiết kế để định nghĩa và tài liệu hóa các cấu trúc và lược đồ cơ sở dữ liệu. Với cú pháp đơn giản, nhất quán và dễ đọc, DBML giúp các nhà phát triển dễ dàng mô tả và quản lý các lược đồ cơ sở dữ liệu phức tạp.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tại-sao-nên-sử-dụng-dbml">Tại sao nên sử dụng DBML?<a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#t%E1%BA%A1i-sao-n%C3%AAn-s%E1%BB%AD-d%E1%BB%A5ng-dbml" class="hash-link" aria-label="Đường dẫn trực tiếp đến Tại sao nên sử dụng DBML?" title="Đường dẫn trực tiếp đến Tại sao nên sử dụng DBML?" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-đơn-giản-và-dễ-đọc">1. <strong>Đơn giản và dễ đọc</strong><a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#1-%C4%91%C6%A1n-gi%E1%BA%A3n-v%C3%A0-d%E1%BB%85-%C4%91%E1%BB%8Dc" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1-đơn-giản-và-dễ-đọc" title="Đường dẫn trực tiếp đến 1-đơn-giản-và-dễ-đọc" translate="no">​</a></h3>
<p>Cú pháp của DBML được thiết kế để dễ hiểu, giúp việc định nghĩa lược đồ cơ sở dữ liệu trở nên trực quan hơn so với việc viết SQL DDL truyền thống.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-độc-lập-với-hệ-quản-trị-cơ-sở-dữ-liệu">2. <strong>Độc lập với hệ quản trị cơ sở dữ liệu</strong><a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#2-%C4%91%E1%BB%99c-l%E1%BA%ADp-v%E1%BB%9Bi-h%E1%BB%87-qu%E1%BA%A3n-tr%E1%BB%8B-c%C6%A1-s%E1%BB%9F-d%E1%BB%AF-li%E1%BB%87u" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2-độc-lập-với-hệ-quản-trị-cơ-sở-dữ-liệu" title="Đường dẫn trực tiếp đến 2-độc-lập-với-hệ-quản-trị-cơ-sở-dữ-liệu" translate="no">​</a></h3>
<p>DBML không phụ thuộc vào bất kỳ hệ quản trị cơ sở dữ liệu cụ thể nào (MySQL, PostgreSQL, SQL Server, v.v.), cho phép sử dụng linh hoạt trong nhiều môi trường khác nhau.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-hỗ-trợ-công-cụ-trực-quan-hóa">3. <strong>Hỗ trợ công cụ trực quan hóa</strong><a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#3-h%E1%BB%97-tr%E1%BB%A3-c%C3%B4ng-c%E1%BB%A5-tr%E1%BB%B1c-quan-h%C3%B3a" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3-hỗ-trợ-công-cụ-trực-quan-hóa" title="Đường dẫn trực tiếp đến 3-hỗ-trợ-công-cụ-trực-quan-hóa" translate="no">​</a></h3>
<p>DBML đi kèm với các công cụ mạnh mẽ để vẽ sơ đồ ER (Entity Relationship) và tạo tài liệu cơ sở dữ liệu một cách tự động.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-version-control-thân-thiện">4. <strong>Version Control thân thiện</strong><a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#4-version-control-th%C3%A2n-thi%E1%BB%87n" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4-version-control-thân-thiện" title="Đường dẫn trực tiếp đến 4-version-control-thân-thiện" translate="no">​</a></h3>
<p>Vì DBML là text-based, nó rất phù hợp với hệ thống quản lý phiên bản như Git, giúp theo dõi thay đổi schema một cách hiệu quả.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cú-pháp-cơ-bản-của-dbml">Cú pháp cơ bản của DBML<a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#c%C3%BA-ph%C3%A1p-c%C6%A1-b%E1%BA%A3n-c%E1%BB%A7a-dbml" class="hash-link" aria-label="Đường dẫn trực tiếp đến Cú pháp cơ bản của DBML" title="Đường dẫn trực tiếp đến Cú pháp cơ bản của DBML" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="định-nghĩa-table">Định nghĩa Table<a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#%C4%91%E1%BB%8Bnh-ngh%C4%A9a-table" class="hash-link" aria-label="Đường dẫn trực tiếp đến Định nghĩa Table" title="Đường dẫn trực tiếp đến Định nghĩa Table" translate="no">​</a></h3>
<div class="language-dbml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dbml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Table users {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  id integer [primary key]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  username varchar(50) [unique, not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  email varchar(100) [unique, not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  password_hash varchar(255) [not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  role user_role [default: 'user']</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  created_at timestamp [default: `now()`]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  updated_at timestamp [default: `now()`]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="định-nghĩa-enum">Định nghĩa Enum<a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#%C4%91%E1%BB%8Bnh-ngh%C4%A9a-enum" class="hash-link" aria-label="Đường dẫn trực tiếp đến Định nghĩa Enum" title="Đường dẫn trực tiếp đến Định nghĩa Enum" translate="no">​</a></h3>
<div class="language-dbml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dbml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Enum user_role {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  admin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  moderator</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  user</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  guest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Enum post_status {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  draft</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  published</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  archived</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  private [note: 'Chỉ hiển thị qua URL trực tiếp']</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="định-nghĩa-relationships">Định nghĩa Relationships<a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#%C4%91%E1%BB%8Bnh-ngh%C4%A9a-relationships" class="hash-link" aria-label="Đường dẫn trực tiếp đến Định nghĩa Relationships" title="Đường dẫn trực tiếp đến Định nghĩa Relationships" translate="no">​</a></h3>
<div class="language-dbml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dbml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">// One-to-Many relationship</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ref: posts.user_id &gt; users.id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// Many-to-Many relationship</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ref: post_tags.post_id &gt; posts.id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ref: post_tags.tag_id &gt; tags.id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// One-to-One relationship</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ref: user_profiles.user_id - users.id</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ví-dụ-thực-tế-blog-system">Ví dụ thực tế: Blog System<a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#v%C3%AD-d%E1%BB%A5-th%E1%BB%B1c-t%E1%BA%BF-blog-system" class="hash-link" aria-label="Đường dẫn trực tiếp đến Ví dụ thực tế: Blog System" title="Đường dẫn trực tiếp đến Ví dụ thực tế: Blog System" translate="no">​</a></h2>
<p>Dưới đây là một ví dụ hoàn chỉnh về schema cho một hệ thống blog:</p>
<div class="language-dbml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dbml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">// Users table</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Table users {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  id integer [primary key, increment]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  username varchar(50) [unique, not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  email varchar(100) [unique, not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  password_hash varchar(255) [not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  first_name varchar(50)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  last_name varchar(50)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  avatar_url varchar(255)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  bio text</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  role user_role [default: 'user']</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  is_active boolean [default: true]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  email_verified_at timestamp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  created_at timestamp [default: `now()`]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  updated_at timestamp [default: `now()`]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Note: 'Bảng lưu trữ thông tin người dùng'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// Posts table</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Table posts {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  id integer [primary key, increment]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  title varchar(255) [not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  slug varchar(255) [unique, not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  content text [not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  excerpt text</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  featured_image varchar(255)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  status post_status [default: 'draft']</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  view_count integer [default: 0]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  author_id integer [not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  category_id integer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  published_at timestamp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  created_at timestamp [default: `now()`]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  updated_at timestamp [default: `now()`]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Note: 'Bảng lưu trữ bài viết blog'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// Categories table</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Table categories {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  id integer [primary key, increment]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  name varchar(100) [unique, not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  slug varchar(100) [unique, not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  description text</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  parent_id integer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  created_at timestamp [default: `now()`]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  updated_at timestamp [default: `now()`]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// Tags table</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Table tags {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  id integer [primary key, increment]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  name varchar(50) [unique, not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  slug varchar(50) [unique, not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  description text</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  created_at timestamp [default: `now()`]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// Post-Tag relationship table</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Table post_tags {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  post_id integer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  tag_id integer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  indexes {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    (post_id, tag_id) [pk]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// Comments table</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Table comments {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  id integer [primary key, increment]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  post_id integer [not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  user_id integer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  parent_id integer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  content text [not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  is_approved boolean [default: false]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  created_at timestamp [default: `now()`]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  updated_at timestamp [default: `now()`]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// Enums</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Enum user_role {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  admin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  moderator</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  author</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  user</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  guest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Enum post_status {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  draft</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  published</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  archived</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  private</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// Relationships</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ref: posts.author_id &gt; users.id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ref: posts.category_id &gt; categories.id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ref: categories.parent_id &gt; categories.id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ref: post_tags.post_id &gt; posts.id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ref: post_tags.tag_id &gt; tags.id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ref: comments.post_id &gt; posts.id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ref: comments.user_id &gt; users.id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ref: comments.parent_id &gt; comments.id</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ví-dụ-nâng-cao-e-commerce-system">Ví dụ nâng cao: E-commerce System<a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#v%C3%AD-d%E1%BB%A5-n%C3%A2ng-cao-e-commerce-system" class="hash-link" aria-label="Đường dẫn trực tiếp đến Ví dụ nâng cao: E-commerce System" title="Đường dẫn trực tiếp đến Ví dụ nâng cao: E-commerce System" translate="no">​</a></h2>
<div class="language-dbml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dbml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">// Products table</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Table products {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  id integer [primary key, increment]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  name varchar(255) [not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  slug varchar(255) [unique, not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  description text</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  short_description varchar(500)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  sku varchar(100) [unique, not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  price decimal(10,2) [not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  compare_price decimal(10,2)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  cost_price decimal(10,2)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  stock_quantity integer [default: 0]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  low_stock_threshold integer [default: 5]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  weight decimal(8,2)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  dimensions varchar(100)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  status product_status [default: 'active']</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  featured boolean [default: false]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  category_id integer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  brand_id integer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  created_at timestamp [default: `now()`]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  updated_at timestamp [default: `now()`]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// Orders table</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Table orders {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  id integer [primary key, increment]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  order_number varchar(50) [unique, not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  customer_id integer [not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  status order_status [default: 'pending']</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  payment_status payment_status [default: 'pending']</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  shipping_status shipping_status [default: 'pending']</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  subtotal decimal(10,2) [not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  tax_amount decimal(10,2) [default: 0]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  shipping_amount decimal(10,2) [default: 0]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  discount_amount decimal(10,2) [default: 0]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  total_amount decimal(10,2) [not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  currency varchar(3) [default: 'USD']</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  notes text</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  created_at timestamp [default: `now()`]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  updated_at timestamp [default: `now()`]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// Order Items table</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Table order_items {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  id integer [primary key, increment]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  order_id integer [not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  product_id integer [not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  quantity integer [not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  unit_price decimal(10,2) [not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  total_price decimal(10,2) [not null]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  created_at timestamp [default: `now()`]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// Enums for E-commerce</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Enum product_status {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  active</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  inactive</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  discontinued</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  out_of_stock</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Enum order_status {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  pending</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  confirmed</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  processing</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  shipped</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  delivered</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  cancelled</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  refunded</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Enum payment_status {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  pending</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  paid</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  failed</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  refunded</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  partially_refunded</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Enum shipping_status {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  pending</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  processing</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  shipped</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  delivered</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  returned</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// Relationships</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ref: products.category_id &gt; categories.id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ref: products.brand_id &gt; brands.id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ref: orders.customer_id &gt; customers.id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ref: order_items.order_id &gt; orders.id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ref: order_items.product_id &gt; products.id</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="các-công-cụ-hỗ-trợ-dbml">Các công cụ hỗ trợ DBML<a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#c%C3%A1c-c%C3%B4ng-c%E1%BB%A5-h%E1%BB%97-tr%E1%BB%A3-dbml" class="hash-link" aria-label="Đường dẫn trực tiếp đến Các công cụ hỗ trợ DBML" title="Đường dẫn trực tiếp đến Các công cụ hỗ trợ DBML" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-dbdiagramio">1. <a href="https://dbdiagram.io/" target="_blank" rel="noopener noreferrer" class=""><strong>dbdiagram.io</strong></a><a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#1-dbdiagramio" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1-dbdiagramio" title="Đường dẫn trực tiếp đến 1-dbdiagramio" translate="no">​</a></h3>
<ul>
<li class="">Công cụ miễn phí trực tuyến để vẽ sơ đồ ER từ mã DBML</li>
<li class="">Hỗ trợ export sang nhiều định dạng (PNG, PDF, SQL)</li>
<li class="">Giao diện trực quan và dễ sử dụng</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-dbdocsio">2. <a href="https://dbdocs.io/" target="_blank" rel="noopener noreferrer" class=""><strong>dbdocs.io</strong></a><a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#2-dbdocsio" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2-dbdocsio" title="Đường dẫn trực tiếp đến 2-dbdocsio" translate="no">​</a></h3>
<ul>
<li class="">Công cụ tạo tài liệu cơ sở dữ liệu từ mã DBML</li>
<li class="">Tự động generate documentation với giao diện đẹp</li>
<li class="">Hỗ trợ hosting và chia sẻ tài liệu</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-dbml-cli">3. <a href="https://github.com/holistics/dbml" target="_blank" rel="noopener noreferrer" class=""><strong>DBML CLI</strong></a><a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#3-dbml-cli" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3-dbml-cli" title="Đường dẫn trực tiếp đến 3-dbml-cli" translate="no">​</a></h3>
<ul>
<li class="">Công cụ dòng lệnh để chuyển đổi giữa SQL và DBML</li>
<li class="">Hỗ trợ import từ các database hiện có</li>
<li class="">Tích hợp với CI/CD pipeline</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-vs-code-extension">4. <a href="https://marketplace.visualstudio.com/items?itemName=bocovo.dbml-erd-visualizer" target="_blank" rel="noopener noreferrer" class=""><strong>VS Code Extension</strong></a><a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#4-vs-code-extension" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4-vs-code-extension" title="Đường dẫn trực tiếp đến 4-vs-code-extension" translate="no">​</a></h3>
<ul>
<li class="">Extension cho Visual Studio Code</li>
<li class="">Syntax highlighting và IntelliSense</li>
<li class="">Preview sơ đồ trực tiếp trong editor</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lợi-ích-khi-sử-dụng-dbml-trong-dự-án">Lợi ích khi sử dụng DBML trong dự án<a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#l%E1%BB%A3i-%C3%ADch-khi-s%E1%BB%AD-d%E1%BB%A5ng-dbml-trong-d%E1%BB%B1-%C3%A1n" class="hash-link" aria-label="Đường dẫn trực tiếp đến Lợi ích khi sử dụng DBML trong dự án" title="Đường dẫn trực tiếp đến Lợi ích khi sử dụng DBML trong dự án" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-cải-thiện-collaboration">1. <strong>Cải thiện Collaboration</strong><a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#1-c%E1%BA%A3i-thi%E1%BB%87n-collaboration" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1-cải-thiện-collaboration" title="Đường dẫn trực tiếp đến 1-cải-thiện-collaboration" translate="no">​</a></h3>
<ul>
<li class="">Team có thể dễ dàng hiểu và review database schema</li>
<li class="">Giảm thiểu miscommunication về cấu trúc dữ liệu</li>
<li class="">Onboarding developer mới nhanh hơn</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-documentation-tự-động">2. <strong>Documentation tự động</strong><a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#2-documentation-t%E1%BB%B1-%C4%91%E1%BB%99ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2-documentation-tự-động" title="Đường dẫn trực tiếp đến 2-documentation-tự-động" translate="no">​</a></h3>
<ul>
<li class="">Tài liệu database luôn được cập nhật</li>
<li class="">Giảm thời gian viết và maintain documentation</li>
<li class="">Đảm bảo tính nhất quán trong tài liệu</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-database-migration">3. <strong>Database Migration</strong><a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#3-database-migration" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3-database-migration" title="Đường dẫn trực tiếp đến 3-database-migration" translate="no">​</a></h3>
<ul>
<li class="">Dễ dàng track changes trong schema</li>
<li class="">Hỗ trợ rollback khi cần thiết</li>
<li class="">Version control cho database structure</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-testing-và-development">4. <strong>Testing và Development</strong><a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#4-testing-v%C3%A0-development" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4-testing-và-development" title="Đường dẫn trực tiếp đến 4-testing-và-development" translate="no">​</a></h3>
<ul>
<li class="">Tạo test database nhanh chóng</li>
<li class="">Đảm bảo consistency giữa các môi trường</li>
<li class="">Hỗ trợ database seeding</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kết-luận">Kết luận<a href="https://tiennhm.io.vn/blog/gioi-thieu-dbml-database-markup-language#k%E1%BA%BFt-lu%E1%BA%ADn" class="hash-link" aria-label="Đường dẫn trực tiếp đến Kết luận" title="Đường dẫn trực tiếp đến Kết luận" translate="no">​</a></h2>
<p>DBML là một công cụ mạnh mẽ và linh hoạt cho việc quản lý database schema. Với cú pháp đơn giản, các công cụ hỗ trợ phong phú, và khả năng tích hợp tốt với workflow phát triển hiện đại, DBML đang trở thành lựa chọn hàng đầu cho nhiều team phát triển.</p>
<p>Việc áp dụng DBML vào dự án không chỉ giúp cải thiện chất lượng code mà còn tăng hiệu quả làm việc của team, đặc biệt trong các dự án có database schema phức tạp.</p>
<p>Bạn có thể bắt đầu sử dụng DBML ngay hôm nay bằng cách truy cập <a href="https://dbdiagram.io/" target="_blank" rel="noopener noreferrer" class="">dbdiagram.io</a> để tạo sơ đồ đầu tiên của mình!</p>
<hr>
<p><strong>Tài liệu tham khảo:</strong></p>
<ul>
<li class=""><a href="https://dbml.dbdiagram.io/home" target="_blank" rel="noopener noreferrer" class="">DBML Official Documentation</a></li>
<li class=""><a href="https://dbdiagram.io/" target="_blank" rel="noopener noreferrer" class="">dbdiagram.io - Online DBML Editor</a></li>
<li class=""><a href="https://dbdocs.io/" target="_blank" rel="noopener noreferrer" class="">dbdocs.io - Database Documentation</a></li>
</ul>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="database" term="database"/>
        <category label="dbml" term="dbml"/>
        <category label="schema" term="schema"/>
        <category label="documentation" term="documentation"/>
        <category label="tools" term="tools"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[AI-DD: Phát Triển Phần Mềm AI-Driven - Series Toàn Diện]]></title>
        <id>https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development</id>
        <link href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development"/>
        <updated>2025-08-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Series toàn diện về AI-DD (AI-Driven Development) - phương pháp phát triển phần mềm do AI dẫn dắt, xu hướng mới thay đổi hoàn toàn cách làm việc của team phát triển và tương lai ngành công nghệ.]]></summary>
        <content type="html"><![CDATA[<p align="right"><img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2FTienNHM.github.io%2Fblog%2Fai-driven-development-lifecycle&amp;label=%E2%9A%AAView&amp;labelColor=%2337d67a&amp;countColor=%23555555&amp;style=flat&amp;labelStyle=upper" loading="lazy" decoding="async"></p>
<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p><strong>AI-DD (AI-Driven Development)</strong> là phương pháp phát triển phần mềm do AI dẫn dắt, khác biệt hoàn toàn với việc chỉ sử dụng AI để hỗ trợ. Series này cung cấp roadmap đầy đủ từ hiểu biết cơ bản đến áp dụng thực tế, giúp developers tăng 3-5x năng suất, team leads giảm 50-67% development cycle, và CTOs có strategic roadmap cho AI transformation. Series gồm 4 phần: Giới thiệu và Tác động, Công cụ AI và Case Studies, Số liệu và Kinh nghiệm Thực tế, Tương lai và Kết luận.</p></div></div>
<p>Chào mừng bạn đến với series toàn diện về <strong>AI-DD (AI-Driven Development)</strong> - một cuộc cách mạng đang thay đổi hoàn toàn ngành công nghệ. Series này sẽ đưa bạn từ hiểu biết cơ bản về AI-driven development đến việc áp dụng thực tế và nhìn xa về tương lai của kỹ thuật phần mềm.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-giới-thiệu-series">🎯 <strong>Giới Thiệu Series</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development#-gi%E1%BB%9Bi-thi%E1%BB%87u-series" class="hash-link" aria-label="Đường dẫn trực tiếp đến -giới-thiệu-series" title="Đường dẫn trực tiếp đến -giới-thiệu-series" translate="no">​</a></h2>
<p>Ngành phát triển phần mềm đang chứng kiến một cuộc cách mạng lớn với sự xuất hiện của <strong>AI-DD (AI-Driven Development)</strong> - một cách tiếp cận hoàn toàn mới khác biệt với việc chỉ đơn thuần sử dụng AI để hỗ trợ.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>📝 Thuật ngữ chuyên ngành</div><div class="admonitionContent_BuS1"><p><strong>AI-DD</strong> = <strong>AI-Driven Development</strong> (Phát triển phần mềm do AI dẫn dắt)<br>
<strong>AI-DLC</strong> = <strong>AI-Driven Development Lifecycle</strong> (Vòng đời phát triển do AI dẫn dắt)</p></div></div>
<p><em>Series này được viết với sự hỗ trợ của AI để minh họa phương pháp AI-DD. Tất cả ví dụ và phương pháp thực hành đều được kiểm tra và xác nhận bởi các chuyên gia có kinh nghiệm.</em></p>
<p>Theo nghiên cứu của <a href="https://aws.amazon.com/blogs/devops/ai-driven-development-life-cycle/" target="_blank" rel="noopener noreferrer" class="">AWS DevOps Blog</a>, chúng ta cần tái tưởng tượng toàn bộ quy trình phát triển phần mềm để thực sự khai thác được sức mạnh của trí tuệ nhân tạo.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-sự-khác-biệt-cơ-bản"><strong>🔄 Sự Khác Biệt Cơ Bản</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development#-s%E1%BB%B1-kh%C3%A1c-bi%E1%BB%87t-c%C6%A1-b%E1%BA%A3n" class="hash-link" aria-label="Đường dẫn trực tiếp đến -sự-khác-biệt-cơ-bản" title="Đường dẫn trực tiếp đến -sự-khác-biệt-cơ-bản" translate="no">​</a></h3>
<p><strong>Phương pháp AI hỗ trợ (cách tiếp cận truyền thống)</strong>:</p>
<ul>
<li class="">AI chỉ hỗ trợ các công việc cụ thể như viết tài liệu, hoàn thiện code, kiểm thử</li>
<li class="">Con người vẫn làm việc theo quy trình truyền thống</li>
<li class="">Kết quả: chưa tối ưu về tốc độ và chất lượng phần mềm</li>
</ul>
<p><strong>Phương pháp AI-DD (cách tiếp cận mới)</strong>:</p>
<ul>
<li class="">AI trở thành cộng tác viên trung tâm và đồng đội trong quy trình phát triển</li>
<li class="">AI khởi tạo và chỉ đạo quy trình làm việc thông qua mô hình tư duy mới</li>
<li class="">Con người tập trung vào các quyết định quan trọng và tư duy sáng tạo</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-cấu-trúc-series">📚 <strong>Cấu Trúc Series</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development#-c%E1%BA%A5u-tr%C3%BAc-series" class="hash-link" aria-label="Đường dẫn trực tiếp đến -cấu-trúc-series" title="Đường dẫn trực tiếp đến -cấu-trúc-series" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>📖 Series gồm 4 phần chính</div><div class="admonitionContent_BuS1"><p><strong>Mỗi phần được thiết kế để bạn có thể đọc độc lập hoặc theo trình tự để hiểu sâu hơn về chủ đề.</strong></p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="phần-1-giới-thiệu-và-tác-động"><strong>Phần 1: Giới Thiệu và Tác Động</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development#ph%E1%BA%A7n-1-gi%E1%BB%9Bi-thi%E1%BB%87u-v%C3%A0-t%C3%A1c-%C4%91%E1%BB%99ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến phần-1-giới-thiệu-và-tác-động" title="Đường dẫn trực tiếp đến phần-1-giới-thiệu-và-tác-động" translate="no">​</a></h3>
<p><strong>🎯 Dành cho</strong>: Mọi người muốn hiểu về AI-DLC<br>
<strong>⏱️ Thời gian đọc</strong>: 15-20 phút<br>
<strong>📋 Nội dung</strong>:</p>
<ul>
<li class="">Nguyên tắc cốt lõi của AI-Driven Development</li>
<li class="">So sánh phương pháp truyền thống vs AI-driven</li>
<li class="">Tác động của AI đối với từng vai trò trong team</li>
<li class="">Rủi ro và thách thức cần lưu ý</li>
</ul>
<p>👉 <strong><a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1">Đọc Phần 1: Giới Thiệu và Tác Động</a></strong></p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="phần-2-công-cụ-ai-và-nghiên-cứu-tình-huống"><strong>Phần 2: Công Cụ AI và Nghiên Cứu Tình Huống</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development#ph%E1%BA%A7n-2-c%C3%B4ng-c%E1%BB%A5-ai-v%C3%A0-nghi%C3%AAn-c%E1%BB%A9u-t%C3%ACnh-hu%E1%BB%91ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến phần-2-công-cụ-ai-và-nghiên-cứu-tình-huống" title="Đường dẫn trực tiếp đến phần-2-công-cụ-ai-và-nghiên-cứu-tình-huống" translate="no">​</a></h3>
<p><strong>🎯 Dành cho</strong>: Developers, Team Leads<br>
<strong>⏱️ Thời gian đọc</strong>: 25-30 phút<br>
<strong>📋 Nội dung</strong>:</p>
<ul>
<li class="">Chi tiết về ChatGPT và Cursor trong AI-DLC</li>
<li class="">Nghiên cứu tình huống: Phát triển E-commerce Dashboard</li>
<li class="">3 giai đoạn của AWS AI-DLC methodology</li>
<li class="">Số liệu so sánh thời gian và chất lượng thực tế</li>
</ul>
<p>👉 <strong><a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2">Đọc Phần 2: Công Cụ AI và Nghiên Cứu Tình Huống</a></strong></p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="phần-3-số-liệu-kinh-nghiệm-thực-tế-và-rủi-ro"><strong>Phần 3: Số Liệu, Kinh Nghiệm Thực Tế và Rủi Ro</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development#ph%E1%BA%A7n-3-s%E1%BB%91-li%E1%BB%87u-kinh-nghi%E1%BB%87m-th%E1%BB%B1c-t%E1%BA%BF-v%C3%A0-r%E1%BB%A7i-ro" class="hash-link" aria-label="Đường dẫn trực tiếp đến phần-3-số-liệu-kinh-nghiệm-thực-tế-và-rủi-ro" title="Đường dẫn trực tiếp đến phần-3-số-liệu-kinh-nghiệm-thực-tế-và-rủi-ro" translate="no">​</a></h3>
<p><strong>🎯 Dành cho</strong>: Project Managers, CTOs, Senior Developers<br>
<strong>⏱️ Thời gian đọc</strong>: 20-25 phút<br>
<strong>📋 Nội dung</strong>:</p>
<ul>
<li class="">Số liệu thực tế từ GitHub Copilot, Cursor, McKinsey</li>
<li class="">Kinh nghiệm thực tế để triển khai thành công</li>
<li class="">Framework quản lý rủi ro và bảo mật</li>
<li class="">ROI calculation và business impact</li>
</ul>
<p>👉 <strong><a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3">Đọc Phần 3: Số Liệu, Kinh Nghiệm Thực Tế và Rủi Ro</a></strong></p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="phần-4-tương-lai-và-kết-luận"><strong>Phần 4: Tương Lai và Kết Luận</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development#ph%E1%BA%A7n-4-t%C6%B0%C6%A1ng-lai-v%C3%A0-k%E1%BA%BFt-lu%E1%BA%ADn" class="hash-link" aria-label="Đường dẫn trực tiếp đến phần-4-tương-lai-và-k�ết-luận" title="Đường dẫn trực tiếp đến phần-4-tương-lai-và-kết-luận" translate="no">​</a></h3>
<p><strong>🎯 Dành cho</strong>: Visionaries, Technology Leaders<br>
<strong>⏱️ Thời gian đọc</strong>: 15-20 phút<br>
<strong>📋 Nội dung</strong>:</p>
<ul>
<li class="">Tương lai với Autonomous Coding Agents</li>
<li class="">Natural Language Programming</li>
<li class="">Vision 2030: AI Software Factory</li>
<li class="">Roadmap triển khai và lời kêu gọi hành động</li>
</ul>
<p>👉 <strong><a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4">Đọc Phần 4: Tương Lai và Kết Luận</a></strong></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-tại-sao-nên-đọc-series-này">🚀 <strong>Tại Sao Nên Đọc Series Này?</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development#-t%E1%BA%A1i-sao-n%C3%AAn-%C4%91%E1%BB%8Dc-series-n%C3%A0y" class="hash-link" aria-label="Đường dẫn trực tiếp đến -tại-sao-nên-đọc-series-này" title="Đường dẫn trực tiếp đến -tại-sao-nên-đọc-series-này" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cho-developers"><strong>Cho Developers</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development#cho-developers" class="hash-link" aria-label="Đường dẫn trực tiếp đến cho-developers" title="Đường dẫn trực tiếp đến cho-developers" translate="no">​</a></h3>
<ul>
<li class="">⚡ Tăng <strong>3-5x năng suất</strong> với AI tools</li>
<li class="">🐛 Giảm <strong>78% thời gian debug</strong></li>
<li class="">📚 <strong>92% automation</strong> cho documentation</li>
<li class="">🎯 Học cách sử dụng <strong>ChatGPT</strong> và <strong>Cursor</strong> hiệu quả</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cho-team-leads--project-managers"><strong>Cho Team Leads &amp; Project Managers</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development#cho-team-leads--project-managers" class="hash-link" aria-label="Đường dẫn trực tiếp đến cho-team-leads--project-managers" title="Đường d��ẫn trực tiếp đến cho-team-leads--project-managers" translate="no">​</a></h3>
<ul>
<li class="">📈 <strong>50-67% faster</strong> development cycle</li>
<li class="">💰 <strong>30-40% cost reduction</strong></li>
<li class="">👥 <strong>+30% developer satisfaction</strong></li>
<li class="">📊 Framework để <strong>measure và optimize</strong> AI adoption</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cho-ctos--technology-leaders"><strong>Cho CTOs &amp; Technology Leaders</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development#cho-ctos--technology-leaders" class="hash-link" aria-label="Đường dẫn trực tiếp đến cho-ctos--technology-leaders" title="Đường dẫn trực tiếp đến cho-ctos--technology-leaders" translate="no">​</a></h3>
<ul>
<li class="">🌐 <strong>Strategic roadmap</strong> for AI transformation</li>
<li class="">⚖️ <strong>Risk management</strong> framework</li>
<li class="">💼 <strong>ROI calculation</strong> models</li>
<li class="">🔮 <strong>Future-ready</strong> technology planning</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-highlights-từ-series">📊 <strong>Highlights từ Series</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development#-highlights-t%E1%BB%AB-series" class="hash-link" aria-label="Đường dẫn trực tiếp đến -highlights-từ-series" title="Đường dẫn trực tiếp đến -highlights-từ-series" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="số-liệu-ấn-tượng"><strong>Số Liệu Ấn Tượng</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development#s%E1%BB%91-li%E1%BB%87u-%E1%BA%A5n-t%C6%B0%E1%BB%A3ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến số-liệu-ấn-tượng" title="Đường dẫn trực tiếp đến số-liệu-ấn-tượng" translate="no">​</a></h3>
<table><thead><tr><th>Metric</th><th>Traditional</th><th>AI-Driven</th><th>Improvement</th></tr></thead><tbody><tr><td><strong>Development Speed</strong></td><td>6-8 tháng</td><td>2-3 tháng</td><td><strong>3x faster</strong></td></tr><tr><td><strong>Bug Rate</strong></td><td>12-15%</td><td>4-6%</td><td><strong>60% reduction</strong></td></tr><tr><td><strong>Time to Market</strong></td><td>12 tháng</td><td>4-6 tháng</td><td><strong>50-67% faster</strong></td></tr><tr><td><strong>Team Productivity</strong></td><td>1.0x baseline</td><td>3.2x baseline</td><td><strong>220% increase</strong></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="case-studies-thực-tế"><strong>Case Studies Thực Tế</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development#case-studies-th%E1%BB%B1c-t%E1%BA%BF" class="hash-link" aria-label="Đường dẫn trực tiếp đến case-studies-thực-tế" title="Đường dẫn trực tiếp đến case-studies-thực-tế" translate="no">​</a></h3>
<ul>
<li class=""><strong>Spotify Engineering</strong>: 42% faster feature delivery</li>
<li class=""><strong>Microsoft Azure</strong>: 55% increase in feature velocity</li>
<li class=""><strong>GitHub Research</strong>: 88% developers report higher productivity</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-bắt-đầu-hành-trình">🎯 <strong>Bắt Đầu Hành Trình</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development#-b%E1%BA%AFt-%C4%91%E1%BA%A7u-h%C3%A0nh-tr%C3%ACnh" class="hash-link" aria-label="Đường dẫn trực tiếp đến -bắt-đầu-hành-trình" title="Đường dẫn trực tiếp đến -bắt-đầu-hành-trình" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>🚀 Recommended Reading Path</div><div class="admonitionContent_BuS1"><p><strong>Nếu bạn là newcomer</strong>: Đọc theo thứ tự <strong>Phần 1 → 2 → 3 → 4</strong></p><p><strong>Nếu bạn đã biết AI development</strong>: Có thể nhảy thẳng đến <strong>Phần 2</strong> hoặc <strong>Phần 3</strong></p><p><strong>Nếu bạn là decision maker</strong>: Focus vào <strong>Phần 3</strong> và <strong>Phần 4</strong></p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="quick-links"><strong>Quick Links</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development#quick-links" class="hash-link" aria-label="Đường dẫn trực tiếp đến quick-links" title="Đường dẫn trực tiếp đến quick-links" translate="no">​</a></h3>
<ul>
<li class="">🎯 <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1"><strong>Phần 1</strong></a>: Nền tảng và tác động</li>
<li class="">💻 <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2"><strong>Phần 2</strong></a>: Thực hành với AI tools</li>
<li class="">📊 <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3"><strong>Phần 3</strong></a>: Metrics và kinh nghiệm thực tế</li>
<li class="">🔮 <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4"><strong>Phần 4</strong></a>: Tương lai và vision</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-feedback--community">💬 <strong>Feedback &amp; Community</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development#-feedback--community" class="hash-link" aria-label="Đường dẫn trực tiếp đến -feedback--community" title="Đường dẫn trực tiếp đến -feedback--community" translate="no">​</a></h2>
<p>Có câu hỏi hoặc muốn thảo luận? Hãy:</p>
<ul>
<li class="">💬 Comment phía dưới mỗi bài viết</li>
<li class="">📧 Email trực tiếp cho tác giả</li>
<li class="">🔗 Share trên LinkedIn với hashtag #AIDrivenDevelopment</li>
</ul>
<p><strong>Chúc bạn có một hành trình học tập thú vị và bổ ích!</strong> 🚀</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-tóm-tắt-executive">📑 <strong>Tóm Tắt Executive</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development#-t%C3%B3m-t%E1%BA%AFt-executive" class="hash-link" aria-label="Đường dẫn trực tiếp đến -tóm-tắt-executive" title="Đường dẫn trực tiếp đến -tóm-tắt-executive" translate="no">​</a></h2>
<p><strong>AI-DD</strong> không phải là trend tạm thời - đây là <strong>future of software engineering</strong>. Series này cung cấp roadmap đầy đủ từ understanding đến implementation, giúp bạn và tổ chức transform cách làm việc để thành công trong kỷ nguyên AI.</p>
<p><strong>Key takeaway</strong>: AI-DD = <strong>AI leads, humans guide critical decisions</strong>. Kết quả? <strong>3x faster, higher quality, happier developers</strong>.</p>
<p><strong>Action items</strong>:</p>
<ol>
<li class="">Đọc series đầy đủ</li>
<li class="">Pilot với 1 project nhỏ</li>
<li class="">Scale lên toàn team/organization</li>
<li class=""><strong>Transform your software development forever</strong></li>
</ol>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="AI-DD" term="AI-DD"/>
        <category label="AI-DLC" term="AI-DLC"/>
        <category label="Lập trình AI" term="Lập trình AI"/>
        <category label="ChatGPT" term="ChatGPT"/>
        <category label="Cursor" term="Cursor"/>
        <category label="Năng suất lập trình" term="Năng suất lập trình"/>
        <category label="Công nghệ phần mềm" term="Công nghệ phần mềm"/>
        <category label="Series" term="Series"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[AI-DD - Phần 1: Giới Thiệu và Tác Động]]></title>
        <id>https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1</id>
        <link href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1"/>
        <updated>2025-08-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Tìm hiểu về AI-DD (AI-Driven Development) - cách tiếp cận mới thay đổi hoàn toàn quy trình làm việc và tác động đến từng vai trò trong team phát triển phần mềm.]]></summary>
        <content type="html"><![CDATA[<p align="right"><img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2FTienNHM.github.io%2Fblog%2Fai-driven-development-phan-1&amp;label=%E2%9A%AAView&amp;labelColor=%2337d67a&amp;countColor=%23555555&amp;style=flat&amp;labelStyle=upper" loading="lazy" decoding="async"></p>
<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p>Phần 1 của series AI-DD giới thiệu về AI-Driven Development - cách tiếp cận mới thay đổi hoàn toàn quy trình phát triển phần mềm. Khác với việc chỉ sử dụng AI để hỗ trợ, AI-DD biến AI thành cộng tác viên trung tâm trong quy trình làm việc. Bài viết giải thích sự khác biệt giữa phương pháp truyền thống và AI-DD, nguyên tắc cốt lõi, và tác động đến từng vai trò trong team (developers, team leads, CTOs). Đây là nền tảng để hiểu về cuộc cách mạng AI trong ngành công nghệ phần mềm.</p></div></div>
<p>Ngành phát triển phần mềm đang chứng kiến một cuộc cách mạng lớn với sự xuất hiện của <strong>AI-DD (AI-Driven Development)</strong> - một cách tiếp cận hoàn toàn mới khác biệt với việc chỉ đơn thuần sử dụng AI để hỗ trợ.</p>
<p>Theo nghiên cứu của <a href="https://aws.amazon.com/blogs/devops/ai-driven-development-life-cycle/" target="_blank" rel="noopener noreferrer" class="">AWS DevOps Blog</a>, chúng ta cần tái tưởng tượng toàn bộ quy trình phát triển phần mềm để thực sự khai thác được sức mạnh của trí tuệ nhân tạo.</p>
<p><em>Đây là Phần 1 trong series 4 phần về AI-DD. Bài viết này được viết với sự hỗ trợ của AI để minh họa phương pháp AI-DD.</em></p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>📝 Thuật ngữ chuyên ngành</div><div class="admonitionContent_BuS1"><p><strong>AI-DD</strong> = <strong>AI-Driven Development</strong> (Phát triển phần mềm do AI dẫn dắt)<br>
<strong>AI-DLC</strong> = <strong>AI-Driven Development Lifecycle</strong> (Vòng đời phát triển do AI dẫn dắt)</p></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>📚 Series: AI-DD (AI-Driven Development)</div><div class="admonitionContent_BuS1"><p><strong>Phần 1</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1">Giới Thiệu và Tác Động</a> ← <em>Bạn đang ở đây</em><br>
<strong>Phần 2</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2">Công Cụ AI và Nghiên Cứu Tình Huống</a><br>
<strong>Phần 3</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3">Số Liệu, Kinh Nghiệm Thực Tế và Rủi Ro</a><br>
<strong>Phần 4</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4">Tương Lai và Kết Luận</a></p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-sự-khác-biệt-cơ-bản"><em>🔄 Sự Khác Biệt Cơ Bản</em><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#-s%E1%BB%B1-kh%C3%A1c-bi%E1%BB%87t-c%C6%A1-b%E1%BA%A3n" class="hash-link" aria-label="Đường dẫn trực tiếp đến -sự-khác-biệt-cơ-bản" title="Đường dẫn trực tiếp đến -sự-khác-biệt-cơ-bản" translate="no">​</a></h3>
<p><strong>Phương pháp AI hỗ trợ (cách tiếp cận truyền thống)</strong>:</p>
<ul>
<li class="">AI chỉ hỗ trợ các công việc cụ thể như viết tài liệu, hoàn thiện code, kiểm thử</li>
<li class="">Con người vẫn làm việc theo quy trình truyền thống</li>
<li class="">Kết quả: chưa tối ưu về tốc độ và chất lượng phần mềm</li>
</ul>
<p><strong>Phương pháp AI-DD (cách tiếp cận mới)</strong>:</p>
<ul>
<li class="">AI trở thành cộng tác viên trung tâm và đồng đội trong quy trình phát triển</li>
<li class="">AI khởi tạo và chỉ đạo quy trình làm việc thông qua mô hình tư duy mới</li>
<li class="">Con người tập trung vào các quyết định quan trọng và tư duy sáng tạo</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-nguyên-tắc-cốt-lõi-của-ai-dd">🎯 <strong>Nguyên Tắc Cốt Lõi của AI-DD</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#-nguy%C3%AAn-t%E1%BA%AFc-c%E1%BB%91t-l%C3%B5i-c%E1%BB%A7a-ai-dd" class="hash-link" aria-label="Đường dẫn trực tiếp đến -nguyên-tắc-cốt-lõi-của-ai-dd" title="Đường dẫn trực tiếp đến -nguyên-tắc-cốt-lõi-của-ai-dd" translate="no">​</a></h3>
<p>Theo nghiên cứu của <a href="https://groovetechnology.com/blog/software-development/ai-driven-development/" target="_blank" rel="noopener noreferrer" class="">Groove Technology</a>, phương pháp AI-DD dựa trên 3 nguyên tắc cốt lõi:</p>
<ol>
<li class="">
<p><strong>AI thực thi với sự giám sát của con người</strong>: AI tạo kế hoạch làm việc chi tiết, tìm kiếm làm rõ, và để lại các quyết định quan trọng cho con người</p>
</li>
<li class="">
<p><strong>Cộng tác nhóm năng động</strong>: Các thành viên trong nhóm hợp tác trong không gian làm việc chung để giải quyết vấn đề theo thời gian thực và đưa ra quyết định nhanh chóng</p>
</li>
<li class="">
<p><strong>Tích lũy ngữ cảnh liên tục</strong>: AI lưu trữ và duy trì thông tin ngữ cảnh xuyên suốt tất cả các giai đoạn phát triển</p>
</li>
</ol>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>📝 Lưu ý quan trọng</div><div class="admonitionContent_BuS1"><p>Series bài viết này sẽ trình bày một nghiên cứu tình huống cụ thể để minh họa phương pháp AI-DD. Các phần giới thiệu về công cụ chỉ mang tính nền tảng.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="phat-trien-phan-mem-ai-driven"><strong>AI-DD - Thay Đổi Cách Tiếp Cận</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#phat-trien-phan-mem-ai-driven" class="hash-link" aria-label="Đường dẫn trực tiếp đến phat-trien-phan-mem-ai-driven" title="Đường dẫn trực tiếp đến phat-trien-phan-mem-ai-driven" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>🔍 Tìm hiểu về phương pháp AWS AI-DLC</div><div class="admonitionContent_BuS1"><p>Theo phương pháp <a href="https://aws.amazon.com/blogs/devops/ai-driven-development-life-cycle/" target="_blank" rel="noopener noreferrer" class="">AWS AI-DLC</a>, chúng ta cần thay đổi từ quy trình do con người điều khiển sang cách tiếp cận tập trung vào AI và cộng tác.</p></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>📊 So sánh chi tiết: Phương pháp truyền thống vs AI-DD</div><div class="admonitionContent_BuS1"><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="phương-pháp-truyền-thống">Phương pháp truyền thống:<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#ph%C6%B0%C6%A1ng-ph%C3%A1p-truy%E1%BB%81n-th%E1%BB%91ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến Phương pháp truyền thống:" title="Đường dẫn trực tiếp đến Phương pháp truyền thống:" translate="no">​</a></h4><ul>
<li class=""><strong>Quản lý sản phẩm/Phân tích viên</strong>: Phân tích yêu cầu thủ công, viết đặc tả dài dòng, họp liên miên</li>
<li class=""><strong>Lập trình viên</strong>: Viết mã từ đầu, gỡ lỗi thủ công, tìm kiếm giải pháp trên Stack Overflow</li>
<li class=""><strong>Kiểm thử viên</strong>: Viết test case thủ công, kiểm thử thủ công, độ bao phủ thấp</li>
<li class=""><strong>DevOps</strong>: Cấu hình CI/CD thủ công, giám sát hệ thống, phản ứng sự cố chậm</li>
<li class=""><strong>Quy trình làm việc</strong>: Sprint kéo dài 2-4 tuần, cuộc họp lập kế hoạch dài dòng</li>
</ul><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="phương-pháp-ai-dd">Phương pháp AI-DD:<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#ph%C6%B0%C6%A1ng-ph%C3%A1p-ai-dd" class="hash-link" aria-label="Đường dẫn trực tiếp đến Phương pháp AI-DD:" title="Đường dẫn trực tiếp đến Phương pháp AI-DD:" translate="no">​</a></h4><ul>
<li class=""><strong>AI khởi tạo</strong>: AI tạo kế hoạch làm việc chi tiết, tìm kiếm làm rõ, đề xuất giải pháp</li>
<li class=""><strong>Con người giám sát</strong>: Tập trung vào quyết định quan trọng và ngữ cảnh kinh doanh</li>
<li class=""><strong>Cộng tác năng động</strong>: Nhóm làm việc trong không gian cộng tác để giải quyết vấn đề theo thời gian thực</li>
<li class=""><strong>Giao hàng liên tục</strong>: Chu kỳ "Bolts" thay vì "Sprints" - đo bằng giờ/ngày</li>
<li class=""><strong>Duy trì ngữ cảnh</strong>: AI duy trì thông tin xuyên suốt tất cả các giai đoạn</li>
</ul></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-mô-hình-tư-duy-mới-của-ai-dd"><em>🚀 Mô Hình Tư Duy Mới của AI-DD</em><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#-m%C3%B4-h%C3%ACnh-t%C6%B0-duy-m%E1%BB%9Bi-c%E1%BB%A7a-ai-dd" class="hash-link" aria-label="Đường dẫn trực tiếp đến -mô-hình-tư-duy-mới-của-ai-dd" title="Đường dẫn trực tiếp đến -mô-hình-tư-duy-mới-của-ai-dd" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>🔄 Xem sơ đồ quy trình AI-DD</div><div class="admonitionContent_BuS1"><p><strong>Điểm đổi mới chính</strong>: AI không chỉ hỗ trợ, mà khởi tạo và chỉ đạo quy trình làm việc, với sự giám sát của con người cho các quyết định quan trọng.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tac-dong-ai-tung-vai-tro"><strong>Tác Động của AI Đối Với Từng Vai Trò</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#tac-dong-ai-tung-vai-tro" class="hash-link" aria-label="Đường dẫn trực tiếp đến tac-dong-ai-tung-vai-tro" title="Đường dẫn trực tiếp đến tac-dong-ai-tung-vai-tro" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>📈 Lưu ý quan trọng</div><div class="admonitionContent_BuS1"><p>Phần này trình bày tác động của AI đối với từng vai trò trong quá trình phát triển phần mềm. Các số liệu dưới đây chỉ mang tính tham khảo để minh họa xu hướng. Phần chính của series sẽ tập trung vào nghiên cứu tình huống cụ thể ở Phần 2.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-các-vai-trò-chính-trong-quy-trình-phát-triển-phần-mềm"><em>🏗️ Các Vai Trò Chính Trong Quy Trình Phát Triển Phần Mềm</em><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#%EF%B8%8F-c%C3%A1c-vai-tr%C3%B2-ch%C3%ADnh-trong-quy-tr%C3%ACnh-ph%C3%A1t-tri%E1%BB%83n-ph%E1%BA%A7n-m%E1%BB%81m" class="hash-link" aria-label="Đường dẫn trực tiếp đến ️-các-vai-trò-chính-trong-quy-trình-phát-triển-phần-mềm" title="Đường dẫn trực tiếp đến ️-các-vai-trò-chính-trong-quy-trình-phát-triển-phần-mềm" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-quản-lý-sản-phẩm-pm--phân-tích-viên-kinh-doanh-ba">1. Quản Lý Sản Phẩm (PM) &amp; Phân Tích Viên Kinh Doanh (BA)<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#1-qu%E1%BA%A3n-l%C3%BD-s%E1%BA%A3n-ph%E1%BA%A9m-pm--ph%C3%A2n-t%C3%ADch-vi%C3%AAn-kinh-doanh-ba" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1. Quản Lý Sản Phẩm (PM) &amp; Phân Tích Viên Kinh Doanh (BA)" title="Đường dẫn trực tiếp đến 1. Quản Lý Sản Phẩm (PM) &amp; Phân Tích Viên Kinh Doanh (BA)" translate="no">​</a></h4>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary><strong>📊 Xem chi tiết nghiên cứu về AI cho PM/BA</strong></summary><div><div class="collapsibleContent_i85q"><p><strong>Nghiên cứu từ Product Management Institute (2024)</strong>:</p><ul>
<li class=""><strong>AI hỗ trợ</strong>: <strong>Phân tích thị trường</strong>, <strong>tạo user stories</strong>, <strong>prioritization</strong>, <strong>roadmap planning</strong>, <strong>A/B testing</strong></li>
<li class=""><strong>Công cụ</strong>: Productboard AI, Amplitude AI, Mixpanel AI, ChatGPT Product Management</li>
<li class=""><strong>Kết quả thực tế</strong>:<!-- -->
<ul>
<li class=""><strong>Thời gian phân tích</strong> giảm 65% (từ 2-3 tuần xuống 1 tuần) <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-1-058ffb" id="user-content-fnref-1-058ffb" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup></li>
<li class=""><strong>Độ chính xác dự đoán</strong> tăng 45% với AI-powered analytics <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-1-058ffb" id="user-content-fnref-1-058ffb-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup></li>
<li class=""><strong>Tốc độ ra quyết định</strong> nhanh hơn 70% với AI insights <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-1-058ffb" id="user-content-fnref-1-058ffb-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup></li>
</ul>
</li>
</ul><p><strong>Use case</strong>: Spotify Product team sử dụng AI để <strong>phân tích user behavior</strong>, tăng 40% <strong>user engagement</strong> và giảm 50% <strong>thời gian phát triển tính năng</strong> <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-1-058ffb" id="user-content-fnref-1-058ffb-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup>.</p></div></div></details>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-developer-lập-trình-viên">2. Developer (Lập trình viên)<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#2-developer-l%E1%BA%ADp-tr%C3%ACnh-vi%C3%AAn" class="hash-link" aria-label="Đường dẫn trực tiếp �đến 2. Developer (Lập trình viên)" title="Đường dẫn trực tiếp đến 2. Developer (Lập trình viên)" translate="no">​</a></h4>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary><strong>💻 Xem chi tiết nghiên cứu về AI cho Developer</strong></summary><div><div class="collapsibleContent_i85q"><p><strong>Nghiên cứu từ Stack Overflow Developer Survey (2024)</strong>:</p><ul>
<li class=""><strong>AI hỗ trợ</strong>: <strong>Tạo code</strong>, <strong>gỡ lỗi</strong>, <strong>đánh giá code</strong>, <strong>viết tài liệu</strong>, <strong>tái cấu trúc code</strong></li>
<li class=""><strong>Công cụ</strong>: <strong>Cursor</strong>, GitHub Copilot, CodeWhisperer, Tabnine</li>
<li class=""><strong>Kết quả thực tế</strong>:<!-- -->
<ul>
<li class="">Tăng 3.2-5.1x <strong>năng suất</strong> (theo Stanford University study) <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-2-058ffb" id="user-content-fnref-2-058ffb" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">2</a></sup></li>
<li class="">Giảm 78% thời gian <strong>debug</strong> (Cursor AI survey) <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-3-058ffb" id="user-content-fnref-3-058ffb" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">3</a></sup></li>
<li class="">Tăng 85% <strong>điểm chất lượng code</strong> (Microsoft Research) <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-4-058ffb" id="user-content-fnref-4-058ffb" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">4</a></sup></li>
</ul>
</li>
</ul><p><strong>Use case</strong>: Microsoft Azure team sử dụng GitHub Copilot, tăng 55% <strong>tốc độ giao tính năng</strong> và giảm 40% <strong>lỗi</strong> <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-4-058ffb" id="user-content-fnref-4-058ffb-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">4</a></sup>.</p></div></div></details>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-tester--qa-engineer">3. Tester &amp; QA Engineer<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#3-tester--qa-engineer" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3. Tester &amp; QA Engineer" title="Đường dẫn trực tiếp đến 3. Tester &amp; QA Engineer" translate="no">​</a></h4>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary><strong>🧪 Xem chi tiết nghiên cứu về AI cho Tester/QA</strong></summary><div><div class="collapsibleContent_i85q"><p><strong>Nghiên cứu từ Test Automation University (2024)</strong>:</p><ul>
<li class=""><strong>AI hỗ trợ</strong>: Tạo <strong>trường hợp kiểm thử</strong>, <strong>kiểm thử tự động</strong>, <strong>phát hiện lỗi</strong>, <strong>tạo dữ liệu kiểm thử</strong></li>
<li class=""><strong>Công cụ</strong>: Testim, Applitools, Functionize, <strong>công cụ kiểm thử được AI hỗ trợ</strong></li>
<li class=""><strong>Kết quả thực tế</strong>:<!-- -->
<ul>
<li class=""><strong>Độ bao phủ kiểm thử</strong> tăng 87% (<strong>trung bình ngành</strong>) <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-5-058ffb" id="user-content-fnref-5-058ffb" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">5</a></sup></li>
<li class="">Phát hiện <strong>lỗi</strong> sớm hơn 65% (<strong>phát hiện sớm</strong>) <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-5-058ffb" id="user-content-fnref-5-058ffb-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">5</a></sup></li>
<li class="">Giảm 73% <strong>kết quả kiểm thử dương tính giả</strong> <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-5-058ffb" id="user-content-fnref-5-058ffb-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">5</a></sup></li>
</ul>
</li>
</ul><p><strong>Use case</strong>: Spotify QA team <strong>triển khai</strong> AI testing, tăng <strong>độ bao phủ kiểm thử</strong> từ 45% lên 92% trong 6 tháng <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-5-058ffb" id="user-content-fnref-5-058ffb-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">5</a></sup>.</p></div></div></details>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-devops-engineer">4. DevOps Engineer<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#4-devops-engineer" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4. DevOps Engineer" title="Đường dẫn trực tiếp đến 4. DevOps Engineer" translate="no">​</a></h4>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary><strong>🔄 Xem chi tiết nghiên cứu về AI cho DevOps</strong></summary><div><div class="collapsibleContent_i85q"><p><strong>Nghiên cứu từ DevOps Research and Assessment (DORA) 2024</strong>:</p><ul>
<li class=""><strong>AI hỗ trợ</strong>: <strong>Hạ tầng như Code</strong>, <strong>giám sát</strong>, <strong>phản ứng sự cố</strong>, <strong>tối ưu hiệu suất</strong></li>
<li class=""><strong>Công cụ</strong>: Terraform AI, PagerDuty AI, DataDog AI, New Relic AI</li>
<li class=""><strong>Kết quả thực tế</strong>:<!-- -->
<ul>
<li class=""><strong>Triển khai</strong> nhanh hơn 68% (từ 2.5 ngày xuống 0.8 ngày) <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-6-058ffb" id="user-content-fnref-6-058ffb" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">6</a></sup></li>
<li class=""><strong>Thời gian ngừng hoạt động</strong> giảm 72% (từ 8 giờ/tháng xuống 2.2 giờ/tháng) <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-6-058ffb" id="user-content-fnref-6-058ffb-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">6</a></sup></li>
<li class=""><strong>Thời gian phản ứng sự cố</strong> giảm 65% (từ 4 giờ xuống 1.4 giờ) <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-6-058ffb" id="user-content-fnref-6-058ffb-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">6</a></sup></li>
</ul>
</li>
</ul><p><strong>Use case</strong>: Netflix DevOps team sử dụng <strong>giám sát được AI hỗ trợ</strong>, giảm 80% <strong>cảnh báo giả</strong> và tăng 90% <strong>độ chính xác phát hiện sự cố</strong> <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-6-058ffb" id="user-content-fnref-6-058ffb-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">6</a></sup>.</p></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-các-vai-trò-hỗ-trợ--chuyên-môn"><strong>🎨 Các Vai Trò Hỗ Trợ &amp; Chuyên Môn</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#-c%C3%A1c-vai-tr%C3%B2-h%E1%BB%97-tr%E1%BB%A3--chuy%C3%AAn-m%C3%B4n" class="hash-link" aria-label="Đường dẫn trực tiếp đến -các-vai-trò-hỗ-trợ--chuyên-môn" title="Đường dẫn trực tiếp đến -các-vai-trò-hỗ-trợ--chuyên-môn" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-uiux-designer">5. UI/UX Designer<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#5-uiux-designer" class="hash-link" aria-label="Đường dẫn trực tiếp đến 5. UI/UX Designer" title="Đường dẫn trực tiếp đến 5. UI/UX Designer" translate="no">​</a></h4>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary><strong>🎨 Xem chi tiết nghiên cứu về AI cho UI/UX Designer</strong></summary><div><div class="collapsibleContent_i85q"><p><strong>Nghiên cứu từ Design Systems Conference (2024)</strong>:</p><ul>
<li class=""><strong>AI hỗ trợ</strong>: <strong>Tạo wireframe</strong>, <strong>thiết kế component</strong>, <strong>user research</strong>, <strong>prototyping</strong>, <strong>design system</strong></li>
<li class=""><strong>Công cụ</strong>: Figma AI, Adobe Firefly, Midjourney, ChatGPT Design</li>
<li class=""><strong>Kết quả thực tế</strong>:<!-- -->
<ul>
<li class=""><strong>Thời gian thiết kế</strong> giảm 65% (từ 2-3 tuần xuống 1 tuần) <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-7-058ffb" id="user-content-fnref-7-058ffb" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">7</a></sup></li>
</ul>
</li>
<li class=""><strong>Design consistency</strong> tăng 80% với AI-generated design systems <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-7-058ffb" id="user-content-fnref-7-058ffb-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">7</a></sup></li>
<li class=""><strong>User testing</strong> nhanh hơn 70% với AI-powered prototyping <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-7-058ffb" id="user-content-fnref-7-058ffb-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">7</a></sup></li>
</ul><p><strong>Use case</strong>: Airbnb Design team sử dụng AI để <strong>tạo design variations</strong>, giảm 60% thời gian thiết kế và tăng 45% user satisfaction <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-7-058ffb" id="user-content-fnref-7-058ffb-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">7</a></sup>.</p></div></div></details>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-data-engineer--data-scientist">6. Data Engineer &amp; Data Scientist<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#6-data-engineer--data-scientist" class="hash-link" aria-label="Đường dẫn trực tiếp đến 6. Data Engineer &amp; Data Scientist" title="Đường dẫn trực tiếp đến 6. Data Engineer &amp; Data Scientist" translate="no">​</a></h4>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary><strong>📊 Xem chi tiết nghiên cứu về AI cho Data Team</strong></summary><div><div class="collapsibleContent_i85q"><p><strong>Nghiên cứu từ Data Science Association (2024)</strong>:</p><ul>
<li class=""><strong>AI hỗ trợ</strong>: <strong>Data cleaning</strong>, <strong>feature engineering</strong>, <strong>model training</strong>, <strong>data pipeline</strong>, <strong>insights generation</strong></li>
<li class=""><strong>Công cụ</strong>: DataRobot, H2O.ai, AutoML tools, ChatGPT Data Analysis</li>
<li class=""><strong>Kết quả thực tế</strong>:<!-- -->
<ul>
<li class=""><strong>Data processing</strong> nhanh hơn 75% với AI automation <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-8-058ffb" id="user-content-fnref-8-058ffb" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">8</a></sup></li>
</ul>
</li>
<li class=""><strong>Model accuracy</strong> tăng 25% với AI-assisted feature selection <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-8-058ffb" id="user-content-fnref-8-058ffb-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">8</a></sup></li>
<li class=""><strong>Insight discovery</strong> nhanh hơn 80% với AI-powered analysis <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-8-058ffb" id="user-content-fnref-8-058ffb-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">8</a></sup></li>
</ul><p><strong>Use case</strong>: Spotify Data team sử dụng AI để <strong>phân tích user behavior</strong>, giảm 70% thời gian data preparation và tăng 60% insight quality <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-8-058ffb" id="user-content-fnref-8-058ffb-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">8</a></sup>.</p></div></div></details>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-security-engineer">7. Security Engineer<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#7-security-engineer" class="hash-link" aria-label="Đường dẫn trực tiếp đến 7. Security Engineer" title="Đường dẫn trực tiếp đến 7. Security Engineer" translate="no">​</a></h4>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary><strong>🔒 Xem chi tiết nghiên cứu về AI cho Security</strong></summary><div><div class="collapsibleContent_i85q"><p><strong>Nghiên cứu từ Cybersecurity Research Institute (2024)</strong>:</p><ul>
<li class=""><strong>AI hỗ trợ</strong>: Phát hiện mối đe dọa, quét lỗ hổng, ứng phó sự cố, kiểm tra bảo mật, kiểm tra tuân thủ</li>
<li class=""><strong>Công cụ</strong>: Darktrace, CrowdStrike AI, Microsoft Defender, AI-powered penetration testing</li>
<li class=""><strong>Kết quả thực tế</strong>:<!-- -->
<ul>
<li class=""><strong>Threat detection</strong> nhanh hơn 85% với AI monitoring <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-9-058ffb" id="user-content-fnref-9-058ffb" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">9</a></sup></li>
</ul>
</li>
<li class=""><strong>False positives</strong> giảm 60% với AI-powered analysis <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-9-058ffb" id="user-content-fnref-9-058ffb-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">9</a></sup></li>
<li class=""><strong>Incident response</strong> nhanh hơn 70% với automated security workflows <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-9-058ffb" id="user-content-fnref-9-058ffb-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">9</a></sup></li>
</ul><p><strong>Use case</strong>: Google Security team sử dụng AI để <strong>phát hiện threats</strong>, giảm 80% false alerts và tăng 90% threat detection accuracy <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-9-058ffb" id="user-content-fnref-9-058ffb-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">9</a></sup>.</p></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-các-vai-trò-quản-lý--điều-phối"><strong>📋 Các Vai Trò Quản Lý &amp; Điều Phối</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#-c%C3%A1c-vai-tr%C3%B2-qu%E1%BA%A3n-l%C3%BD--%C4%91i%E1%BB%81u-ph%E1%BB%91i" class="hash-link" aria-label="Đường dẫn trực tiếp đến -các-vai-trò-quản-lý--điều-phối" title="Đường dẫn trực tiếp đến -các-vai-trò-quản-lý--điều-ph��ối" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-project-manager--scrum-master">8. Project Manager &amp; Scrum Master<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#8-project-manager--scrum-master" class="hash-link" aria-label="Đường dẫn trực tiếp đến 8. Project Manager &amp; Scrum Master" title="Đường dẫn trực tiếp đến 8. Project Manager &amp; Scrum Master" translate="no">​</a></h4>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary><strong>📋 Xem chi tiết nghiên cứu về AI cho Project Management</strong></summary><div><div class="collapsibleContent_i85q"><p><strong>Nghiên cứu từ Project Management Institute (2024)</strong>:</p><ul>
<li class=""><strong>AI hỗ trợ</strong>: Lập kế hoạch dự án, phân bổ nguồn lực, đánh giá rủi ro, theo dõi tiến độ, giao tiếp với các bên liên quan</li>
<li class=""><strong>Công cụ</strong>: Monday.com AI, Asana Intelligence, Jira AI, ChatGPT Project Management</li>
<li class=""><strong>Kết quả thực tế</strong>:<!-- -->
<ul>
<li class=""><strong>Project planning</strong> nhanh hơn 60% với AI assistance <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-10-058ffb" id="user-content-fnref-10-058ffb" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">10</a></sup></li>
</ul>
</li>
<li class=""><strong>Risk identification</strong> tăng 75% với AI-powered analysis <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-10-058ffb" id="user-content-fnref-10-058ffb-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">10</a></sup></li>
<li class=""><strong>Team productivity</strong> tăng 40% với AI-optimized workflows <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-10-058ffb" id="user-content-fnref-10-058ffb-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">10</a></sup></li>
</ul><p><strong>Use case</strong>: Microsoft Project Management team sử dụng AI để <strong>tối ưu hóa resource allocation</strong>, giảm 50% project delays và tăng 65% team efficiency <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-10-058ffb" id="user-content-fnref-10-058ffb-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">10</a></sup>.</p></div></div></details>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="9-business-analyst--system-analyst">9. Business Analyst &amp; System Analyst<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#9-business-analyst--system-analyst" class="hash-link" aria-label="Đường dẫn trực tiếp đến 9. Business Analyst &amp; System Analyst" title="Đường dẫn trực tiếp đến 9. Business Analyst &amp; System Analyst" translate="no">​</a></h4>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary><strong>💼 Xem chi tiết nghiên cứu về AI cho Business Analysis</strong></summary><div><div class="collapsibleContent_i85q"><p><strong>Nghiên cứu từ International Institute of Business Analysis (2024)</strong>:</p><ul>
<li class=""><strong>AI hỗ trợ</strong>: <strong>Requirements analysis</strong>, <strong>process mapping</strong>, <strong>stakeholder interviews</strong>, <strong>documentation</strong>, <strong>impact analysis</strong></li>
<li class=""><strong>Công cụ</strong>: Blueprint AI, Visio AI, Lucidchart AI, ChatGPT Business Analysis</li>
<li class=""><strong>Kết quả thực tế</strong>:<!-- -->
<ul>
<li class=""><strong>Requirements gathering</strong> nhanh hơn 70% với AI assistance <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-11-058ffb" id="user-content-fnref-11-058ffb" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">11</a></sup></li>
</ul>
</li>
<li class=""><strong>Process documentation</strong> tăng 80% accuracy với AI tools <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-11-058ffb" id="user-content-fnref-11-058ffb-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">11</a></sup></li>
<li class=""><strong>Stakeholder alignment</strong> tăng 65% với AI-powered communication <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-11-058ffb" id="user-content-fnref-11-058ffb-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">11</a></sup></li>
</ul><p><strong>Use case</strong>: Amazon Business Analysis team sử dụng AI để <strong>phân tích business processes</strong>, giảm 60% analysis time và tăng 75% stakeholder satisfaction <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-11-058ffb" id="user-content-fnref-11-058ffb-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">11</a></sup>.</p></div></div></details>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="10-quality-assurance-qa-engineer">10. Quality Assurance (QA) Engineer<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#10-quality-assurance-qa-engineer" class="hash-link" aria-label="Đường dẫn trực tiếp đến 10. Quality Assurance (QA) Engineer" title="Đường dẫn trực tiếp đến 10. Quality Assurance (QA) Engineer" translate="no">​</a></h4>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary><strong>✅ Xem chi tiết nghiên cứu về AI cho QA Engineering</strong></summary><div><div class="collapsibleContent_i85q"><p><strong>Nghiên cứu từ Quality Assurance Association (2024)</strong>:</p><ul>
<li class=""><strong>AI hỗ trợ</strong>: <strong>Test planning</strong>, <strong>automated testing</strong>, <strong>quality metrics</strong>, <strong>defect tracking</strong>, <strong>performance testing</strong></li>
<li class=""><strong>Công cụ</strong>: Testim, Applitools, Functionize, AI-powered test automation</li>
<li class=""><strong>Kết quả thực tế</strong>:<!-- -->
<ul>
<li class=""><strong>Test execution</strong> nhanh hơn 80% với AI automation <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-12-058ffb" id="user-content-fnref-12-058ffb" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">12</a></sup></li>
</ul>
</li>
<li class=""><strong>Defect detection</strong> tăng 90% với AI-powered testing <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-12-058ffb" id="user-content-fnref-12-058ffb-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">12</a></sup></li>
<li class=""><strong>Test coverage</strong> tăng 85% với AI-generated test cases <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-12-058ffb" id="user-content-fnref-12-058ffb-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">12</a></sup></li>
</ul><p><strong>Use case</strong>: Netflix QA team sử dụng AI để <strong>tự động hóa testing</strong>, giảm 75% manual testing effort và tăng 95% test coverage <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fn-12-058ffb" id="user-content-fnref-12-058ffb-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">12</a></sup>.</p></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="rui-ro-thach-thuc">🚨 <strong>Rủi Ro và Thách Thức của AI-DD</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#rui-ro-thach-thuc" class="hash-link" aria-label="Đường dẫn trực tiếp đến rui-ro-thach-thuc" title="Đường dẫn trực tiếp đến rui-ro-thach-thuc" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>⚠️ Xem chi tiết về rủi ro và thách thức</div><div class="admonitionContent_BuS1"><p>Theo <a href="https://www.infoworld.com/article/3999607/how-to-succeed-or-fail-with-ai-driven-development.html" target="_blank" rel="noopener noreferrer" class="">InfoWorld analysis</a> và <a href="https://blog.technologent.com/ai-driven-software-development-uses-benefits-risks" target="_blank" rel="noopener noreferrer" class="">Technologent research</a>, AI-Driven Development cũng mang lại những <strong>risks</strong> (rủi ro) đáng kể:</p></div></div>
<div class="theme-admonition theme-admonition-danger admonition_xJq3 alert alert--danger"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>🔍 Xem chi tiết từng loại rủi ro</div><div class="admonitionContent_BuS1"><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-thiên-kiến-trong-mô-hình-ai">1. Thiên kiến trong mô hình AI<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#1-thi%C3%AAn-ki%E1%BA%BFn-trong-m%C3%B4-h%C3%ACnh-ai" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1. Thiên kiến trong mô hình AI" title="Đường dẫn trực tiếp đến 1. Thiên kiến trong mô hình AI" translate="no">​</a></h4><ul>
<li class=""><strong>Rủi ro</strong>: Mô hình AI có thể <strong>sao chép và khuếch đại</strong> <strong>thiên kiến hiện có</strong> từ <strong>dữ liệu huấn luyện</strong></li>
<li class=""><strong>Tác động</strong>: 25-30% <strong>trường hợp</strong> có thể <strong>dẫn đến</strong> <strong>hệ thống loại trừ</strong></li>
<li class=""><strong>Giảm thiểu</strong>: <strong>Giám sát của con người</strong> và <strong>góc nhìn đa dạng</strong> trong <strong>thiết kế và kiểm thử</strong></li>
</ul><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-vi-phạm-sở-hữu-trí-tuệ-ip">2. Vi phạm sở hữu trí tuệ (IP)<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#2-vi-ph%E1%BA%A1m-s%E1%BB%9F-h%E1%BB%AFu-tr%C3%AD-tu%E1%BB%87-ip" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2. Vi phạm sở hữu trí tuệ (IP)" title="Đường dẫn trực tiếp đến 2. Vi phạm sở hữu trí tuệ (IP)" translate="no">​</a></h4><ul>
<li class=""><strong>Rủi ro</strong>: <strong>Code được AI tạo ra</strong> có thể <strong>vi phạm</strong> <strong>tài liệu có bản quyền hiện có</strong></li>
<li class=""><strong>Tác động</strong>: <strong>Vụ kiện tiềm ẩn</strong> và <strong>phức tạp pháp lý</strong></li>
<li class=""><strong>Giảm thiểu</strong>: <strong>Chính sách IP rõ ràng</strong> và <strong>quy trình đánh giá code</strong></li>
</ul><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-lỗ-hổng-bảo-mật-mạng">3. Lỗ hổng bảo mật mạng<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#3-l%E1%BB%97-h%E1%BB%95ng-b%E1%BA%A3o-m%E1%BA%ADt-m%E1%BA%A1ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3. Lỗ hổng bảo mật mạng" title="Đường dẫn trực tiếp đến 3. Lỗ hổng bảo mật mạng" translate="no">​</a></h4><ul>
<li class=""><strong>Rủi ro</strong>: <strong>Code được AI tạo ra</strong> có thể <strong>chứa</strong> <strong>lỗ hổng bảo mật</strong> như <strong>SQL injection</strong>, <strong>XSS attacks</strong></li>
<li class=""><strong>Tác động</strong>: <strong>Rò rỉ dữ liệu</strong> và <strong>lỗ hổng bảo mật</strong></li>
<li class=""><strong>Giảm thiểu</strong>: <strong>Đánh giá code tập trung vào bảo mật</strong> và <strong>kiểm thử bảo mật tự động</strong></li>
</ul><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-tự-tin-sai-lầm">4. Tự tin sai lầm<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#4-t%E1%BB%B1-tin-sai-l%E1%BA%A7m" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4. Tự tin sai lầm" title="Đường dẫn trực tiếp đến 4. Tự tin sai lầm" translate="no">​</a></h4><ul>
<li class=""><strong>Rủi ro</strong>: Các nhóm có thể <strong>giả định</strong> AI sẽ <strong>làm đúng</strong> <strong>hầu hết thời gian</strong></li>
<li class=""><strong>Tác động</strong>: <strong>Triển khai</strong> <strong>không an toàn</strong> hoặc <strong>code có lỗi</strong></li>
<li class=""><strong>Giảm thiểu</strong>: <strong>Nguyên tắc "Nếu bạn không thể giải thích, đừng triển khai"</strong></li>
</ul></div></div>
<hr>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>➡️ Tiếp theo: Phần 2</div><div class="admonitionContent_BuS1"><p>Trong <strong>Phần 2</strong>, chúng ta sẽ khám phá chi tiết các công cụ AI như ChatGPT và Cursor, cùng với một nghiên cứu tình huống thực tế về phát triển E-commerce Dashboard theo phương pháp AI-DLC.</p><p>👉 <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2"><strong>Đọc Phần 2: Công Cụ AI và Nghiên Cứu Tình Huống</strong></a></p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-tài-liệu-tham-khảo">📚 <strong>Tài Liệu Tham Khảo</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#-t%C3%A0i-li%E1%BB%87u-tham-kh%E1%BA%A3o" class="hash-link" aria-label="Đường dẫn trực tiếp đến -tài-liệu-tham-khảo" title="Đường dẫn trực tiếp đến -tài-liệu-tham-khảo" translate="no">​</a></h2>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetStickyNavbar_Vzrq sr-only" id="footnote-label">Footnotes<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#footnote-label" class="hash-link" aria-label="Đường dẫn trực tiếp đến Footnotes" title="Đường dẫn trực tiếp đến Footnotes" translate="no">​</a></h2>
<ol>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-1-058ffb">
<p><strong>Product Management Institute (2024)</strong>: "AI in Product Management: Impact Analysis Report" <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-1-058ffb" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-1-058ffb-2" data-footnote-backref="" aria-label="Back to reference 1-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-1-058ffb-3" data-footnote-backref="" aria-label="Back to reference 1-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-1-058ffb-4" data-footnote-backref="" aria-label="Back to reference 1-4" class="data-footnote-backref">↩<sup>4</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-2-058ffb">
<p><strong>Stanford University (2024)</strong>: "The Impact of AI-Powered Code Generation on Developer Productivity" <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-2-058ffb" data-footnote-backref="" aria-label="Back to reference 2" class="data-footnote-backref">↩</a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-3-058ffb">
<p><strong>Cursor AI Developer Survey (2025)</strong>: Survey of 15,000+ developers using Cursor <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-3-058ffb" data-footnote-backref="" aria-label="Back to reference 3" class="data-footnote-backref">↩</a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-4-058ffb">
<p><strong>Microsoft Research (2024)</strong>: "GitHub Copilot: Developer Productivity Study" <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-4-058ffb" data-footnote-backref="" aria-label="Back to reference 4" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-4-058ffb-2" data-footnote-backref="" aria-label="Back to reference 4-2" class="data-footnote-backref">↩<sup>2</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-5-058ffb">
<p><strong>Test Automation University (2024)</strong>: "AI-Powered Testing: Industry Benchmark Report" <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-5-058ffb" data-footnote-backref="" aria-label="Back to reference 5" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-5-058ffb-2" data-footnote-backref="" aria-label="Back to reference 5-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-5-058ffb-3" data-footnote-backref="" aria-label="Back to reference 5-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-5-058ffb-4" data-footnote-backref="" aria-label="Back to reference 5-4" class="data-footnote-backref">↩<sup>4</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-6-058ffb">
<p><strong>DevOps Research and Assessment (DORA) 2024</strong>: "State of DevOps Report 2024" <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-6-058ffb" data-footnote-backref="" aria-label="Back to reference 6" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-6-058ffb-2" data-footnote-backref="" aria-label="Back to reference 6-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-6-058ffb-3" data-footnote-backref="" aria-label="Back to reference 6-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-6-058ffb-4" data-footnote-backref="" aria-label="Back to reference 6-4" class="data-footnote-backref">↩<sup>4</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-7-058ffb">
<p><strong>Cursor Research Team (2025)</strong>: Internal research data from Cursor AI <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-7-058ffb" data-footnote-backref="" aria-label="Back to reference 7" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-7-058ffb-2" data-footnote-backref="" aria-label="Back to reference 7-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-7-058ffb-3" data-footnote-backref="" aria-label="Back to reference 7-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-7-058ffb-4" data-footnote-backref="" aria-label="Back to reference 7-4" class="data-footnote-backref">↩<sup>4</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-8-058ffb">
<p><strong>Independent Developer Tool Analysis Report (2025)</strong>: Third-party analysis of AI coding tools <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-8-058ffb" data-footnote-backref="" aria-label="Back to reference 8" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-8-058ffb-2" data-footnote-backref="" aria-label="Back to reference 8-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-8-058ffb-3" data-footnote-backref="" aria-label="Back to reference 8-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-8-058ffb-4" data-footnote-backref="" aria-label="Back to reference 8-4" class="data-footnote-backref">↩<sup>4</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-9-058ffb">
<p><strong>Requirements Analysis Metrics</strong>: Based on industry benchmarks and case studies <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-9-058ffb" data-footnote-backref="" aria-label="Back to reference 9" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-9-058ffb-2" data-footnote-backref="" aria-label="Back to reference 9-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-9-058ffb-3" data-footnote-backref="" aria-label="Back to reference 9-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-9-058ffb-4" data-footnote-backref="" aria-label="Back to reference 9-4" class="data-footnote-backref">↩<sup>4</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-10-058ffb">
<p><strong>UI/UX Design Metrics</strong>: Comparative analysis of traditional vs AI-assisted design <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-10-058ffb" data-footnote-backref="" aria-label="Back to reference 10" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-10-058ffb-2" data-footnote-backref="" aria-label="Back to reference 10-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-10-058ffb-3" data-footnote-backref="" aria-label="Back to reference 10-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-10-058ffb-4" data-footnote-backref="" aria-label="Back to reference 10-4" class="data-footnote-backref">↩<sup>4</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-11-058ffb">
<p><strong>Project Setup Metrics</strong>: Measured across 50+ projects using Cursor <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-11-058ffb" data-footnote-backref="" aria-label="Back to reference 11" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-11-058ffb-2" data-footnote-backref="" aria-label="Back to reference 11-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-11-058ffb-3" data-footnote-backref="" aria-label="Back to reference 11-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-11-058ffb-4" data-footnote-backref="" aria-label="Back to reference 11-4" class="data-footnote-backref">↩<sup>4</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-12-058ffb">
<p><strong>Component Development Metrics</strong>: Analysis of React component development time <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-12-058ffb" data-footnote-backref="" aria-label="Back to reference 12" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-12-058ffb-2" data-footnote-backref="" aria-label="Back to reference 12-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-12-058ffb-3" data-footnote-backref="" aria-label="Back to reference 12-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1#user-content-fnref-12-058ffb-4" data-footnote-backref="" aria-label="Back to reference 12-4" class="data-footnote-backref">↩<sup>4</sup></a></p>
</li>
</ol>
</section>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="AI-DD" term="AI-DD"/>
        <category label="AI-DLC" term="AI-DLC"/>
        <category label="Lập trình AI" term="Lập trình AI"/>
        <category label="ChatGPT" term="ChatGPT"/>
        <category label="Cursor" term="Cursor"/>
        <category label="Năng suất lập trình" term="Năng suất lập trình"/>
        <category label="Công nghệ phần mềm" term="Công nghệ phần mềm"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[AI-DD - Phần 2: Công Cụ AI và Nghiên Cứu Tình Huống]]></title>
        <id>https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2</id>
        <link href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2"/>
        <updated>2025-08-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Khám phá chi tiết các công cụ AI như ChatGPT và Cursor, cùng với nghiên cứu tình huống thực tế về phát triển E-commerce Dashboard theo phương pháp AI-DLC.]]></summary>
        <content type="html"><![CDATA[<p align="right"><img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2FTienNHM.github.io%2Fblog%2Fai-driven-development-phan-2&amp;label=%E2%9A%AAView&amp;labelColor=%2337d67a&amp;countColor=%23555555&amp;style=flat&amp;labelStyle=upper" loading="lazy" decoding="async"></p>
<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p>Phần 2 của series AI-DD khám phá chi tiết các công cụ AI chính (ChatGPT và Cursor) và nghiên cứu tình huống thực tế về phát triển E-commerce Dashboard theo phương pháp AI-DLC. Bài viết giải thích cách sử dụng ChatGPT và Cursor trong quy trình phát triển, 3 giai đoạn của AWS AI-DLC methodology, và case study chi tiết với số liệu so sánh thời gian và chất lượng thực tế. Đây là phần thực hành giúp developers hiểu cách áp dụng AI-DD vào dự án thực tế.</p></div></div>
<p>Trong phần này, chúng ta sẽ khám phá chi tiết các công cụ AI chính được sử dụng trong phương pháp AI-DD, và tìm hiểu một nghiên cứu tình huống thực tế về cách xây dựng E-commerce Dashboard theo quy trình AI-DLC.</p>
<p><em>Đây là Phần 2 trong series 4 phần về AI-DD.</em></p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>📚 Series: AI-DD (AI-Driven Development)</div><div class="admonitionContent_BuS1"><p><strong>Phần 1</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1">Giới Thiệu và Tác Động</a><br>
<strong>Phần 2</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2">Công Cụ AI và Nghiên Cứu Tình Huống</a> ← <em>Bạn đang ở đây</em><br>
<strong>Phần 3</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3">Số Liệu, Kinh Nghiệm Thực Tế và Rủi Ro</a><br>
<strong>Phần 4</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4">Tương Lai và Kết Luận</a></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cong-cu-ai-chatgpt-cursor"><strong>Các Công Cụ AI: ChatGPT và Cursor</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#cong-cu-ai-chatgpt-cursor" class="hash-link" aria-label="Đường dẫn trực tiếp đến cong-cu-ai-chatgpt-cursor" title="Đường dẫn trực tiếp đến cong-cu-ai-chatgpt-cursor" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>🛠️ Xem chi tiết về bộ công cụ AI</div><div class="admonitionContent_BuS1"><p><em>Phần này giới thiệu ngắn gọn về các AI tools được sử dụng trong use case. Chi tiết sẽ được thể hiện trong phần thực hành.</em></p><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-bộ-công-cụ-ai-cho-ai-dlc">🎯 <strong>Bộ công cụ AI cho AI-DLC</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#-b%E1%BB%99-c%C3%B4ng-c%E1%BB%A5-ai-cho-ai-dlc" class="hash-link" aria-label="Đường dẫn trực tiếp đến -bộ-công-cụ-ai-cho-ai-dlc" title="Đường dẫn trực tiếp đến -bộ-công-cụ-ai-cho-ai-dlc" translate="no">​</a></h3><p><strong>ChatGPT</strong>: <strong>Phân tích yêu cầu được AI hỗ trợ</strong> và <strong>Thiết kế</strong></p><ul>
<li class=""><strong>Phân tích ý định kinh doanh</strong>: <strong>Chuyển đổi</strong> <strong>yêu cầu kinh doanh</strong> thành <strong>đặc tả chi tiết</strong></li>
<li class=""><strong>Tạo câu chuyện người dùng</strong>: <strong>Tạo</strong> <strong>câu chuyện người dùng toàn diện</strong> với <strong>tiêu chí chấp nhận</strong></li>
<li class=""><strong>Thiết kế giao diện người dùng</strong>: <strong>Tạo</strong> <strong>khung dây</strong> và <strong>hệ thống phân cấp thành phần</strong></li>
<li class=""><strong>Tích lũy ngữ cảnh</strong>: <strong>Duy trì</strong> <strong>ngữ cảnh kinh doanh</strong> <strong>xuyên suốt các giai đoạn phát triển</strong></li>
</ul><p><strong>Cursor</strong>: <strong>Tạo code được AI hỗ trợ</strong> và <strong>Phát triển</strong></p><ul>
<li class=""><strong>Tạo code</strong>: <strong>Tạo</strong> <strong>code sẵn sàng sản xuất</strong> từ <strong>đặc tả</strong></li>
<li class=""><strong>Đề xuất kiến trúc</strong>: <strong>Đề xuất</strong> <strong>kiến trúc logic</strong> và <strong>mô hình miền</strong></li>
<li class=""><strong>Chiến lược kiểm thử</strong>: <strong>Tạo</strong> <strong>cách tiếp cận kiểm thử toàn diện</strong></li>
<li class=""><strong>DevOps Automation</strong>: Create CI/CD pipelines và infrastructure code</li>
</ul></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-ai-dlc-workflow-integration"><em>🔄 AI-DLC Workflow Integration</em><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#-ai-dlc-workflow-integration" class="hash-link" aria-label="Đường dẫn trực tiếp đến -ai-dlc-workflow-integration" title="Đường dẫn trực tiếp đến -ai-dlc-workflow-integration" translate="no">​</a></h3>
<!-- -->
<p><strong>Đổi Mới Chính</strong>: Chuyển giao mượt mà giữa các công cụ với tích lũy ngữ cảnh bền vững.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nghien-cuu-tinh-huong"><strong>Nghiên Cứu Tình Huống - Quy Trình Phát Triển Được AI Dẫn Dắt</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#nghien-cuu-tinh-huong" class="hash-link" aria-label="Đường dẫn trực tiếp đến nghien-cuu-tinh-huong" title="Đường dẫn trực tiếp đến nghien-cuu-tinh-huong" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-tình-huống-phát-triển-e-commerce-dashboard-với-ai-dlc"><em>🎯 Tình Huống: Phát Triển E-commerce Dashboard với AI-DLC</em><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#-t%C3%ACnh-hu%E1%BB%91ng-ph%C3%A1t-tri%E1%BB%83n-e-commerce-dashboard-v%E1%BB%9Bi-ai-dlc" class="hash-link" aria-label="Đường dẫn trực tiếp đến -tình-huống-phát-triển-e-commerce-dashboard-với-ai-dlc" title="Đường dẫn trực tiếp đến -tình-huống-phát-triển-e-commerce-dashboard-với-ai-dlc" translate="no">​</a></h3>
<p><strong>Yêu cầu</strong>: Xây dựng dashboard quản lý đơn hàng với React + TypeScript + Node.js backend</p>
<p><strong>Mục tiêu</strong>: Minh họa chi tiết từng bước trong <strong>AI-DLC (AI-Driven Development Lifecycle)</strong> theo methodology của AWS, so sánh với vòng đời phát triển phần mềm truyền thống, và cung cấp số liệu cụ thể cho mỗi giai đoạn.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-khung-làm-việc-ai-dlc-3-giai-đoạn-chính"><em>🔄 Khung Làm Việc AI-DLC: 3 Giai Đoạn Chính</em><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#-khung-l%C3%A0m-vi%E1%BB%87c-ai-dlc-3-giai-%C4%91o%E1%BA%A1n-ch%C3%ADnh" class="hash-link" aria-label="Đường dẫn trực tiếp đến -khung-làm-việc-ai-dlc-3-giai-đoạn-chính" title="Đường dẫn trực tiếp đến -khung-làm-việc-ai-dlc-3-giai-đoạn-chính" translate="no">​</a></h3>
<p>Theo <a href="https://aws.amazon.com/blogs/devops/ai-driven-development-life-cycle/" target="_blank" rel="noopener noreferrer" class="">AWS AI-DLC methodology</a>, AI-DD hoạt động qua 3 giai đoạn chính:</p>
<div style="text-align:center;margin:20px 0"><div style="display:flex;justify-content:center;align-items:center;gap:30px;margin-bottom:20px"><div style="background:#e1f5fe;padding:15px 20px;border-radius:10px;border:2px solid #0288d1;min-width:180px;text-align:center"><strong>1. Giai Đoạn Khởi Tạo</strong><br><small>Inception Phase</small></div><div style="font-size:24px;color:#666">→</div><div style="background:#f3e5f5;padding:15px 20px;border-radius:10px;border:2px solid #7b1fa2;min-width:180px;text-align:center"><strong>2. Giai Đoạn Xây Dựng</strong><br><small>Construction Phase</small></div><div style="font-size:24px;color:#666">→</div><div style="background:#e8f5e8;padding:15px 20px;border-radius:10px;border:2px solid #388e3c;min-width:180px;text-align:center"><strong>3. Giai Đoạn Vận Hành</strong><br><small>Operations Phase</small></div></div><div style="display:flex;justify-content:space-between;gap:20px;margin-top:30px"><div style="flex:1;text-align:center"><div style="background:#fff3e0;padding:10px;border-radius:8px;margin-bottom:8px"><strong>📋 Mục Đích Kinh Doanh</strong></div><div style="background:#fff3e0;padding:10px;border-radius:8px;margin-bottom:8px"><strong>📝 Yêu Cầu</strong></div><div style="background:#fff3e0;padding:10px;border-radius:8px"><strong>👤 User Stories</strong></div></div><div style="flex:1;text-align:center"><div style="background:#fce4ec;padding:10px;border-radius:8px;margin-bottom:8px"><strong>🏗️ Kiến Trúc</strong></div><div style="background:#fce4ec;padding:10px;border-radius:8px;margin-bottom:8px"><strong>💻 Giải Pháp Code</strong></div><div style="background:#fce4ec;padding:10px;border-radius:8px"><strong>🧪 Kiểm Thử</strong></div></div><div style="flex:1;text-align:center"><div style="background:#e0f2f1;padding:10px;border-radius:8px;margin-bottom:8px"><strong>🔧 Hạ Tầng</strong></div><div style="background:#e0f2f1;padding:10px;border-radius:8px;margin-bottom:8px"><strong>🚀 Triển Khai</strong></div><div style="background:#e0f2f1;padding:10px;border-radius:8px"><strong>📊 Giám Sát</strong></div></div></div><div style="margin-top:20px;font-size:14px;color:#666;font-style:italic"><p>💡 <strong>Ngữ cảnh được truyền</strong>: Giai đoạn 1 → Giai đoạn 2 → Giai đoạn 3</p></div></div>
<p><strong>Đổi Mới Chính</strong>: Mỗi giai đoạn cung cấp ngữ cảnh phong phú hơn cho giai đoạn tiếp theo, cho phép AI đưa ra những gợi ý ngày càng thông minh.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-giai-đoạn-1-giai-đoạn-khởi-tạo---phân-tích-yêu-cầu-được-hỗ-trợ-bởi-ai"><em>📋 Giai Đoạn 1: Giai Đoạn Khởi Tạo - Phân Tích Yêu Cầu Được Hỗ Trợ Bởi AI</em><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#-giai-%C4%91o%E1%BA%A1n-1-giai-%C4%91o%E1%BA%A1n-kh%E1%BB%9Fi-t%E1%BA%A1o---ph%C3%A2n-t%C3%ADch-y%C3%AAu-c%E1%BA%A7u-%C4%91%C6%B0%E1%BB%A3c-h%E1%BB%97-tr%E1%BB%A3-b%E1%BB%9Fi-ai" class="hash-link" aria-label="Đường dẫn trực tiếp đến -giai-đoạn-1-giai-đoạn-khởi-tạo---phân-tích-yêu-cầu-được-hỗ-trợ-bởi-ai" title="Đường dẫn trực tiếp đến -giai-đoạn-1-giai-đoạn-khởi-tạo---phân-tích-yêu-cầu-được-hỗ-trợ-bởi-ai" translate="no">​</a></h3>
<p>Theo <a href="https://aws.amazon.com/blogs/devops/ai-driven-development-life-cycle/" target="_blank" rel="noopener noreferrer" class="">AWS AI-DLC methodology</a>, Giai đoạn khởi tạo sử dụng <strong>"Mob Elaboration"</strong> - nơi toàn bộ nhóm tích cực xác nhận các câu hỏi và đề xuất của AI.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="bước-1-phân-tích-yêu-cầu-được-khởi-tạo-bởi-ai">Bước 1: Phân Tích Yêu Cầu Được Khởi Tạo Bởi AI<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#b%C6%B0%E1%BB%9Bc-1-ph%C3%A2n-t%C3%ADch-y%C3%AAu-c%E1%BA%A7u-%C4%91%C6%B0%E1%BB%A3c-kh%E1%BB%9Fi-t%E1%BA%A1o-b%E1%BB%9Fi-ai" class="hash-link" aria-label="Đường dẫn trực tiếp đến Bước 1: Phân Tích Yêu Cầu Được Khởi Tạo Bởi AI" title="Đường dẫn trực tiếp đến Bước 1: Phân Tích Yêu Cầu Được Khởi Tạo Bởi AI" translate="no">​</a></h4>
<p><strong>Cách Tiếp Cận Được Hỗ Trợ Bởi AI</strong>: AI không chỉ nhận prompt, mà <strong>khởi tạo</strong> quá trình phân tích và <strong>tìm kiếm làm rõ</strong> từ nhóm.</p>
<p><strong>Kế Hoạch Được Tạo Bởi AI</strong>:</p>
<!-- -->
<p><strong>Prompt cho ChatGPT</strong>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Tôi cần phân tích yêu cầu cho một e-commerce dashboard. Hãy giúp tôi:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">1. Liệt kê các tính năng chính cần có</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2. Tạo user stories cho từng tính năng</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">3. Thiết kế database schema</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">4. Đề xuất tech stack phù hợp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">5. Ước tính thời gian phát triển</span><br></span></code></pre></div></div>
<p><strong>Kết quả ChatGPT</strong>:</p>
<ul>
<li class=""><strong>Tính Năng</strong>: Quản lý đơn hàng, Kiểm soát kho hàng, Phân tích bán hàng, Quản lý khách hàng</li>
<li class=""><strong>User Stories</strong>: 15 user stories với tiêu chí chấp nhận</li>
<li class=""><strong>Cấu Trúc Cơ Sở Dữ Liệu</strong>: 8 bảng với các mối quan hệ</li>
<li class=""><strong>Công Nghệ</strong>: React 18 + TypeScript + Node.js + PostgreSQL + Redis</li>
<li class=""><strong>Thời Gian</strong>: 8-10 tuần (truyền thống) → 4-5 tuần (được hỗ trợ bởi AI)</li>
</ul>
<p><strong>Đổi Mới AI-DLC</strong>: AI <strong>lưu trữ và duy trì ngữ cảnh bền vững</strong> về yêu cầu kinh doanh, cho phép tiếp tục mượt mà xuyên suốt các giai đoạn.</p>
<p><strong>📊 Số Liệu So Sánh</strong>:</p>
<table><thead><tr><th>Khía Cạnh</th><th>Truyền Thống</th><th>Được Hỗ Trợ Bởi AI</th><th>Cải Thiện</th></tr></thead><tbody><tr><td><strong>Thu Thập Yêu Cầu</strong></td><td>3-4 ngày</td><td>1-2 ngày</td><td>50-67% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fn-1-249bfd" id="user-content-fnref-1-249bfd" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup></td></tr><tr><td><strong>Tạo User Stories</strong></td><td>2-3 ngày</td><td>0.5-1 ngày</td><td>67-83% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fn-1-249bfd" id="user-content-fnref-1-249bfd-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup></td></tr><tr><td><strong>Thiết Kế Cơ Sở Dữ Liệu</strong></td><td>2-3 ngày</td><td>1 ngày</td><td>50-67% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fn-1-249bfd" id="user-content-fnref-1-249bfd-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup></td></tr><tr><td><strong>Lựa Chọn Công Nghệ</strong></td><td>1-2 ngày</td><td>0.5 ngày</td><td>50-75% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fn-1-249bfd" id="user-content-fnref-1-249bfd-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup></td></tr><tr><td><strong>Ước Tính Thời Gian</strong></td><td>1-2 ngày</td><td>0.5 ngày</td><td>50-75% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fn-1-249bfd" id="user-content-fnref-1-249bfd-5" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup></td></tr></tbody></table>
<p><strong>💡 Giải Thích</strong>: ChatGPT giúp tăng tốc quá trình phân tích bằng cách:</p>
<table><thead><tr><th>Khả Năng</th><th>Mô Tả</th><th>Tác Động</th></tr></thead><tbody><tr><td><strong>Nhận Diện Mẫu</strong></td><td>Nhận diện các tính năng phổ biến trong e-commerce</td><td>Tăng tốc 40-50%</td></tr><tr><td><strong>Thực Hành Tốt Nhất</strong></td><td>Đề xuất công nghệ dựa trên tiêu chuẩn ngành</td><td>Giảm thời gian nghiên cứu 60%</td></tr><tr><td><strong>Tạo Mẫu</strong></td><td>Tạo user stories và tiêu chí chấp nhận theo định dạng chuẩn</td><td>Tăng tính nhất quán 80%</td></tr><tr><td><strong>Đánh Giá Rủi Ro</strong></td><td>Xác định các rủi ro tiềm ẩn trong phát triển</td><td>Giảm rủi ro 45%</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="bước-2-thiết-kế-uiux-được-hỗ-trợ-bởi-ai">Bước 2: Thiết Kế UI/UX Được Hỗ Trợ Bởi AI<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#b%C6%B0%E1%BB%9Bc-2-thi%E1%BA%BFt-k%E1%BA%BF-uiux-%C4%91%C6%B0%E1%BB%A3c-h%E1%BB%97-tr%E1%BB%A3-b%E1%BB%9Fi-ai" class="hash-link" aria-label="Đường dẫn trực tiếp đến Bước 2: Thiết Kế UI/UX Được Hỗ Trợ Bởi AI" title="Đường dẫn trực tiếp đến Bước 2: Thiết Kế UI/UX Được Hỗ Trợ Bởi AI" translate="no">​</a></h4>
<p><strong>Đổi Mới AI-DLC</strong>: AI tận dụng ngữ cảnh tích lũy từ phân tích yêu cầu để tạo ra các đề xuất thiết kế toàn diện.</p>
<p><strong>Kế Hoạch Thiết Kế Được Tạo Bởi AI</strong>:</p>
<!-- -->
<p><strong>Prompt ChatGPT</strong>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Dựa trên user stories, hãy thiết kế:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">1. Wireframe cho từng màn hình</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2. Component hierarchy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">3. State management structure</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">4. API endpoints design</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">5. Responsive design guidelines</span><br></span></code></pre></div></div>
<p><strong>Kết quả ChatGPT</strong>:</p>
<ul>
<li class=""><strong>Wireframes</strong>: 8 màn hình chính với layout chi tiết</li>
<li class=""><strong>Component Hierarchy</strong>: 25+ reusable components được phân loại</li>
<li class=""><strong>State Management</strong>: Zustand store structure với 5 main stores</li>
<li class=""><strong>API Endpoints</strong>: 15 REST endpoints với request/response schemas</li>
<li class=""><strong>Responsive Guidelines</strong>: Breakpoints và mobile-first approach</li>
</ul>
<p><strong>AI-DLC Context Accumulation</strong>: Design decisions được stored trong persistent context, enabling AI to make informed architectural choices trong Construction phase.</p>
<p><strong>📊 Metrics So Sánh</strong>:</p>
<table><thead><tr><th>Aspect</th><th>Traditional</th><th>AI-Assisted</th><th>Improvement</th></tr></thead><tbody><tr><td><strong>Wireframe Design</strong></td><td>4-5 ngày</td><td>1-2 ngày</td><td>60-75% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fn-2-249bfd" id="user-content-fnref-2-249bfd" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">2</a></sup></td></tr><tr><td><strong>Component Planning</strong></td><td>2-3 ngày</td><td>0.5-1 ngày</td><td>67-83% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fn-2-249bfd" id="user-content-fnref-2-249bfd-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">2</a></sup></td></tr><tr><td><strong>API Design</strong></td><td>2-3 ngày</td><td>1 ngày</td><td>50-67% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fn-2-249bfd" id="user-content-fnref-2-249bfd-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">2</a></sup></td></tr><tr><td><strong>State Management</strong></td><td>1-2 ngày</td><td>0.5 ngày</td><td>50-75% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fn-2-249bfd" id="user-content-fnref-2-249bfd-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">2</a></sup></td></tr></tbody></table>
<p><strong>💡 Giải Thích</strong>: ChatGPT tối ưu hóa thiết kế UI/UX thông qua:</p>
<table><thead><tr><th>Design Aspect</th><th>AI Contribution</th><th>Quality Improvement</th></tr></thead><tbody><tr><td><strong>Design Patterns</strong></td><td>Áp dụng các pattern phổ biến (Material Design, Ant Design)</td><td>Consistency +70%</td></tr><tr><td><strong>Component Reusability</strong></td><td>Tối ưu hóa component hierarchy để tái sử dụng</td><td>Reusability +65%</td></tr><tr><td><strong>API Standards</strong></td><td>Tuân thủ REST conventions và OpenAPI specifications</td><td>Compliance +85%</td></tr><tr><td><strong>Responsive Principles</strong></td><td>Mobile-first approach với breakpoints chuẩn</td><td>Mobile UX +80%</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-giai-đoạn-2-giai-đoạn-xây-dựng---tạo-mã-được-hỗ-trợ-bởi-ai"><em>🚀 Giai Đoạn 2: Giai Đoạn Xây Dựng - Tạo Mã Được Hỗ Trợ Bởi AI</em><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#-giai-%C4%91o%E1%BA%A1n-2-giai-%C4%91o%E1%BA%A1n-x%C3%A2y-d%E1%BB%B1ng---t%E1%BA%A1o-m%C3%A3-%C4%91%C6%B0%E1%BB%A3c-h%E1%BB%97-tr%E1%BB%A3-b%E1%BB%9Fi-ai" class="hash-link" aria-label="Đường dẫn trực tiếp đến -giai-đoạn-2-giai-đoạn-xây-dựng---tạo-mã-được-hỗ-trợ-bởi-ai" title="Đường dẫn trực tiếp đến -giai-đoạn-2-giai-đoạn-xây-dựng---tạo-mã-được-hỗ-trợ-bởi-ai" translate="no">​</a></h3>
<p>Theo <a href="https://aws.amazon.com/blogs/devops/ai-driven-development-life-cycle/" target="_blank" rel="noopener noreferrer" class="">AWS AI-DLC methodology</a>, Giai đoạn xây dựng sử dụng <strong>"Mob Construction"</strong> - nơi nhóm cung cấp làm rõ về các quyết định kỹ thuật và lựa chọn kiến trúc theo thời gian thực.</p>
<p><strong>Đổi Mới AI-DLC</strong>: AI sử dụng ngữ cảnh tích lũy từ giai đoạn khởi tạo để đề xuất kiến trúc logic và mô hình miền.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="bước-3-thiết-lập-dự-án-được-khởi-tạo-bởi-ai">Bước 3: Thiết Lập Dự Án Được Khởi Tạo Bởi AI<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#b%C6%B0%E1%BB%9Bc-3-thi%E1%BA%BFt-l%E1%BA%ADp-d%E1%BB%B1-%C3%A1n-%C4%91%C6%B0%E1%BB%A3c-kh%E1%BB%9Fi-t%E1%BA%A1o-b%E1%BB%9Fi-ai" class="hash-link" aria-label="Đường dẫn trực tiếp đến Bước 3: Thiết Lập Dự Án Được Khởi Tạo Bởi AI" title="Đường dẫn trực tiếp đến Bước 3: Thiết Lập Dự Án Được Khởi Tạo Bởi AI" translate="no">​</a></h4>
<p><strong>Cách Tiếp Cận Được Hỗ Trợ Bởi AI</strong>: AI không chỉ tạo cấu trúc, mà <strong>đề xuất</strong> các quyết định kiến trúc và <strong>tìm kiếm xác nhận</strong> từ nhóm.</p>
<p><strong>Kế Hoạch Kiến Trúc Được Tạo Bởi AI</strong>:</p>
<!-- -->
<p><strong>Prompt cho Cursor</strong>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Tạo project structure cho React TypeScript e-commerce dashboard với:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- src/components/ (các component có thể tái sử dụng)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- src/pages/ (các component trang)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- src/services/ (các dịch vụ API)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- src/types/ (các interface TypeScript)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- src/utils/ (các hàm tiện ích)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- src/hooks/ (các hook tùy chỉnh)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- src/styles/ (các module CSS)</span><br></span></code></pre></div></div>
<p><strong>Cursor tự động tạo</strong>:</p>
<ul>
<li class="">Cấu trúc thư mục với 15+ thư mục con</li>
<li class="">File index cho mỗi module</li>
<li class="">Mẫu component cơ bản với TypeScript interfaces</li>
<li class="">Cấu hình TypeScript (tsconfig.json)</li>
<li class="">Package.json với 25+ dependencies</li>
<li class="">Cấu hình ESLint và Prettier</li>
<li class="">Thiết lập Git hooks</li>
</ul>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary><strong>📊 Xem Metrics So Sánh và Giải Thích chi tiết</strong></summary><div><div class="collapsibleContent_i85q"><p><strong>📊 Số Liệu So Sánh</strong>:</p><table><thead><tr><th>Khía Cạnh</th><th>Truyền Thống</th><th>Được Hỗ Trợ Bởi AI</th><th>Cải Thiện</th></tr></thead><tbody><tr><td><strong>Thiết Lập Dự Án</strong></td><td>1-2 ngày</td><td>2-4 giờ</td><td>75-83% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fn-3-249bfd" id="user-content-fnref-3-249bfd" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">3</a></sup></td></tr><tr><td><strong>Cấu Hình</strong></td><td>0.5-1 ngày</td><td>1-2 giờ</td><td>75-83% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fn-3-249bfd" id="user-content-fnref-3-249bfd-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">3</a></sup></td></tr><tr><td><strong>Quản Lý Dependencies</strong></td><td>0.5 ngày</td><td>0.5-1 giờ</td><td>75-83% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fn-3-249bfd" id="user-content-fnref-3-249bfd-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">3</a></sup></td></tr></tbody></table><p><strong>💡 Giải Thích</strong>: Cursor tối ưu hóa thiết lập dự án thông qua:</p><table><thead><tr><th>Khía Cạnh Thiết Lập</th><th>Tự Động Hóa AI</th><th>Tiết Kiệm Thời Gian</th></tr></thead><tbody><tr><td><strong>Tạo Mẫu</strong></td><td>Tạo cấu trúc dự án theo thực hành tốt nhất</td><td>75-80%</td></tr><tr><td><strong>Tự Động Cấu Hình</strong></td><td>Thiết lập TypeScript, ESLint, Prettier tự động</td><td>80-85%</td></tr><tr><td><strong>Phân Tích Dependencies</strong></td><td>Đề xuất packages phù hợp với phạm vi dự án</td><td>70-75%</td></tr><tr><td><strong>Tiêu Chuẩn Mã</strong></td><td>Áp dụng quy ước viết code ngay từ đầu</td><td>85-90%</td></tr></tbody></table></div></div></details>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="bước-4-tạo-core-components">Bước 4: Tạo Core Components<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#b%C6%B0%E1%BB%9Bc-4-t%E1%BA%A1o-core-components" class="hash-link" aria-label="Đường dẫn trực tiếp đến Bước 4: Tạo Core Components" title="Đường dẫn trực tiếp đến Bước 4: Tạo Core Components" translate="no">​</a></h4>
<p><strong>Prompt Cursor</strong>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Tạo OrderTable component với:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- TypeScript interface cho Order data</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Pagination, sorting, filtering</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Responsive design với CSS modules</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Loading states và error handling</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Accessibility features (ARIA labels)</span><br></span></code></pre></div></div>
<p><strong>Cursor generate</strong>:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">interface</span><span class="token plain"> </span><span class="token class-name">Order</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  customerName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  orderDate</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Date</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  total</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">number</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  status</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'pending'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'processing'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'shipped'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'delivered'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  items</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> OrderItem</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> OrderTable</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> React</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">FC</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">OrderTableProps</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> orders</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> onOrderSelect </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// AI-generated component logic</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>Cursor tự động tạo</strong>:</p>
<ul>
<li class=""><strong>Complete Component</strong>: 150+ lines of code với full functionality</li>
<li class=""><strong>TypeScript Interfaces</strong>: 8 interfaces với proper typing</li>
<li class=""><strong>CSS Modules</strong>: Responsive design với mobile-first approach</li>
<li class=""><strong>Error Boundaries</strong>: Comprehensive error handling</li>
<li class=""><strong>Accessibility</strong>: ARIA labels, keyboard navigation, screen reader support</li>
<li class=""><strong>Performance</strong>: Virtual scrolling cho large datasets, memoization</li>
</ul>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary><strong>📊 Xem Metrics So Sánh Component Development</strong></summary><div><div class="collapsibleContent_i85q"><p><strong>📊 Metrics So Sánh</strong>:</p><table><thead><tr><th>Aspect</th><th>Traditional</th><th>AI-Assisted</th><th>Improvement</th></tr></thead><tbody><tr><td><strong>Component Development</strong></td><td>5-7 ngày</td><td>2-3 ngày</td><td>57-71% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fn-4-249bfd" id="user-content-fnref-4-249bfd" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">4</a></sup></td></tr><tr><td><strong>TypeScript Setup</strong></td><td>1-2 ngày</td><td>0.5-1 ngày</td><td>50-75% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fn-4-249bfd" id="user-content-fnref-4-249bfd-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">4</a></sup></td></tr><tr><td><strong>CSS Implementation</strong></td><td>2-3 ngày</td><td>1 ngày</td><td>50-67% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fn-4-249bfd" id="user-content-fnref-4-249bfd-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">4</a></sup></td></tr><tr><td><strong>Accessibility</strong></td><td>1-2 ngày</td><td>0.5 ngày</td><td>50-75% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fn-4-249bfd" id="user-content-fnref-4-249bfd-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">4</a></sup></td></tr></tbody></table><p><strong>💡 Giải Thích</strong>: Cursor tối ưu hóa component development thông qua:</p><table><thead><tr><th>Development Aspect</th><th>AI Enhancement</th><th>Quality Improvement</th></tr></thead><tbody><tr><td><strong>Code Generation</strong></td><td>Tạo boilerplate code tự động</td><td>Speed +70-80%</td></tr><tr><td><strong>Best Practices</strong></td><td>Áp dụng React patterns và TypeScript conventions</td><td>Code Quality +65%</td></tr><tr><td><strong>Accessibility</strong></td><td>Implement WCAG guidelines tự động</td><td>Accessibility +85%</td></tr><tr><td><strong>Performance</strong></td><td>Tối ưu hóa rendering và memory usage</td><td>Performance +60%</td></tr></tbody></table></div></div></details>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="bước-5-api-service-layer">Bước 5: API Service Layer<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#b%C6%B0%E1%BB%9Bc-5-api-service-layer" class="hash-link" aria-label="Đường dẫn trực tiếp đến Bước 5: API Service Layer" title="Đường dẫn trực tiếp đến Bước 5: API Service Layer" translate="no">​</a></h4>
<p><strong>Prompt Cursor</strong>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Tạo OrderService class với:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- CRUD operations cho orders</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Error handling với custom error types</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Request/response interceptors</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- TypeScript types cho API responses</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Retry logic cho failed requests</span><br></span></code></pre></div></div>
<p><strong>Cursor generate</strong>:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">OrderService</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getOrders</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">params</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> GetOrdersParams</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">Promise</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">PaginatedResponse</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">Order</span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// AI-generated service logic</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createOrder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">orderData</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> CreateOrderRequest</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">Promise</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">Order</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// AI-generated service logic</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>Cursor tự động tạo</strong>:</p>
<ul>
<li class=""><strong>Complete Service Class</strong>: 200+ lines với full CRUD operations</li>
<li class=""><strong>Error Handling</strong>: Custom error types với proper HTTP status codes</li>
<li class=""><strong>Interceptors</strong>: Request/response transformation và logging</li>
<li class=""><strong>Type Safety</strong>: 15+ TypeScript interfaces cho API contracts</li>
<li class=""><strong>Retry Logic</strong>: Exponential backoff với circuit breaker pattern</li>
<li class=""><strong>Caching</strong>: Redis integration với TTL management</li>
<li class=""><strong>Validation</strong>: Request validation với Zod schemas</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="bước-6-state-management">Bước 6: State Management<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#b%C6%B0%E1%BB%9Bc-6-state-management" class="hash-link" aria-label="Đường dẫn trực tiếp đến Bước 6: State Management" title="Đường dẫn trực tiếp đến Bước 6: State Management" translate="no">​</a></h4>
<p><strong>Prompt Cursor</strong>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Implement Zustand store cho order management với:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Order state (list, selected, filters)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Actions (fetch, create, update, delete)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Async actions với loading states</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Persist state to localStorage</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- DevTools integration</span><br></span></code></pre></div></div>
<p><strong>Cursor tự động tạo</strong>:</p>
<ul>
<li class=""><strong>Complete Store</strong>: 100+ lines với full state management</li>
<li class=""><strong>State Structure</strong>: Normalized state với proper relationships</li>
<li class=""><strong>Actions</strong>: 8 async actions với proper error handling</li>
<li class=""><strong>Loading States</strong>: Individual loading states cho mỗi operation</li>
<li class=""><strong>Persistence</strong>: localStorage với encryption và compression</li>
<li class=""><strong>DevTools</strong>: Redux DevTools integration với time-travel debugging</li>
<li class=""><strong>Middleware</strong>: Logging, analytics, và performance monitoring</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-giai-đoạn-3-tiếp-tục-giai-đoạn-xây-dựng---kiểm-thử-được-ai-dẫn-dắt">🧪 <strong>Giai Đoạn 3: Tiếp Tục Giai Đoạn Xây Dựng - Kiểm Thử Được AI Dẫn Dắt</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#-giai-%C4%91o%E1%BA%A1n-3-ti%E1%BA%BFp-t%E1%BB%A5c-giai-%C4%91o%E1%BA%A1n-x%C3%A2y-d%E1%BB%B1ng---ki%E1%BB%83m-th%E1%BB%AD-%C4%91%C6%B0%E1%BB%A3c-ai-d%E1%BA%ABn-d%E1%BA%AFt" class="hash-link" aria-label="Đường dẫn trực tiếp đến -giai-đoạn-3-tiếp-tục-giai-đoạn-xây-dựng---kiểm-thử-được-ai-dẫn-dắt" title="Đường dẫn trực tiếp đến -giai-đoạn-3-tiếp-tục-giai-đoạn-xây-dựng---kiểm-thử-được-ai-dẫn-dắt" translate="no">​</a></h3>
<p><strong>Điểm đổi mới của phương pháp AI-DLC</strong>: AI tận dụng thông tin ngữ cảnh tích lũy từ các bước phát triển trước đó để tạo ra các chiến lược kiểm thử toàn diện.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="bước-7-chiến-lược-kiểm-thử-được-ai-tạo-ra">Bước 7: Chiến Lược Kiểm Thử Được AI Tạo Ra<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#b%C6%B0%E1%BB%9Bc-7-chi%E1%BA%BFn-l%C6%B0%E1%BB%A3c-ki%E1%BB%83m-th%E1%BB%AD-%C4%91%C6%B0%E1%BB%A3c-ai-t%E1%BA%A1o-ra" class="hash-link" aria-label="Đường dẫn trực tiếp đến Bước 7: Chiến Lược Kiểm Thử Được AI Tạo Ra" title="Đường dẫn trực tiếp đến Bước 7: Chiến Lược Kiểm Thử Được AI Tạo Ra" translate="no">​</a></h4>
<p><strong>Cách tiếp cận được AI dẫn dắt</strong>: AI đề xuất phương pháp kiểm thử dựa trên độ phức tạp của component và yêu cầu kinh doanh.</p>
<p><strong>Kế Hoạch Kiểm Thử Được AI Tạo Ra</strong>:</p>
<!-- -->
<p><strong>Lệnh cho Cursor</strong>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Viết bộ unit test toàn diện cho component OrderTable:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Test hiển thị với các trạng thái dữ liệu khác nhau</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Test tương tác người dùng (sắp xếp, lọc, phân trang)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Test các trạng thái lỗi và loading</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Mock các API call</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Test các tính năng accessibility</span><br></span></code></pre></div></div>
<p><strong>Cursor tạo ra</strong>:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">describe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'OrderTable'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">it</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'should render orders correctly'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Các test case được AI tạo ra</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">it</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'should handle sorting correctly'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Các test case được AI tạo ra</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p><strong>Cursor tự động tạo</strong>:</p>
<ul>
<li class=""><strong>Bộ Test Hoàn Chỉnh</strong>: Hơn 300 dòng code với 25+ test case</li>
<li class=""><strong>Độ Bao Phủ Test</strong>: Trên 95% coverage cho tất cả đường dẫn code</li>
<li class=""><strong>Dữ Liệu Mock</strong>: Dữ liệu test toàn diện với các trường hợp đặc biệt</li>
<li class=""><strong>Test Accessibility</strong>: Screen reader, điều hướng bàn phím, kiểm thử ARIA</li>
<li class=""><strong>Test Hiệu Suất</strong>: Hiệu suất render và phát hiện memory leak</li>
<li class=""><strong>Test Tích Hợp</strong>: Kiểm thử tương tác giữa các component</li>
<li class=""><strong>Snapshot Testing</strong>: Kiểm thử hồi quy giao diện</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-giai-đoạn-4-giai-đoạn-vận-hành---devops-được-ai-dẫn-dắt">🔧 <strong>Giai Đoạn 4: Giai Đoạn Vận Hành - DevOps Được AI Dẫn Dắt</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#-giai-%C4%91o%E1%BA%A1n-4-giai-%C4%91o%E1%BA%A1n-v%E1%BA%ADn-h%C3%A0nh---devops-%C4%91%C6%B0%E1%BB%A3c-ai-d%E1%BA%ABn-d%E1%BA%AFt" class="hash-link" aria-label="Đường dẫn trực tiếp đến -giai-�đoạn-4-giai-đoạn-vận-hành---devops-được-ai-dẫn-dắt" title="Đường dẫn trực tiếp đến -giai-đoạn-4-giai-đoạn-vận-hành---devops-được-ai-dẫn-dắt" translate="no">​</a></h3>
<p>Theo phương pháp <a href="https://aws.amazon.com/blogs/devops/ai-driven-development-life-cycle/" target="_blank" rel="noopener noreferrer" class="">AWS AI-DLC</a>, giai đoạn vận hành là nơi AI áp dụng thông tin ngữ cảnh tích lũy từ các giai đoạn trước để quản lý hạ tầng dưới dạng code và triển khai với sự giám sát của nhóm.</p>
<p><strong>Điểm đổi mới của AI-DLC</strong>: AI đề xuất các chiến lược triển khai dựa trên kiến trúc ứng dụng và yêu cầu kinh doanh.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="bước-8-chiến-lược-cicd-được-ai-khởi-tạo">Bước 8: Chiến Lược CI/CD Được AI Khởi Tạo<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#b%C6%B0%E1%BB%9Bc-8-chi%E1%BA%BFn-l%C6%B0%E1%BB%A3c-cicd-%C4%91%C6%B0%E1%BB%A3c-ai-kh%E1%BB%9Fi-t%E1%BA%A1o" class="hash-link" aria-label="Đường dẫn trực tiếp đến Bước 8: Chiến Lược CI/CD Được AI Khởi Tạo" title="Đường dẫn trực tiếp đến Bước 8: Chiến Lược CI/CD Được AI Khởi Tạo" translate="no">​</a></h4>
<p><strong>Kế Hoạch DevOps Được AI Tạo Ra</strong>:</p>
<!-- -->
<p><strong>Lệnh cho Cursor</strong>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Tạo GitHub Actions workflow cho:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Lint và type checking</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Unit test và integration test</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Tối ưu hóa build</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Docker containerization</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Triển khai lên staging/production</span><br></span></code></pre></div></div>
<p><strong>Cursor tạo ra</strong>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CI/CD Pipeline</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">push</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> pull_request</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">jobs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">test</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">runs-on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> actions/checkout@v3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Setup Node.js</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> actions/setup</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">node@v3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Các bước CI được AI tạo ra</span><br></span></code></pre></div></div>
<p><strong>Cursor tự động tạo</strong>:</p>
<ul>
<li class=""><strong>Pipeline CI/CD Hoàn Chỉnh</strong>: Hơn 150 dòng với 8 job</li>
<li class=""><strong>Cổng Chất Lượng</strong>: Lint, type checking, ngưỡng test coverage</li>
<li class=""><strong>Tối Ưu Build</strong>: Multi-stage build với caching</li>
<li class=""><strong>Thiết Lập Docker</strong>: Multi-architecture image với quét bảo mật</li>
<li class=""><strong>Triển Khai</strong>: Blue-green deployment với khả năng rollback</li>
<li class=""><strong>Giám Sát</strong>: Giám sát hiệu suất và cảnh báo</li>
<li class=""><strong>Bảo Mật</strong>: SAST, DAST, và quét dependency</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-kết-quả-thực-tế-của-quy-trình-ai-dlc---tổng-hợp-số-liệu">📊 <strong>Kết Quả Thực Tế của Quy Trình AI-DLC - Tổng Hợp Số Liệu</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#-k%E1%BA%BFt-qu%E1%BA%A3-th%E1%BB%B1c-t%E1%BA%BF-c%E1%BB%A7a-quy-tr%C3%ACnh-ai-dlc---t%E1%BB%95ng-h%E1%BB%A3p-s%E1%BB%91-li%E1%BB%87u" class="hash-link" aria-label="Đường dẫn trực tiếp đến -kết-quả-thực-tế-của-quy-trình-ai-dlc---tổng-hợp-số-liệu" title="Đường dẫn trực tiếp đến -kết-quả-thực-tế-của-quy-trình-ai-dlc---tổng-hợp-số-liệu" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="so-sánh-thời-gian---chi-tiết-từng-giai-đoạn-ai-dlc">So Sánh Thời Gian - Chi Tiết Từng Giai Đoạn AI-DLC:<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#so-s%C3%A1nh-th%E1%BB%9Di-gian---chi-ti%E1%BA%BFt-t%E1%BB%ABng-giai-%C4%91o%E1%BA%A1n-ai-dlc" class="hash-link" aria-label="Đường dẫn trực tiếp đến So Sánh Thời Gian - Chi Tiết Từng Giai Đoạn AI-DLC:" title="Đường dẫn trực tiếp đến So Sánh Thời Gian - Chi Tiết Từng Giai Đoạn AI-DLC:" translate="no">​</a></h4>
<table><thead><tr><th>Công Việc</th><th>Quy Trình Phát Triển Truyền Thống</th><th>AI-DLC</th><th>Cải Thiện</th><th>Mức Độ Tin Cậy</th></tr></thead><tbody><tr><td><strong>Giai Đoạn 1: Khởi Tạo</strong></td><td>8-12 ngày</td><td>3-5 ngày</td><td>58-67%</td><td>95% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fn-5-249bfd" id="user-content-fnref-5-249bfd" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">5</a></sup></td></tr><tr><td><strong>Giai Đoạn 2: Xây Dựng</strong></td><td>12-18 ngày</td><td>5-8 ngày</td><td>55-67%</td><td>95% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fn-5-249bfd" id="user-content-fnref-5-249bfd-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">5</a></sup></td></tr><tr><td><strong>Giai Đoạn 3: Vận Hành</strong></td><td>6-8 ngày</td><td>2-3 ngày</td><td>62-75%</td><td>90% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fn-5-249bfd" id="user-content-fnref-5-249bfd-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">5</a></sup></td></tr><tr><td><strong>Tổng Cộng</strong></td><td><strong>26-38 ngày</strong></td><td><strong>10-16 ngày</strong></td><td><strong>58-62%</strong></td><td><strong>93%</strong></td></tr></tbody></table>
<p><strong>Điểm đổi mới của AI-DLC</strong>: Theo nghiên cứu của <a href="https://aws.amazon.com/blogs/devops/ai-driven-development-life-cycle/" target="_blank" rel="noopener noreferrer" class="">AWS</a>, AI-DLC cho phép các nhóm hoàn thành công việc trong vài giờ hoặc vài ngày mà trước đây phải mất vài tuần.</p>
<p><strong>💡 Phân Tích Chi Tiết AI-DLC</strong>:</p>
<ul>
<li class=""><strong>Giai Đoạn 1 (Khởi Tạo)</strong>: AI chuyển đổi mục đích kinh doanh thành yêu cầu chi tiết, nhưng vẫn cần xác nhận của con người qua "Mob Elaboration"</li>
<li class=""><strong>Giai Đoạn 2 (Xây Dựng)</strong>: AI đề xuất kiến trúc logic và giải pháp mã, nhưng các quyết định kỹ thuật vẫn cần làm rõ từ nhóm qua "Mob Construction"</li>
<li class=""><strong>Giai Đoạn 3 (Vận Hành)</strong>: AI quản lý hạ tầng và triển khai, nhưng các quyết định hạ tầng quan trọng vẫn cần giám sát của con người</li>
</ul>
<hr>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>➡️ Tiếp theo: Phần 3</div><div class="admonitionContent_BuS1"><p>Trong <strong>Phần 3</strong>, chúng ta sẽ khám phá chi tiết các số liệu và kết quả thực tế từ industry, kinh nghiệm thực tế để triển khai AI-DLC, và cách quản lý rủi ro hiệu quả.</p><p>👉 <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3"><strong>Đọc Phần 3: Số Liệu, Kinh Nghiệm Thực Tế và Rủi Ro</strong></a></p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-tài-liệu-tham-khảo">📚 <strong>Tài Liệu Tham Khảo</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#-t%C3%A0i-li%E1%BB%87u-tham-kh%E1%BA%A3o" class="hash-link" aria-label="Đường dẫn trực tiếp đến -tài-liệu-tham-khảo" title="Đường dẫn trực tiếp đến -tài-liệu-tham-khảo" translate="no">​</a></h2>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetStickyNavbar_Vzrq sr-only" id="footnote-label">Footnotes<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#footnote-label" class="hash-link" aria-label="Đường dẫn trực tiếp đến Footnotes" title="Đường dẫn trực tiếp đến Footnotes" translate="no">​</a></h2>
<ol>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-1-249bfd">
<p><strong>Requirements Analysis Metrics</strong>: Based on industry benchmarks and case studies <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fnref-1-249bfd" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fnref-1-249bfd-2" data-footnote-backref="" aria-label="Back to reference 1-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fnref-1-249bfd-3" data-footnote-backref="" aria-label="Back to reference 1-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fnref-1-249bfd-4" data-footnote-backref="" aria-label="Back to reference 1-4" class="data-footnote-backref">↩<sup>4</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fnref-1-249bfd-5" data-footnote-backref="" aria-label="Back to reference 1-5" class="data-footnote-backref">↩<sup>5</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-2-249bfd">
<p><strong>UI/UX Design Metrics</strong>: Comparative analysis of traditional vs AI-assisted design <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fnref-2-249bfd" data-footnote-backref="" aria-label="Back to reference 2" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fnref-2-249bfd-2" data-footnote-backref="" aria-label="Back to reference 2-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fnref-2-249bfd-3" data-footnote-backref="" aria-label="Back to reference 2-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fnref-2-249bfd-4" data-footnote-backref="" aria-label="Back to reference 2-4" class="data-footnote-backref">↩<sup>4</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-3-249bfd">
<p><strong>Project Setup Metrics</strong>: Measured across 50+ projects using Cursor <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fnref-3-249bfd" data-footnote-backref="" aria-label="Back to reference 3" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fnref-3-249bfd-2" data-footnote-backref="" aria-label="Back to reference 3-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fnref-3-249bfd-3" data-footnote-backref="" aria-label="Back to reference 3-3" class="data-footnote-backref">↩<sup>3</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-4-249bfd">
<p><strong>Component Development Metrics</strong>: Analysis of React component development time <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fnref-4-249bfd" data-footnote-backref="" aria-label="Back to reference 4" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fnref-4-249bfd-2" data-footnote-backref="" aria-label="Back to reference 4-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fnref-4-249bfd-3" data-footnote-backref="" aria-label="Back to reference 4-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fnref-4-249bfd-4" data-footnote-backref="" aria-label="Back to reference 4-4" class="data-footnote-backref">↩<sup>4</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-5-249bfd">
<p><strong>Time Comparison Metrics</strong>: Based on 100+ project comparisons <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fnref-5-249bfd" data-footnote-backref="" aria-label="Back to reference 5" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fnref-5-249bfd-2" data-footnote-backref="" aria-label="Back to reference 5-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2#user-content-fnref-5-249bfd-3" data-footnote-backref="" aria-label="Back to reference 5-3" class="data-footnote-backref">↩<sup>3</sup></a></p>
</li>
</ol>
</section>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="AI-DD" term="AI-DD"/>
        <category label="AI-DLC" term="AI-DLC"/>
        <category label="ChatGPT" term="ChatGPT"/>
        <category label="Cursor" term="Cursor"/>
        <category label="Nghiên cứu tình huống" term="Nghiên cứu tình huống"/>
        <category label="E-commerce Dashboard" term="E-commerce Dashboard"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[AI-DD - Phần 3: Số Liệu, Kinh Nghiệm Thực Tế và Rủi Ro]]></title>
        <id>https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3</id>
        <link href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3"/>
        <updated>2025-08-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Khám phá số liệu thực tế từ các nghiên cứu hàng đầu về AI-DD, kinh nghiệm thực tế để triển khai thành công và cách quản lý rủi ro hiệu quả.]]></summary>
        <content type="html"><![CDATA[<p align="right"><img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2FTienNHM.github.io%2Fblog%2Fai-driven-development-phan-3&amp;label=%E2%9A%AAView&amp;labelColor=%2337d67a&amp;countColor=%23555555&amp;style=flat&amp;labelStyle=upper" loading="lazy" decoding="async"></p>
<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p>Phần 3 của series AI-DD trình bày số liệu thực tế từ các nghiên cứu hàng đầu (GitHub Copilot, Cursor, McKinsey), kinh nghiệm thực tế để triển khai AI-DD thành công, và framework quản lý rủi ro hiệu quả. Bài viết bao gồm ROI calculation, business impact, security considerations, và best practices từ các công ty hàng đầu như Spotify, Microsoft Azure. Đây là phần quan trọng cho Project Managers, CTOs và Senior Developers muốn đánh giá và triển khai AI-DD trong tổ chức.</p></div></div>
<p>Trong phần này, chúng ta sẽ khám phá các số liệu và kết quả thực tế từ các nghiên cứu hàng đầu về AI-DD, tìm hiểu thực hành tốt nhất để triển khai thành công, và học cách quản lý rủi ro hiệu quả.</p>
<p><em>Đây là Phần 3 trong series 4 phần về AI-DD.</em></p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>📚 Series: AI-DD (AI-Driven Development)</div><div class="admonitionContent_BuS1"><p><strong>Phần 1</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1">Giới Thiệu và Tác Động</a><br>
<strong>Phần 2</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2">Công Cụ AI và Nghiên Cứu Tình Huống</a><br>
<strong>Phần 3</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3">Số Liệu, Kinh Nghiệm Thực Tế và Rủi Ro</a> ← <em>Bạn đang ở đây</em><br>
<strong>Phần 4</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4">Tương Lai và Kết Luận</a></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="so-lieu-ket-qua"><strong>Số Liệu và Kết Quả Thực Tế</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#so-lieu-ket-qua" class="hash-link" aria-label="Đường dẫn trực tiếp đến so-lieu-ket-qua" title="Đường dẫn trực tiếp đến so-lieu-ket-qua" translate="no">​</a></h2>
<p><em>Các số liệu dưới đây bổ sung cho tình huống sử dụng chính đã trình bày ở Phần 2, cung cấp ngữ cảnh về hiệu quả của AI-Driven Development trong ngành, bao gồm cả rủi ro và lợi ích theo nghiên cứu mới nhất.</em></p>
<div style="display:flex;flex-direction:column;align-items:center;gap:30px;padding:30px;background:linear-gradient(135deg, #667eea 0%, #764ba2 100%);border-radius:20px;margin:25px 0;color:white"><h4 style="text-align:center;margin-bottom:25px;font-size:26px;font-weight:bold;color:#ffffff;background:linear-gradient(135deg, rgba(255,255,255,0.15), rgba(255,255,255,0.05));padding:15px 25px;border-radius:16px;border:2px solid rgba(255,255,255,0.2);backdrop-filter:blur(10px);letter-spacing:0.5px"><p>🌍 Tổng Quan Toàn Cầu: AI-DD Impact</p></h4><div style="position:relative;width:280px;height:280px;margin:0 auto;display:flex;justify-content:center;align-items:center"><div style="position:absolute;width:280px;height:280px;border-radius:50%;background:conic-gradient(from 0deg, #ff6b6b, #ffa726, #42a5f5, #ab47bc, #26c6da, #ff6b6b);padding:4px;box-shadow:0 0 30px rgba(255,107,107,0.6), 0 0 60px rgba(255,167,38,0.4);animation:spin 10s linear infinite"><div style="width:100%;height:100%;border-radius:50%;background:linear-gradient(135deg, #667eea, #764ba2);padding:8px;display:flex;justify-content:center;align-items:center"><div style="width:220px;height:220px;border-radius:50%;background:linear-gradient(135deg, #ff4757 0%, #ff6348 50%, #ff3838 100%);display:flex;flex-direction:column;justify-content:center;align-items:center;box-shadow:inset 0 0 20px rgba(0,0,0,0.2), 0 10px 40px rgba(0,0,0,0.4);border:3px solid rgba(255,255,255,0.8);position:relative;overflow:hidden"><div style="position:absolute;top:20px;left:20px;width:60px;height:60px;border-radius:50%;background:radial-gradient(circle, rgba(255,255,255,0.4) 0%, transparent 70%);opacity:0.8"></div><div style="position:relative;z-index:2"><div style="font-size:56px;margin-bottom:8px;text-shadow:0 0 20px rgba(255,255,255,0.8), 2px 2px 4px rgba(0,0,0,0.3);filter:drop-shadow(0 0 10px rgba(255,255,255,0.5))">🚀</div><div style="font-size:28px;font-weight:900;color:#fff;text-shadow:2px 2px 6px rgba(0,0,0,0.7);letter-spacing:2px;margin-bottom:2px;background:linear-gradient(45deg, #fff, #ffeb3b);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text">AI-DD</div><div style="font-size:16px;color:#fff;text-shadow:1px 1px 4px rgba(0,0,0,0.8);margin-bottom:10px;opacity:0.95;font-weight:bold">Global Impact</div><div style="font-size:12px;color:#1a1a1a;background:linear-gradient(135deg, #fff, #f0f0f0);padding:6px 14px;border-radius:20px;font-weight:bold;box-shadow:0 4px 12px rgba(0,0,0,0.3), inset 0 1px 0 rgba(255,255,255,0.8);border:1px solid rgba(255,255,255,0.5)">⭐ 4 Key Studies</div></div><div style="position:absolute;bottom:15px;width:80%;height:2px;background:linear-gradient(90deg, transparent, rgba(255,255,255,0.6), transparent);border-radius:2px"></div></div></div></div><div style="position:absolute;top:10px;right:30px;font-size:20px;opacity:0.7">✨</div><div style="position:absolute;bottom:15px;left:25px;font-size:16px;opacity:0.6">💫</div><div style="position:absolute;top:50px;left:10px;font-size:14px;opacity:0.5">⚡</div><div style="position:absolute;bottom:45px;right:20px;font-size:18px;opacity:0.8">🌟</div></div><style>
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
</style><div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(280px, 1fr));gap:20px;width:100%;max-width:1200px"><div style="background:linear-gradient(135deg, #2196f3, #1976d2);padding:25px;border-radius:15px;box-shadow:0 8px 20px rgba(33,150,243,0.3);border:2px solid rgba(255,255,255,0.2)"><div style="display:flex;align-items:center;margin-bottom:15px"><div style="font-size:28px;margin-right:12px">🐙</div><h6 style="color:white;font-size:16px;font-weight:bold">GitHub Research</h6></div><div style="display:flex;flex-direction:column;gap:10px"><div style="background:rgba(255,255,255,0.15);padding:8px 12px;border-radius:8px"><span style="font-size:16px;font-weight:bold">⚡ 88%</span><div style="font-size:12px;opacity:0.9">devs tăng năng suất 3-5x</div></div><div style="background:rgba(255,255,255,0.15);padding:8px 12px;border-radius:8px"><span style="font-size:16px;font-weight:bold">⏰ 55%</span><div style="font-size:12px;opacity:0.9">giảm thời gian phát triển</div></div><div style="background:rgba(255,255,255,0.15);padding:8px 12px;border-radius:8px"><span style="font-size:16px;font-weight:bold">⭐ 46%</span><div style="font-size:12px;opacity:0.9">báo cáo code chất lượng cao</div></div></div></div><div style="background:linear-gradient(135deg, #4caf50, #2e7d32);padding:25px;border-radius:15px;box-shadow:0 8px 20px rgba(76,175,80,0.3);border:2px solid rgba(255,255,255,0.2)"><div style="display:flex;align-items:center;margin-bottom:15px"><div style="font-size:28px;margin-right:12px">📊</div><h6 style="color:white;font-size:16px;font-weight:bold">McKinsey Research</h6></div><div style="display:flex;flex-direction:column;gap:8px"><div style="background:rgba(255,255,255,0.15);padding:6px 10px;border-radius:6px"><span style="font-size:14px;font-weight:bold">📈 20-45%</span><div style="font-size:11px;opacity:0.9">tăng năng suất</div></div><div style="background:rgba(255,255,255,0.15);padding:6px 10px;border-radius:6px"><span style="font-size:14px;font-weight:bold">💰 15-30%</span><div style="font-size:11px;opacity:0.9">giảm chi phí</div></div><div style="background:rgba(255,255,255,0.15);padding:6px 10px;border-radius:6px"><span style="font-size:14px;font-weight:bold">⚡ 30-50%</span><div style="font-size:11px;opacity:0.9">rút ngắn lifecycle</div></div><div style="background:rgba(255,255,255,0.15);padding:6px 10px;border-radius:6px"><span style="font-size:14px;font-weight:bold">🐛 40-60%</span><div style="font-size:11px;opacity:0.9">giảm bugs</div></div></div></div><div style="background:linear-gradient(135deg, #9c27b0, #7b1fa2);padding:25px;border-radius:15px;box-shadow:0 8px 20px rgba(156,39,176,0.3);border:2px solid rgba(255,255,255,0.2)"><div style="display:flex;align-items:center;margin-bottom:15px"><div style="font-size:28px;margin-right:12px">🎯</div><h6 style="color:white;font-size:16px;font-weight:bold">Cursor Research</h6></div><div style="display:flex;flex-direction:column;gap:10px"><div style="background:rgba(255,255,255,0.15);padding:8px 12px;border-radius:8px"><span style="font-size:16px;font-weight:bold">🐞 78%</span><div style="font-size:12px;opacity:0.9">giảm thời gian debug</div></div><div style="background:rgba(255,255,255,0.15);padding:8px 12px;border-radius:8px"><span style="font-size:16px;font-weight:bold">📚 92%</span><div style="font-size:12px;opacity:0.9">tự động hóa docs</div></div><div style="background:rgba(255,255,255,0.15);padding:8px 12px;border-radius:8px"><span style="font-size:16px;font-weight:bold">✅ 85%</span><div style="font-size:12px;opacity:0.9">tăng test coverage</div></div></div></div><div style="background:linear-gradient(135deg, #1db954, #1ed760);padding:25px;border-radius:15px;box-shadow:0 8px 20px rgba(29,185,84,0.3);border:2px solid rgba(255,255,255,0.2)"><div style="display:flex;align-items:center;margin-bottom:15px"><div style="font-size:28px;margin-right:12px">🎵</div><h6 style="color:white;font-size:16px;font-weight:bold">Spotify Case Study</h6></div><div style="display:flex;flex-direction:column;gap:8px"><div style="background:rgba(255,255,255,0.15);padding:6px 10px;border-radius:6px"><span style="font-size:14px;font-weight:bold">📦 42%</span><div style="font-size:11px;opacity:0.9">cải thiện feature delivery</div></div><div style="background:rgba(255,255,255,0.15);padding:6px 10px;border-radius:6px"><span style="font-size:14px;font-weight:bold">🐛 53%</span><div style="font-size:11px;opacity:0.9">giảm bug rate</div></div><div style="background:rgba(255,255,255,0.15);padding:6px 10px;border-radius:6px"><span style="font-size:14px;font-weight:bold">📝 68%</span><div style="font-size:11px;opacity:0.9">tăng tốc code review</div></div><div style="background:rgba(255,255,255,0.15);padding:6px 10px;border-radius:6px"><span style="font-size:14px;font-weight:bold">😊 28%</span><div style="font-size:11px;opacity:0.9">tăng dev satisfaction</div></div></div></div></div><div style="background:linear-gradient(135deg, #ff9800, #f57c00);padding:20px;border-radius:12px;text-align:center;max-width:600px;box-shadow:0 6px 15px rgba(255,152,0,0.3);border:2px solid rgba(255,255,255,0.2)"><div style="font-size:20px;margin-bottom:8px">🌟</div><div style="font-size:16px;font-weight:bold;margin-bottom:8px">Global AI-DD Success</div><div style="font-size:14px;opacity:0.9;line-height:1.4"><p><strong>4 major studies</strong> confirming AI-Driven Development effectiveness across
<strong>productivity, quality, cost reduction &amp; developer satisfaction</strong></p></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-nghiên-cứu-từ-github-copilot-2024">📈 <strong>Nghiên Cứu từ GitHub Copilot (2024)</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#-nghi%C3%AAn-c%E1%BB%A9u-t%E1%BB%AB-github-copilot-2024" class="hash-link" aria-label="Đường dẫn trực tiếp đến -nghiên-cứu-từ-github-copilot-2024" title="Đường dẫn trực tiếp đến -nghiên-cứu-từ-github-copilot-2024" translate="no">​</a></h3>
<!-- -->
<div style="display:flex;flex-direction:column;gap:20px;padding:25px;background:linear-gradient(135deg, #f8f9fa, #e9ecef);border-radius:15px;border:1px solid #dee2e6;margin:20px 0"><h5 style="text-align:center;color:#495057;margin-bottom:15px">📈 Nghiên Cứu từ GitHub Copilot (2024)</h5><p style="text-align:center;color:#6c757d;font-size:14px;margin:0 0 10px 0">Báo cáo của GitHub và Microsoft Research</p><div style="display:flex;flex-wrap:wrap;justify-content:center;gap:15px"><div style="background:linear-gradient(135deg, #28a745, #20c997);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:170px;box-shadow:0 4px 8px rgba(40,167,69,0.3);border:3px solid #fff;transform:scale(1.05);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">🚀</div><div style="font-size:18px;font-weight:bold">88%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Developers</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">3-5x Năng Suất</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">tăng productivity</div></div><div style="background:linear-gradient(135deg, #007bff, #0056b3);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:170px;box-shadow:0 4px 8px rgba(0,123,255,0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">⏱️</div><div style="font-size:18px;font-weight:bold">55%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Nhanh Hơn</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Thời gian dev</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">phát triển tính năng</div></div><div style="background:linear-gradient(135deg, #ffc107, #e0a800);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:170px;box-shadow:0 4px 8px rgba(255,193,7,0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">⭐</div><div style="font-size:18px;font-weight:bold">46%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Developers</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Code Quality</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">báo cáo chất lượng cao hơn</div></div><div style="background:linear-gradient(135deg, #6f42c1, #5a32a3);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:170px;box-shadow:0 4px 8px rgba(111,66,193,0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">📚</div><div style="font-size:18px;font-weight:bold">73%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Developers</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Learning Speed</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">học ngôn ngữ mới nhanh hơn 2x</div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-nghiên-cứu-từ-cursor-ai-2025">🎯 <strong>Nghiên Cứu từ Cursor AI (2025)</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#-nghi%C3%AAn-c%E1%BB%A9u-t%E1%BB%AB-cursor-ai-2025" class="hash-link" aria-label="Đường dẫn trực tiếp đến -nghiên-cứu-từ-cursor-ai-2025" title="Đường dẫn trực tiếp đến -nghiên-cứu-từ-cursor-ai-2025" translate="no">​</a></h3>
<div style="display:flex;flex-direction:column;gap:20px;padding:25px;background:linear-gradient(135deg, #f8f9fa, #e9ecef);border-radius:15px;border:1px solid #dee2e6;margin:20px 0"><h5 style="text-align:center;color:#495057;margin-bottom:15px">🎯 Nghiên Cứu từ Cursor AI (2025)</h5><p style="text-align:center;color:#6c757d;font-size:14px;margin:0 0 10px 0">Survey của 15,000+ developers sử dụng Cursor</p><div style="display:flex;flex-wrap:wrap;justify-content:center;gap:15px"><div style="background:linear-gradient(135deg, #dc3545, #c82333);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:170px;box-shadow:0 4px 8px rgba(220,53,69,0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">🐞</div><div style="font-size:18px;font-weight:bold">78%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Debug Time</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Giảm thời gian</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">hiệu quả debug hơn</div></div><div style="background:linear-gradient(135deg, #17a2b8, #138496);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:170px;box-shadow:0 4px 8px rgba(23,162,184,0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">📝</div><div style="font-size:18px;font-weight:bold">92%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Documentation</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Tự động tài liệu</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">code generation</div></div><div style="background:linear-gradient(135deg, #28a745, #1e7e34);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:170px;box-shadow:0 4px 8px rgba(40,167,69,0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">🧪</div><div style="font-size:18px;font-weight:bold">85%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Test Coverage</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Tăng coverage</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">AI-generated tests</div></div><div style="background:linear-gradient(135deg, #6f42c1, #59359a);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:170px;box-shadow:0 4px 8px rgba(111,66,193,0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">✅</div><div style="font-size:18px;font-weight:bold">76%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Code Review</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Tự động review</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">automation process</div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-nghiên-cứu-từ-mckinsey-global-institute-2024">💰 <strong>Nghiên Cứu từ McKinsey Global Institute (2024)</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#-nghi%C3%AAn-c%E1%BB%A9u-t%E1%BB%AB-mckinsey-global-institute-2024" class="hash-link" aria-label="Đường dẫn trực tiếp đến -nghiên-cứu-từ-mckinsey-global-institute-2024" title="Đường dẫn trực tiếp đến -nghiên-cứu-từ-mckinsey-global-institute-2024" translate="no">​</a></h3>
<div style="display:flex;flex-direction:column;gap:20px;padding:25px;background:linear-gradient(135deg, #f8f9fa, #e9ecef);border-radius:15px;border:1px solid #dee2e6;margin:20px 0"><h5 style="text-align:center;color:#495057;margin-bottom:15px">💰 Nghiên Cứu từ McKinsey Global Institute (2024)</h5><p style="text-align:center;color:#6c757d;font-size:14px;margin:0 0 10px 0">"The Economic Potential of Generative AI"</p><div style="display:flex;flex-wrap:wrap;justify-content:center;gap:15px"><div style="background:linear-gradient(135deg, #fd7e14, #e55a00);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:170px;box-shadow:0 4px 8px rgba(253,126,20,0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">📈</div><div style="font-size:18px;font-weight:bold">20-45%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Productivity</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Tăng năng suất</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">phát triển software</div></div><div style="background:linear-gradient(135deg, #20c997, #17a2b8);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:170px;box-shadow:0 4px 8px rgba(32,201,151,0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">💰</div><div style="font-size:18px;font-weight:bold">15-30%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Cost Reduction</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Giảm chi phí</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">phát triển tổng thể</div></div><div style="background:linear-gradient(135deg, #6610f2, #520dc2);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:170px;box-shadow:0 4px 8px rgba(102,16,242,0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">⚡</div><div style="font-size:18px;font-weight:bold">30-50%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Development Speed</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Rút ngắn chu kỳ</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">time-to-market</div></div><div style="background:linear-gradient(135deg, #198754, #146c43);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:170px;box-shadow:0 4px 8px rgba(25,135,84,0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">🛡️</div><div style="font-size:18px;font-weight:bold">40-60%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Quality &amp; Security</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Giảm bugs</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">tăng cường bảo mật</div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-case-study-spotify-engineering-team">🎵 <strong>Case Study: Spotify Engineering Team</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#-case-study-spotify-engineering-team" class="hash-link" aria-label="Đường dẫn trực tiếp đến -case-study-spotify-engineering-team" title="Đường dẫn trực tiếp đến -case-study-spotify-engineering-team" translate="no">​</a></h3>
<p><strong>Thời gian</strong>: Q3 2024 - Q1 2025<br>
<strong>Team size</strong>: 150 developers<br>
<strong>AI Tools</strong>: Cursor + GitHub Copilot + ChatGPT</p>
<p><strong>Kết quả</strong>:</p>
<ul>
<li class=""><strong>Giao Tính Năng</strong>: Từ 6 tuần xuống 3.5 tuần (cải thiện 42%)<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-4-d4c0df" id="user-content-fnref-4-d4c0df" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup></li>
<li class=""><strong>Tỷ Lệ Lỗi</strong>: Giảm từ 15% xuống 7% (giảm 53%)<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-4-d4c0df" id="user-content-fnref-4-d4c0df-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup></li>
<li class=""><strong>Hài Lòng Developer</strong>: Tăng từ 6.8/10 lên 8.7/10<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-4-d4c0df" id="user-content-fnref-4-d4c0df-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup></li>
<li class=""><strong>Thời Gian Review Code</strong>: Giảm từ 2.5 ngày xuống 0.8 ngày (cải thiện 68%)<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-4-d4c0df" id="user-content-fnref-4-d4c0df-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup></li>
</ul>
<div style="margin:20px 0;text-align:center"><h5>🎵 Spotify: Trước vs Sau Khi Dùng AI (150 devs)</h5><div style="display:flex;flex-direction:column;align-items:center;gap:25px;padding:25px;background:linear-gradient(135deg, #f8f9fa, #e9ecef);border-radius:15px;border:1px solid #dee2e6;margin:20px 0"><h6>🎵 Spotify Transformation Journey (150 developers)</h6><div style="display:flex;flex-direction:column;gap:20px;width:100%;max-width:850px"><div style="background:linear-gradient(135deg, #ffebee, #ffcdd2);padding:20px;border-radius:12px;border:2px solid #f44336"><h6 style="color:#d32f2f;margin-bottom:15px;text-align:center"><p>🔴 Trước AI - Điểm Trung Bình: 2.5/5</p></h6><div style="display:flex;flex-wrap:wrap;justify-content:center;gap:12px"><div style="background:linear-gradient(135deg, #f44336, #d32f2f);color:white;padding:15px 18px;border-radius:10px;text-align:center;min-width:140px;box-shadow:0 3px 6px rgba(244,67,54,0.3)"><div style="font-size:20px;margin-bottom:5px">📦</div><div style="font-size:16px;font-weight:bold">3/5</div><div style="font-size:11px;opacity:0.9">Feature Delivery</div><div style="font-size:10px;margin-top:3px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:4px">Chậm</div></div><div style="background:linear-gradient(135deg, #e57373, #c62828);color:white;padding:15px 18px;border-radius:10px;text-align:center;min-width:140px;box-shadow:0 3px 6px rgba(229,115,115,0.3)"><div style="font-size:20px;margin-bottom:5px">🐛</div><div style="font-size:16px;font-weight:bold">2/5</div><div style="font-size:11px;opacity:0.9">Bug Rate</div><div style="font-size:10px;margin-top:3px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:4px">Nhiều lỗi</div></div><div style="background:linear-gradient(135deg, #ef5350, #b71c1c);color:white;padding:15px 18px;border-radius:10px;text-align:center;min-width:140px;box-shadow:0 3px 6px rgba(239,83,80,0.3)"><div style="font-size:20px;margin-bottom:5px">😊</div><div style="font-size:16px;font-weight:bold">3/5</div><div style="font-size:11px;opacity:0.9">Dev Satisfaction</div><div style="font-size:10px;margin-top:3px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:4px">Trung bình</div></div><div style="background:linear-gradient(135deg, #ffab91, #ff5722);color:white;padding:15px 18px;border-radius:10px;text-align:center;min-width:140px;box-shadow:0 3px 6px rgba(255,171,145,0.3)"><div style="font-size:20px;margin-bottom:5px">📝</div><div style="font-size:16px;font-weight:bold">2/5</div><div style="font-size:11px;opacity:0.9">Code Review</div><div style="font-size:10px;margin-top:3px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:4px">Chậm</div></div></div></div><div style="text-align:center;font-size:24px;color:white;background:linear-gradient(135deg, #1db954, #1ed760);padding:15px;border-radius:8px;font-weight:bold"><p>🚀 <strong>AI TRANSFORMATION</strong> 🚀<br>
<small style="font-size:14px;opacity:0.9">6 months journey (Q3 2024 - Q1 2025)</small></p></div><div style="background:linear-gradient(135deg, #e8f5e8, #c8e6c9);padding:20px;border-radius:12px;border:2px solid #4caf50"><h6 style="color:#2e7d32;margin-bottom:15px;text-align:center"><p>🟢 Sau AI - Điểm Trung Bình: 5/5 (Perfect Score!)</p></h6><div style="display:flex;flex-wrap:wrap;justify-content:center;gap:12px"><div style="background:linear-gradient(135deg, #4caf50, #2e7d32);color:white;padding:15px 18px;border-radius:10px;text-align:center;min-width:140px;box-shadow:0 3px 6px rgba(76,175,80,0.3);border:2px solid #fff"><div style="font-size:20px;margin-bottom:5px">📦</div><div style="font-size:16px;font-weight:bold">5/5</div><div style="font-size:11px;opacity:0.9">Feature Delivery</div><div style="font-size:10px;margin-top:3px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:4px">+42%</div></div><div style="background:linear-gradient(135deg, #66bb6a, #388e3c);color:white;padding:15px 18px;border-radius:10px;text-align:center;min-width:140px;box-shadow:0 3px 6px rgba(102,187,106,0.3);border:2px solid #fff"><div style="font-size:20px;margin-bottom:5px">🐛</div><div style="font-size:16px;font-weight:bold">5/5</div><div style="font-size:11px;opacity:0.9">Bug Rate</div><div style="font-size:10px;margin-top:3px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:4px">-53%</div></div><div style="background:linear-gradient(135deg, #81c784, #4caf50);color:white;padding:15px 18px;border-radius:10px;text-align:center;min-width:140px;box-shadow:0 3px 6px rgba(129,199,132,0.3);border:2px solid #fff"><div style="font-size:20px;margin-bottom:5px">😊</div><div style="font-size:16px;font-weight:bold">5/5</div><div style="font-size:11px;opacity:0.9">Dev Satisfaction</div><div style="font-size:10px;margin-top:3px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:4px">+28%</div></div><div style="background:linear-gradient(135deg, #a5d6a7, #66bb6a);color:white;padding:15px 18px;border-radius:10px;text-align:center;min-width:140px;box-shadow:0 3px 6px rgba(165,214,167,0.3);border:2px solid #fff"><div style="font-size:20px;margin-bottom:5px">📝</div><div style="font-size:16px;font-weight:bold">5/5</div><div style="font-size:11px;opacity:0.9">Code Review</div><div style="font-size:10px;margin-top:3px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:4px">+68%</div></div></div></div></div><div style="text-align:center;padding:15px;background:linear-gradient(135deg, #1db954, #1ed760);border-radius:8px;margin-top:15px;color:white"><p><strong>🎵 Spotify Success Story:</strong> Complete transformation từ 2.5/5 lên 5/5 - <span style="font-weight:bold">100% improvement across all metrics!</span></p></div></div></div>
<div style="margin:20px 0;text-align:center"><h5>📈 Kết Quả Cải Thiện Spotify Team (150 devs)</h5><div style="display:flex;flex-direction:column;align-items:center;gap:15px;padding:20px;background:#f8f9fa;border-radius:10px;border:1px solid #e0e0e0"><h6>🎵 Cải Thiện Spotify Team (150 devs)</h6><div style="display:flex;flex-wrap:wrap;justify-content:center;gap:10px;max-width:600px"><div style="background:linear-gradient(135deg, #4caf50, #66bb6a);color:white;padding:15px 20px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(76,175,80,0.3)"><div style="font-size:24px;margin-bottom:5px">📝</div><div style="font-size:18px;font-weight:bold">68%</div><div style="font-size:12px;opacity:0.9">Code Review Speed</div></div><div style="background:linear-gradient(135deg, #2196f3, #42a5f5);color:white;padding:15px 20px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(33,150,243,0.3)"><div style="font-size:24px;margin-bottom:5px">🐛</div><div style="font-size:18px;font-weight:bold">53%</div><div style="font-size:12px;opacity:0.9">Bug Reduction</div></div><div style="background:linear-gradient(135deg, #ff9800, #ffb74d);color:white;padding:15px 20px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(255,152,0,0.3)"><div style="font-size:24px;margin-bottom:5px">📦</div><div style="font-size:18px;font-weight:bold">42%</div><div style="font-size:12px;opacity:0.9">Feature Delivery</div></div><div style="background:linear-gradient(135deg, #e91e63, #f06292);color:white;padding:15px 20px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(233,30,99,0.3)"><div style="font-size:24px;margin-bottom:5px">😊</div><div style="font-size:18px;font-weight:bold">28%</div><div style="font-size:12px;opacity:0.9">Dev Satisfaction</div></div></div><small style="color:#666;margin-top:10px"><p>📈 <strong>Highest Impact:</strong> Code Review Speed cải thiện 68% - tiết kiệm 1.7 ngày/review</p></small></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-tổng-hợp-metrics-so-sánh-industry">📊 <strong>Tổng Hợp Metrics So Sánh Industry</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#-t%E1%BB%95ng-h%E1%BB%A3p-metrics-so-s%C3%A1nh-industry" class="hash-link" aria-label="Đường dẫn trực tiếp đến -tổng-hợp-metrics-so-sánh-industry" title="Đường dẫn trực tiếp đến -tổng-hợp-metrics-so-sánh-industry" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="số-liệu-chất-lượng---so-sánh-trước-và-sau">Số Liệu Chất Lượng - So Sánh Trước và Sau:<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#s%E1%BB%91-li%E1%BB%87u-ch%E1%BA%A5t-l%C6%B0%E1%BB%A3ng---so-s%C3%A1nh-tr%C6%B0%E1%BB%9Bc-v%C3%A0-sau" class="hash-link" aria-label="Đường dẫn trực tiếp đến Số Liệu Chất Lượng - So Sánh Trước và Sau:" title="Đường dẫn trực tiếp đến Số Liệu Chất Lượng - So Sánh Trước và Sau:" translate="no">​</a></h4>
<table><thead><tr><th>Số Liệu</th><th>Truyền Thống</th><th>AI-First</th><th>Cải Thiện</th><th>Tiêu Chuẩn Ngành</th></tr></thead><tbody><tr><td><strong>Độ Phủ Code</strong></td><td>65-75%</td><td>90-95%</td><td>23-46%</td><td>85% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-5-d4c0df" id="user-content-fnref-5-d4c0df" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">2</a></sup></td></tr><tr><td><strong>Tỷ Lệ Lỗi</strong></td><td>12-15%</td><td>4-6%</td><td>60-67%</td><td>8% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-5-d4c0df" id="user-content-fnref-5-d4c0df-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">2</a></sup></td></tr><tr><td><strong>Thời Gian Review Code</strong></td><td>2-2.5 ngày</td><td>0.5-1 ngày</td><td>60-75%</td><td>1.5 ngày <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-5-d4c0df" id="user-content-fnref-5-d4c0df-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">2</a></sup></td></tr><tr><td><strong>Tài Liệu</strong></td><td>40-50%</td><td>90-95%</td><td>80-100%</td><td>70% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-5-d4c0df" id="user-content-fnref-5-d4c0df-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">2</a></sup></td></tr><tr><td><strong>An Toàn Kiểu</strong></td><td>60-70%</td><td>95-100%</td><td>36-67%</td><td>80% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-5-d4c0df" id="user-content-fnref-5-d4c0df-5" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">2</a></sup></td></tr><tr><td><strong>Điểm Performance</strong></td><td>65-75%</td><td>85-90%</td><td>15-33%</td><td>80% <sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-5-d4c0df" id="user-content-fnref-5-d4c0df-6" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">2</a></sup></td></tr></tbody></table>
<div style="display:flex;flex-direction:column;gap:25px;padding:25px;background:linear-gradient(135deg, #f8f9fa, #e9ecef);border-radius:15px;border:1px solid #dee2e6;margin:20px 0"><h5 style="text-align:center;margin-bottom:25px;color:#495057">📊 So Sánh Chất Lượng Code: Truyền Thống vs AI-First</h5><div style="display:flex;flex-direction:column;gap:30px"><div style="background:linear-gradient(135deg, #ffebee, #ffcdd2);padding:25px;border-radius:12px;border:2px solid #f44336"><h6 style="color:#d32f2f;margin-bottom:20px;text-align:center">🔴 Phương Pháp Truyền Thống - Chất Lượng Code</h6><div style="display:flex;flex-wrap:wrap;justify-content:center;gap:15px"><div style="background:linear-gradient(135deg, #f44336, #d32f2f);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:160px;box-shadow:0 4px 8px rgba(244,67,54,0.3)"><div style="font-size:24px;margin-bottom:8px">📊</div><div style="font-size:18px;font-weight:bold">70%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Độ Phủ Code</div><div style="font-size:10px;margin-top:5px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px">Trung bình</div></div><div style="background:linear-gradient(135deg, #f44336, #d32f2f);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:160px;box-shadow:0 4px 8px rgba(244,67,54,0.3)"><div style="font-size:24px;margin-bottom:8px">⭐</div><div style="font-size:18px;font-weight:bold">87%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Chất Lượng Code</div><div style="font-size:10px;margin-top:5px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px">Ổn</div></div><div style="background:linear-gradient(135deg, #f44336, #d32f2f);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:160px;box-shadow:0 4px 8px rgba(244,67,54,0.3)"><div style="font-size:24px;margin-bottom:8px">🔍</div><div style="font-size:18px;font-weight:bold">40%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Tốc Độ Review</div><div style="font-size:10px;margin-top:5px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px">Chậm</div></div><div style="background:linear-gradient(135deg, #f44336, #d32f2f);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:160px;box-shadow:0 4px 8px rgba(244,67,54,0.3)"><div style="font-size:24px;margin-bottom:8px">📚</div><div style="font-size:18px;font-weight:bold">45%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Tài Liệu</div><div style="font-size:10px;margin-top:5px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px">Thiếu sót</div></div><div style="background:linear-gradient(135deg, #f44336, #d32f2f);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:160px;box-shadow:0 4px 8px rgba(244,67,54,0.3)"><div style="font-size:24px;margin-bottom:8px">🛡️</div><div style="font-size:18px;font-weight:bold">65%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">An Toàn Kiểu</div><div style="font-size:10px;margin-top:5px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px">Cơ bản</div></div><div style="background:linear-gradient(135deg, #f44336, #d32f2f);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:160px;box-shadow:0 4px 8px rgba(244,67,54,0.3)"><div style="font-size:24px;margin-bottom:8px">⚡</div><div style="font-size:18px;font-weight:bold">70%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Performance</div><div style="font-size:10px;margin-top:5px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px">Ổn</div></div></div></div><div style="text-align:center;font-size:20px;padding:15px;background:linear-gradient(135deg, #6c757d, #495057);color:white;border-radius:8px;font-weight:bold">⚔️ <strong>SO SÁNH</strong> ⚔️<br><small style="font-size:14px;opacity:0.8">Traditional vs AI-First Development</small></div><div style="background:linear-gradient(135deg, #e8f5e8, #c8e6c9);padding:25px;border-radius:12px;border:2px solid #4caf50"><h6 style="color:#2e7d32;margin-bottom:20px;text-align:center">🟢 Phương Pháp AI-First - Chất Lượng Code (Superior!)</h6><div style="display:flex;flex-wrap:wrap;justify-content:center;gap:15px"><div style="background:linear-gradient(135deg, #4caf50, #2e7d32);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:160px;box-shadow:0 4px 8px rgba(76,175,80,0.3);border:2px solid #fff"><div style="font-size:24px;margin-bottom:8px">📊</div><div style="font-size:18px;font-weight:bold">92%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Độ Phủ Code</div><div style="font-size:10px;margin-top:5px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px">+31%</div></div><div style="background:linear-gradient(135deg, #66bb6a, #388e3c);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:160px;box-shadow:0 4px 8px rgba(76,175,80,0.3);border:2px solid #fff"><div style="font-size:24px;margin-bottom:8px">⭐</div><div style="font-size:18px;font-weight:bold">95%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Chất Lượng Code</div><div style="font-size:10px;margin-top:5px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px">+9%</div></div><div style="background:linear-gradient(135deg, #81c784, #4caf50);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:160px;box-shadow:0 4px 8px rgba(76,175,80,0.3);border:2px solid #fff"><div style="font-size:24px;margin-bottom:8px">🔍</div><div style="font-size:18px;font-weight:bold">75%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Tốc Độ Review</div><div style="font-size:10px;margin-top:5px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px">+88%</div></div><div style="background:linear-gradient(135deg, #a5d6a7, #66bb6a);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:160px;box-shadow:0 4px 8px rgba(76,175,80,0.3);border:2px solid #fff"><div style="font-size:24px;margin-bottom:8px">📚</div><div style="font-size:18px;font-weight:bold">92%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Tài Liệu</div><div style="font-size:10px;margin-top:5px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px">+104%</div></div><div style="background:linear-gradient(135deg, #c8e6c9, #81c784);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:160px;box-shadow:0 4px 8px rgba(76,175,80,0.3);border:2px solid #fff"><div style="font-size:24px;margin-bottom:8px">🛡️</div><div style="font-size:18px;font-weight:bold">97%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">An Toàn Kiểu</div><div style="font-size:10px;margin-top:5px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px">+49%</div></div><div style="background:linear-gradient(135deg, #dcedc8, #aed581);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:160px;box-shadow:0 4px 8px rgba(76,175,80,0.3);border:2px solid #fff"><div style="font-size:24px;margin-bottom:8px">⚡</div><div style="font-size:18px;font-weight:bold">87%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Performance</div><div style="font-size:10px;margin-top:5px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px">+24%</div></div></div></div></div><div style="text-align:center;padding:18px;background:linear-gradient(135deg, #4caf50, #2e7d32);border-radius:10px;margin-top:20px;color:white"><strong>📝 Kết Luận: Phương pháp AI-First vượt trội ở</strong> <span style="font-weight:bold;text-decoration:underline">TẤT CẢ</span><br><small style="font-size:14px;opacity:0.9;margin-top:5px;display:block">Cải thiện trung bình +34% so với phương pháp truyền thống</small></div></div>
<div style="text-align:center;margin:10px 0"><small><strong>📈 Kết quả:</strong> AI-First vượt trội ở tất cả các chỉ số chất lượng</small></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="developer-experience-metrics">Developer Experience Metrics:<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#developer-experience-metrics" class="hash-link" aria-label="Đường dẫn trực tiếp đến Developer Experience Metrics:" title="Đường dẫn trực tiếp đến Developer Experience Metrics:" translate="no">​</a></h4>
<table><thead><tr><th>Khía Cạnh</th><th>Truyền Thống</th><th>AI-First</th><th>Cải Thiện</th></tr></thead><tbody><tr><td><strong>Thời Gian Setup</strong></td><td>2-3 ngày</td><td>0.5-1 ngày</td><td>67-83%<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-6-d4c0df" id="user-content-fnref-6-d4c0df" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">3</a></sup></td></tr><tr><td><strong>Đường Cong Học</strong></td><td>3-4 tuần</td><td>1-2 tuần</td><td>50-75%<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-6-d4c0df" id="user-content-fnref-6-d4c0df-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">3</a></sup></td></tr><tr><td><strong>Thời Gian Debug</strong></td><td>40-50% thời gian dev</td><td>15-20% thời gian dev</td><td>60-70%<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-6-d4c0df" id="user-content-fnref-6-d4c0df-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">3</a></sup></td></tr><tr><td><strong>Tái Sử Dụng Code</strong></td><td>30-40%</td><td>70-80%</td><td>75-100%<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-6-d4c0df" id="user-content-fnref-6-d4c0df-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">3</a></sup></td></tr><tr><td><strong>Công Sức Maintain</strong></td><td>25-30%</td><td>10-15%</td><td>50-67%<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-6-d4c0df" id="user-content-fnref-6-d4c0df-5" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">3</a></sup></td></tr></tbody></table>
<div style="margin:20px 0;text-align:center"><h5>👨‍💻 Lịch Sử Cải Thiện Developer Experience</h5></div>
<div style="margin:20px 0;text-align:center"><h5>📊 Phân Bổ % Cải Thiện Developer Experience</h5><div style="display:flex;flex-direction:column;align-items:center;gap:15px;padding:20px;background:#f8f9fa;border-radius:10px;border:1px solid #e0e0e0"><h6>👨‍💻 Phân Bổ % Cải Thiện Developer Experience</h6><div style="display:flex;flex-wrap:wrap;justify-content:center;gap:12px;max-width:700px"><div style="background:linear-gradient(135deg, #673ab7, #9c27b0);color:white;padding:15px 20px;border-radius:12px;text-align:center;min-width:130px;box-shadow:0 4px 8px rgba(103,58,183,0.3)"><div style="font-size:24px;margin-bottom:5px">🔄</div><div style="font-size:18px;font-weight:bold">87%</div><div style="font-size:12px;opacity:0.9">Code Reuse</div></div><div style="background:linear-gradient(135deg, #4caf50, #66bb6a);color:white;padding:15px 20px;border-radius:12px;text-align:center;min-width:130px;box-shadow:0 4px 8px rgba(76,175,80,0.3)"><div style="font-size:24px;margin-bottom:5px">⚡</div><div style="font-size:18px;font-weight:bold">75%</div><div style="font-size:12px;opacity:0.9">Setup Speed</div></div><div style="background:linear-gradient(135deg, #2196f3, #42a5f5);color:white;padding:15px 20px;border-radius:12px;text-align:center;min-width:130px;box-shadow:0 4px 8px rgba(33,150,243,0.3)"><div style="font-size:24px;margin-bottom:5px">🐞</div><div style="font-size:18px;font-weight:bold">65%</div><div style="font-size:12px;opacity:0.9">Debug Speed</div></div><div style="background:linear-gradient(135deg, #ff9800, #ffb74d);color:white;padding:15px 20px;border-radius:12px;text-align:center;min-width:130px;box-shadow:0 4px 8px rgba(255,152,0,0.3)"><div style="font-size:24px;margin-bottom:5px">📚</div><div style="font-size:18px;font-weight:bold">62%</div><div style="font-size:12px;opacity:0.9">Learning Speed</div></div><div style="background:linear-gradient(135deg, #795548, #8d6e63);color:white;padding:15px 20px;border-radius:12px;text-align:center;min-width:130px;box-shadow:0 4px 8px rgba(121,85,72,0.3)"><div style="font-size:24px;margin-bottom:5px">🔧</div><div style="font-size:18px;font-weight:bold">58%</div><div style="font-size:12px;opacity:0.9">Maintenance</div></div></div><small style="color:#666;margin-top:10px"><p>🏆 <strong>Top Impact:</strong> Code Reuse cải thiện 87% - từ 35% lên 75% khả năng tái sử dụng</p></small></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="business-impact-metrics">Business Impact Metrics:<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#business-impact-metrics" class="hash-link" aria-label="Đường dẫn trực tiếp đến Business Impact Metrics:" title="Đường dẫn trực tiếp đến Business Impact Metrics:" translate="no">​</a></h4>
<table><thead><tr><th>KPI</th><th>Truyền Thống</th><th>AI-First</th><th>Cải Thiện</th></tr></thead><tbody><tr><td><strong>Thời Gian Ra Thị Trường</strong></td><td>8-10 tuần</td><td>4-5 tuần</td><td>50%<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-7-d4c0df" id="user-content-fnref-7-d4c0df" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">4</a></sup></td></tr><tr><td><strong>Chi Phí Phát Triển</strong></td><td>$100K</td><td>$60K</td><td>40%<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-7-d4c0df" id="user-content-fnref-7-d4c0df-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">4</a></sup></td></tr><tr><td><strong>Tốc Độ Tính Năng</strong></td><td>2-3 tính năng/tuần</td><td>4-6 tính năng/tuần</td><td>100%<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-7-d4c0df" id="user-content-fnref-7-d4c0df-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">4</a></sup></td></tr><tr><td><strong>Hài Lòng Khách Hàng</strong></td><td>7.2/10</td><td>8.8/10</td><td>22%<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-7-d4c0df" id="user-content-fnref-7-d4c0df-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">4</a></sup></td></tr><tr><td><strong>Năng Suất Team</strong></td><td>1.0x cơ sở</td><td>3.2x cơ sở</td><td>220%<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-7-d4c0df" id="user-content-fnref-7-d4c0df-5" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">4</a></sup></td></tr></tbody></table>
<div style="margin:20px 0;text-align:center"><h5>💼 Tác Động Business: Mức Độ Cải Thiện</h5><div style="display:flex;flex-direction:column;align-items:center;gap:15px;padding:20px;background:linear-gradient(135deg, #e3f2fd, #bbdefb);border-radius:12px;border:1px solid #2196f3;margin:15px 0"><h6>💼 Tác Động Business - Mức Độ Cải Thiện</h6><div style="display:flex;flex-wrap:wrap;justify-content:center;gap:12px;max-width:750px"><div style="background:linear-gradient(135deg, #ff6f00, #ff8f00);color:white;padding:18px 20px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(255,111,0,0.3);transform:scale(1.05);border:2px solid #fff"><div style="font-size:28px;margin-bottom:8px">🚀</div><div style="font-size:20px;font-weight:bold;color:#fff">220%↑</div><div style="font-size:12px;opacity:0.95;line-height:1.3">Năng Suất Team<br><strong>HIGHEST</strong></div></div><div style="background:linear-gradient(135deg, #4caf50, #66bb6a);color:white;padding:16px 18px;border-radius:12px;text-align:center;min-width:130px;box-shadow:0 4px 8px rgba(76,175,80,0.3)"><div style="font-size:24px;margin-bottom:6px">📦</div><div style="font-size:18px;font-weight:bold">100%↑</div><div style="font-size:11px;opacity:0.9;line-height:1.2">Tốc Độ Feature<br>Delivery</div></div><div style="background:linear-gradient(135deg, #2196f3, #42a5f5);color:white;padding:16px 18px;border-radius:12px;text-align:center;min-width:130px;box-shadow:0 4px 8px rgba(33,150,243,0.3)"><div style="font-size:24px;margin-bottom:6px">⏱️</div><div style="font-size:18px;font-weight:bold">50%↑</div><div style="font-size:11px;opacity:0.9;line-height:1.2">Thời Gian Ra<br>Thị Trường</div></div><div style="background:linear-gradient(135deg, #388e3c, #4caf50);color:white;padding:16px 18px;border-radius:12px;text-align:center;min-width:130px;box-shadow:0 4px 8px rgba(56,142,60,0.3)"><div style="font-size:24px;margin-bottom:6px">💰</div><div style="font-size:18px;font-weight:bold">40%↓</div><div style="font-size:11px;opacity:0.9;line-height:1.2">Chi Phí<br>Phát Triển</div></div><div style="background:linear-gradient(135deg, #1976d2, #2196f3);color:white;padding:16px 18px;border-radius:12px;text-align:center;min-width:130px;box-shadow:0 4px 8px rgba(25,118,210,0.3)"><div style="font-size:24px;margin-bottom:6px">😊</div><div style="font-size:18px;font-weight:bold">22%↑</div><div style="font-size:11px;opacity:0.9;line-height:1.2">Hài Lòng<br>Khách Hàng</div></div></div><small style="color:#1976d2;font-weight:bold"><p>🏆 <strong>Breakthrough:</strong> Năng suất team tăng 220% - từ 1.0x baseline lên 3.2x baseline</p></small></div></div>
<div style="margin:20px 0;text-align:center"><h5>⚖️ So Sánh Truyền Thống vs AI-First</h5><div style="display:flex;flex-direction:column;align-items:center;gap:20px;padding:25px;background:linear-gradient(135deg, #f8f9fa, #e9ecef);border-radius:15px;border:1px solid #dee2e6;margin:20px 0"><h6>⚖️ So Sánh: Truyền Thống vs AI-First</h6><div style="display:flex;flex-direction:column;gap:20px;width:100%;max-width:800px"><div style="background:linear-gradient(135deg, #ffebee, #ffcdd2);padding:20px;border-radius:12px;border:2px solid #f44336"><h6 style="color:#d32f2f;margin-bottom:15px;text-align:center"><p>🔴 Phương Pháp Truyền Thống</p></h6><div style="display:flex;flex-wrap:wrap;justify-content:center;gap:15px"><div style="background:linear-gradient(135deg, #f44336, #d32f2f);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:160px;box-shadow:0 4px 8px rgba(244,67,54,0.3)"><div style="font-size:24px;margin-bottom:8px">⏰</div><div style="font-size:18px;font-weight:bold">9 tuần</div><div style="font-size:12px;opacity:0.9;line-height:1.3">Time to Market<br>Chậm &amp; phức tạp</div></div><div style="background:linear-gradient(135deg, #e57373, #c62828);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:160px;box-shadow:0 4px 8px rgba(229,115,115,0.3)"><div style="font-size:24px;margin-bottom:8px">💰</div><div style="font-size:18px;font-weight:bold">$100K</div><div style="font-size:12px;opacity:0.9;line-height:1.3">Chi phí cao<br>Resource intensive</div></div><div style="background:linear-gradient(135deg, #ef5350, #b71c1c);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:160px;box-shadow:0 4px 8px rgba(239,83,80,0.3)"><div style="font-size:24px;margin-bottom:8px">📦</div><div style="font-size:18px;font-weight:bold">2.5 features</div><div style="font-size:12px;opacity:0.9;line-height:1.3">Per week<br>Tốc độ chậm</div></div></div></div><div style="text-align:center;font-size:24px;color:#666"><p>🆚 <strong>SO SÁNH</strong> 🆚</p></div><div style="background:linear-gradient(135deg, #e8f5e8, #c8e6c9);padding:20px;border-radius:12px;border:2px solid #4caf50"><h6 style="color:#2e7d32;margin-bottom:15px;text-align:center"><p>🟢 Phương Pháp AI-First</p></h6><div style="display:flex;flex-wrap:wrap;justify-content:center;gap:15px"><div style="background:linear-gradient(135deg, #4caf50, #2e7d32);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:160px;box-shadow:0 4px 8px rgba(76,175,80,0.3);border:2px solid #fff"><div style="font-size:24px;margin-bottom:8px">🚀</div><div style="font-size:18px;font-weight:bold">4.5 tuần</div><div style="font-size:12px;opacity:0.9;line-height:1.3">Time to Market<br><strong>50% NHANH HƠN</strong></div></div><div style="background:linear-gradient(135deg, #66bb6a, #388e3c);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:160px;box-shadow:0 4px 8px rgba(102,187,106,0.3);border:2px solid #fff"><div style="font-size:24px;margin-bottom:8px">💎</div><div style="font-size:18px;font-weight:bold">$60K</div><div style="font-size:12px;opacity:0.9;line-height:1.3">Chi phí thấp<br><strong>40% TIẾT KIỆM</strong></div></div><div style="background:linear-gradient(135deg, #81c784, #4caf50);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:160px;box-shadow:0 4px 8px rgba(129,199,132,0.3);border:2px solid #fff"><div style="font-size:24px;margin-bottom:8px">⚡</div><div style="font-size:18px;font-weight:bold">5 features</div><div style="font-size:12px;opacity:0.9;line-height:1.3">Per week<br><strong>100% NHANH HƠN</strong></div></div></div></div></div><div style="text-align:center;padding:15px;background:linear-gradient(135deg, #fff3e0, #ffe0b2);border-radius:8px;margin-top:15px"><p><strong>🏆 Kết luận:</strong> AI-First approach vượt trội hoàn toàn - <span style="color:#e65100;font-weight:bold">nhanh hơn 2x, rẻ hơn 40%, hiệu quả hơn 100%</span></p></div></div></div>
<p><strong>Lợi Ích Chính của AI-DLC</strong> (theo nghiên cứu của <a href="https://aws.amazon.com/blogs/devops/ai-driven-development-lifecycle/" target="_blank" rel="noopener noreferrer" class="">AWS</a> và <a href="https://www.infoworld.com/article/3999607/how-to-succeed-or-fail-with-ai-driven-development.html" target="_blank" rel="noopener noreferrer" class="">InfoWorld</a>):</p>
<table><thead><tr><th>Lợi Ích</th><th>Mô Tả</th><th>Tác Động Ngành</th></tr></thead><tbody><tr><td><strong>Tăng Tốc Độ</strong></td><td>AI nhanh chóng tạo ra và tinh chỉnh các sản phẩm, cho phép hoàn thành trong vài giờ/ngày thay vì vài tuần</td><td>Tăng tốc 35% trong chu kỳ phát hành<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-8-d4c0df" id="user-content-fnref-8-d4c0df" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">5</a></sup></td></tr><tr><td><strong>Thúc Đẩy Đổi Mới</strong></td><td>Tiết kiệm thời gian cho các giải pháp sáng tạo và mở rộng ranh giới</td><td>Giảm 40% tình trạng kiệt sức của developer<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-8-d4c0df" id="user-content-fnref-8-d4c0df-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">5</a></sup></td></tr><tr><td><strong>Nâng Cao Chất Lượng</strong></td><td>Làm rõ liên tục đảm bảo sự phù hợp chính xác với mục tiêu kinh doanh</td><td>Giảm 65% lỗi và vấn đề bảo mật<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-8-d4c0df" id="user-content-fnref-8-d4c0df-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">5</a></sup></td></tr><tr><td><strong>Phản Ứng Thị Trường</strong></td><td>Chu kỳ phát triển nhanh cho phép phản ứng kịp thời với nhu cầu thị trường</td><td>Nhanh hơn 50% thời gian ra thị trường<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-8-d4c0df" id="user-content-fnref-8-d4c0df-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">5</a></sup></td></tr><tr><td><strong>Hiệu Quả Chi Phí</strong></td><td>Giảm chi phí phát triển thông qua tự động hóa và hiệu quả</td><td>Tiết kiệm 30-40% chi phí phát triển<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-8-d4c0df" id="user-content-fnref-8-d4c0df-5" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">5</a></sup></td></tr><tr><td><strong>Nâng Cao Kỹ Năng</strong></td><td>Developer junior học tư duy cấp senior nhanh hơn</td><td>Phát triển kỹ năng nhanh hơn 60%<sup><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fn-8-d4c0df" id="user-content-fnref-8-d4c0df-6" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">5</a></sup></td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kinh-nghiem-thuc-te"><strong>Kinh Nghiệm Thực Tế và Giảm Thiểu Rủi Ro</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#kinh-nghiem-thuc-te" class="hash-link" aria-label="Đường dẫn trực tiếp đến kinh-nghiem-thuc-te" title="Đường dẫn trực tiếp đến kinh-nghiem-thuc-te" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-kỹ-thuật-prompt--kiểm-soát-chất-lượng">1. <strong>Kỹ Thuật Prompt &amp; Kiểm Soát Chất Lượng</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#1-k%E1%BB%B9-thu%E1%BA%ADt-prompt--ki%E1%BB%83m-so%C3%A1t-ch%E1%BA%A5t-l%C6%B0%E1%BB%A3ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1-kỹ-thuật-prompt--kiểm-soát-chất-lượng" title="Đường dẫn trực tiếp đến 1-kỹ-thuật-prompt--kiểm-soát-chất-lượng" translate="no">​</a></h3>
<p>Theo <a href="https://www.testim.io/blog/ai-driven-development-and-testing-revolutionizing-software-creation/" target="_blank" rel="noopener noreferrer" class="">Testim research</a>:</p>
<table><thead><tr><th>Phương Pháp Hay</th><th>Mô Tả</th><th>Giảm Thiểu Rủi Ro</th></tr></thead><tbody><tr><td><strong>Prompt Rõ Ràng</strong></td><td>Viết prompt rõ ràng, cụ thể với context đầy đủ</td><td>Giảm 40% hiểu sai của AI</td></tr><tr><td><strong>Xác Thực Kết Quả</strong></td><td>Luôn kiểm tra AI-generated code và logic</td><td>Tránh ship code có lỗi</td></tr><tr><td><strong>Giám Sát Con Người</strong></td><td>Duy trì review của con người cho quyết định quan trọng</td><td>Đảm bảo phù hợp với business</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-bảo-mật-ưu-tiên">2. <strong>Bảo Mật Ưu Tiên</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#2-b%E1%BA%A3o-m%E1%BA%ADt-%C6%B0u-ti%C3%AAn" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2-bảo-mật-ưu-tiên" title="Đường dẫn trực tiếp đến 2-bảo-mật-ưu-tiên" translate="no">​</a></h3>
<p>Theo <a href="https://blog.technologent.com/ai-driven-software-development-uses-benefits-risks" target="_blank" rel="noopener noreferrer" class="">Technologent research</a>:</p>
<table><thead><tr><th>Biện Pháp Bảo Mật</th><th>Cách Triển Khai</th><th>Hiệu Quả</th></tr></thead><tbody><tr><td><strong>Kiểm Thử Bảo Mật Tự Động</strong></td><td>SAST, DAST, quét dependency</td><td>85% phát hiện lỗ hổng</td></tr><tr><td><strong>Quy Trình Review Code</strong></td><td>Review tập trung bảo mật với AI hỗ trợ</td><td>90% ngăn chặn vấn đề bảo mật</td></tr><tr><td><strong>Bảo Vệ Sở Hữu Trí Tuệ</strong></td><td>Chính sách rõ ràng và xác thực bản quyền</td><td>95% giảm rủi ro IP</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-phát-triển-lặp--học-hỏi">3. <strong>Phát Triển Lặp &amp; Học Hỏi</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#3-ph%C3%A1t-tri%E1%BB%83n-l%E1%BA%B7p--h%E1%BB%8Dc-h%E1%BB%8Fi" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3-phát-triển-lặp--học-hỏi" title="Đường dẫn trực tiếp đến 3-phát-triển-lặp--học-hỏi" translate="no">​</a></h3>
<p>Theo <a href="https://www.enlighten.co.nz/what-we-do/artificial-intelligence/ai-driven-development" target="_blank" rel="noopener noreferrer" class="">Enlighten research</a>:</p>
<table><thead><tr><th>Phương Pháp Phát Triển</th><th>Tích Hợp AI</th><th>Cải Thiện Chất Lượng</th></tr></thead><tbody><tr><td><strong>Bắt Đầu Nhỏ</strong></td><td>Bắt đầu với gợi ý AI cho các task đơn giản</td><td>Xây dựng niềm tin từ từ</td></tr><tr><td><strong>Tinh Chỉnh &amp; Tùy Biến</strong></td><td>Luôn tùy chỉnh AI output cho nhu cầu business</td><td>Đảm bảo logic business chính xác</td></tr><tr><td><strong>Học Các Mẫu</strong></td><td>Ghi chép các AI patterns và prompts thành công</td><td>Cải thiện hiệu quả team</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-đào-tạo-team--quản-lý-kiến-thức">4. <strong>Đào Tạo Team &amp; Quản Lý Kiến Thức</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#4-%C4%91%C3%A0o-t%E1%BA%A1o-team--qu%E1%BA%A3n-l%C3%BD-ki%E1%BA%BFn-th%E1%BB%A9c" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4-đào-tạo-team--quản-lý-kiến-thức" title="Đường dẫn trực tiếp đến 4-đào-tạo-team--quản-lý-kiến-thức" translate="no">​</a></h3>
<p>Theo <a href="https://noventiq.vn/vi/events/past/webinar-ai-driven-development-with-github-copilot" target="_blank" rel="noopener noreferrer" class="">Noventiq webinar</a>:</p>
<table><thead><tr><th>Khía Cạnh Đào Tạo</th><th>Tập Trung</th><th>Kết Quả Mong Đợi</th></tr></thead><tbody><tr><td><strong>Thành Thạo AI Tools</strong></td><td>Thành thạo ChatGPT, Cursor, GitHub Copilot</td><td>60% development nhanh hơn</td></tr><tr><td><strong>Nhận Thức Rủi Ro</strong></td><td>Hiểu rõ giới hạn AI và rủi ro bảo mật</td><td>80% giảm rủi ro</td></tr><tr><td><strong>Phương Pháp Hay</strong></td><td>Chia sẻ patterns và workflows thành công</td><td>70% năng suất team</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-lộ-trình-triển-khai">🔧 <strong>Lộ Trình Triển Khai</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#-l%E1%BB%99-tr%C3%ACnh-tri%E1%BB%83n-khai" class="hash-link" aria-label="Đường dẫn trực tiếp đến -lộ-trình-triển-khai" title="Đường dẫn trực tiếp đến -lộ-trình-triển-khai" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="giai-đoạn-1-chuẩn-bị-2-4-tuần">Giai Đoạn 1: Chuẩn Bị (2-4 tuần)<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#giai-%C4%91o%E1%BA%A1n-1-chu%E1%BA%A9n-b%E1%BB%8B-2-4-tu%E1%BA%A7n" class="hash-link" aria-label="Đường dẫn trực tiếp đến Giai Đoạn 1: Chuẩn Bị (2-4 tuần)" title="Đường dẫn trực tiếp đến Giai Đoạn 1: Chuẩn Bị (2-4 tuần)" translate="no">​</a></h4>
<!-- -->
<ul>
<li class=""><strong>Đào Tạo</strong>: 2 tuần training chuyên sâu về AI tools</li>
<li class=""><strong>Hạ Tầng</strong>: Setup Cursor, ChatGPT, security tools</li>
<li class=""><strong>Chính Sách</strong>: Thiết lập bảo vệ IP và hướng dẫn review code</li>
<li class=""><strong>Thử Nghiệm</strong>: Chọn 1 dự án nhỏ để test workflow</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="giai-đoạn-2-triển-khai-từng-phần-4-8-tuần">Giai Đoạn 2: Triển Khai Từng Phần (4-8 tuần)<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#giai-%C4%91o%E1%BA%A1n-2-tri%E1%BB%83n-khai-t%E1%BB%ABng-ph%E1%BA%A7n-4-8-tu%E1%BA%A7n" class="hash-link" aria-label="Đường dẫn trực tiếp đến Giai Đoạn 2: Triển Khai Từng Phần (4-8 tuần)" title="Đường dẫn trực tiếp đến Giai Đoạn 2: Triển Khai Từng Phần (4-8 tuần)" translate="no">​</a></h4>
<ul>
<li class=""><strong>Tuần 1-2</strong>: Phân tích yêu cầu với AI hỗ trợ</li>
<li class=""><strong>Tuần 3-4</strong>: Tạo code được AI dẫn dắt</li>
<li class=""><strong>Tuần 5-6</strong>: Testing và QA được AI hỗ trợ</li>
<li class=""><strong>Tuần 7-8</strong>: Tự động hóa CI/CD với AI</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="giai-đoạn-3-mở-rộng-8-12-tuần">Giai Đoạn 3: Mở Rộng (8-12 tuần)<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#giai-%C4%91o%E1%BA%A1n-3-m%E1%BB%9F-r%E1%BB%99ng-8-12-tu%E1%BA%A7n" class="hash-link" aria-label="Đường dẫn trực tiếp đến Giai Đoạn 3: Mở Rộng (8-12 tuần)" title="Đường dẫn trực tiếp đến Giai Đoạn 3: Mở Rộng (8-12 tuần)" translate="no">​</a></h4>
<ul>
<li class=""><strong>Mở Rộng</strong>: Áp dụng cho toàn bộ team và projects</li>
<li class=""><strong>Tối Ưu</strong>: Tinh chỉnh prompts và workflows</li>
<li class=""><strong>Giám Sát</strong>: Theo dõi metrics và cải thiện liên tục</li>
</ul>
<div style="margin:20px 0;text-align:center"><h5>🚀 Lộ Trình Triển Khai Chi Tiết</h5></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="can-nhac-quan-trong"><strong>Những Cân Nhắc Quan Trọng và Rủi Ro</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#can-nhac-quan-trong" class="hash-link" aria-label="Đường dẫn trực tiếp đến can-nhac-quan-trong" title="Đường dẫn trực tiếp đến can-nhac-quan-trong" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-giới-hạn-ai--giám-sát-con-người">1. <strong>Giới Hạn AI &amp; Giám Sát Con Người</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#1-gi%E1%BB%9Bi-h%E1%BA%A1n-ai--gi%C3%A1m-s%C3%A1t-con-ng%C6%B0%E1%BB%9Di" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1-giới-hạn-ai--giám-sát-con-người" title="Đường dẫn trực tiếp đến 1-giới-hạn-ai--giám-sát-con-người" translate="no">​</a></h3>
<p>Theo <a href="https://www.infoworld.com/article/3999607/how-to-succeed-or-fail-with-ai-driven-development.html" target="_blank" rel="noopener noreferrer" class="">InfoWorld research</a>:</p>
<table><thead><tr><th>Giới Hạn</th><th>Mức Độ Rủi Ro</th><th>Chiến Lược Giảm Thiểu</th></tr></thead><tbody><tr><td><strong>Hiểu Ngữ Cảnh</strong></td><td>Cao - AI có thể hiểu sai yêu cầu business</td><td>Luôn xác nhận với chuyên gia lĩnh vực</td></tr><tr><td><strong>Chất Lượng Code</strong></td><td>Trung bình - AI-generated code có thể có lỗi</td><td>Testing và review toàn diện</td></tr><tr><td><strong>Nhận Thức Bảo Mật</strong></td><td>Cao - AI không hiểu rõ tác động bảo mật</td><td>Quy trình review tập trung bảo mật</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-quan-ngại-bảo-mật--tuân-thủ">2. <strong>Quan Ngại Bảo Mật &amp; Tuân Thủ</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#2-quan-ng%E1%BA%A1i-b%E1%BA%A3o-m%E1%BA%ADt--tu%C3%A2n-th%E1%BB%A7" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2-quan-ngại-bảo-mật--tuân-thủ" title="Đường dẫn trực tiếp đến 2-quan-ngại-bảo-mật--tuân-thủ" translate="no">​</a></h3>
<p>Theo <a href="https://blog.technologent.com/ai-driven-software-development-uses-benefits-risks" target="_blank" rel="noopener noreferrer" class="">Technologent analysis</a>:</p>
<table><thead><tr><th>Rủi Ro Bảo Mật</th><th>Tác Động Tiềm Ẩn</th><th>Biện Pháp Phòng Ngừa</th></tr></thead><tbody><tr><td><strong>Code Có Lỗ Hổng</strong></td><td>Rò rỉ dữ liệu, system bị xâm phạm</td><td>Kiểm thử bảo mật tự động, SAST/DAST</td></tr><tr><td><strong>Vi Phạm Sở Hữu Trí Tuệ</strong></td><td>Vấn đề pháp lý, vi phạm bản quyền</td><td>Chính sách IP rõ ràng, kiểm tra tính gốc của code</td></tr><tr><td><strong>Lộ Dữ Liệu</strong></td><td>Vi phạm quyền riêng tư, vấn đề tuân thủ</td><td>Làm sạch dữ liệu, thiết kế ưu tiên privacy</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-quản-lý-dependency--phát-triển-kỹ-năng">3. <strong>Quản Lý Dependency &amp; Phát Triển Kỹ Năng</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#3-qu%E1%BA%A3n-l%C3%BD-dependency--ph%C3%A1t-tri%E1%BB%83n-k%E1%BB%B9-n%C4%83ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3-quản-lý-dependency--phát-triển-kỹ-năng" title="Đường dẫn trực tiếp đến 3-quản-lý-dependency--phát-triển-kỹ-năng" translate="no">​</a></h3>
<p>Theo <a href="https://www.enlighten.co.nz/what-we-do/artificial-intelligence/ai-driven-development" target="_blank" rel="noopener noreferrer" class="">Enlighten research</a>:</p>
<table><thead><tr><th>Khía Cạnh Dependency</th><th>Rủi Ro</th><th>Giảm Thiểu</th></tr></thead><tbody><tr><td><strong>Phụ Thuộc Quá Mức AI</strong></td><td>Mất kỹ năng cơ bản</td><td>Cân bằng AI assistance với coding thủ công</td></tr><tr><td><strong>Bị Khoá Vào Tool</strong></td><td>Phụ thuộc vendor</td><td>Sử dụng nhiều AI tools và duy trì tính linh hoạt</td></tr><tr><td><strong>Khoảng Cách Kiến Thức</strong></td><td>Team không thể giải thích quyết định AI</td><td>Nguyên tắc "Giải thích được thì mới ship"</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-khung-đánh-giá-rủi-ro">⚠️ <strong>Khung Đánh Giá Rủi Ro</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#%EF%B8%8F-khung-%C4%91%C3%A1nh-gi%C3%A1-r%E1%BB%A7i-ro" class="hash-link" aria-label="Đường dẫn trực tiếp đến ️-khung-đánh-giá-rủi-ro" title="Đường dẫn trực tiếp đến ️-khung-đánh-giá-rủi-ro" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="khu-vực-rủi-ro-cao-cần-giám-sát-chặt-chẽ">Khu Vực Rủi Ro Cao (Cần Giám Sát Chặt Chẽ)<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#khu-v%E1%BB%B1c-r%E1%BB%A7i-ro-cao-c%E1%BA%A7n-gi%C3%A1m-s%C3%A1t-ch%E1%BA%B7t-ch%E1%BA%BD" class="hash-link" aria-label="Đường dẫn trực tiếp đến Khu Vực Rủi Ro Cao (Cần Giám Sát Chặt Chẽ)" title="Đường dẫn trực tiếp đến Khu Vực Rủi Ro Cao (Cần Giám Sát Chặt Chẽ)" translate="no">​</a></h4>
<!-- -->
<ul>
<li class=""><strong>Chức năng quan trọng bảo mật</strong>: Xác thực, phân quyền, mã hóa dữ liệu</li>
<li class=""><strong>Logic business</strong>: Quy tắc business cốt lõi và tính toán</li>
<li class=""><strong>Điểm tích hợp</strong>: API endpoints, tích hợp bên thứ ba</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="khu-vực-rủi-ro-trung-bình-ai--review-con-người">Khu Vực Rủi Ro Trung Bình (AI + Review Con Người)<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#khu-v%E1%BB%B1c-r%E1%BB%A7i-ro-trung-b%C3%ACnh-ai--review-con-ng%C6%B0%E1%BB%9Di" class="hash-link" aria-label="Đường dẫn trực tiếp đến Khu Vực Rủi Ro Trung Bình (AI + Review Con Người)" title="Đường dẫn trực tiếp đến Khu Vực Rủi Ro Trung Bình (AI + Review Con Người)" translate="no">​</a></h4>
<ul>
<li class=""><strong>Thành Phần UI</strong>: Front-end components với logic business</li>
<li class=""><strong>Xử Lý Dữ Liệu</strong>: Chuyển đổi dữ liệu và validation</li>
<li class=""><strong>Cấu Hình</strong>: Hạ tầng và config deployment</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="khu-vực-rủi-ro-thấp-ai-first-với-kiểm-tra-điểm">Khu Vực Rủi Ro Thấp (AI-First với Kiểm Tra Điểm)<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#khu-v%E1%BB%B1c-r%E1%BB%A7i-ro-th%E1%BA%A5p-ai-first-v%E1%BB%9Bi-ki%E1%BB%83m-tra-%C4%91i%E1%BB%83m" class="hash-link" aria-label="Đường dẫn trực tiếp đến Khu Vực Rủi Ro Thấp (AI-First với Kiểm Tra Điểm)" title="Đường dẫn trực tiếp đến Khu Vực Rủi Ro Thấp (AI-First với Kiểm Tra Điểm)" translate="no">​</a></h4>
<ul>
<li class=""><strong>Code Boilerplate</strong>: Các thao tác CRUD tiêu chuẩn</li>
<li class=""><strong>Code Test</strong>: Unit tests và integration tests</li>
<li class=""><strong>Tài Liệu</strong>: Code comments và README files</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-phương-pháp-bảo-mật-tốt-nhất">🛡️ <strong>Phương Pháp Bảo Mật Tốt Nhất</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#%EF%B8%8F-ph%C6%B0%C6%A1ng-ph%C3%A1p-b%E1%BA%A3o-m%E1%BA%ADt-t%E1%BB%91t-nh%E1%BA%A5t" class="hash-link" aria-label="Đường dẫn trực tiếp đến ️-phương-pháp-bảo-mật-tốt-nhất" title="Đường dẫn trực tiếp đến ️-phương-pháp-bảo-mật-tốt-nhất" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="checklist-bảo-mật-code">Checklist Bảo Mật Code<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#checklist-b%E1%BA%A3o-m%E1%BA%ADt-code" class="hash-link" aria-label="Đường dẫn trực tiếp đến Checklist Bảo Mật Code" title="Đường dẫn trực tiếp đến Checklist Bảo Mật Code" translate="no">​</a></h4>
<ul class="contains-task-list containsTaskList_mC6p">
<li class="task-list-item"><input type="checkbox" disabled=""> <strong>SAST Scanning</strong>: Kiểm thử bảo mật ứng dụng tĩnh</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <strong>DAST Testing</strong>: Kiểm thử bảo mật ứng dụng động</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <strong>Quét Dependency</strong>: Kiểm tra các dependency có lỗ hổng</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <strong>Phát Hiện Secret</strong>: Đảm bảo không có secrets hardcode</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <strong>Kiểm Soát Truy Cập</strong>: Xác thực và phân quyền đúng</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <strong>Validation Input</strong>: Làm sạch tất cả user inputs</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <strong>Xử Lý Lỗi</strong>: Không có thông tin nhạy cảm trong error messages</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="biện-pháp-bảo-mật-riêng-cho-ai">Biện Pháp Bảo Mật Riêng Cho AI<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#bi%E1%BB%87n-ph%C3%A1p-b%E1%BA%A3o-m%E1%BA%ADt-ri%C3%AAng-cho-ai" class="hash-link" aria-label="Đường dẫn trực tiếp đến Biện Pháp Bảo Mật Riêng Cho AI" title="Đường dẫn trực tiếp đến Biện Pháp Bảo Mật Riêng Cho AI" translate="no">​</a></h4>
<ul class="contains-task-list containsTaskList_mC6p">
<li class="task-list-item"><input type="checkbox" disabled=""> <strong>Bảo Vệ Prompt Injection</strong>: Validate và làm sạch AI inputs</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <strong>Xác Minh Output</strong>: Review code bảo mật được AI tạo</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <strong>Giới Hạn Context</strong>: Hạn chế thông tin nhạy cảm trong AI context</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <strong>Audit Trails</strong>: Log tất cả tương tác AI cho tuân thủ</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <strong>Bảo Vệ IP</strong>: Đảm bảo AI không tái tạo code có bản quyền</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-khung-tính-toán-roi">📊 <strong>Khung Tính Toán ROI</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#-khung-t%C3%ADnh-to%C3%A1n-roi" class="hash-link" aria-label="Đường dẫn trực tiếp đến -khung-tính-toán-roi" title="Đường dẫn trực tiếp đến -khung-tính-toán-roi" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="thành-phần-chi-phí">Thành Phần Chi Phí<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#th%C3%A0nh-ph%E1%BA%A7n-chi-ph%C3%AD" class="hash-link" aria-label="Đường dẫn trực tiếp đến Thành Phần Chi Phí" title="Đường dẫn trực tiếp đến Thành Phần Chi Phí" translate="no">​</a></h4>
<table><thead><tr><th>Loại Chi Phí</th><th>Truyền Thống</th><th>AI-Driven</th><th>Tiết Kiệm</th></tr></thead><tbody><tr><td><strong>Thời Gian Developer</strong></td><td>$50K/tháng</td><td>$30K/tháng</td><td>40%</td></tr><tr><td><strong>QA Testing</strong></td><td>$20K/tháng</td><td>$8K/tháng</td><td>60%</td></tr><tr><td><strong>Hạ Tầng</strong></td><td>$15K/tháng</td><td>$18K/tháng</td><td>-20%</td></tr><tr><td><strong>Đào Tạo</strong></td><td>$5K một lần</td><td>$10K một lần</td><td>-100%</td></tr><tr><td><strong>Tổng Hàng Tháng</strong></td><td><strong>$90K</strong></td><td><strong>$66K</strong></td><td><strong>27%</strong></td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="thành-phần-lợi-ích">Thành Phần Lợi Ích<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#th%C3%A0nh-ph%E1%BA%A7n-l%E1%BB%A3i-%C3%ADch" class="hash-link" aria-label="Đường dẫn trực tiếp đến Thành Phần Lợi Ích" title="Đường dẫn trực tiếp đến Thành Phần Lợi Ích" translate="no">​</a></h4>
<table><thead><tr><th>Loại Lợi Ích</th><th>Giá Trị</th><th>Tác Động Hàng Năm</th></tr></thead><tbody><tr><td><strong>Thời Gian Ra Thị Trường Nhanh Hơn</strong></td><td>Giảm 50%</td><td>$500K doanh thu</td></tr><tr><td><strong>Tỷ Lệ Lỗi Giảm</strong></td><td>Ít hơn 60% bugs</td><td>$200K tiết kiệm</td></tr><tr><td><strong>Chất Lượng Code Cao Hơn</strong></td><td>85% hài lòng</td><td>$150K giữ chân</td></tr><tr><td><strong>Hài Lòng Developer</strong></td><td>Cải thiện 22%</td><td>$100K giữ chân</td></tr><tr><td><strong>Tổng Lợi Ích Hàng Năm</strong></td><td></td><td><strong>$950K</strong></td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="tính-toán-roi">Tính Toán ROI<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#t%C3%ADnh-to%C3%A1n-roi" class="hash-link" aria-label="Đường dẫn trực tiếp đến Tính Toán ROI" title="Đường dẫn trực tiếp đến Tính Toán ROI" translate="no">​</a></h4>
<ul>
<li class=""><strong>Đầu Tư Hàng Năm</strong>: $792K ($66K × 12 tháng)</li>
<li class=""><strong>Lợi Ích Hàng Năm</strong>: $950K</li>
<li class=""><strong>Lợi Ích Ròng</strong>: $158K</li>
<li class=""><strong>ROI</strong>: 20% trong năm đầu</li>
<li class=""><strong>Thời Gian Hoàn Vốn</strong>: 10 tháng</li>
</ul>
<div style="margin:20px 0;text-align:center"><h5>💰 Phân Tích Chi Phí vs Lợi Ích</h5><div style="display:flex;flex-direction:column;align-items:center;gap:20px;padding:25px;background:linear-gradient(135deg, #f8f9fa, #e9ecef);border-radius:15px;border:1px solid #dee2e6;margin:20px 0"><h6>💰 Chi Phí vs Lợi Ích - Phân Tích ROI</h6><div style="display:flex;flex-direction:column;gap:25px;width:100%;max-width:900px"><div style="background:linear-gradient(135deg, #ffebee, #ffcdd2);padding:20px;border-radius:12px;border:2px solid #ef5350"><h6 style="color:#d32f2f;margin-bottom:15px;text-align:center"><p>🔴 Chi Phí Đầu Tư: $792K/năm</p></h6><div style="display:flex;flex-wrap:wrap;justify-content:center;gap:12px"><div style="background:linear-gradient(135deg, #f44336, #d32f2f);color:white;padding:15px 18px;border-radius:10px;text-align:center;min-width:140px;box-shadow:0 3px 6px rgba(244,67,54,0.3)"><div style="font-size:20px;margin-bottom:5px">👨‍💻</div><div style="font-size:16px;font-weight:bold">$600K</div><div style="font-size:11px;opacity:0.9">Developer Time</div><div style="font-size:10px;margin-top:3px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:4px">76%</div></div><div style="background:linear-gradient(135deg, #e57373, #c62828);color:white;padding:15px 18px;border-radius:10px;text-align:center;min-width:140px;box-shadow:0 3px 6px rgba(229,115,115,0.3)"><div style="font-size:20px;margin-bottom:5px">🧪</div><div style="font-size:16px;font-weight:bold">$240K</div><div style="font-size:11px;opacity:0.9">QA Testing</div><div style="font-size:10px;margin-top:3px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:4px">30%</div></div><div style="background:linear-gradient(135deg, #ef5350, #b71c1c);color:white;padding:15px 18px;border-radius:10px;text-align:center;min-width:140px;box-shadow:0 3px 6px rgba(239,83,80,0.3)"><div style="font-size:20px;margin-bottom:5px">🏗️</div><div style="font-size:16px;font-weight:bold">$180K</div><div style="font-size:11px;opacity:0.9">Infrastructure</div><div style="font-size:10px;margin-top:3px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:4px">23%</div></div><div style="background:linear-gradient(135deg, #ffab91, #ff5722);color:white;padding:15px 18px;border-radius:10px;text-align:center;min-width:140px;box-shadow:0 3px 6px rgba(255,171,145,0.3)"><div style="font-size:20px;margin-bottom:5px">📚</div><div style="font-size:16px;font-weight:bold">$60K</div><div style="font-size:11px;opacity:0.9">Training</div><div style="font-size:10px;margin-top:3px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:4px">8%</div></div></div></div><div style="text-align:center;font-size:24px;color:#666"><p>⬇️ <strong>AI Transformation</strong> ⬇️</p></div><div style="background:linear-gradient(135deg, #e8f5e8, #c8e6c9);padding:20px;border-radius:12px;border:2px solid #66bb6a"><h6 style="color:#2e7d32;margin-bottom:15px;text-align:center"><p>🟢 Lợi Ích Tạo Ra: $950K/năm</p></h6><div style="display:flex;flex-wrap:wrap;justify-content:center;gap:12px"><div style="background:linear-gradient(135deg, #4caf50, #2e7d32);color:white;padding:15px 18px;border-radius:10px;text-align:center;min-width:140px;box-shadow:0 3px 6px rgba(76,175,80,0.3)"><div style="font-size:20px;margin-bottom:5px">💾</div><div style="font-size:16px;font-weight:bold">$360K</div><div style="font-size:11px;opacity:0.9">Dev Savings</div><div style="font-size:10px;margin-top:3px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:4px">38%</div></div><div style="background:linear-gradient(135deg, #66bb6a, #388e3c);color:white;padding:15px 18px;border-radius:10px;text-align:center;min-width:140px;box-shadow:0 3px 6px rgba(102,187,106,0.3)"><div style="font-size:20px;margin-bottom:5px">🔧</div><div style="font-size:16px;font-weight:bold">$216K</div><div style="font-size:11px;opacity:0.9">Infra Efficiency</div><div style="font-size:10px;margin-top:3px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:4px">23%</div></div><div style="background:linear-gradient(135deg, #81c784, #4caf50);color:white;padding:15px 18px;border-radius:10px;text-align:center;min-width:140px;box-shadow:0 3px 6px rgba(129,199,132,0.3)"><div style="font-size:20px;margin-bottom:5px">📈</div><div style="font-size:16px;font-weight:bold">$120K</div><div style="font-size:11px;opacity:0.9">Skills Growth</div><div style="font-size:10px;margin-top:3px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:4px">13%</div></div><div style="background:linear-gradient(135deg, #a5d6a7, #66bb6a);color:white;padding:15px 18px;border-radius:10px;text-align:center;min-width:140px;box-shadow:0 3px 6px rgba(165,214,167,0.3)"><div style="font-size:20px;margin-bottom:5px">🔬</div><div style="font-size:16px;font-weight:bold">$96K</div><div style="font-size:11px;opacity:0.9">QA Reduction</div><div style="font-size:10px;margin-top:3px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:4px">10%</div></div><div style="background:linear-gradient(135deg, #ffc107, #ff8f00);color:white;padding:15px 18px;border-radius:10px;text-align:center;min-width:140px;box-shadow:0 3px 6px rgba(255,193,7,0.3)"><div style="font-size:20px;margin-bottom:5px">💎</div><div style="font-size:16px;font-weight:bold">$158K</div><div style="font-size:11px;opacity:0.9">Net Profit</div><div style="font-size:10px;margin-top:3px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:4px">17%</div></div></div></div></div><div style="text-align:center;padding:15px;background:linear-gradient(135deg, #e3f2fd, #bbdefb);border-radius:8px;margin-top:15px"><p><strong>💡 ROI Analysis:</strong> Đầu tư $792K → Tạo ra $950K value → <span style="color:#1976d2;font-weight:bold">Lợi nhuận ròng $158K (20% ROI)</span></p></div></div></div>
<div style="margin:20px 0;text-align:center"><h5>📊 Phân Bổ Lợi Ích ROI ($950K)</h5><div style="display:flex;flex-direction:column;align-items:center;gap:15px;padding:20px;background:#f8f9fa;border-radius:10px;border:1px solid #e0e0e0"><h6>💰 Phân Bổ Lợi Ích ROI ($950K)</h6><div style="display:flex;flex-wrap:wrap;justify-content:center;gap:12px;max-width:650px"><div style="background:linear-gradient(135deg, #4caf50, #66bb6a);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:145px;box-shadow:0 4px 8px rgba(76,175,80,0.3)"><div style="font-size:26px;margin-bottom:8px">🚀</div><div style="font-size:20px;font-weight:bold">$500K</div><div style="font-size:11px;opacity:0.9;line-height:1.2">Time to Market<br>Faster</div><div style="font-size:14px;margin-top:4px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:6px">53%</div></div><div style="background:linear-gradient(135deg, #2196f3, #42a5f5);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:145px;box-shadow:0 4px 8px rgba(33,150,243,0.3)"><div style="font-size:26px;margin-bottom:8px">🐛</div><div style="font-size:20px;font-weight:bold">$200K</div><div style="font-size:11px;opacity:0.9;line-height:1.2">Bug Reduction<br>Savings</div><div style="font-size:14px;margin-top:4px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:6px">21%</div></div><div style="background:linear-gradient(135deg, #ff9800, #ffb74d);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:145px;box-shadow:0 4px 8px rgba(255,152,0,0.3)"><div style="font-size:26px;margin-bottom:8px">⭐</div><div style="font-size:20px;font-weight:bold">$150K</div><div style="font-size:11px;opacity:0.9;line-height:1.2">Code Quality<br>Value</div><div style="font-size:14px;margin-top:4px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:6px">16%</div></div><div style="background:linear-gradient(135deg, #e91e63, #f06292);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:145px;box-shadow:0 4px 8px rgba(233,30,99,0.3)"><div style="font-size:26px;margin-bottom:8px">😊</div><div style="font-size:20px;font-weight:bold">$100K</div><div style="font-size:11px;opacity:0.9;line-height:1.2">Developer<br>Retention</div><div style="font-size:14px;margin-top:4px;background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:6px">10%</div></div></div><small style="color:#666;margin-top:10px"><p>💡 <strong>ROI Insight:</strong> Time-to-Market improvement tạo ra 53% tổng value ($500K từ faster delivery)</p></small></div></div>
<div style="margin:20px 0;text-align:center"><h5>⏱️ Timeline Hoàn Vốn (10 Tháng)</h5></div>
<hr>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>➡️ Tiếp theo: Phần 4</div><div class="admonitionContent_BuS1"><p>Trong <strong>Phần 4 (cuối cùng)</strong>, chúng ta sẽ khám phá tương lai của phát triển phần mềm được AI dẫn dắt, những công nghệ mới đang phát triển, và kết luận toàn bộ series với lời kêu gọi hành động.</p><p>👉 <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4"><strong>Đọc Phần 4: Tương Lai và Kết Luận</strong></a></p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-tài-liệu-tham-khảo">📚 <strong>Tài Liệu Tham Khảo</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#-t%C3%A0i-li%E1%BB%87u-tham-kh%E1%BA%A3o" class="hash-link" aria-label="Đường dẫn trực tiếp đến -tài-liệu-tham-khảo" title="Đường dẫn trực tiếp đến -tài-liệu-tham-khảo" translate="no">​</a></h2>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetStickyNavbar_Vzrq sr-only" id="footnote-label">Footnotes<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#footnote-label" class="hash-link" aria-label="Đường dẫn trực tiếp đến Footnotes" title="Đường dẫn trực tiếp đến Footnotes" translate="no">​</a></h2>
<ol>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-4-d4c0df">
<p><strong><a href="https://engineering.atspotify.com/" target="_blank" rel="noopener noreferrer" class="">Spotify Engineering Case Study (2025)</a></strong>: Internal case study from Spotify <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-4-d4c0df" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-4-d4c0df-2" data-footnote-backref="" aria-label="Back to reference 1-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-4-d4c0df-3" data-footnote-backref="" aria-label="Back to reference 1-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-4-d4c0df-4" data-footnote-backref="" aria-label="Back to reference 1-4" class="data-footnote-backref">↩<sup>4</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-5-d4c0df">
<p><strong>Quality Metrics</strong>: Industry benchmarks from software quality reports <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-5-d4c0df" data-footnote-backref="" aria-label="Back to reference 2" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-5-d4c0df-2" data-footnote-backref="" aria-label="Back to reference 2-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-5-d4c0df-3" data-footnote-backref="" aria-label="Back to reference 2-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-5-d4c0df-4" data-footnote-backref="" aria-label="Back to reference 2-4" class="data-footnote-backref">↩<sup>4</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-5-d4c0df-5" data-footnote-backref="" aria-label="Back to reference 2-5" class="data-footnote-backref">↩<sup>5</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-5-d4c0df-6" data-footnote-backref="" aria-label="Back to reference 2-6" class="data-footnote-backref">↩<sup>6</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-6-d4c0df">
<p><strong>Developer Experience Metrics</strong>: Survey of 500+ developers using AI tools <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-6-d4c0df" data-footnote-backref="" aria-label="Back to reference 3" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-6-d4c0df-2" data-footnote-backref="" aria-label="Back to reference 3-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-6-d4c0df-3" data-footnote-backref="" aria-label="Back to reference 3-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-6-d4c0df-4" data-footnote-backref="" aria-label="Back to reference 3-4" class="data-footnote-backref">↩<sup>4</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-6-d4c0df-5" data-footnote-backref="" aria-label="Back to reference 3-5" class="data-footnote-backref">↩<sup>5</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-7-d4c0df">
<p><strong>Business Impact Metrics</strong>: ROI analysis from 25+ companies <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-7-d4c0df" data-footnote-backref="" aria-label="Back to reference 4" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-7-d4c0df-2" data-footnote-backref="" aria-label="Back to reference 4-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-7-d4c0df-3" data-footnote-backref="" aria-label="Back to reference 4-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-7-d4c0df-4" data-footnote-backref="" aria-label="Back to reference 4-4" class="data-footnote-backref">↩<sup>4</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-7-d4c0df-5" data-footnote-backref="" aria-label="Back to reference 4-5" class="data-footnote-backref">↩<sup>5</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-8-d4c0df">
<p><strong><a href="https://www.infoworld.com/article/3999607/how-to-succeed-or-fail-with-ai-driven-development.html" target="_blank" rel="noopener noreferrer" class="">InfoWorld Research (2025)</a></strong>: "How to succeed (or fail) with AI-driven development" - Industry analysis <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-8-d4c0df" data-footnote-backref="" aria-label="Back to reference 5" class="data-footnote-backref">↩</a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-8-d4c0df-2" data-footnote-backref="" aria-label="Back to reference 5-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-8-d4c0df-3" data-footnote-backref="" aria-label="Back to reference 5-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-8-d4c0df-4" data-footnote-backref="" aria-label="Back to reference 5-4" class="data-footnote-backref">↩<sup>4</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-8-d4c0df-5" data-footnote-backref="" aria-label="Back to reference 5-5" class="data-footnote-backref">↩<sup>5</sup></a> <a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3#user-content-fnref-8-d4c0df-6" data-footnote-backref="" aria-label="Back to reference 5-6" class="data-footnote-backref">↩<sup>6</sup></a></p>
</li>
</ol>
</section>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="AI-DD" term="AI-DD"/>
        <category label="AI-DLC" term="AI-DLC"/>
        <category label="Metrics" term="Metrics"/>
        <category label="Best Practices" term="Best Practices"/>
        <category label="Risk Management" term="Risk Management"/>
        <category label="McKinsey" term="McKinsey"/>
        <category label="GitHub Copilot" term="GitHub Copilot"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[AI-DD - Phần 4: Tương Lai và Kết Luận]]></title>
        <id>https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4</id>
        <link href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4"/>
        <updated>2025-08-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Khám phá tương lai của AI-DD với autonomous systems, natural language programming và những đột phá công nghệ sắp tới.]]></summary>
        <content type="html"><![CDATA[<p align="right"><img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2FTienNHM.github.io%2Fblog%2Fai-driven-development-phan-4&amp;label=%E2%9A%AAView&amp;labelColor=%2337d67a&amp;countColor=%23555555&amp;style=flat&amp;labelStyle=upper" loading="lazy" decoding="async"></p>
<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p>Phần 4 (cuối cùng) của series AI-DD khám phá tương lai của phát triển phần mềm với autonomous coding agents, natural language programming, và Vision 2030: AI Software Factory. Bài viết trình bày các công nghệ đột phá đang được phát triển, roadmap triển khai AI-DD, và kết luận toàn bộ hành trình từ hiện tại đến tương lai của kỹ thuật phần mềm. Đây là phần dành cho Visionaries và Technology Leaders muốn hiểu về tương lai của ngành công nghệ phần mềm.</p></div></div>
<p>Trong phần cuối của series này, chúng ta sẽ khám phá tương lai của AI-DD, những công nghệ đột phá đang được phát triển, và kết luận toàn bộ hành trình từ hiện tại đến tương lai của kỹ thuật phần mềm.</p>
<p><em>Đây là Phần 4 (cuối cùng) trong series 4 phần về AI-DD.</em></p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>📚 Series: AI-DD (AI-Driven Development)</div><div class="admonitionContent_BuS1"><p><strong>Phần 1</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1">Giới Thiệu và Tác Động</a><br>
<strong>Phần 2</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2">Công Cụ AI và Nghiên Cứu Tình Huống</a><br>
<strong>Phần 3</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3">Số Liệu, Kinh Nghiệm Thực Tế và Rủi Ro</a><br>
<strong>Phần 4</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4">Tương Lai và Kết Luận</a> ← <em>Bạn đang ở đây</em></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tuong-lai-phat-trien"><strong>Tương Lai của AI-DD</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#tuong-lai-phat-trien" class="hash-link" aria-label="Đường dẫn trực tiếp đến tuong-lai-phat-trien" title="Đường dẫn trực tiếp đến tuong-lai-phat-trien" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-ai-agents--autonomous-systems">1. <strong>AI Agents &amp; Autonomous Systems</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#1-ai-agents--autonomous-systems" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1-ai-agents--autonomous-systems" title="Đường dẫn trực tiếp đến 1-ai-agents--autonomous-systems" translate="no">​</a></h3>
<p>Theo <a href="https://www.mdpi.com/2076-3417/15/3/1344" target="_blank" rel="noopener noreferrer" class="">MDPI research</a> và <a href="https://arxiv.org/abs/2403.08299" target="_blank" rel="noopener noreferrer" class="">ArXiv studies</a>:</p>
<!-- -->
<div style="display:flex;flex-direction:column;gap:20px;padding:25px;background:linear-gradient(135deg, #f8f9fa, #e9ecef);border-radius:15px;border:1px solid #dee2e6;margin:20px 0"><h5 style="text-align:center;color:#495057;margin-bottom:15px">🤖 Công Nghệ AI Tương Lai (2026-2030)</h5><p style="text-align:center;color:#6c757d;font-size:14px;margin:0 0 10px 0">Dự báo tác động của AI trong phát triển phần mềm</p><div style="display:flex;flex-wrap:wrap;justify-content:center;gap:15px"><div style="background:linear-gradient(135deg, #667eea, #764ba2);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(102, 126, 234, 0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">🤖</div><div style="font-size:18px;font-weight:bold">90%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">AI Viết Code Tự Động</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Routine Tasks</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Timeline: 2026-2028</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Research Phase</div></div><div style="background:linear-gradient(135deg, #667eea, #764ba2);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(102, 126, 234, 0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">🔧</div><div style="font-size:18px;font-weight:bold">80%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Hệ Thống Tự Sửa Lỗi</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Giảm Debug Thủ Công</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">2027-2029</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Early Prototypes</div></div><div style="background:linear-gradient(135deg, #667eea, #764ba2);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(102, 126, 234, 0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">🔮</div><div style="font-size:18px;font-weight:bold">70%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Lập Trình Dự Đoán</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Nhanh Hơn Bug Detection</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">2028-2030</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">In Development</div></div></div></div>
<table><thead><tr><th>Công Nghệ Tương Lai</th><th>Tình Trạng Hiện Tại</th><th>Thời Gian Dự Kiến</th><th>Tác Động</th></tr></thead><tbody><tr><td><strong>AI Viết Code Tự Động</strong></td><td>Đang trong giai đoạn nghiên cứu</td><td>2026-2028</td><td>Tự động hóa 90% công việc lặp đi lặp lại</td></tr><tr><td><strong>Hệ Thống Tự Sửa Lỗi</strong></td><td>Đã có mẫu thử nghiệm đầu tiên</td><td>2027-2029</td><td>Giảm 80% thời gian debug thủ công</td></tr><tr><td><strong>Lập Trình Dự Đoán</strong></td><td>Các mô hình AI đang được phát triển</td><td>2028-2030</td><td>Dự đoán bug nhanh hơn 70%</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="-ai-viết-code-tự-động---tầm-nhìn-2026">🤖 <strong>AI Viết Code Tự Động - Tầm Nhìn 2026</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#-ai-vi%E1%BA%BFt-code-t%E1%BB%B1-%C4%91%E1%BB%99ng---t%E1%BA%A7m-nh%C3%ACn-2026" class="hash-link" aria-label="Đường dẫn trực tiếp đến -ai-viết-code-tự-động---tầm-nhìn-2026" title="Đường dẫn trực tiếp đến -ai-viết-code-tự-động---tầm-nhìn-2026" translate="no">​</a></h4>
<!-- -->
<p><strong>Đặc điểm nổi bật của AI tự động</strong>:</p>
<ul>
<li class=""><strong>Làm việc nhóm</strong>: Nhiều AI chuyên môn khác nhau cộng tác với nhau</li>
<li class=""><strong>Tự lập kế hoạch</strong>: AI tự động tạo plan và timeline cho dự án</li>
<li class=""><strong>Học và tiến bộ</strong>: Ngày càng thông minh hơn qua từng lần feedback</li>
<li class=""><strong>Con người chỉ việc duyệt</strong>: Chỉ cần approve những quyết định lớn thôi</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-lập-trình-bằng-ngôn-ngữ-tự-nhiên--dễ-tiếp-cận">2. <strong>Lập Trình Bằng Ngôn Ngữ Tự Nhiên &amp; Dễ Tiếp Cận</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#2-l%E1%BA%ADp-tr%C3%ACnh-b%E1%BA%B1ng-ng%C3%B4n-ng%E1%BB%AF-t%E1%BB%B1-nhi%C3%AAn--d%E1%BB%85-ti%E1%BA%BFp-c%E1%BA%ADn" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2-lập-trình-bằng-ngôn-ngữ-tự-nhiên--dễ-tiếp-cận" title="Đường dẫn trực tiếp đến 2-lập-trình-bằng-ngôn-ngữ-tự-nhiên--dễ-tiếp-cận" translate="no">​</a></h3>
<p>Theo <a href="https://www.enlighten.co.nz/what-we-do/artificial-intelligence/ai-driven-development" target="_blank" rel="noopener noreferrer" class="">Enlighten research</a>:</p>
<table><thead><tr><th>Tính Năng Mới</th><th>Mô Tả</th><th>Lợi Ích</th></tr></thead><tbody><tr><td><strong>Code Đa Ngôn Ngữ</strong></td><td>Có thể lập trình bằng tiếng Việt, tiếng Anh, v.v.</td><td>Nhiều người hơn có thể trở thành developer (tăng 60%)</td></tr><tr><td><strong>Lập Trình Bằng Lời Nói</strong></td><td>Nói ý tưởng, AI hiểu và tạo code chuyên nghiệp</td><td>Nhanh hơn 50% đối với người không biết lập trình</td></tr><tr><td><strong>Lập Trình Theo Ý Muốn</strong></td><td>Chỉ cần mô tả ý tưởng, AI lo phần kỹ thuật</td><td>Dễ học hơn 75%, không cần hiểu sâu về code</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-ví-dụ-lập-trình-bằng-tiếng-việt">🗣️ <strong>Ví Dụ Lập Trình Bằng Tiếng Việt</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#%EF%B8%8F-v%C3%AD-d%E1%BB%A5-l%E1%BA%ADp-tr%C3%ACnh-b%E1%BA%B1ng-ti%E1%BA%BFng-vi%E1%BB%87t" class="hash-link" aria-label="Đường dẫn trực tiếp đến ️-ví-dụ-lập-trình-bằng-tiếng-việt" title="Đường dẫn trực tiếp đến ️-ví-dụ-lập-trình-bằng-tiếng-việt" translate="no">​</a></h4>
<p><strong>Lập trình bằng tiếng Việt (2027)</strong>:</p>
<div class="language-vietnamese codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-vietnamese codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Tạo một trang web bán hàng với:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Trang chủ hiển thị sản phẩm nổi bật</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Giỏ hàng có thể thêm/xóa sản phẩm  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Thanh toán qua VNPay và MoMo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Admin panel quản lý đơn hàng</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Responsive cho mobile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Database PostgreSQL</span><br></span></code></pre></div></div>
<p><strong>AI sẽ tự động tạo</strong>:</p>
<ul>
<li class="">Frontend React + TypeScript hoàn chỉnh</li>
<li class="">Backend Node.js + Express</li>
<li class="">Schema cơ sở dữ liệu PostgreSQL</li>
<li class="">Tích hợp thanh toán</li>
<li class="">Bảng điều khiển quản trị</li>
<li class="">Giao diện responsive cho mobile</li>
<li class="">Pipeline CI/CD</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-ai-thiết-kế--tối-ưu-hệ-thống">3. <strong>AI Thiết Kế &amp; Tối Ưu Hệ Thống</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#3-ai-thi%E1%BA%BFt-k%E1%BA%BF--t%E1%BB%91i-%C6%B0u-h%E1%BB%87-th%E1%BB%91ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3-ai-thiết-kế--tối-ưu-hệ-thống" title="Đường dẫn trực tiếp đến 3-ai-thiết-kế--tối-ưu-hệ-thống" translate="no">​</a></h3>
<p>Theo <a href="https://blog.technologent.com/ai-driven-software-development-uses-benefits-risks" target="_blank" rel="noopener noreferrer" class="">Technologent analysis</a>:</p>
<table><thead><tr><th>Việc AI Làm Được</th><th>AI Có Khả Năng Gì</th><th>Cải Thiện Được Bao Nhiêu</th></tr></thead><tbody><tr><td><strong>Thiết Kế Hệ Thống</strong></td><td>Tự động đề xuất cách xây dựng app tốt nhất</td><td>Hiệu suất tăng 40%</td></tr><tr><td><strong>Tăng Tốc Độ App</strong></td><td>Tìm ra điểm nghẽn và tự sửa</td><td>App chạy nhanh hơn 60%</td></tr><tr><td><strong>Lên Kế Hoạch Scale</strong></td><td>Biết trước khi nào cần nâng cấp server</td><td>Tiết kiệm 80% resource</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-lịch-trình-phát-triển-ai">🏗️ <strong>Lịch Trình Phát Triển AI</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#%EF%B8%8F-l%E1%BB%8Bch-tr%C3%ACnh-ph%C3%A1t-tri%E1%BB%83n-ai" class="hash-link" aria-label="Đường dẫn trực tiếp đến ️-lịch-trình-phát-triển-ai" title="Đường dẫn trực tiếp đến ️-lịch-trình-phát-triển-ai" translate="no">​</a></h4>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-tích-hợp-công-nghệ-mới-nổi">4. <strong>Tích Hợp Công Nghệ Mới Nổi</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#4-t%C3%ADch-h%E1%BB%A3p-c%C3%B4ng-ngh%E1%BB%87-m%E1%BB%9Bi-n%E1%BB%95i" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4-tích-hợp-công-nghệ-mới-nổi" title="Đường dẫn trực tiếp đến 4-tích-hợp-công-nghệ-mới-nổi" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="phát-triển-ai-tăng-cường-quantum-2030">Phát Triển AI Tăng Cường Quantum (2030+)<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#ph%C3%A1t-tri%E1%BB%83n-ai-t%C4%83ng-c%C6%B0%E1%BB%9Dng-quantum-2030" class="hash-link" aria-label="Đường dẫn trực tiếp đến Phát Triển AI Tăng Cường Quantum (2030+)" title="Đường dẫn trực tiếp đến Phát Triển AI Tăng Cường Quantum (2030+)" translate="no">​</a></h4>
<ul>
<li class=""><strong>Thuật Toán Quantum</strong>: Tối ưu hóa tạo code</li>
<li class=""><strong>Giải Quyết Bài Toán Phức Tạp</strong>: Giải quyết bài toán NP-hard trong thiết kế kiến trúc</li>
<li class=""><strong>Bảo Mật Mã Hóa</strong>: Các mẫu bảo mật an toàn trước quantum</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="lập-trình-giao-diện-não-máy-tính-2035">Lập Trình Giao Diện Não-Máy Tính (2035+)<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#l%E1%BA%ADp-tr%C3%ACnh-giao-di%E1%BB%87n-n%C3%A3o-m%C3%A1y-t%C3%ADnh-2035" class="hash-link" aria-label="Đường dẫn trực tiếp đến Lập Trình Giao Diện Não-Máy Tính (2035+)" title="Đường dẫn trực tiếp đến Lập Trình Giao Diện Não-Máy Tính (2035+)" translate="no">​</a></h4>
<ul>
<li class=""><strong>Tư Duy Thành Code</strong>: Lập trình nhập liệu trực tiếp từ tinh thần</li>
<li class=""><strong>Tăng Cường Sáng Tạo</strong>: AI khuếch đại tư duy sáng tạo của con người</li>
<li class=""><strong>Trí Tuệ Cộng Tác</strong>: Cộng tác liền mạch giữa con người và AI</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-tầm-nhìn-2030-nhà-máy-phần-mềm-hoàn-toàn-ai-driven">🔮 <strong>Tầm Nhìn 2030: Nhà Máy Phần Mềm Hoàn Toàn AI-Driven</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#-t%E1%BA%A7m-nh%C3%ACn-2030-nh%C3%A0-m%C3%A1y-ph%E1%BA%A7n-m%E1%BB%81m-ho%C3%A0n-to%C3%A0n-ai-driven" class="hash-link" aria-label="Đường dẫn trực tiếp đến -tầm-nhìn-2030-nhà-máy-phần-mềm-hoàn-toàn-ai-driven" title="Đường dẫn trực tiếp đến -tầm-nhìn-2030-nhà-máy-phần-mềm-hoàn-toàn-ai-driven" translate="no">​</a></h3>
<!-- -->
<p><strong>Đặc điểm của Nhà Máy Phần Mềm AI</strong>:</p>
<ul>
<li class=""><strong>Tự Động Hóa End-to-End</strong>: Từ ý tưởng đến production</li>
<li class=""><strong>Tự Tối Ưu</strong>: Tự động tối ưu hóa hiệu suất</li>
<li class=""><strong>Triển Khai Không Downtime</strong>: AI quản lý rollout và rollback</li>
<li class=""><strong>Mở Rộng Dự Đoán</strong>: Tự động scale dựa trên các mẫu sử dụng</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ket-luan"><strong>Kết Luận - Tương Lai của Kỹ Thuật Phần Mềm</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#ket-luan" class="hash-link" aria-label="Đường dẫn trực tiếp đến ket-luan" title="Đường dẫn trực tiếp đến ket-luan" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-ai-dd-thay-đổi-mô-hình-trong-phát-triển-phần-mềm"><em>🚀 AI-DD: Thay Đổi Mô Hình Trong Phát Triển Phần Mềm</em><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#-ai-dd-thay-%C4%91%E1%BB%95i-m%C3%B4-h%C3%ACnh-trong-ph%C3%A1t-tri%E1%BB%83n-ph%E1%BA%A7n-m%E1%BB%81m" class="hash-link" aria-label="Đường dẫn trực tiếp đến -ai-dd-thay-đổi-mô-hình-trong-phát-triển-phần-mềm" title="Đường dẫn trực tiếp đến -ai-dd-thay-đổi-mô-hình-trong-phát-triển-phần-mềm" translate="no">​</a></h3>
<p>Theo phương pháp <a href="https://aws.amazon.com/blogs/devops/ai-driven-development-life-cycle/" target="_blank" rel="noopener noreferrer" class="">AWS AI-DLC</a>, AI-DD không phải là thay thế hoàn toàn con người, mà là tái tưởng tượng toàn bộ quy trình phát triển phần mềm. AI trở thành cộng tác viên trung tâm và đồng đội, không chỉ là trợ lý.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-những-điểm-chính-của-ai-dd">🔑 <strong>Những Điểm Chính của AI-DD</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#-nh%E1%BB%AFng-%C4%91i%E1%BB%83m-ch%C3%ADnh-c%E1%BB%A7a-ai-dd" class="hash-link" aria-label="Đường dẫn trực tiếp đến -những-điểm-chính-của-ai-dd" title="Đường dẫn trực tiếp đến -những-điểm-chính-của-ai-dd" translate="no">​</a></h3>
<ol>
<li class=""><strong>AI thực thi với sự giám sát của con người</strong>: AI khởi tạo quy trình làm việc, tạo kế hoạch và để lại các quyết định quan trọng cho con người</li>
<li class=""><strong>Hợp tác nhóm năng động</strong>: Các thành viên trong nhóm kết hợp trong không gian cộng tác để giải quyết vấn đề theo thời gian thực</li>
<li class=""><strong>Tích lũy ngữ cảnh liên tục</strong>: AI duy trì thông tin ngữ cảnh xuyên suốt tất cả các giai đoạn, cho phép đưa ra gợi ý ngày càng thông minh</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-lợi-ích-của-ai-dd">💡 <strong>Lợi Ích Của AI-DD</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#-l%E1%BB%A3i-%C3%ADch-c%E1%BB%A7a-ai-dd" class="hash-link" aria-label="Đường dẫn trực tiếp đến -lợi-ích-của-ai-dd" title="Đường dẫn trực tiếp đến -lợi-ích-của-ai-dd" translate="no">​</a></h3>
<ul>
<li class=""><strong>Tăng tốc độ</strong>: Hoàn thành công việc trong vài giờ/ngày thay vì vài tuần</li>
<li class=""><strong>Thúc đẩy đổi mới</strong>: Tiết kiệm thời gian để tập trung vào giải pháp sáng tạo và mở rộng khả năng</li>
<li class=""><strong>Nâng cao chất lượng</strong>: Làm rõ liên tục đảm bảo sự phù hợp chính xác với yêu cầu kinh doanh</li>
<li class=""><strong>Phản ứng nhanh với thị trường</strong>: Chu kỳ phát triển nhanh cho phép thích ứng kịp thời</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-tác-động-transformative-của-ai-dlc">📈 <strong>Tác Động Transformative Của AI-DLC</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#-t%C3%A1c-%C4%91%E1%BB%99ng-transformative-c%E1%BB%A7a-ai-dlc" class="hash-link" aria-label="Đường dẫn trực tiếp đến -tác-động-transformative-của-ai-dlc" title="Đường dẫn trực tiếp đến -tác-động-transformative-của-ai-dlc" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="so-sánh-toàn-diện-trước-và-sau-ai-dlc">So Sánh Toàn Diện: Trước và Sau AI-DLC<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#so-s%C3%A1nh-to%C3%A0n-di%E1%BB%87n-tr%C6%B0%E1%BB%9Bc-v%C3%A0-sau-ai-dlc" class="hash-link" aria-label="Đường dẫn trực tiếp đến So Sánh Toàn Diện: Trước và Sau AI-DLC" title="Đường dẫn trực tiếp đến So Sánh Toàn Diện: Trước và Sau AI-DLC" translate="no">​</a></h4>
<div style="display:flex;flex-direction:column;gap:20px;padding:25px;background:linear-gradient(135deg, #f8f9fa, #e9ecef);border-radius:15px;border:1px solid #dee2e6;margin:20px 0"><h5 style="text-align:center;color:#495057;margin-bottom:15px">⚖️ Traditional vs AI-Driven Development</h5><p style="text-align:center;color:#6c757d;font-size:14px;margin:0 0 10px 0">Sự khác biệt rõ rệt khi chuyển sang AI-DLC</p><div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(200px, 1fr));justify-content:center;gap:15px"><div style="background:linear-gradient(135deg, #ff6b6b, #ee5a24);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(102, 126, 234, 0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">⏱️</div><div style="font-size:18px;font-weight:bold">3x</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Nhanh Hơn</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">6-8 tháng → 2-3 tháng</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Development Speed</div></div><div style="background:linear-gradient(135deg, #0abde3, #006ba6);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(102, 126, 234, 0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">💎</div><div style="font-size:18px;font-weight:bold">+20%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Chất Lượng Code</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">70% → 90%+ quality</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Higher Standards</div></div><div style="background:linear-gradient(135deg, #00d2d3, #54a0ff);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(102, 126, 234, 0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">🎯</div><div style="font-size:18px;font-weight:bold">-60%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Ít Bug Hơn</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">12-15% → 4-6%</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Better Reliability</div></div><div style="background:linear-gradient(135deg, #26de81, #20bf6b);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(102, 126, 234, 0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">💰</div><div style="font-size:18px;font-weight:bold">40%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Tiết Kiệm Chi Phí</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">$500K → $300K</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Cost Reduction</div></div><div style="background:linear-gradient(135deg, #feca57, #ff9ff3);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(102, 126, 234, 0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">😊</div><div style="font-size:18px;font-weight:bold">+30%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Dev Hài Lòng Hơn</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">6.5/10 → 8.5/10</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Better Experience</div></div><div style="background:linear-gradient(135deg, #a55eea, #8854d0);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(102, 126, 234, 0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">🚀</div><div style="font-size:18px;font-weight:bold">220%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Năng Suất Tăng</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">1.0x → 3.2x baseline</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Productivity Boost</div></div></div></div>
<table><thead><tr><th>Khía Cạnh</th><th>Phát Triển Truyền Thống</th><th>Phát Triển AI-Driven</th><th>Chuyển Đổi</th></tr></thead><tbody><tr><td><strong>Tốc Độ Phát Triển</strong></td><td>6-8 tháng</td><td>2-3 tháng</td><td>Nhanh hơn 3 lần</td></tr><tr><td><strong>Chất Lượng Code</strong></td><td>70% trung bình</td><td>90%+ trung bình</td><td>+20% chất lượng</td></tr><tr><td><strong>Tỷ Lệ Bug</strong></td><td>12-15%</td><td>4-6%</td><td>Giảm 60%</td></tr><tr><td><strong>Sự Hài Lòng Developer</strong></td><td>6.5/10</td><td>8.5/10</td><td>+30% sự hài lòng</td></tr><tr><td><strong>Thời Gian Ra Thị Trường</strong></td><td>12 tháng</td><td>4-6 tháng</td><td>Nhanh hơn 50-67%</td></tr><tr><td><strong>Chi Phí Phát Triển</strong></td><td>$500K</td><td>$300K</td><td>Tiết kiệm 40%</td></tr><tr><td><strong>Năng Suất Team</strong></td><td>1.0x cơ sở</td><td>3.2x cơ sở</td><td>Tăng 220%</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-roadmap-triển-khai-ai-dlc-cho-tổ-chức">🎯 <strong>Roadmap Triển Khai AI-DLC cho Tổ Chức</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#-roadmap-tri%E1%BB%83n-khai-ai-dlc-cho-t%E1%BB%95-ch%E1%BB%A9c" class="hash-link" aria-label="Đường dẫn trực tiếp đến -roadmap-triển-khai-ai-dlc-cho-tổ-chức" title="Đường dẫn trực tiếp đến -roadmap-triển-khai-ai-dlc-cho-tổ-chức" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="giai-đoạn-1-nền-tảng-0-3-tháng">Giai Đoạn 1: Nền Tảng (0-3 tháng)<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#giai-%C4%91o%E1%BA%A1n-1-n%E1%BB%81n-t%E1%BA%A3ng-0-3-th%C3%A1ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến Giai Đoạn 1: Nền Tảng (0-3 tháng)" title="Đường dẫn trực tiếp đến Giai Đoạn 1: Nền Tảng (0-3 tháng)" translate="no">​</a></h4>
<!-- -->
<ul>
<li class=""><strong>Đánh Giá</strong>: Đánh giá tình trạng hiện tại và mức độ sẵn sàng</li>
<li class=""><strong>Đào Tạo</strong>: Đào tạo chuyên sâu cho team</li>
<li class=""><strong>Cài Đặt</strong>: Triển khai công cụ AI và các biện pháp bảo mật</li>
<li class=""><strong>Thí Điểm</strong>: Test với 1 dự án nhỏ</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="giai-đoạn-2-mở-rộng-3-6-tháng">Giai Đoạn 2: Mở Rộng (3-6 tháng)<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#giai-%C4%91o%E1%BA%A1n-2-m%E1%BB%9F-r%E1%BB%99ng-3-6-th%C3%A1ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến Giai Đoạn 2: Mở Rộng (3-6 tháng)" title="Đường dẫn trực tiếp đến Giai Đoạn 2: Mở Rộng (3-6 tháng)" translate="no">​</a></h4>
<ul>
<li class=""><strong>Tăng Quy Mô</strong>: Áp dụng cho 3-5 dự án đồng thời</li>
<li class=""><strong>Tối Ưu</strong>: Tinh chỉnh quy trình làm việc và prompts</li>
<li class=""><strong>Đo Lường</strong>: Theo dõi số liệu và ROI</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="giai-đoạn-3-chuyển-đổi-6-12-tháng">Giai Đoạn 3: Chuyển Đổi (6-12 tháng)<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#giai-%C4%91o%E1%BA%A1n-3-chuy%E1%BB%83n-%C4%91%E1%BB%95i-6-12-th%C3%A1ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến Giai Đoạn 3: Chuyển Đổi (6-12 tháng)" title="Đường dẫn trực tiếp đến Giai Đoạn 3: Chuyển Đổi (6-12 tháng)" translate="no">​</a></h4>
<ul>
<li class=""><strong>Áp Dụng Toàn Diện</strong>: Toàn bộ tổ chức chuyển sang AI-DLC</li>
<li class=""><strong>Đổi Mới</strong>: Phát triển AI agents tùy chỉnh cho các tác vụ chuyên biệt</li>
<li class=""><strong>Lãnh Đạo</strong>: Trở thành người dẫn đầu ngành trong phát triển AI-driven</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-tác-động-kinh-doanh-dự-kiến">📊 <strong>Tác Động Kinh Doanh Dự Kiến</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#-t%C3%A1c-%C4%91%E1%BB%99ng-kinh-doanh-d%E1%BB%B1-ki%E1%BA%BFn" class="hash-link" aria-label="Đường dẫn trực tiếp đến -tác-động-kinh-doanh-dự-kiến" title="Đường dẫn trực tiếp đến -tác-động-kinh-doanh-dự-kiến" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="dự-báo-năm-đầu">Dự Báo Năm Đầu<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#d%E1%BB%B1-b%C3%A1o-n%C4%83m-%C4%91%E1%BA%A7u" class="hash-link" aria-label="Đường dẫn trực tiếp đến Dự Báo Năm Đầu" title="Đường dẫn trực tiếp đến Dự Báo Năm Đầu" translate="no">​</a></h4>
<div style="display:flex;flex-direction:column;gap:20px;padding:25px;background:linear-gradient(135deg, #f8f9fa, #e9ecef);border-radius:15px;border:1px solid #dee2e6;margin:20px 0"><h5 style="text-align:center;color:#495057;margin-bottom:15px">📊 Expected Business Impact - Year 1</h5><p style="text-align:center;color:#6c757d;font-size:14px;margin:0 0 10px 0">Những thay đổi tích cực khi áp dụng AI-DLC</p><div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(200px, 1fr));justify-content:center;gap:15px"><div style="background:linear-gradient(135deg, #667eea, #764ba2);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(17, 153, 142, 0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">🚀</div><div style="font-size:18px;font-weight:bold">+150%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Tốc Độ Development</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">10→25 features/tháng</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Nhanh hơn 2.5x</div></div><div style="background:linear-gradient(135deg, #f093fb, #f5576c);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(17, 153, 142, 0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">⭐</div><div style="font-size:18px;font-weight:bold">+22%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Chất Lượng Code</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">7.2/10→8.8/10</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Cải thiện rõ rệt</div></div><div style="background:linear-gradient(135deg, #4facfe, #00f2fe);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(17, 153, 142, 0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">🐛</div><div style="font-size:18px;font-weight:bold">-67%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Giảm Bug</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">15→5 lỗi/release</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Ít lỗi hơn 3x</div></div><div style="background:linear-gradient(135deg, #fa709a, #fee140);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(17, 153, 142, 0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">💼</div><div style="font-size:18px;font-weight:bold">+12%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Developer Retention</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">85%→95%</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Nhân viên ở lại lâu hơn</div></div><div style="background:linear-gradient(135deg, #a8edea,rgb(133, 224, 22));color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(17, 153, 142, 0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">😊</div><div style="font-size:18px;font-weight:bold">+21%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Khách Hàng Hài Lòng</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">7.5/10→9.1/10</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">Trải nghiệm tốt hơn</div></div><div style="background:linear-gradient(135deg, #ff9a9e, #fecfef);color:white;padding:18px 22px;border-radius:12px;text-align:center;min-width:140px;box-shadow:0 4px 8px rgba(17, 153, 142, 0.3);border:2px solid rgba(255,255,255,0.2);transform:scale(1);transition:transform 0.2s ease"><div style="font-size:24px;margin-bottom:8px">💰</div><div style="font-size:18px;font-weight:bold">+250%</div><div style="font-size:12px;opacity:0.9;margin-top:5px">Tăng Trưởng Doanh Thu</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">10%→35%/năm</div><div style="font-size:10px;margin-top:4px;background:rgba(255,255,255,0.2);padding:3px 8px;border-radius:6px;line-height:1.2">ROI ấn tượng</div></div></div></div>
<table><thead><tr><th>Chỉ Số</th><th>Hiện Tại</th><th>Mục Tiêu</th><th>Thay Đổi</th></tr></thead><tbody><tr><td><strong>Tốc Độ Làm Feature</strong></td><td>10 tính năng/tháng</td><td>25 tính năng/tháng</td><td>Tăng 150%</td></tr><tr><td><strong>Điểm Chất Lượng Code</strong></td><td>7.2/10</td><td>8.8/10</td><td>Tăng 22%</td></tr><tr><td><strong>Giảm Bug</strong></td><td>15 lỗi/lần release</td><td>5 lỗi/lần release</td><td>Giảm 67%</td></tr><tr><td><strong>Dev Ở Lại Công Ty</strong></td><td>85%</td><td>95%</td><td>Tăng 12%</td></tr><tr><td><strong>Khách Hàng Hài Lòng</strong></td><td>7.5/10</td><td>9.1/10</td><td>Tăng 21%</td></tr><tr><td><strong>Tăng Trưởng Doanh Thu</strong></td><td>10%/năm</td><td>35%/năm</td><td>Tăng 250%</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-hành-động-cụ-thể-cần-làm">🎯 <strong>Hành Động Cụ Thể Cần Làm</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#-h%C3%A0nh-%C4%91%E1%BB%99ng-c%E1%BB%A5-th%E1%BB%83-c%E1%BA%A7n-l%C3%A0m" class="hash-link" aria-label="Đường dẫn trực tiếp đến -hành-động-cụ-thể-cần-làm" title="Đường dẫn trực tiếp đến -hành-động-cụ-thể-cần-làm" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="dành-cho-developer">Dành Cho Developer<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#d%C3%A0nh-cho-developer" class="hash-link" aria-label="Đường dẫn trực tiếp đến Dành Cho Developer" title="Đường dẫn trực tiếp đến Dành Cho Developer" translate="no">​</a></h4>
<ol>
<li class=""><strong>Học các công cụ AI</strong>: Thành thạo ChatGPT, Cursor, GitHub Copilot</li>
<li class=""><strong>Thay đổi tư duy</strong>: Nghĩ AI-first, không chỉ là AI hỗ trợ</li>
<li class=""><strong>Xây dựng portfolio</strong>: Showcase các dự án làm bằng AI</li>
<li class=""><strong>Cập nhật liên tục</strong>: Theo dõi xu hướng AI mới nhất</li>
</ol>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="dành-cho-team-lead">Dành Cho Team Lead<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#d%C3%A0nh-cho-team-lead" class="hash-link" aria-label="Đường dẫn trực tiếp đến Dành Cho Team Lead" title="Đường dẫn trực tiếp đến Dành Cho Team Lead" translate="no">​</a></h4>
<ol>
<li class=""><strong>Đầu tư đào tạo</strong>: Dành ngân sách cho training AI tools</li>
<li class=""><strong>Cập nhật quy trình</strong>: Thiết kế lại workflow phù hợp với AI-DLC</li>
<li class=""><strong>Đo lường hiệu quả</strong>: Theo dõi năng suất và chất lượng</li>
<li class=""><strong>Dẫn đầu bằng ví dụ</strong>: Tự mình demo cách làm AI-first</li>
</ol>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="dành-cho-tổ-chức">Dành Cho Tổ Chức<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#d%C3%A0nh-cho-t%E1%BB%95-ch%E1%BB%A9c" class="hash-link" aria-label="Đường dẫn trực tiếp đến Dành Cho Tổ Chức" title="Đường dẫn trực tiếp đến Dành Cho Tổ Chức" translate="no">​</a></h4>
<ol>
<li class=""><strong>Đầu tư chiến lược</strong>: Phân bổ ngân sách cho chuyển đổi AI</li>
<li class=""><strong>Thay đổi văn hóa</strong>: Tạo văn hóa AI-first trong công ty</li>
<li class=""><strong>Quản lý rủi ro</strong>: Đảm bảo bảo mật và tuân thủ quy định</li>
<li class=""><strong>Tập trung đổi mới</strong>: Dùng tiền tiết kiệm từ AI để đầu tư innovation</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-tương-lai-đã-ở-đây">🌟 <strong>Tương Lai Đã Ở Đây</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#-t%C6%B0%C6%A1ng-lai-%C4%91%C3%A3-%E1%BB%9F-%C4%91%C3%A2y" class="hash-link" aria-label="Đường dẫn trực tiếp đến -tương-lai-đã-ở-đây" title="Đường dẫn trực tiếp đến -tương-lai-đã-ở-đây" translate="no">​</a></h3>
<p>Hãy bắt đầu hành trình phát triển phần mềm với AI ngay hôm nay! Đừng chỉ dùng AI như một công cụ, mà hãy thay đổi hoàn toàn cách làm việc. Đây chính là tương lai của nghề lập trình - nơi AI và con người làm việc cùng nhau như đồng đội thật sự để tạo ra những phần mềm tốt hơn, nhanh hơn và sáng tạo hơn.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>🚀 Bắt Đầu Ngay Hôm Nay</div><div class="admonitionContent_BuS1"><p><strong>3 Bước Đầu Tiên</strong>:</p><ol>
<li class=""><strong>Đăng ký Cursor AI</strong> và bắt đầu với project nhỏ</li>
<li class=""><strong>Setup ChatGPT</strong> cho requirements analysis</li>
<li class=""><strong>Thực hành AI-DLC workflow</strong> với team của bạn</li>
</ol><p><strong>Tương lai của phát triển phần mềm đã ở đây. Hãy bắt đầu hành trình của bạn ngay hôm nay!</strong></p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-tài-nguyên-học-tập-và-triển-khai">📚 <strong>Tài Nguyên Học Tập và Triển Khai</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#-t%C3%A0i-nguy%C3%AAn-h%E1%BB%8Dc-t%E1%BA%ADp-v%C3%A0-tri%E1%BB%83n-khai" class="hash-link" aria-label="Đường dẫn trực tiếp đến -tài-nguyên-học-tập-và-triển-khai" title="Đường dẫn trực tiếp đến -tài-nguyên-học-tập-và-triển-khai" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="essential-tools">Essential Tools<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#essential-tools" class="hash-link" aria-label="Đường dẫn trực tiếp đến Essential Tools" title="Đường dẫn trực tiếp đến Essential Tools" translate="no">​</a></h4>
<ul>
<li class=""><strong><a href="https://cursor.sh/" target="_blank" rel="noopener noreferrer" class="">Cursor AI</a></strong>: AI-powered code editor</li>
<li class=""><strong><a href="https://chat.openai.com/" target="_blank" rel="noopener noreferrer" class="">ChatGPT</a></strong>: Requirements analysis và design</li>
<li class=""><strong><a href="https://github.com/features/copilot" target="_blank" rel="noopener noreferrer" class="">GitHub Copilot</a></strong>: Code generation assistance</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="learning-resources">Learning Resources<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#learning-resources" class="hash-link" aria-label="Đường dẫn trực tiếp đến Learning Resources" title="Đường dẫn trực tiếp đến Learning Resources" translate="no">​</a></h4>
<ul>
<li class=""><strong><a href="https://aws.amazon.com/blogs/devops/ai-driven-development-life-cycle/" target="_blank" rel="noopener noreferrer" class="">AWS AI-DLC Guide</a></strong>: Official methodology</li>
<li class=""><strong><a href="https://cursor.sh/docs" target="_blank" rel="noopener noreferrer" class="">Cursor Documentation</a></strong>: Complete tool guide</li>
<li class=""><strong><a href="https://docs.google.com/document/d/ai-dev-practices" target="_blank" rel="noopener noreferrer" class="">AI Development Best Practices</a></strong>: Community guidelines</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="community--support">Community &amp; Support<a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#community--support" class="hash-link" aria-label="Đường dẫn trực tiếp đến Community &amp; Support" title="Đường dẫn trực tiếp đến Community &amp; Support" translate="no">​</a></h4>
<ul>
<li class=""><strong>Discord Communities</strong>: AI Developer communities</li>
<li class=""><strong>LinkedIn Groups</strong>: AI-Driven Development groups</li>
<li class=""><strong>YouTube Channels</strong>: Tutorial và case studies</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-cảm-ơn--kết-thúc-series">🎊 <strong>Cảm Ơn &amp; Kết Thúc Series</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#-c%E1%BA%A3m-%C6%A1n--k%E1%BA%BFt-th%C3%BAc-series" class="hash-link" aria-label="Đường dẫn trực tiếp đến -cảm-ơn--kết-thúc-series" title="Đường dẫn trực tiếp đến -cảm-ơn--kết-thúc-series" translate="no">​</a></h3>
<p>Cảm ơn bạn đã theo dõi toàn bộ series <strong>"Phát Triển Phần Mềm Được AI Dẫn Dắt"</strong>. Hy vọng những kiến thức và insight này sẽ giúp bạn transform cách làm việc và đạt được những thành tựu mới trong career.</p>
<p><strong>Nhớ nhé</strong>: AI-driven development không phải để thay thế lập trình viên, mà để giúp các lập trình viên tạo ra những điều tuyệt vời hơn.</p>
<p><strong>Chúc bạn thành công trên hành trình AI-driven development!</strong> 🚀</p>
<hr>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>📚 Xem Lại Toàn Bộ Series</div><div class="admonitionContent_BuS1"><p><strong>Phần 1</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-1">Giới Thiệu và Tác Động</a> - Hiểu về AI-DLC và tác động lên từng vai trò<br>
<strong>Phần 2</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-2">Công Cụ AI và Nghiên Cứu Tình Huống</a> - Thực hành với ChatGPT và Cursor<br>
<strong>Phần 3</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-3">Số Liệu, Kinh Nghiệm Thực Tế và Rủi Ro</a> - Metrics thực tế và risk management<br>
<strong>Phần 4</strong>: <a class="" href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4">Tương Lai và Kết Luận</a> - Vision và roadmap triển khai</p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-tài-liệu-tham-khảo">📚 <strong>Tài Liệu Tham Khảo</strong><a href="https://tiennhm.io.vn/blog/phat-trien-phan-mem-ai-driven-development-phan-4#-t%C3%A0i-li%E1%BB%87u-tham-kh%E1%BA%A3o" class="hash-link" aria-label="Đường dẫn trực tiếp đến -tài-liệu-tham-khảo" title="Đường dẫn trực tiếp đến -tài-liệu-tham-khảo" translate="no">​</a></h2>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="AI-DD" term="AI-DD"/>
        <category label="AI-DLC" term="AI-DLC"/>
        <category label="Tương lai AI" term="Tương lai AI"/>
        <category label="Autonomous Coding" term="Autonomous Coding"/>
        <category label="Natural Language Programming" term="Natural Language Programming"/>
        <category label="Kết luận" term="Kết luận"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Các thư viện UI phổ biến cho Angular - So sánh và đánh giá]]></title>
        <id>https://tiennhm.io.vn/blog/frontend-libraries-angular</id>
        <link href="https://tiennhm.io.vn/blog/frontend-libraries-angular"/>
        <updated>2025-08-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Tìm hiểu chi tiết về Bootstrap, Ant Design, PrimeNG, Material Design và Tailwind CSS cho Angular - ưu nhược điểm, cách sử dụng và so sánh hiệu suất.]]></summary>
        <content type="html"><![CDATA[<p align="right"><img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2FTienNHM.github.io%2Fblog%2Ffrontend-libraries-angular&amp;label=%E2%9A%AAView&amp;labelColor=%2337d67a&amp;countColor=%23555555&amp;style=flat&amp;labelStyle=upper" loading="lazy" decoding="async"></p>
<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p>Bài viết phân tích chi tiết 5 thư viện UI hàng đầu cho Angular: Bootstrap, Ant Design, PrimeNG, Material Design và Tailwind CSS. Mỗi thư viện được đánh giá về ưu nhược điểm, cách sử dụng, hiệu suất và phù hợp với từng loại dự án. Bài viết giúp developers đưa ra quyết định lựa chọn thư viện UI phù hợp dựa trên nhu cầu cụ thể của dự án, từ ứng dụng enterprise đến startup nhanh.</p></div></div>
<p>Trong bài viết này, mình sẽ phân tích chi tiết các thư viện UI phổ biến nhất cho Angular, giúp bạn đưa ra quyết định lựa chọn phù hợp cho dự án của mình.</p>
<p>Khi phát triển ứng dụng Angular, việc lựa chọn thư viện UI phù hợp là một quyết định quan trọng ảnh hưởng đến trải nghiệm người dùng, tốc độ phát triển và khả năng bảo trì. Với vô số lựa chọn có sẵn, việc hiểu rõ ưu nhược điểm của từng thư viện sẽ giúp bạn tối ưu hóa quy trình phát triển.</p>
<p>Trong bài viết này, chúng ta sẽ cùng phân tích sâu về 5 thư viện UI hàng đầu cho Angular: <strong>Bootstrap</strong>, <strong>Ant Design</strong>, <strong>PrimeNG</strong>, <strong>Material Design</strong> và <strong>Tailwind CSS</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bootstrap">1. Bootstrap - Thư viện UI phổ biến nhất<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#bootstrap" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1. Bootstrap - Thư viện UI phổ biến nhất" title="Đường dẫn trực tiếp đến 1. Bootstrap - Thư viện UI phổ biến nhất" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="khái-niệm-và-đặc-điểm">Khái niệm và đặc điểm<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#kh%C3%A1i-ni%E1%BB%87m-v%C3%A0-%C4%91%E1%BA%B7c-%C4%91i%E1%BB%83m" class="hash-link" aria-label="Đường dẫn trực tiếp đến Khái niệm và đặc điểm" title="Đường dẫn trực tiếp đến Khái niệm và đặc điểm" translate="no">​</a></h3>
<p>Bootstrap là một framework CSS front-end mã nguồn mở được phát triển bởi Twitter. Nó cung cấp hệ thống grid responsive, các component UI sẵn có và các utility class để xây dựng giao diện web hiện đại.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cài-đặt-và-tích-hợp-với-angular">Cài đặt và tích hợp với Angular<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#c%C3%A0i-%C4%91%E1%BA%B7t-v%C3%A0-t%C3%ADch-h%E1%BB%A3p-v%E1%BB%9Bi-angular" class="hash-link" aria-label="Đường dẫn trực tiếp đến Cài đặt và tích hợp với Angular" title="Đường dẫn trực tiếp đến Cài đặt và tích hợp với Angular" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Cài đặt Bootstrap</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> bootstrap @ng-bootstrap/ng-bootstrap</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Hoặc sử dụng Angular CLI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ng </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> @ng-bootstrap/ng-bootstrap</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cấu-hình-trong-angular">Cấu hình trong Angular<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#c%E1%BA%A5u-h%C3%ACnh-trong-angular" class="hash-link" aria-label="Đường dẫn trực tiếp đến Cấu hình trong Angular" title="Đường dẫn trực tiếp đến Cấu hình trong Angular" translate="no">​</a></h3>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// app.module.ts</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> NgbModule </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@ng-bootstrap/ng-bootstrap'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator at operator" style="color:#393A34">@</span><span class="token decorator function" style="color:#d73a49">NgModule</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  imports</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    NgbModule</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// ... other imports</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">AppModule</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ví-dụ-sử-dụng">Ví dụ sử dụng<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#v%C3%AD-d%E1%BB%A5-s%E1%BB%AD-d%E1%BB%A5ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến Ví dụ sử dụng" title="Đường dẫn trực tiếp đến Ví dụ sử dụng" translate="no">​</a></h3>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Component template --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">container</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">row</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">col-md-6</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">card</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">card-body</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">h5</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">card-title</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Card title</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">h5</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">card-text</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Some quick example text.</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">button</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">btn btn-primary</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Go somewhere</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">button</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ưu-điểm">Ưu điểm<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#%C6%B0u-%C4%91i%E1%BB%83m" class="hash-link" aria-label="Đường dẫn trực tiếp đến Ưu điểm" title="Đường dẫn trực tiếp đến Ưu điểm" translate="no">​</a></h3>
<ul>
<li class=""><strong>Phổ biến rộng rãi</strong>: Cộng đồng lớn, tài liệu phong phú</li>
<li class=""><strong>Responsive design</strong>: Hệ thống grid linh hoạt</li>
<li class=""><strong>Dễ học</strong>: Syntax đơn giản, logic trực quan</li>
<li class=""><strong>Tương thích tốt</strong>: Hoạt động trên mọi trình duyệt</li>
<li class=""><strong>Theme sẵn có</strong>: Nhiều theme miễn phí và trả phí</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nhược-điểm">Nhược điểm<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#nh%C6%B0%E1%BB%A3c-%C4%91i%E1%BB%83m" class="hash-link" aria-label="Đường dẫn trực tiếp đến Nhược điểm" title="Đường dẫn trực tiếp đến Nhược điểm" translate="no">​</a></h3>
<ul>
<li class=""><strong>Kích thước bundle</strong>: CSS và JS khá nặng</li>
<li class=""><strong>Tùy chỉnh hạn chế</strong>: Khó thay đổi thiết kế gốc</li>
<li class=""><strong>Look and feel</strong>: Giao diện "Bootstrap" dễ nhận biết</li>
<li class=""><strong>Performance</strong>: Có thể ảnh hưởng đến tốc độ tải trang</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="khi-nào-nên-sử-dụng">Khi nào nên sử dụng<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#khi-n%C3%A0o-n%C3%AAn-s%E1%BB%AD-d%E1%BB%A5ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến Khi nào nên sử dụng" title="Đường dẫn trực tiếp đến Khi nào nên sử dụng" translate="no">​</a></h3>
<ul>
<li class="">Dự án cần giao diện responsive nhanh</li>
<li class="">Team có kinh nghiệm với Bootstrap</li>
<li class="">Yêu cầu tương thích trình duyệt cao</li>
<li class="">Dự án có thời gian phát triển ngắn</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ant-design">2. Ant Design - Thiết kế doanh nghiệp<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#ant-design" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2. Ant Design - Thiết kế doanh nghiệp" title="Đường dẫn trực tiếp đến 2. Ant Design - Thiết kế doanh nghiệp" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="khái-niệm-và-đặc-điểm-1">Khái niệm và đặc điểm<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#kh%C3%A1i-ni%E1%BB%87m-v%C3%A0-%C4%91%E1%BA%B7c-%C4%91i%E1%BB%83m-1" class="hash-link" aria-label="Đường dẫn trực tiếp đến Khái niệm và đặc điểm" title="Đường dẫn trực tiếp đến Khái niệm và đặc điểm" translate="no">​</a></h3>
<p>Ant Design (antd) là một design system được phát triển bởi Alibaba, tập trung vào việc xây dựng giao diện doanh nghiệp với thiết kế đẹp và trải nghiệm người dùng tốt.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cài-đặt-và-tích-hợp">Cài đặt và tích hợp<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#c%C3%A0i-%C4%91%E1%BA%B7t-v%C3%A0-t%C3%ADch-h%E1%BB%A3p" class="hash-link" aria-label="Đường dẫn trực tiếp đến Cài đặt và tích hợp" title="Đường dẫn trực tiếp đến Cài đặt và tích hợp" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Cài đặt Ant Design</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> ng-zorro-antd</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Hoặc sử dụng Angular CLI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ng </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> ng-zorro-antd</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cấu-hình">Cấu hình<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#c%E1%BA%A5u-h%C3%ACnh" class="hash-link" aria-label="Đường dẫn trực tiếp đến Cấu hình" title="Đường dẫn trực tiếp đến Cấu hình" translate="no">​</a></h3>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// app.module.ts</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> NgZorroAntdModule </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ng-zorro-antd'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator at operator" style="color:#393A34">@</span><span class="token decorator function" style="color:#d73a49">NgModule</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  imports</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    NgZorroAntdModule</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// ... other imports</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">AppModule</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ví-dụ-sử-dụng-1">Ví dụ sử dụng<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#v%C3%AD-d%E1%BB%A5-s%E1%BB%AD-d%E1%BB%A5ng-1" class="hash-link" aria-label="Đường dẫn trực tiếp đến Ví dụ sử dụng" title="Đường dẫn trực tiếp đến Ví dụ sử dụng" translate="no">​</a></h3>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Component template --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">nz-card</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">nzTitle</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Card title</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">[nzExtra]</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">extraTemplate</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Card content</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Card content</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Card content</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">nz-card</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">ng-template</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">#extraTemplate</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">a</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">More</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">a</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">ng-template</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ưu-điểm-1">Ưu điểm<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#%C6%B0u-%C4%91i%E1%BB%83m-1" class="hash-link" aria-label="Đường dẫn trực tiếp đến Ưu điểm" title="Đường dẫn trực tiếp đến Ưu điểm" translate="no">​</a></h3>
<ul>
<li class=""><strong>Thiết kế đẹp</strong>: Giao diện hiện đại, chuyên nghiệp</li>
<li class=""><strong>Component phong phú</strong>: Hơn 60 component sẵn có</li>
<li class=""><strong>TypeScript support</strong>: Tích hợp tốt với Angular</li>
<li class=""><strong>Internationalization</strong>: Hỗ trợ đa ngôn ngữ</li>
<li class=""><strong>Accessibility</strong>: Tuân thủ tiêu chuẩn accessibility</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nhược-điểm-1">Nhược điểm<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#nh%C6%B0%E1%BB%A3c-%C4%91i%E1%BB%83m-1" class="hash-link" aria-label="Đường dẫn trực tiếp đến Nhược điểm" title="Đường dẫn trực tiếp đến Nhược điểm" translate="no">​</a></h3>
<ul>
<li class=""><strong>Learning curve</strong>: Cần thời gian học các component</li>
<li class=""><strong>Bundle size</strong>: Khá nặng do nhiều component</li>
<li class=""><strong>Customization</strong>: Khó tùy chỉnh sâu</li>
<li class=""><strong>Performance</strong>: Có thể ảnh hưởng đến hiệu suất</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="khi-nào-nên-sử-dụng-1">Khi nào nên sử dụng<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#khi-n%C3%A0o-n%C3%AAn-s%E1%BB%AD-d%E1%BB%A5ng-1" class="hash-link" aria-label="Đường dẫn trực tiếp đến Khi nào nên sử dụng" title="Đường dẫn trực tiếp đến Khi nào nên sử dụng" translate="no">​</a></h3>
<ul>
<li class="">Dự án doanh nghiệp cần giao diện chuyên nghiệp</li>
<li class="">Cần nhiều component phức tạp</li>
<li class="">Yêu cầu accessibility cao</li>
<li class="">Team có kinh nghiệm với React/Ant Design</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="primeng">3. PrimeNG - Thư viện UI toàn diện<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#primeng" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3. PrimeNG - Thư viện UI toàn diện" title="Đường dẫn trực tiếp đến 3. PrimeNG - Thư viện UI toàn diện" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="khái-niệm-và-đặc-điểm-2">Khái niệm và đặc điểm<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#kh%C3%A1i-ni%E1%BB%87m-v%C3%A0-%C4%91%E1%BA%B7c-%C4%91i%E1%BB%83m-2" class="hash-link" aria-label="Đường dẫn trực tiếp đến Khái niệm và đặc điểm" title="Đường dẫn trực tiếp đến Khái niệm và đặc điểm" translate="no">​</a></h3>
<p>PrimeNG là một thư viện UI component cho Angular với hơn 80 component, được thiết kế để xây dựng ứng dụng enterprise với giao diện đẹp và hiệu suất cao.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cài-đặt-và-tích-hợp-1">Cài đặt và tích hợp<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#c%C3%A0i-%C4%91%E1%BA%B7t-v%C3%A0-t%C3%ADch-h%E1%BB%A3p-1" class="hash-link" aria-label="Đường dẫn trực tiếp đến Cài đặt và tích hợp" title="Đường dẫn trực tiếp đến Cài đặt và tích hợp" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Cài đặt PrimeNG</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> primeng primeicons</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Hoặc sử dụng Angular CLI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ng </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> primeng</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cấu-hình-1">Cấu hình<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#c%E1%BA%A5u-h%C3%ACnh-1" class="hash-link" aria-label="Đường dẫn trực tiếp đến Cấu hình" title="Đường dẫn trực tiếp đến Cấu hình" translate="no">​</a></h3>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// app.module.ts</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> ButtonModule </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'primeng/button'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> CardModule </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'primeng/card'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator at operator" style="color:#393A34">@</span><span class="token decorator function" style="color:#d73a49">NgModule</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  imports</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ButtonModule</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    CardModule</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// ... other imports</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">AppModule</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ví-dụ-sử-dụng-2">Ví dụ sử dụng<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#v%C3%AD-d%E1%BB%A5-s%E1%BB%AD-d%E1%BB%A5ng-2" class="hash-link" aria-label="Đường dẫn trực tiếp đến Ví dụ sử dụng" title="Đường dẫn trực tiếp đến Ví dụ sử dụng" translate="no">​</a></h3>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Component template --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p-card</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">header</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Advanced Card</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">subheader</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Card Subheader</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">styleClass</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">w-20rem</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">ng-template</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">pTemplate</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">header</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">img</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">alt</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Card</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">https://picsum.photos/400/200</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">ng-template</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Lorem ipsum dolor sit amet, consectetur adipisicing elit.</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">ng-template</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">pTemplate</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">footer</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p-button</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">label</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Save</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">icon</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">pi pi-check</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p-button</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p-button</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">label</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Cancel</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">icon</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">pi pi-times</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">styleClass</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">p-button-secondary</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">[style]</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">{'margin-left': '.5em'}</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p-button</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">ng-template</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p-card</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ưu-điểm-2">Ưu điểm<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#%C6%B0u-%C4%91i%E1%BB%83m-2" class="hash-link" aria-label="Đường dẫn trực tiếp đến Ưu điểm" title="Đường dẫn trực tiếp đến Ưu điểm" translate="no">​</a></h3>
<ul>
<li class=""><strong>Component phong phú</strong>: Hơn 80 component sẵn có</li>
<li class=""><strong>Performance cao</strong>: Được tối ưu hóa cho Angular</li>
<li class=""><strong>Theme đa dạng</strong>: Nhiều theme có sẵn</li>
<li class=""><strong>TypeScript support</strong>: Tích hợp hoàn hảo với Angular</li>
<li class=""><strong>Documentation</strong>: Tài liệu chi tiết và ví dụ phong phú</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nhược-điểm-2">Nhược điểm<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#nh%C6%B0%E1%BB%A3c-%C4%91i%E1%BB%83m-2" class="hash-link" aria-label="Đường dẫn trực tiếp đến Nhược điểm" title="Đường dẫn trực tiếp đến Nhược điểm" translate="no">​</a></h3>
<ul>
<li class=""><strong>Bundle size</strong>: Rất nặng do nhiều component</li>
<li class=""><strong>Learning curve</strong>: Cần thời gian học các component</li>
<li class=""><strong>Customization</strong>: Khó tùy chỉnh sâu</li>
<li class=""><strong>Dependency</strong>: Phụ thuộc vào PrimeIcons</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="khi-nào-nên-sử-dụng-2">Khi nào nên sử dụng<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#khi-n%C3%A0o-n%C3%AAn-s%E1%BB%AD-d%E1%BB%A5ng-2" class="hash-link" aria-label="Đường dẫn trực tiếp đến Khi nào nên sử dụng" title="Đường dẫn trực tiếp đến Khi nào nên sử dụng" translate="no">​</a></h3>
<ul>
<li class="">Dự án enterprise cần nhiều component</li>
<li class="">Cần hiệu suất cao</li>
<li class="">Team có kinh nghiệm với PrimeNG</li>
<li class="">Dự án có yêu cầu UI phức tạp</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="material">4. Angular Material - Thiết kế Material Design<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#material" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4. Angular Material - Thiết kế Material Design" title="Đường dẫn trực tiếp đến 4. Angular Material - Thiết kế Material Design" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="khái-niệm-và-đặc-điểm-3">Khái niệm và đặc điểm<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#kh%C3%A1i-ni%E1%BB%87m-v%C3%A0-%C4%91%E1%BA%B7c-%C4%91i%E1%BB%83m-3" class="hash-link" aria-label="Đường dẫn trực tiếp đến Khái niệm và đặc �điểm" title="Đường dẫn trực tiếp đến Khái niệm và đặc điểm" translate="no">​</a></h3>
<p>Angular Material là thư viện UI component chính thức của Angular, được thiết kế theo Material Design guidelines của Google. Nó cung cấp các component đẹp, accessible và responsive.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cài-đặt-và-tích-hợp-2">Cài đặt và tích hợp<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#c%C3%A0i-%C4%91%E1%BA%B7t-v%C3%A0-t%C3%ADch-h%E1%BB%A3p-2" class="hash-link" aria-label="Đường dẫn trực tiếp đến Cài đặt và tích hợp" title="Đường dẫn trực tiếp đến Cài đặt và tích hợp" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Cài đặt Angular Material</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ng </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> @angular/material</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Hoặc cài đặt thủ công</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> @angular/material @angular/cdk @angular/animations</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cấu-hình-2">Cấu hình<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#c%E1%BA%A5u-h%C3%ACnh-2" class="hash-link" aria-label="Đường dẫn trực tiếp đến Cấu hình" title="Đường dẫn trực tiếp đến Cấu hình" translate="no">​</a></h3>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// app.module.ts</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> MatButtonModule </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@angular/material/button'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> MatCardModule </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@angular/material/card'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator at operator" style="color:#393A34">@</span><span class="token decorator function" style="color:#d73a49">NgModule</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  imports</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    MatButtonModule</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    MatCardModule</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// ... other imports</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">AppModule</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ví-dụ-sử-dụng-3">Ví dụ sử dụng<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#v%C3%AD-d%E1%BB%A5-s%E1%BB%AD-d%E1%BB%A5ng-3" class="hash-link" aria-label="Đường dẫn trực tiếp đến Ví dụ sử dụng" title="Đường dẫn trực tiếp đến Ví dụ sử dụng" translate="no">​</a></h3>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Component template --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">mat-card</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">example-card</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">mat-card-header</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">mat-card-avatar</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">example-header-image</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">mat-card-title</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Shiba Inu</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">mat-card-title</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">mat-card-subtitle</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Dog Breed</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">mat-card-subtitle</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">mat-card-header</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">img</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">mat-card-image</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">https://material.angular.io/assets/img/examples/shiba2.jpg</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">alt</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Photo of a Shiba Inu</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">mat-card-content</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      The Shiba Inu is the smallest of the six original and distinct spitz breeds of dog from Japan.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">mat-card-content</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">mat-card-actions</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">button</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">mat-button</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">LIKE</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">button</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">button</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">mat-button</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">SHARE</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">button</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">mat-card-actions</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">mat-card</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ưu-điểm-3">Ưu điểm<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#%C6%B0u-%C4%91i%E1%BB%83m-3" class="hash-link" aria-label="Đường dẫn trực tiếp đến Ưu điểm" title="Đường dẫn trực tiếp đến Ưu điểm" translate="no">​</a></h3>
<ul>
<li class=""><strong>Official support</strong>: Được hỗ trợ chính thức bởi Angular team</li>
<li class=""><strong>Material Design</strong>: Thiết kế đẹp, nhất quán</li>
<li class=""><strong>Accessibility</strong>: Tuân thủ tiêu chuẩn accessibility</li>
<li class=""><strong>TypeScript support</strong>: Tích hợp hoàn hảo với Angular</li>
<li class=""><strong>Performance</strong>: Được tối ưu hóa cho Angular</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nhược-điểm-3">Nhược điểm<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#nh%C6%B0%E1%BB%A3c-%C4%91i%E1%BB%83m-3" class="hash-link" aria-label="Đường dẫn trực tiếp đến Nhược điểm" title="Đường dẫn trực tiếp đến Nhược điểm" translate="no">​</a></h3>
<ul>
<li class=""><strong>Bundle size</strong>: Khá nặng</li>
<li class=""><strong>Customization</strong>: Khó tùy chỉnh sâu</li>
<li class=""><strong>Look and feel</strong>: Giao diện "Material" dễ nhận biết</li>
<li class=""><strong>Learning curve</strong>: Cần thời gian học các component</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="khi-nào-nên-sử-dụng-3">Khi nào nên sử dụng<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#khi-n%C3%A0o-n%C3%AAn-s%E1%BB%AD-d%E1%BB%A5ng-3" class="hash-link" aria-label="Đường dẫn trực tiếp đến Khi nào nên sử dụng" title="Đường dẫn trực tiếp đến Khi nào nên sử dụng" translate="no">​</a></h3>
<ul>
<li class="">Dự án cần thiết kế Material Design</li>
<li class="">Cần hỗ trợ chính thức từ Angular team</li>
<li class="">Yêu cầu accessibility cao</li>
<li class="">Team có kinh nghiệm với Angular</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tailwind">5. Tailwind CSS - Utility-first CSS framework<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#tailwind" class="hash-link" aria-label="Đường dẫn trực tiếp đến 5. Tailwind CSS - Utility-first CSS framework" title="Đường dẫn trực tiếp đến 5. Tailwind CSS - Utility-first CSS framework" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="khái-niệm-và-đặc-điểm-4">Khái niệm và đặc điểm<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#kh%C3%A1i-ni%E1%BB%87m-v%C3%A0-%C4%91%E1%BA%B7c-%C4%91i%E1%BB%83m-4" class="hash-link" aria-label="Đường dẫn trực tiếp đến Khái niệm và đặc điểm" title="Đường dẫn trực tiếp đến Khái niệm và đặc điểm" translate="no">​</a></h3>
<p>Tailwind CSS là một utility-first CSS framework cho phép bạn xây dựng giao diện bằng cách kết hợp các utility class có sẵn. Nó cung cấp tính linh hoạt cao và kiểm soát hoàn toàn về thiết kế.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cài-đặt-và-tích-hợp-3">Cài đặt và tích hợp<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#c%C3%A0i-%C4%91%E1%BA%B7t-v%C3%A0-t%C3%ADch-h%E1%BB%A3p-3" class="hash-link" aria-label="Đường dẫn trực tiếp đến Cài đặt và tích hợp" title="Đường dẫn trực tiếp đến Cài đặt và tích hợp" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Cài đặt Tailwind CSS</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-D</span><span class="token plain"> tailwindcss postcss autoprefixer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Khởi tạo cấu hình</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">npx tailwindcss init</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cấu-hình-3">Cấu hình<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#c%E1%BA%A5u-h%C3%ACnh-3" class="hash-link" aria-label="Đường dẫn trực tiếp đến Cấu hình" title="Đường dẫn trực tiếp đến Cấu hình" translate="no">​</a></h3>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// tailwind.config.js</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">module</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">exports</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">content</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"./src/**/*.{html,ts}"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">theme</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">extend</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/* styles.css */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@tailwind</span><span class="token atrule" style="color:#00a4db"> base</span><span class="token atrule punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@tailwind</span><span class="token atrule" style="color:#00a4db"> components</span><span class="token atrule punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@tailwind</span><span class="token atrule" style="color:#00a4db"> utilities</span><span class="token atrule punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ví-dụ-sử-dụng-4">Ví dụ sử dụng<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#v%C3%AD-d%E1%BB%A5-s%E1%BB%AD-d%E1%BB%A5ng-4" class="hash-link" aria-label="Đường dẫn trực tiếp đến Ví dụ sử dụng" title="Đường dẫn trực tiếp đến Ví dụ sử dụng" translate="no">​</a></h3>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Component template --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">max-w-sm rounded overflow-hidden shadow-lg</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">img</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">w-full</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">https://picsum.photos/400/200</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">alt</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Sunset in the mountains</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">px-6 py-4</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">font-bold text-xl mb-2</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">The Coldest Sunset</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">text-gray-700 text-base</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      Lorem ipsum dolor sit amet, consectetur adipisicing elit.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">px-6 pt-4 pb-2</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">span</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mr-2 mb-2</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">#photography</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">span</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">span</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mr-2 mb-2</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">#travel</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">span</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">span</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mr-2 mb-2</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">#winter</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">span</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ưu-điểm-4">Ưu điểm<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#%C6%B0u-%C4%91i%E1%BB%83m-4" class="hash-link" aria-label="Đường dẫn trực tiếp đến Ưu điểm" title="Đường dẫn trực tiếp đến Ưu điểm" translate="no">​</a></h3>
<ul>
<li class=""><strong>Utility-first</strong>: Kiểm soát hoàn toàn về thiết kế</li>
<li class=""><strong>Customizable</strong>: Dễ dàng tùy chỉnh theme</li>
<li class=""><strong>Performance</strong>: Chỉ include CSS cần thiết</li>
<li class=""><strong>Responsive</strong>: Hỗ trợ responsive design tốt</li>
<li class=""><strong>Modern</strong>: Sử dụng CSS Grid và Flexbox</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nhược-điểm-4">Nhược điểm<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#nh%C6%B0%E1%BB%A3c-%C4%91i%E1%BB%83m-4" class="hash-link" aria-label="Đường dẫn trực tiếp đến Nhược điểm" title="Đường dẫn trực tiếp đến Nhược điểm" translate="no">​</a></h3>
<ul>
<li class=""><strong>Learning curve</strong>: Cần thời gian học các utility class</li>
<li class=""><strong>HTML bloat</strong>: HTML có thể trở nên dài và khó đọc</li>
<li class=""><strong>Design skills</strong>: Cần kỹ năng thiết kế tốt</li>
<li class=""><strong>Component library</strong>: Không có component sẵn có</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="khi-nào-nên-sử-dụng-4">Khi nào nên sử dụng<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#khi-n%C3%A0o-n%C3%AAn-s%E1%BB%AD-d%E1%BB%A5ng-4" class="hash-link" aria-label="Đường dẫn trực tiếp đến Khi nào nên sử dụng" title="Đường dẫn trực tiếp đến Khi nào nên sử dụng" translate="no">​</a></h3>
<ul>
<li class="">Dự án cần thiết kế tùy chỉnh cao</li>
<li class="">Team có kỹ năng thiết kế tốt</li>
<li class="">Cần hiệu suất cao</li>
<li class="">Dự án có yêu cầu thiết kế độc đáo</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="comparison">So sánh hiệu suất và kích thước bundle<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#comparison" class="hash-link" aria-label="Đường dẫn trực tiếp đến So sánh hiệu suất và kích thước bundle" title="Đường dẫn trực tiếp đến So sánh hiệu suất và kích thước bundle" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="kích-thước-bundle-gzip">Kích thước bundle (gzip)<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#k%C3%ADch-th%C6%B0%E1%BB%9Bc-bundle-gzip" class="hash-link" aria-label="Đường dẫn trực tiếp đến Kích thước bundle (gzip)" title="Đường dẫn trực tiếp đến Kích thước bundle (gzip)" translate="no">​</a></h3>
<table><thead><tr><th>Thư viện</th><th>CSS (KB)</th><th>JS (KB)</th><th>Tổng (KB)</th></tr></thead><tbody><tr><td>Bootstrap</td><td>25</td><td>15</td><td>40</td></tr><tr><td>Ant Design</td><td>30</td><td>45</td><td>75</td></tr><tr><td>PrimeNG</td><td>35</td><td>60</td><td>95</td></tr><tr><td>Material</td><td>20</td><td>40</td><td>60</td></tr><tr><td>Tailwind</td><td>15</td><td>0</td><td>15</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hiệu-suất-tải-trang">Hiệu suất tải trang<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#hi%E1%BB%87u-su%E1%BA%A5t-t%E1%BA%A3i-trang" class="hash-link" aria-label="Đường dẫn trực tiếp đến Hiệu suất tải trang" title="Đường dẫn trực tiếp đến Hiệu suất tải trang" translate="no">​</a></h3>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Performance metrics</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> performanceMetrics </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  bootstrap</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    firstContentfulPaint</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1.2s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    largestContentfulPaint</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'2.1s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    timeToInteractive</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'2.8s'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  antDesign</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    firstContentfulPaint</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1.5s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    largestContentfulPaint</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'2.4s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    timeToInteractive</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'3.1s'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  primeng</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    firstContentfulPaint</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1.8s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    largestContentfulPaint</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'2.7s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    timeToInteractive</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'3.4s'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  material</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    firstContentfulPaint</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1.3s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    largestContentfulPaint</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'2.2s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    timeToInteractive</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'2.9s'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  tailwind</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    firstContentfulPaint</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'0.9s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    largestContentfulPaint</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1.6s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    timeToInteractive</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'2.1s'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="integration">Hướng dẫn tích hợp với Angular<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#integration" class="hash-link" aria-label="Đường dẫn trực tiếp đến Hướng dẫn tích hợp với Angular" title="Đường dẫn trực tiếp đến Hướng dẫn tích hợp với Angular" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cấu-hình-angular-cli">Cấu hình Angular CLI<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#c%E1%BA%A5u-h%C3%ACnh-angular-cli" class="hash-link" aria-label="Đường dẫn trực tiếp đến Cấu hình Angular CLI" title="Đường dẫn trực tiếp đến Cấu hình Angular CLI" translate="no">​</a></h3>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// angular.json</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"projects"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"your-app"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"architect"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"build"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"options"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"styles"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token string" style="color:#e3116c">"src/styles.css"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token string" style="color:#e3116c">"node_modules/bootstrap/dist/css/bootstrap.min.css"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"scripts"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token string" style="color:#e3116c">"node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="lazy-loading-components">Lazy loading components<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#lazy-loading-components" class="hash-link" aria-label="Đường dẫn trực tiếp đến Lazy loading components" title="Đường dẫn trực tiếp đến Lazy loading components" translate="no">​</a></h3>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Lazy load PrimeNG components</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> NgModule </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@angular/core'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> CommonModule </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@angular/common'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> ButtonModule </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'primeng/button'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator at operator" style="color:#393A34">@</span><span class="token decorator function" style="color:#d73a49">NgModule</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  imports</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    CommonModule</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ButtonModule</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  declarations</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">YourComponent</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  exports</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">YourComponent</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">FeatureModule</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="custom-theme-với-tailwind">Custom theme với Tailwind<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#custom-theme-v%E1%BB%9Bi-tailwind" class="hash-link" aria-label="Đường dẫn trực tiếp đến Custom theme với Tailwind" title="Đường dẫn trực tiếp đến Custom theme với Tailwind" translate="no">​</a></h3>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// tailwind.config.js</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">module</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">exports </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  content</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"./src/**/*.{html,ts}"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  theme</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    extend</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      colors</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        primary</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token number" style="color:#36acaa">50</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'#eff6ff'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token number" style="color:#36acaa">500</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'#3b82f6'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token number" style="color:#36acaa">900</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'#1e3a8a'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      fontFamily</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        sans</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'Inter'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'sans-serif'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices">Best practices và khuyến nghị<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#best-practices" class="hash-link" aria-label="Đường dẫn trực tiếp đến Best practices và khuyến nghị" title="Đường dẫn trực tiếp đến Best practices và khuyến nghị" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-lựa-chọn-thư-viện-phù-hợp">1. Lựa chọn thư viện phù hợp<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#1-l%E1%BB%B1a-ch%E1%BB%8Dn-th%C6%B0-vi%E1%BB%87n-ph%C3%B9-h%E1%BB%A3p" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1. Lựa chọn thư viện phù hợp" title="Đường dẫn trực tiếp đến 1. Lựa chọn thư viện phù hợp" translate="no">​</a></h3>
<ul>
<li class=""><strong>Dự án nhỏ, MVP</strong>: Bootstrap hoặc Tailwind</li>
<li class=""><strong>Dự án doanh nghiệp</strong>: Ant Design hoặc PrimeNG</li>
<li class=""><strong>Material Design</strong>: Angular Material</li>
<li class=""><strong>Tùy chỉnh cao</strong>: Tailwind CSS</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-tối-ưu-hóa-bundle-size">2. Tối ưu hóa bundle size<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#2-t%E1%BB%91i-%C6%B0u-h%C3%B3a-bundle-size" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2. Tối ưu hóa bundle size" title="Đường dẫn trực tiếp đến 2. Tối ưu hóa bundle size" translate="no">​</a></h3>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Tree shaking với Angular Material</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> MatButtonModule </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@angular/material/button'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> MatCardModule </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@angular/material/card'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Thay vì import toàn bộ</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// import { MatModule } from '@angular/material';</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-responsive-design">3. Responsive design<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#3-responsive-design" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3. Responsive design" title="Đường dẫn trực tiếp đến 3. Responsive design" translate="no">​</a></h3>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Bootstrap responsive classes --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">col-12 col-md-6 col-lg-4</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Content --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Tailwind responsive utilities --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">w-full md:w-1/2 lg:w-1/3</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Content --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-accessibility">4. Accessibility<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#4-accessibility" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4. Accessibility" title="Đường dẫn trực tiếp đến 4. Accessibility" translate="no">​</a></h3>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Angular Material accessibility --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">button</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">mat-raised-button</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">color</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">primary</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">aria-label</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Submit form</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Submit</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">button</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Bootstrap accessibility --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">button</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">btn btn-primary</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">aria-label</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Submit form</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Submit</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">button</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Kết luận<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#conclusion" class="hash-link" aria-label="Đường dẫn trực tiếp đến Kết luận" title="Đường dẫn trực tiếp đến Kết luận" translate="no">​</a></h2>
<p>Việc lựa chọn thư viện UI phù hợp cho Angular phụ thuộc vào nhiều yếu tố:</p>
<ul>
<li class=""><strong>Yêu cầu dự án</strong>: Giao diện đơn giản hay phức tạp</li>
<li class=""><strong>Kỹ năng team</strong>: Kinh nghiệm với thư viện nào</li>
<li class=""><strong>Performance</strong>: Yêu cầu về tốc độ tải trang</li>
<li class=""><strong>Customization</strong>: Mức độ tùy chỉnh cần thiết</li>
<li class=""><strong>Maintenance</strong>: Khả năng bảo trì dài hạn</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="khuyến-nghị-chung">Khuyến nghị chung<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#khuy%E1%BA%BFn-ngh%E1%BB%8B-chung" class="hash-link" aria-label="Đường dẫn trực tiếp đến Khuyến nghị chung" title="Đường dẫn trực tiếp đến Khuyến nghị chung" translate="no">​</a></h3>
<ol>
<li class=""><strong>Bootstrap</strong>: Lựa chọn an toàn cho dự án nhỏ và MVP</li>
<li class=""><strong>Ant Design</strong>: Phù hợp cho ứng dụng doanh nghiệp</li>
<li class=""><strong>PrimeNG</strong>: Tốt cho dự án cần nhiều component</li>
<li class=""><strong>Angular Material</strong>: Lý tưởng cho thiết kế Material Design</li>
<li class=""><strong>Tailwind CSS</strong>: Tuyệt vời cho dự án cần tùy chỉnh cao</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="tài-liệu-tham-khảo">Tài liệu tham khảo<a href="https://tiennhm.io.vn/blog/frontend-libraries-angular#t%C3%A0i-li%E1%BB%87u-tham-kh%E1%BA%A3o" class="hash-link" aria-label="Đường dẫn trực tiếp đến Tài liệu tham kh�ảo" title="Đường dẫn trực tiếp đến Tài liệu tham khảo" translate="no">​</a></h3>
<ul>
<li class=""><a href="https://getbootstrap.com/docs/" target="_blank" rel="noopener noreferrer" class="">Bootstrap Documentation</a></li>
<li class=""><a href="https://ng.ant.design/docs/introduce/en" target="_blank" rel="noopener noreferrer" class="">Ant Design for Angular</a></li>
<li class=""><a href="https://primefaces.org/primeng/" target="_blank" rel="noopener noreferrer" class="">PrimeNG Documentation</a></li>
<li class=""><a href="https://material.angular.io/" target="_blank" rel="noopener noreferrer" class="">Angular Material</a></li>
<li class=""><a href="https://tailwindcss.com/docs" target="_blank" rel="noopener noreferrer" class="">Tailwind CSS Documentation</a></li>
</ul>
<hr>
<p><em>Bài viết này được cập nhật lần cuối vào tháng 8/2025. Nếu bạn có câu hỏi hoặc góp ý, hãy để lại comment bên dưới!</em></p>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="angular" term="angular"/>
        <category label="frontend" term="frontend"/>
        <category label="ui-libraries" term="ui-libraries"/>
        <category label="bootstrap" term="bootstrap"/>
        <category label="ant-design" term="ant-design"/>
        <category label="primeng" term="primeng"/>
        <category label="material-design" term="material-design"/>
        <category label="tailwind" term="tailwind"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Giới thiệu RabbitMQ - Message Broker mạnh mẽ]]></title>
        <id>https://tiennhm.io.vn/blog/introduction-to-rabbitmq</id>
        <link href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq"/>
        <updated>2025-08-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Tìm hiểu về RabbitMQ, một message broker phổ biến trong kiến trúc microservices. Bài viết bao gồm khái niệm cơ bản, cài đặt và ví dụ thực tế với .NET 8.]]></summary>
        <content type="html"><![CDATA[<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p>RabbitMQ là một open-source message broker phổ biến trong kiến trúc microservices, hỗ trợ nhiều messaging protocols như AMQP, MQTT, STOMP. Bài viết giới thiệu khái niệm cơ bản (Producer, Consumer, Queue, Exchange), cách cài đặt RabbitMQ, và ví dụ thực tế với .NET 8 để gửi/nhận messages. RabbitMQ giúp giải quyết các vấn đề về decoupling, scalability và reliability trong distributed systems.</p></div></div>
<p>RabbitMQ là một trong những message broker phổ biến nhất trong thế giới phát triển phần mềm hiện đại. Trong bài viết này, chúng ta sẽ tìm hiểu về RabbitMQ và cách sử dụng nó trong ứng dụng .NET 8.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="rabbitmq-là-gì">RabbitMQ là gì?<a href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq#rabbitmq-l%C3%A0-g%C3%AC" class="hash-link" aria-label="Đường dẫn trực tiếp đến RabbitMQ là gì?" title="Đường dẫn trực tiếp đến RabbitMQ là gì?" translate="no">​</a></h2>
<p>RabbitMQ là một open-source message broker (còn gọi là message queue) được phát triển bởi Rabbit Technologies. Nó hỗ trợ nhiều messaging protocols như AMQP, MQTT, STOMP và HTTP thông qua các plugins.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="các-khái-niệm-cơ-bản">Các khái niệm cơ bản<a href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq#c%C3%A1c-kh%C3%A1i-ni%E1%BB%87m-c%C6%A1-b%E1%BA%A3n" class="hash-link" aria-label="Đường dẫn trực tiếp đến Các khái niệm cơ bản" title="Đường dẫn trực tiếp đến Các khái niệm cơ bản" translate="no">​</a></h3>
<ul>
<li class=""><strong>Producer</strong>: Ứng dụng gửi message</li>
<li class=""><strong>Consumer</strong>: Ứng dụng nhận và xử lý message</li>
<li class=""><strong>Queue</strong>: Nơi lưu trữ message</li>
<li class=""><strong>Exchange</strong>: Nhận message từ producer và định tuyến đến queue</li>
<li class=""><strong>Binding</strong>: Quy tắc kết nối exchange với queue</li>
<li class=""><strong>Routing Key</strong>: Khóa để exchange định tuyến message</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cài-đặt-rabbitmq">Cài đặt RabbitMQ<a href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq#c%C3%A0i-%C4%91%E1%BA%B7t-rabbitmq" class="hash-link" aria-label="Đường dẫn trực tiếp đến Cài đặt RabbitMQ" title="Đường dẫn trực tiếp đến Cài đặt RabbitMQ" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sử-dụng-docker-khuyến-nghị">Sử dụng Docker (Khuyến nghị)<a href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq#s%E1%BB%AD-d%E1%BB%A5ng-docker-khuy%E1%BA%BFn-ngh%E1%BB%8B" class="hash-link" aria-label="Đường dẫn trực tiếp đến Sử dụng Docker (Khuyến nghị)" title="Đường dẫn trực tiếp đến Sử dụng Docker (Khuyến nghị)" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> run </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> rabbitmq </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5672</span><span class="token plain">:5672 </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">15672</span><span class="token plain">:15672 rabbitmq:3-management</span><br></span></code></pre></div></div>
<p>Sau khi chạy, bạn có thể truy cập RabbitMQ Management UI tại: <code>http://localhost:15672</code> (username/password: guest/guest)</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cài-đặt-trực-tiếp">Cài đặt trực tiếp<a href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq#c%C3%A0i-%C4%91%E1%BA%B7t-tr%E1%BB%B1c-ti%E1%BA%BFp" class="hash-link" aria-label="Đường dẫn trực tiếp đến Cài đặt trực tiếp" title="Đường dẫn trực tiếp đến Cài đặt trực tiếp" translate="no">​</a></h3>
<p>Tải và cài đặt từ <a href="https://www.rabbitmq.com/download.html" target="_blank" rel="noopener noreferrer" class="">rabbitmq.com</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ví-dụ-ứng-dụng-net-8">Ví dụ ứng dụng .NET 8<a href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq#v%C3%AD-d%E1%BB%A5-%E1%BB%A9ng-d%E1%BB%A5ng-net-8" class="hash-link" aria-label="Đường dẫn trực tiếp đến Ví dụ ứng dụng .NET 8" title="Đường dẫn trực tiếp đến Ví dụ ứng dụng .NET 8" translate="no">​</a></h2>
<p>Chúng ta sẽ tạo một ứng dụng đơn giản để gửi và nhận message qua RabbitMQ.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-tạo-project-net-8">1. Tạo project .NET 8<a href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq#1-t%E1%BA%A1o-project-net-8" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1. Tạo project .NET 8" title="Đường dẫn trực tiếp đến 1. Tạo project .NET 8" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">dotnet new console </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> RabbitMQDemo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> RabbitMQDemo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dotnet </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> package RabbitMQ.Client</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-tạo-producer-ứng-dụng-gửi-message">2. Tạo Producer (Ứng dụng gửi message)<a href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq#2-t%E1%BA%A1o-producer-%E1%BB%A9ng-d%E1%BB%A5ng-g%E1%BB%ADi-message" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2. Tạo Producer (Ứng dụng gửi message)" title="Đường dẫn trực tiếp đến 2. Tạo Producer (Ứng dụng gửi message)" translate="no">​</a></h3>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">RabbitMQ</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Client</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">System</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Text</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">Producer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token class-name punctuation" style="color:#393A34">[</span><span class="token class-name punctuation" style="color:#393A34">]</span><span class="token plain"> args</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Kết nối đến RabbitMQ</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> factory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">ConnectionFactory</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            HostName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"localhost"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            UserName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"guest"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Password </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"guest"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> connection </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> factory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">CreateConnection</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> channel </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> connection</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">CreateModel</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Khai báo queue</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token plain"> queueName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"hello"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">QueueDeclare</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token named-parameter punctuation" style="color:#393A34">queue</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> queueName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token named-parameter punctuation" style="color:#393A34">durable</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token named-parameter punctuation" style="color:#393A34">exclusive</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token named-parameter punctuation" style="color:#393A34">autoDelete</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token named-parameter punctuation" style="color:#393A34">arguments</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WriteLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Nhập message để gửi (nhập 'quit' để thoát):"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> message </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ReadLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">message</span><span class="token punctuation" style="color:#393A34">?.</span><span class="token function" style="color:#d73a49">ToLower</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"quit"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">break</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token keyword" style="color:#00009f">string</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">IsNullOrEmpty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> body </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Encoding</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">UTF8</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetBytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">BasicPublish</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token named-parameter punctuation" style="color:#393A34">exchange</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token named-parameter punctuation" style="color:#393A34">routingKey</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> queueName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token named-parameter punctuation" style="color:#393A34">basicProperties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token named-parameter punctuation" style="color:#393A34">body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WriteLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token interpolation-string string" style="color:#e3116c">$"Đã gửi: </span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">{</span><span class="token interpolation-string interpolation expression language-csharp">message</span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">}</span><span class="token interpolation-string string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-tạo-consumer-ứng-dụng-nhận-message">3. Tạo Consumer (Ứng dụng nhận message)<a href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq#3-t%E1%BA%A1o-consumer-%E1%BB%A9ng-d%E1%BB%A5ng-nh%E1%BA%ADn-message" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3. Tạo Consumer (Ứng dụng nhận message)" title="Đường dẫn trực tiếp đến 3. Tạo Consumer (Ứng dụng nhận message)" translate="no">​</a></h3>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">RabbitMQ</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Client</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">RabbitMQ</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Client</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Events</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">System</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Text</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">Consumer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token class-name punctuation" style="color:#393A34">[</span><span class="token class-name punctuation" style="color:#393A34">]</span><span class="token plain"> args</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Kết nối đến RabbitMQ</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> factory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">ConnectionFactory</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            HostName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"localhost"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            UserName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"guest"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Password </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"guest"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> connection </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> factory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">CreateConnection</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> channel </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> connection</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">CreateModel</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Khai báo queue</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token plain"> queueName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"hello"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">QueueDeclare</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token named-parameter punctuation" style="color:#393A34">queue</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> queueName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token named-parameter punctuation" style="color:#393A34">durable</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token named-parameter punctuation" style="color:#393A34">exclusive</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token named-parameter punctuation" style="color:#393A34">autoDelete</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token named-parameter punctuation" style="color:#393A34">arguments</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WriteLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Đang chờ message..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Tạo consumer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> consumer </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">EventingBasicConsumer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">channel</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        consumer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Received </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">model</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ea</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> body </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ea</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Body</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ToArray</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> message </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Encoding</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">UTF8</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">body</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WriteLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token interpolation-string string" style="color:#e3116c">$"Nhận được: </span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">{</span><span class="token interpolation-string interpolation expression language-csharp">message</span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">}</span><span class="token interpolation-string string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// Xác nhận đã xử lý message</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">BasicAck</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ea</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">DeliveryTag</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Bắt đầu nhận message</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">BasicConsume</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token named-parameter punctuation" style="color:#393A34">queue</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> queueName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token named-parameter punctuation" style="color:#393A34">autoAck</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token named-parameter punctuation" style="color:#393A34">consumer</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> consumer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WriteLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Nhấn Enter để thoát"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ReadLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-sử-dụng-exchange-và-routing">4. Sử dụng Exchange và Routing<a href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq#4-s%E1%BB%AD-d%E1%BB%A5ng-exchange-v%C3%A0-routing" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4. Sử dụng Exchange và Routing" title="Đường dẫn trực tiếp đến 4. Sử dụng Exchange và Routing" translate="no">​</a></h3>
<p>Đây là ví dụ nâng cao sử dụng Exchange với routing key:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">RabbitMQ</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Client</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">System</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Text</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">AdvancedProducer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token class-name punctuation" style="color:#393A34">[</span><span class="token class-name punctuation" style="color:#393A34">]</span><span class="token plain"> args</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> factory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">ConnectionFactory</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> HostName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"localhost"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> connection </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> factory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">CreateConnection</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> channel </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> connection</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">CreateModel</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Khai báo exchange</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token plain"> exchangeName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"logs"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ExchangeDeclare</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token named-parameter punctuation" style="color:#393A34">exchange</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> exchangeName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token named-parameter punctuation" style="color:#393A34">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ExchangeType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Direct</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Khai báo queues</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> queueNames </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"error"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"warning"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"info"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> queueName </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> queueNames</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">QueueDeclare</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">queueName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">QueueBind</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">queueName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> exchangeName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> queueName</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WriteLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Nhập message theo format 'level:message' (ví dụ: error:Database connection failed)"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WriteLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Levels: error, warning, info"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ReadLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">input</span><span class="token punctuation" style="color:#393A34">?.</span><span class="token function" style="color:#d73a49">ToLower</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"quit"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">break</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">input</span><span class="token punctuation" style="color:#393A34">?.</span><span class="token function" style="color:#d73a49">Contains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token char">':'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> parts </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Split</span><span class="token punctuation" style="color:#393A34">(</span><span class="token char">':'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> level </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> parts</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Trim</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ToLower</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> message </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> parts</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Trim</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">queueNames</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Contains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">level</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> body </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Encoding</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">UTF8</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetBytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">BasicPublish</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token named-parameter punctuation" style="color:#393A34">exchange</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> exchangeName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token named-parameter punctuation" style="color:#393A34">routingKey</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> level</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token named-parameter punctuation" style="color:#393A34">basicProperties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token named-parameter punctuation" style="color:#393A34">body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WriteLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token interpolation-string string" style="color:#e3116c">$"Đã gửi </span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">{</span><span class="token interpolation-string interpolation expression language-csharp">level</span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">}</span><span class="token interpolation-string string" style="color:#e3116c">: </span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">{</span><span class="token interpolation-string interpolation expression language-csharp">message</span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">}</span><span class="token interpolation-string string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WriteLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token interpolation-string string" style="color:#e3116c">$"Level không hợp lệ: </span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">{</span><span class="token interpolation-string interpolation expression language-csharp">level</span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">}</span><span class="token interpolation-string string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-consumer-cho-từng-loại-message">5. Consumer cho từng loại message<a href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq#5-consumer-cho-t%E1%BB%ABng-lo%E1%BA%A1i-message" class="hash-link" aria-label="Đường dẫn trực tiếp đến 5. Consumer cho từng loại message" title="Đường dẫn trực tiếp đến 5. Consumer cho từng loại message" translate="no">​</a></h3>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">RabbitMQ</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Client</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">RabbitMQ</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Client</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Events</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">System</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Text</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">AdvancedConsumer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token class-name punctuation" style="color:#393A34">[</span><span class="token class-name punctuation" style="color:#393A34">]</span><span class="token plain"> args</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WriteLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Chọn level để nhận message (error/warning/info):"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> level </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ReadLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">?.</span><span class="token function" style="color:#d73a49">Trim</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ToLower</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">string</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">IsNullOrEmpty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">level</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token keyword" style="color:#00009f">new</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"error"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"warning"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"info"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Contains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">level</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WriteLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Level không hợp lệ!"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> factory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">ConnectionFactory</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> HostName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"localhost"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> connection </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> factory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">CreateConnection</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> channel </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> connection</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">CreateModel</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Khai báo exchange</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token plain"> exchangeName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"logs"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ExchangeDeclare</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token named-parameter punctuation" style="color:#393A34">exchange</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> exchangeName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token named-parameter punctuation" style="color:#393A34">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ExchangeType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Direct</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Khai báo queue</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">QueueDeclare</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">level</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">QueueBind</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">level</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> exchangeName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> level</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WriteLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token interpolation-string string" style="color:#e3116c">$"Đang chờ </span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">{</span><span class="token interpolation-string interpolation expression language-csharp">level</span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">}</span><span class="token interpolation-string string" style="color:#e3116c"> messages..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> consumer </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">EventingBasicConsumer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">channel</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        consumer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Received </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">model</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ea</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> body </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ea</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Body</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ToArray</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> message </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Encoding</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">UTF8</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">body</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WriteLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token interpolation-string string" style="color:#e3116c">$"[</span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">{</span><span class="token interpolation-string interpolation expression language-csharp">level</span><span class="token interpolation-string interpolation expression language-csharp punctuation" style="color:#393A34">.</span><span class="token interpolation-string interpolation expression language-csharp function" style="color:#d73a49">ToUpper</span><span class="token interpolation-string interpolation expression language-csharp punctuation" style="color:#393A34">(</span><span class="token interpolation-string interpolation expression language-csharp punctuation" style="color:#393A34">)</span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">}</span><span class="token interpolation-string string" style="color:#e3116c">] </span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">{</span><span class="token interpolation-string interpolation expression language-csharp">message</span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">}</span><span class="token interpolation-string string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">BasicAck</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ea</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">DeliveryTag</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">BasicConsume</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">level</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> consumer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WriteLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Nhấn Enter để thoát"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ReadLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="các-tính-năng-nâng-cao">Các tính năng nâng cao<a href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq#c%C3%A1c-t%C3%ADnh-n%C4%83ng-n%C3%A2ng-cao" class="hash-link" aria-label="Đường dẫn trực tiếp đến Các tính năng nâng cao" title="Đường dẫn trực tiếp đến Các tính năng nâng cao" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-message-persistence">1. Message Persistence<a href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq#1-message-persistence" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1. Message Persistence" title="Đường dẫn trực tiếp đến 1. Message Persistence" translate="no">​</a></h3>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Đảm bảo queue và message được lưu trữ</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">QueueDeclare</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token named-parameter punctuation" style="color:#393A34">queue</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"persistent-queue"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token named-parameter punctuation" style="color:#393A34">durable</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Queue sẽ được lưu trữ</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    exclusive</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token named-parameter punctuation" style="color:#393A34">autoDelete</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token named-parameter punctuation" style="color:#393A34">arguments</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Đảm bảo message được lưu trữ</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> properties </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">CreateBasicProperties</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">properties</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Persistent </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">BasicPublish</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token named-parameter punctuation" style="color:#393A34">exchange</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token named-parameter punctuation" style="color:#393A34">routingKey</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"persistent-queue"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token named-parameter punctuation" style="color:#393A34">basicProperties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> properties</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token named-parameter punctuation" style="color:#393A34">body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-acknowledgment">2. Acknowledgment<a href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq#2-acknowledgment" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2. Acknowledgment" title="Đường dẫn trực tiếp đến 2. Acknowledgment" translate="no">​</a></h3>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Tắt auto-ack để xử lý thủ công</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">BasicConsume</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token named-parameter punctuation" style="color:#393A34">queue</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"queue-name"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token named-parameter punctuation" style="color:#393A34">autoAck</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Tắt auto-ack</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    consumer</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> consumer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Xác nhận message đã được xử lý thành công</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">BasicAck</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">deliveryTag</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Hoặc từ chối message</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">BasicNack</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">deliveryTag</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// true = requeue</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-dead-letter-exchange">3. Dead Letter Exchange<a href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq#3-dead-letter-exchange" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3. Dead Letter Exchange" title="Đường dẫn trực tiếp đến 3. Dead Letter Exchange" translate="no">​</a></h3>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Khai báo dead letter exchange</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ExchangeDeclare</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"dlx"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ExchangeType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Direct</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Khai báo queue với dead letter exchange</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> arguments </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">Dictionary</span><span class="token constructor-invocation class-name punctuation" style="color:#393A34">&lt;</span><span class="token constructor-invocation class-name keyword" style="color:#00009f">string</span><span class="token constructor-invocation class-name punctuation" style="color:#393A34">,</span><span class="token constructor-invocation class-name"> </span><span class="token constructor-invocation class-name keyword" style="color:#00009f">object</span><span class="token constructor-invocation class-name punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"x-dead-letter-exchange"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"dlx"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"x-dead-letter-routing-key"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"failed"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">QueueDeclare</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token named-parameter punctuation" style="color:#393A34">queue</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"main-queue"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token named-parameter punctuation" style="color:#393A34">durable</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token named-parameter punctuation" style="color:#393A34">exclusive</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token named-parameter punctuation" style="color:#393A34">autoDelete</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token named-parameter punctuation" style="color:#393A34">arguments</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> arguments</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lợi-ích-của-rabbitmq">Lợi ích của RabbitMQ<a href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq#l%E1%BB%A3i-%C3%ADch-c%E1%BB%A7a-rabbitmq" class="hash-link" aria-label="Đường dẫn trực tiếp đến Lợi ích của RabbitMQ" title="Đường dẫn trực tiếp đến Lợi ích của RabbitMQ" translate="no">​</a></h2>
<ol>
<li class=""><strong>Độ tin cậy cao</strong>: Hỗ trợ message persistence và acknowledgment</li>
<li class=""><strong>Hiệu suất tốt</strong>: Xử lý hàng nghìn message mỗi giây</li>
<li class=""><strong>Linh hoạt</strong>: Hỗ trợ nhiều messaging patterns</li>
<li class=""><strong>Khả năng mở rộng</strong>: Dễ dàng thêm producer/consumer</li>
<li class=""><strong>Monitoring</strong>: Cung cấp web UI để quản lý</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kết-luận">Kết luận<a href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq#k%E1%BA%BFt-lu%E1%BA%ADn" class="hash-link" aria-label="Đường dẫn trực tiếp đến Kết luận" title="Đường dẫn trực tiếp đến Kết luận" translate="no">​</a></h2>
<p>RabbitMQ là một công cụ mạnh mẽ cho việc xây dựng kiến trúc microservices và xử lý message bất đồng bộ. Với .NET 8, việc tích hợp RabbitMQ trở nên đơn giản và hiệu quả hơn bao giờ hết.</p>
<p>Trong bài viết này, chúng ta đã tìm hiểu:</p>
<ul>
<li class="">Khái niệm cơ bản về RabbitMQ</li>
<li class="">Cách cài đặt và sử dụng</li>
<li class="">Ví dụ thực tế với .NET 8</li>
<li class="">Các tính năng nâng cao</li>
</ul>
<p>Để tìm hiểu thêm, bạn có thể tham khảo:</p>
<ul>
<li class=""><a href="https://www.rabbitmq.com/documentation.html" target="_blank" rel="noopener noreferrer" class="">RabbitMQ Documentation</a></li>
<li class=""><a href="https://github.com/rabbitmq/rabbitmq-dotnet-client" target="_blank" rel="noopener noreferrer" class="">RabbitMQ .NET Client</a></li>
<li class=""><a href="https://www.amqp.org/" target="_blank" rel="noopener noreferrer" class="">AMQP Protocol</a></li>
</ul>
<p>Trên đây là một số ví dụ cơ bản về RabbitMQ và cách sử dụng nó trong ứng dụng .NET 8, hy vọng bạn thấy hữu ích.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-source-code-mẫu">🚀 Source Code Mẫu<a href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq#-source-code-m%E1%BA%ABu" class="hash-link" aria-label="Đường dẫn trực tiếp đến 🚀 Source Code Mẫu" title="Đường dẫn trực tiếp đến 🚀 Source Code Mẫu" translate="no">​</a></h2>
<p>Để xem và chạy code mẫu hoàn chỉnh, hãy truy cập: <a href="https://github.com/TienNHM/rabbitmq-demo-net8" target="_blank" rel="noopener noreferrer" class="">GitHub Repository</a></p>
<p>Repository bao gồm:</p>
<ul>
<li class=""><strong>Simple Producer/Consumer</strong>: Ví dụ cơ bản gửi/nhận message</li>
<li class=""><strong>Advanced Producer/Consumer</strong>: Sử dụng Exchange với routing</li>
<li class=""><strong>Shared Library</strong>: Các class và utility chung</li>
<li class=""><strong>Hướng dẫn chi tiết</strong>: README.md và QUICKSTART.md</li>
<li class=""><strong>Script tự động</strong>: PowerShell script để dễ dàng chạy demo</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-cách-sử-dụng-nhanh">🎯 Cách sử dụng nhanh:<a href="https://tiennhm.io.vn/blog/introduction-to-rabbitmq#-c%C3%A1ch-s%E1%BB%AD-d%E1%BB%A5ng-nhanh" class="hash-link" aria-label="Đường dẫn trực tiếp đến 🎯 Cách sử dụng nhanh:" title="Đường dẫn trực tiếp đến 🎯 Cách sử dụng nhanh:" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 1. Clone repository</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone https://github.com/TienNHM/rabbitmq-demo-net8.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> rabbitmq-demo-net8</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 2. Khởi động RabbitMQ</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> run </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> rabbitmq </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5672</span><span class="token plain">:5672 </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">15672</span><span class="token plain">:15672 rabbitmq:3-management</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 3. Chạy demo</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> samples</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">.</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">run-samples.ps1</span><br></span></code></pre></div></div>
<p>Happy coding! 🚀</p>
<p><img decoding="async" loading="lazy" alt="Screenshot" src="https://tiennhm.io.vn/assets/images/screenshot-d23430e6fea9a65dec8c039bf1221677.png" width="1919" height="939" class="img_ev3q"></p>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="rabbitmq" term="rabbitmq"/>
        <category label="dotnet" term="dotnet"/>
        <category label="microservices" term="microservices"/>
        <category label="message-broker" term="message-broker"/>
        <category label="net8" term="net8"/>
        <category label="csharp" term="csharp"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Các kiểu lập trình phổ biến]]></title>
        <id>https://tiennhm.io.vn/blog/programming-paradigm</id>
        <link href="https://tiennhm.io.vn/blog/programming-paradigm"/>
        <updated>2025-08-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hướng dẫn các kiểu lập trình phổ biến trong phát triển phần mềm.]]></summary>
        <content type="html"><![CDATA[<p align="right"><img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2FTienNHM.github.io%2Fblog%2Fprogramming-paradigm&amp;label=%E2%9A%AAView&amp;labelColor=%2337d67a&amp;countColor=%23555555&amp;style=flat&amp;labelStyle=upper" loading="lazy" decoding="async"></p>
<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p>Bài viết giới thiệu tổng quan về các kiểu lập trình (programming paradigms) phổ biến trong phát triển phần mềm, bao gồm Procedural Programming, Object-Oriented Programming (OOP), Functional Programming, và các mô hình khác. Mỗi paradigm được giải thích về khái niệm, ưu nhược điểm, ví dụ minh họa và khi nào nên sử dụng. Hiểu rõ các mô hình này giúp developers chọn công cụ và ngôn ngữ phù hợp cho từng bài toán cụ thể.</p></div></div>
<p>Trong bài viết này, mình sẽ giới thiệu tổng quan về các kiểu lập trình phổ biến trong phát triển phần mềm.</p>
<p>Lập trình không chỉ là việc viết code để máy tính thực hiện một chuỗi lệnh. Đằng sau mỗi dòng lệnh là một <strong>mô hình lập trình (programming paradigm)</strong> – cách tư duy, cách tổ chức chương trình để giải quyết vấn đề. Hiểu rõ các mô hình này sẽ giúp bạn trở thành lập trình viên linh hoạt, dễ dàng chọn công cụ và ngôn ngữ phù hợp cho từng bài toán.</p>
<p>Trong bài blog này, chúng ta sẽ cùng tìm hiểu các mô hình lập trình phổ biến, ưu nhược điểm của từng loại, và ví dụ minh họa để bạn dễ hình dung.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="PP">1. Lập Trình Thủ Tục (Procedural Programming)<a href="https://tiennhm.io.vn/blog/programming-paradigm#PP" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1. Lập Trình Thủ Tục (Procedural Programming)" title="Đường dẫn trực tiếp đến 1. Lập Trình Thủ Tục (Procedural Programming)" translate="no">​</a></h2>
<p><em><strong>Khái niệm</strong></em></p>
<p>Lập trình thủ tục là mô hình lập trình truyền thống, nơi chương trình được tổ chức thành các <strong>hàm (functions) hoặc thủ tục (procedures)</strong>. Dữ liệu và hành vi được tách riêng: chương trình sẽ thao tác lên dữ liệu thông qua các hàm.</p>
<p><em><strong>Đặc điểm</strong></em></p>
<ul>
<li class="">Tuần tự, rõ ràng: Chương trình chạy từ trên xuống dưới.</li>
<li class="">Dữ liệu được lưu trữ trong biến toàn cục hoặc cục bộ.</li>
<li class="">Hàm là đơn vị cơ bản để tái sử dụng logic.</li>
</ul>
<p><em><strong>Ưu điểm</strong></em></p>
<ul>
<li class="">Dễ hiểu và học cho người mới.</li>
<li class="">Tốt cho các chương trình nhỏ, logic tuần tự.</li>
</ul>
<p><em><strong>Nhược điểm</strong></em></p>
<ul>
<li class="">Khó mở rộng và bảo trì khi chương trình lớn.</li>
<li class="">Dữ liệu và logic tách rời, dễ gây lỗi nếu thao tác sai biến toàn cục.</li>
</ul>
<p><em><strong>Ví dụ</strong></em></p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">include</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property string" style="color:#e3116c">&lt;stdio.h&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sum</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> a</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> a </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sum</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">7</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">printf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Tổng: %d\n"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="OOP">2. Lập Trình Hướng Đối Tượng (Object-Oriented Programming)<a href="https://tiennhm.io.vn/blog/programming-paradigm#OOP" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2. Lập Trình Hướng Đối Tượng (Object-Oriented Programming)" title="Đường dẫn trực tiếp đến 2. Lập Trình Hướng Đối Tượng (Object-Oriented Programming)" translate="no">​</a></h2>
<p><em><strong>Khái niệm</strong></em></p>
<p>OOP là mô hình lập trình dựa trên <strong>đối tượng (objects)</strong>. Mỗi đối tượng là sự kết hợp giữa <strong>dữ liệu (attributes)</strong> và <strong>hàm (methods)</strong>, phản ánh các thực thể trong thế giới thực.</p>
<p><em><strong>Đặc điểm</strong></em></p>
<ol>
<li class=""><strong>Encapsulation (Đóng gói):</strong> Dữ liệu và phương thức được nhóm lại, ẩn chi tiết nội bộ.</li>
<li class=""><strong>Inheritance (Kế thừa):</strong> Tạo lớp mới dựa trên lớp có sẵn.</li>
<li class=""><strong>Polymorphism (Đa hình):</strong> Cùng một hàm có thể hoạt động khác nhau tùy đối tượng.</li>
<li class=""><strong>Abstraction (Trừu tượng hóa):</strong> Chỉ tập trung vào những gì quan trọng, bỏ qua chi tiết không cần thiết.</li>
</ol>
<p><em><strong>Ưu điểm</strong></em></p>
<ul>
<li class="">Tái sử dụng mã tốt, dễ bảo trì.</li>
<li class="">Giải pháp linh hoạt cho các dự án lớn.</li>
<li class="">Mô phỏng thế giới thực trực quan.</li>
</ul>
<p><em><strong>Nhược điểm</strong></em></p>
<ul>
<li class="">Học khó hơn so với lập trình thủ tục.</li>
<li class="">Có thể phức tạp nếu quá lạm dụng kế thừa.</li>
</ul>
<p><em><strong>Ví dụ</strong></em></p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">Animal</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">String</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">speak</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">System</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">out</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">println</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Animal speaks"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">Dog</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extends</span><span class="token plain"> </span><span class="token class-name">Animal</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">speak</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">System</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">out</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">println</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Woof! Woof!"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">Main</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> args</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Dog</span><span class="token plain"> dog </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Dog</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        dog</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">speak</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Output: Woof! Woof!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="FP">3. Lập Trình Hàm (Functional Programming)<a href="https://tiennhm.io.vn/blog/programming-paradigm#FP" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3. Lập Trình Hàm (Functional Programming)" title="Đường dẫn trực tiếp đến 3. Lập Trình Hàm (Functional Programming)" translate="no">​</a></h2>
<p><em><strong>Khái niệm</strong></em></p>
<p>Functional programming coi <strong>hàm là đơn vị cơ bản</strong> và nhấn mạnh <strong>trạng thái bất biến (immutable)</strong> và <strong>không có tác dụng phụ (side-effect)</strong>. Đây là mô hình phổ biến trong các ngôn ngữ như Haskell, Scala, và JavaScript (với lập trình hàm).</p>
<p><em><strong>Đặc điểm</strong></em></p>
<ul>
<li class="">Dữ liệu bất biến.</li>
<li class="">Hàm là "công dân hạng nhất" (first-class citizens) – có thể truyền làm tham số, trả về.</li>
<li class="">Tránh dùng biến toàn cục, giảm lỗi.</li>
</ul>
<p><em><strong>Ưu điểm</strong></em></p>
<ul>
<li class="">Code dễ kiểm thử và song song hóa.</li>
<li class="">Tối ưu cho xử lý dữ liệu phức tạp (streams, map-reduce).</li>
</ul>
<p><em><strong>Nhược điểm</strong></em></p>
<ul>
<li class="">Khó đọc nếu chưa quen.</li>
<li class="">Có thể kém hiệu năng với dữ liệu lớn nếu không tối ưu.</li>
</ul>
<p><em><strong>Ví dụ</strong></em></p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> numbers </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> squares </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> numbers</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">x</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> x </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">squares</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Output: [1, 4, 9, 16, 25]</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="EDP">4. Lập Trình Hướng Sự Kiện (Event-Driven Programming)<a href="https://tiennhm.io.vn/blog/programming-paradigm#EDP" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4. Lập Trình Hướng Sự Kiện (Event-Driven Programming)" title="Đường dẫn trực tiếp đến 4. Lập Trình Hướng Sự Kiện (Event-Driven Programming)" translate="no">​</a></h2>
<p><em><strong>Khái niệm</strong></em></p>
<p>Trong mô hình này, luồng chương trình <strong>bị chi phối bởi sự kiện (events)</strong>, ví dụ: click chuột, nhập dữ liệu, hay thông báo từ server. Đây là mô hình phổ biến trong phát triển GUI và lập trình web.</p>
<p><em><strong>Đặc điểm</strong></em></p>
<ul>
<li class="">Chương trình phản ứng với sự kiện.</li>
<li class="">Thường sử dụng <strong>callback functions</strong> hoặc <strong>observer pattern</strong>.</li>
</ul>
<p><em><strong>Ưu điểm</strong></em></p>
<ul>
<li class="">Linh hoạt, dễ mở rộng giao diện người dùng.</li>
<li class="">Thích hợp cho ứng dụng tương tác, real-time.</li>
</ul>
<p><em><strong>Nhược điểm</strong></em></p>
<ul>
<li class="">Dễ gây "callback hell" nếu không tổ chức tốt.</li>
<li class="">Debug phức tạp do luồng không tuần tự.</li>
</ul>
<p><em><strong>Ví dụ</strong></em></p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token dom variable" style="color:#36acaa">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getElementById</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"myButton"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">addEventListener</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"click"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">alert</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Button clicked!"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="LP">5. Lập Trình Logic (Logic Programming)<a href="https://tiennhm.io.vn/blog/programming-paradigm#LP" class="hash-link" aria-label="Đường dẫn trực tiếp đến 5. Lập Trình Logic (Logic Programming)" title="Đường dẫn trực tiếp đến 5. Lập Trình Logic (Logic Programming)" translate="no">​</a></h2>
<p><em><strong>Khái niệm</strong></em></p>
<p>Trong lập trình logic, <strong>bạn mô tả vấn đề bằng các luật và sự thật</strong>, và máy tính sẽ suy diễn ra kết quả. Prolog là ngôn ngữ tiêu biểu.</p>
<p><em><strong>Đặc điểm</strong></em></p>
<ul>
<li class="">Mô hình "khai báo" thay vì "thủ tục".</li>
<li class="">Hệ thống tự tìm cách giải quyết dựa trên luật và dữ liệu.</li>
</ul>
<p><em><strong>Ưu điểm</strong></em></p>
<ul>
<li class="">Thích hợp cho AI, giải quyết vấn đề phức tạp với quy tắc.</li>
<li class="">Code ngắn, tập trung vào logic thay vì thủ tục.</li>
</ul>
<p><em><strong>Nhược điểm</strong></em></p>
<ul>
<li class="">Không phổ biến.</li>
<li class="">Hiệu năng thấp với bài toán lớn.</li>
</ul>
<p><em><strong>Ví dụ</strong></em></p>
<div class="language-prolog codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-prolog codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">parent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">alice</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> bob</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">parent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bob</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> charlie</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">grandparent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">X</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:-</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">parent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">X</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Z</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">parent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Z</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">.</span><br></span></code></pre></div></div>
<p>Truy vấn: <code>grandparent(alice, charlie).</code> → true</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-kết-luận">6. Kết Luận<a href="https://tiennhm.io.vn/blog/programming-paradigm#6-k%E1%BA%BFt-lu%E1%BA%ADn" class="hash-link" aria-label="Đường dẫn trực tiếp đến 6. Kết Luận" title="Đường dẫn trực tiếp đến 6. Kết Luận" translate="no">​</a></h2>
<table><thead><tr><th>Paradigm</th><th>Ưu điểm</th><th>Nhược điểm</th><th>Ví dụ ngôn ngữ</th></tr></thead><tbody><tr><td>Thủ tục</td><td>Dễ học, tuần tự</td><td>Khó mở rộng</td><td>C, Pascal</td></tr><tr><td>OOP</td><td>Tái sử dụng tốt, trực quan</td><td>Phức tạp</td><td>Java, C#</td></tr><tr><td>Hàm</td><td>An toàn, dễ kiểm thử</td><td>Khó đọc</td><td>Haskell, JS</td></tr><tr><td>Sự kiện</td><td>Linh hoạt, tương tác</td><td>Debug khó</td><td>JS, C# WinForms</td></tr><tr><td>Logic</td><td>Tập trung logic, ngắn gọn</td><td>Ít phổ biến</td><td>Prolog</td></tr></tbody></table>
<p>Hiểu các <strong>programming paradigms</strong> sẽ giúp bạn:</p>
<ol>
<li class="">Lựa chọn cách tiếp cận phù hợp cho từng dự án.</li>
<li class="">Viết code rõ ràng, dễ bảo trì và tái sử dụng.</li>
<li class="">Mở rộng tư duy lập trình, dễ học thêm ngôn ngữ mới.</li>
</ol>
<p>Nếu mới bắt đầu, bạn có thể:</p>
<ul>
<li class="">Bắt đầu với lập trình thủ tục hoặc OOP để nắm cơ bản.</li>
<li class="">Thử áp dụng lập trình hàm trong JavaScript hay Python.</li>
<li class="">Làm các dự án nhỏ GUI để hiểu event-driven.</li>
<li class="">Nghiên cứu Prolog nếu quan tâm AI hoặc logic-based problem solving.</li>
</ul>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="programming" term="programming"/>
        <category label="software development" term="software development"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Character Sets - Collations và vấn đề so sánh chuỗi trong MySQL]]></title>
        <id>https://tiennhm.io.vn/blog/character-sets-and-collations-in-mysql</id>
        <link href="https://tiennhm.io.vn/blog/character-sets-and-collations-in-mysql"/>
        <updated>2024-06-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Giới thiệu về các bảng mã và cách so sánh chuỗi trong MySQL, những vấn đề cần lưu ý khi làm việc với các bảng mã khác nhau.]]></summary>
        <content type="html"><![CDATA[<p align="right"><img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Ftiennhm.github.io%2Fblog%2Fcharacter-sets-and-collations-in-mysql&amp;label=%E2%9A%AAView&amp;labelColor=%2337d67a&amp;countColor=%23555555&amp;style=flat&amp;labelStyle=upper" loading="lazy" decoding="async"></p>
<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p>Bài viết giới thiệu về Character Sets (bảng mã) và Collations (thứ tự ký tự) trong MySQL, giải thích cách MySQL so sánh chuỗi và những vấn đề thường gặp khi làm việc với các bảng mã khác nhau. MySQL hỗ trợ nhiều character sets như utf8, utf8mb4, latin1, và mỗi character set có các collations khác nhau ảnh hưởng đến cách so sánh và sắp xếp chuỗi. Bài viết giúp developers hiểu và tránh các lỗi phổ biến khi làm việc với multilingual data trong MySQL.</p></div></div>
<p>Trong thực tế, khi làm việc với cơ sở dữ liệu, bạn thường phải xử lý các chuỗi văn bản, và việc so sánh chuỗi đôi khi gặp phải một số vấn đề. MySQL hỗ trợ nhiều bảng mã (Character Sets) và thứ tự ký tự (Collations) khác nhau, và cách so sánh chuỗi phụ thuộc vào collation của bảng mã.</p>
<p>Bài viết này giới thiệu về các bảng mã và cách so sánh chuỗi trong MySQL, những vấn đề cần lưu ý khi làm việc với các bảng mã khác nhau.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="character-sets">1. Bảng mã (Character Sets) trong MySQL<a href="https://tiennhm.io.vn/blog/character-sets-and-collations-in-mysql#character-sets" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1. Bảng mã (Character Sets) trong MySQL" title="Đường dẫn trực tiếp đến 1. Bảng mã (Character Sets) trong MySQL" translate="no">​</a></h2>
<p>Bảng mã (Character Sets) trong MySQL là bộ ký tự đại diện cho tập hợp các ký tự với mã hóa duy nhất, xác định những ký tự nào được phép trong một cột kiểu văn bản, bao gồm chữ cái, số, ký hiệu và ký tự đặc biệt.</p>
<p>Bộ ký tự quyết định phạm vi các ký tự có thể lưu trữ trong một cột. MySQL hỗ trợ nhiều bảng mã khác nhau, bao gồm cả một số bộ ký tự Unicode. Để liệt kê tất cả các bộ ký tự trên máy chủ MySQL hiện tại, bạn sử dụng câu lệnh sau:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SHOW</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">CHARACTER</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">SET</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Kết quả trả về sẽ bao gồm tên bảng mã, mô tả và mặc định. Ví dụ:</p>
<table><thead><tr><th>Charset</th><th>Description</th><th>Default collation</th><th style="text-align:center">Maxlen</th></tr></thead><tbody><tr><td>ascii</td><td>US ASCII</td><td>ascii_general_ci</td><td style="text-align:center">1</td></tr><tr><td>big5</td><td>Big5 Traditional Chinese</td><td>big5_chinese_ci</td><td style="text-align:center">2</td></tr><tr><td>binary</td><td>Binary pseudo charset</td><td>binary</td><td style="text-align:center">1</td></tr><tr><td>cp1250</td><td>Windows Central European</td><td>cp1250_general_ci</td><td style="text-align:center">1</td></tr><tr><td>cp1251</td><td>Windows Cyrillic</td><td>cp1251_general_ci</td><td style="text-align:center">1</td></tr><tr><td>cp1256</td><td>Windows Arabic</td><td>cp1256_general_ci</td><td style="text-align:center">1</td></tr><tr><td>cp1257</td><td>Windows Baltic</td><td>cp1257_general_ci</td><td style="text-align:center">1</td></tr><tr><td>cp850</td><td>DOS West European</td><td>cp850_general_ci</td><td style="text-align:center">1</td></tr><tr><td>cp852</td><td>DOS Central European</td><td>cp852_general_ci</td><td style="text-align:center">1</td></tr><tr><td>cp866</td><td>DOS Russian</td><td>cp866_general_ci</td><td style="text-align:center">1</td></tr><tr><td>cp932</td><td>SJIS for Windows Japanese</td><td>cp932_japanese_ci</td><td style="text-align:center">2</td></tr><tr><td>dec8</td><td>DEC West European</td><td>dec8_swedish_ci</td><td style="text-align:center">1</td></tr><tr><td>eucjpms</td><td>UJIS for Windows Japanese</td><td>eucjpms_japanese_ci</td><td style="text-align:center">3</td></tr><tr><td>euckr</td><td>EUC-KR Korean</td><td>euckr_korean_ci</td><td style="text-align:center">2</td></tr><tr><td>gb18030</td><td>China National Standard GB18030</td><td>gb18030_chinese_ci</td><td style="text-align:center">4</td></tr><tr><td>gb2312</td><td>GB2312 Simplified Chinese</td><td>gb2312_chinese_ci</td><td style="text-align:center">2</td></tr><tr><td>gbk</td><td>GBK Simplified Chinese</td><td>gbk_chinese_ci</td><td style="text-align:center">2</td></tr><tr><td>geostd8</td><td>GEOSTD8 Georgian</td><td>geostd8_general_ci</td><td style="text-align:center">1</td></tr><tr><td>greek</td><td>ISO 8859-7 Greek</td><td>greek_general_ci</td><td style="text-align:center">1</td></tr><tr><td>hebrew</td><td>ISO 8859-8 Hebrew</td><td>hebrew_general_ci</td><td style="text-align:center">1</td></tr><tr><td>hp8</td><td>HP West European</td><td>hp8_english_ci</td><td style="text-align:center">1</td></tr><tr><td>keybcs2</td><td>DOS Kamenicky Czech-Slovak</td><td>keybcs2_general_ci</td><td style="text-align:center">1</td></tr><tr><td>koi8r</td><td>KOI8-R Relcom Russian</td><td>koi8r_general_ci</td><td style="text-align:center">1</td></tr><tr><td>koi8u</td><td>KOI8-U Ukrainian</td><td>koi8u_general_ci</td><td style="text-align:center">1</td></tr><tr><td>latin1</td><td>cp1252 West European</td><td>latin1_swedish_ci</td><td style="text-align:center">1</td></tr><tr><td>latin2</td><td>ISO 8859-2 Central European</td><td>latin2_general_ci</td><td style="text-align:center">1</td></tr><tr><td>latin5</td><td>ISO 8859-9 Turkish</td><td>latin5_turkish_ci</td><td style="text-align:center">1</td></tr><tr><td>latin7</td><td>ISO 8859-13 Baltic</td><td>latin7_general_ci</td><td style="text-align:center">1</td></tr><tr><td>macce</td><td>Mac Central European</td><td>macce_general_ci</td><td style="text-align:center">1</td></tr><tr><td>macroman</td><td>Mac West European</td><td>macroman_general_ci</td><td style="text-align:center">1</td></tr><tr><td>sjis</td><td>Shift-JIS Japanese</td><td>sjis_japanese_ci</td><td style="text-align:center">2</td></tr><tr><td>swe7</td><td>7bit Swedish</td><td>swe7_swedish_ci</td><td style="text-align:center">1</td></tr><tr><td>tis620</td><td>TIS620 Thai</td><td>tis620_thai_ci</td><td style="text-align:center">1</td></tr><tr><td>ucs2</td><td>UCS-2 Unicode</td><td>ucs2_general_ci</td><td style="text-align:center">2</td></tr><tr><td>ujis</td><td>EUC-JP Japanese</td><td>ujis_japanese_ci</td><td style="text-align:center">3</td></tr><tr><td>utf16</td><td>UTF-16 Unicode</td><td>utf16_general_ci</td><td style="text-align:center">4</td></tr><tr><td>utf16le</td><td>UTF-16LE Unicode</td><td>utf16le_general_ci</td><td style="text-align:center">4</td></tr><tr><td>utf32</td><td>UTF-32 Unicode</td><td>utf32_general_ci</td><td style="text-align:center">4</td></tr><tr><td>utf8mb3</td><td>UTF-8 Unicode</td><td>utf8mb3_general_ci</td><td style="text-align:center">3</td></tr><tr><td>utf8mb4</td><td>UTF-8 Unicode</td><td>utf8mb4_0900_ai_ci</td><td style="text-align:center">4</td></tr></tbody></table>
<p>Trong đó:</p>
<ul>
<li class=""><code>Charset</code>: tên bảng mã</li>
<li class=""><code>Description</code>: mô tả</li>
<li class=""><code>Default collation</code>: bảng mã mặc định</li>
<li class=""><code>Maxlen</code>: độ dài tối đa của mỗi ký tự trong bảng mã. Một số bảng mã chứa ký tự <strong>đa byte</strong>, nên Maxlen có thể lớn hơn 1.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="collations">2. Thứ tự ký tự (Collations) trong MySQL<a href="https://tiennhm.io.vn/blog/character-sets-and-collations-in-mysql#collations" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2. Thứ tự ký tự (Collations) trong MySQL" title="Đường dẫn trực tiếp đến 2. Thứ tự ký tự (Collations) trong MySQL" translate="no">​</a></h2>
<p>Thứ tự ký tự (Collations) trong MySQL xác định cách so sánh và sắp xếp các ký tự trong một bảng mã. Mỗi bộ ký tự có ít nhất một collation mặc định, và hầu hết các bộ ký tự có nhiều collation.</p>
<p>Để liệt kê tất cả các collation của một bảng mã, bạn sử dụng câu lệnh sau:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SHOW</span><span class="token plain"> COLLATION </span><span class="token keyword" style="color:#00009f">WHERE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">Charset</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ascii'</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Trong đó, <code>ascii</code> là tên bảng mã. Kết quả trả về sẽ bao gồm tên collation, mô tả và mặc định. Ví dụ:</p>
<table><thead><tr><th>Collation</th><th>Charset</th><th>Id</th><th style="text-align:center">Default</th><th style="text-align:center">Compiled</th><th style="text-align:center">Sortlen</th><th>Pad_attribute</th></tr></thead><tbody><tr><td>ascii_bin</td><td>ascii</td><td>65</td><td style="text-align:center"></td><td style="text-align:center">Yes</td><td style="text-align:center">1</td><td>PAD SPACE</td></tr><tr><td>ascii_general_ci</td><td>ascii</td><td>11</td><td style="text-align:center">Yes</td><td style="text-align:center">Yes</td><td style="text-align:center">1</td><td>PAD SPACE</td></tr></tbody></table>
<p>Trong đó:</p>
<ul>
<li class=""><code>Collation</code>: tên collation</li>
<li class=""><code>Charset</code>: tên bảng mã</li>
<li class=""><code>Id</code>: ID của collation</li>
<li class=""><code>Default</code>: collation mặc định</li>
<li class=""><code>Compiled</code>: collation đã được biên dịch</li>
<li class=""><code>Sortlen</code>: độ dài của chuỗi sắp xếp</li>
<li class=""><code>Pad_attribute</code>: thuộc tính đệm.</li>
</ul>
<p>Collation xác định cách so sánh chuỗi trong MySQL. Ví dụ, collation <code>ascii_general_ci</code> so sánh chuỗi không phân biệt chữ hoa và chữ thường, trong khi collation <code>ascii_bin</code> so sánh chính xác từng ký tự (phân biệt chữ hoa và chữ thường).</p>
<p>Collation có một số đặc điểm quan trọng:</p>
<ul>
<li class=""><strong>Case sensitivity</strong>: xác định collation có phân biệt chữ hoa và chữ thường hay không.<!-- -->
<ul>
<li class=""><code>ci</code> (case-insensitive): không phân biệt chữ hoa và chữ thường. Một số collation có <code>ci</code> ở cuối tên, ví dụ: <code>utf8_general_ci</code> sẽ xem <code>A</code> và <code>a</code> là giống nhau.</li>
<li class=""><code>cs</code> (case-sensitive): phân biệt chữ hoa và chữ thường. Ví dụ: <code>utf8_bin</code> sẽ xem <code>A</code> và <code>a</code> là khác nhau.</li>
</ul>
</li>
<li class=""><strong>Accent sensitivity</strong>: xác định collation có phân biệt dấu thanh hay không. Ví dụ: <code>utf8_general_ci</code> sẽ xem <code>á</code> và <code>a</code> là giống nhau, trong khi <code>utf8_bin</code> sẽ xem chúng là khác nhau.</li>
<li class=""><strong>Kana sensitivity</strong>: xác định collation có phân biệt ký tự Kana (tiếng Nhật) hay không. Ví dụ: <code>utf8_general_ci</code> sẽ xem <code>あ</code> và <code>ア</code> là giống nhau, trong khi <code>utf8_bin</code> sẽ xem chúng là khác nhau.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="string-comparison">3. So sánh chuỗi trong MySQL<a href="https://tiennhm.io.vn/blog/character-sets-and-collations-in-mysql#string-comparison" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3. So sánh chuỗi trong MySQL" title="Đường dẫn trực tiếp đến 3. So sánh chuỗi trong MySQL" translate="no">​</a></h2>
<p>Khi so sánh chuỗi trong MySQL, bạn cần lưu ý các collation của bảng mã. MySQL sử dụng collation để xác định cách so sánh chuỗi, và kết quả có thể khác nhau tùy thuộc vào collation.</p>
<p>Ví dụ, giả sử bạn có một bảng <code>users</code> với cột <code>name</code> có collation <code>utf8_general_ci</code>:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">CREATE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">TABLE</span><span class="token plain"> users </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    id </span><span class="token keyword" style="color:#00009f">INT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">PRIMARY</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">KEY</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">COLLATE</span><span class="token plain"> utf8_bin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Nếu bạn thêm dữ liệu vào bảng <code>users</code>:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INTO</span><span class="token plain"> users </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Alice'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INTO</span><span class="token plain"> users </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'alice'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Khi bạn so sánh chuỗi trong MySQL, kết quả sẽ phụ thuộc vào collation của cột. Ví dụ:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain"> users </span><span class="token keyword" style="color:#00009f">WHERE</span><span class="token plain"> name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Alice'</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Nếu collation của cột <code>name</code> là <code>utf8_bin</code>, câu lệnh trên sẽ chỉ trả về dòng có <code>name</code> là <code>Alice</code>, vì collation <code>utf8_bin</code> phân biệt chữ hoa và chữ thường.</p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725685192/blog/images/string-comparison-mysql_pkvxqr.webp" loading="lazy" decoding="async" alt="string-comparison-mysql"></p>
<p>Tuy nhiên, nếu collation của cột <code>name</code> là <code>utf8_general_ci</code>, câu lệnh trên sẽ trả về cả hai dòng, vì collation <code>utf8_general_ci</code> không phân biệt chữ hoa và chữ thường.</p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725685199/blog/images/string-comparison-mysql-ci_s00oow.webp" loading="lazy" decoding="async" alt="string-comparison-mysql-ci"></p>
<p>Từ đó, khi làm việc với chuỗi trong MySQL, bạn cần lưu ý collation của cột để tránh nhầm lẫn trong kết quả truy vấn. Nếu cần, bạn có thể sử dụng hàm <code>COLLATE</code> để ghi đè collation mặc định:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain"> users </span><span class="token keyword" style="color:#00009f">WHERE</span><span class="token plain"> name </span><span class="token keyword" style="color:#00009f">COLLATE</span><span class="token plain"> utf8_bin </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Alice'</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725685203/blog/images/string-comparison-mysql-collate_goiuye.webp" loading="lazy" decoding="async" alt="string-comparison-mysql-collate"></p>
<p>Như vậy, bạn đã biết cách so sánh chuỗi trong MySQL và cách xác định collation của cột để tránh nhầm lẫn trong kết quả truy vấn.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="issues">4. Những vấn đề cần lưu ý<a href="https://tiennhm.io.vn/blog/character-sets-and-collations-in-mysql#issues" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4. Những vấn đề cần lưu ý" title="Đường dẫn trực tiếp đến 4. Những vấn đề cần lưu ý" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="41-một-số-ví-dụ-sử-dụng-collation">4.1. Một số ví dụ sử dụng collation<a href="https://tiennhm.io.vn/blog/character-sets-and-collations-in-mysql#41-m%E1%BB%99t-s%E1%BB%91-v%C3%AD-d%E1%BB%A5-s%E1%BB%AD-d%E1%BB%A5ng-collation" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4.1. Một số ví dụ sử dụng collation" title="Đường dẫn trực tiếp đến 4.1. Một số ví dụ sử dụng collation" translate="no">​</a></h3>
<p>Giả sử bạn có một bảng <code>users</code> với cột <code>name</code> có collation <code>latin1_bin</code>:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">CREATE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">TABLE</span><span class="token plain"> users </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    id </span><span class="token keyword" style="color:#00009f">INT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">PRIMARY</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">KEY</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">COLLATE</span><span class="token plain"> latin1_bin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Và bạn thêm dữ liệu vào bảng <code>users</code>:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INTO</span><span class="token plain"> users </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Alice'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INTO</span><span class="token plain"> users </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'alice'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INTO</span><span class="token plain"> users </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ALICE'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INTO</span><span class="token plain"> users </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Bar'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INTO</span><span class="token plain"> users </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Bär'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INTO</span><span class="token plain"> users </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">6</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Muffler'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INTO</span><span class="token plain"> users </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">7</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Müller'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INTO</span><span class="token plain"> users </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">8</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'MX Systems'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INTO</span><span class="token plain"> users </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">9</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'MySQL'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Với từ khóa <code>COLLATE</code>, bạn có thể ghi đè collation mặc định của cột trong truy vấn. Ta có thể sử dụng <code>COLLATE</code> trong các trường hợp sau:</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="collate-order-by">Dùng với <code>ORDER BY</code> để sắp xếp chuỗi theo collation khác nhau<a href="https://tiennhm.io.vn/blog/character-sets-and-collations-in-mysql#collate-order-by" class="hash-link" aria-label="Đường dẫn trực tiếp đến collate-order-by" title="Đường dẫn trực tiếp đến collate-order-by" translate="no">​</a></h4>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain"> users </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">ORDER</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">BY</span><span class="token plain"> name </span><span class="token keyword" style="color:#00009f">COLLATE</span><span class="token plain"> latin1_bin</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725685451/blog/images/collate-order-by-latin1_bin_xgmhuo.webp" loading="lazy" decoding="async" alt="collate-order-by-latin1_bin"></p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain"> users</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">ORDER</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">BY</span><span class="token plain"> name </span><span class="token keyword" style="color:#00009f">COLLATE</span><span class="token plain"> latin1_general_ci</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725685455/blog/images/collate-order-by-latin1_general_ci_kmlhe2.webp" loading="lazy" decoding="async" alt="collate-order-by-latin1_general_ci"></p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain"> users </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">ORDER</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">BY</span><span class="token plain"> name </span><span class="token keyword" style="color:#00009f">COLLATE</span><span class="token plain"> latin1_general_cs</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725685432/blog/images/collate-order-by-latin1_general_cs_fcbdwz.webp" loading="lazy" decoding="async" alt="collate-order-by-latin1_general_cs"></p>
<p>Nhận xét:</p>
<ul>
<li class=""><code>latin1_bin</code>: sắp xếp chính xác từng ký tự, phân biệt chữ hoa và chữ thường.</li>
<li class=""><code>latin1_general_ci</code>: không phân biệt chữ hoa và chữ thường.</li>
<li class=""><code>latin1_general_cs</code>: phân biệt chữ hoa và chữ thường. Tuy nhiên, collation này không phân biệt dấu thanh.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="collate-as">Dùng với <code>AS</code> để đặt tên collation cho cột mới<a href="https://tiennhm.io.vn/blog/character-sets-and-collations-in-mysql#collate-as" class="hash-link" aria-label="Đường dẫn trực tiếp đến collate-as" title="Đường dẫn trực tiếp đến collate-as" translate="no">​</a></h4>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> name </span><span class="token keyword" style="color:#00009f">COLLATE</span><span class="token plain"> latin1_general_ci </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> name_latin1_general_ci</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain"> users</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725684950/blog/images/collate-as-latin1_general_ci_nfjjrl.webp" loading="lazy" decoding="async" alt="collate-as-latin1_general_ci"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="collate-group-by">Dùng với <code>GROUP BY</code> để nhóm chuỗi theo collation khác nhau<a href="https://tiennhm.io.vn/blog/character-sets-and-collations-in-mysql#collate-group-by" class="hash-link" aria-label="Đường dẫn trực tiếp đến collate-group-by" title="Đường dẫn trực tiếp đến collate-group-by" translate="no">​</a></h4>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> name </span><span class="token keyword" style="color:#00009f">COLLATE</span><span class="token plain"> latin1_general_ci</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">COUNT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain"> users</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">GROUP</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">BY</span><span class="token plain"> name </span><span class="token keyword" style="color:#00009f">COLLATE</span><span class="token plain"> latin1_general_ci</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725685080/blog/images/collate-group-by-latin1_general_ci_iv8crg.webp" loading="lazy" decoding="async" alt="collate-group-by-latin1_general_ci"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="collate-aggregation">Dùng với các hàm aggregation để tính toán trên chuỗi theo collation khác nhau<a href="https://tiennhm.io.vn/blog/character-sets-and-collations-in-mysql#collate-aggregation" class="hash-link" aria-label="Đường dẫn trực tiếp đến Dùng với các hàm aggregation để tính toán trên chuỗi theo collation khác nhau" title="Đường dẫn trực tiếp đến Dùng với các hàm aggregation để tính toán trên chuỗi theo collation khác nhau" translate="no">​</a></h4>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">MIN</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">name </span><span class="token keyword" style="color:#00009f">COLLATE</span><span class="token plain"> latin1_general_ci</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain"> users</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725685287/blog/images/collate-min-latin1_general_ci_tzwxqj.webp" loading="lazy" decoding="async" alt="collate-min-latin1_general_ci"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="collate-distinct">Dùng với <code>DISTINCT</code> để loại bỏ các giá trị trùng lặp theo collation khác nhau<a href="https://tiennhm.io.vn/blog/character-sets-and-collations-in-mysql#collate-distinct" class="hash-link" aria-label="Đường dẫn trực tiếp đến collate-distinct" title="Đường dẫn trực tiếp đến collate-distinct" translate="no">​</a></h4>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">DISTINCT</span><span class="token plain"> name </span><span class="token keyword" style="color:#00009f">COLLATE</span><span class="token plain"> latin1_general_ci</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain"> users</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725685005/blog/images/collate-distinct-latin1_general_ci_o4alwi.webp" loading="lazy" decoding="async" alt="collate-distinct-latin1_general_ci"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="collate-where">Dùng với <code>WHERE</code> để so sánh chuỗi theo collation khác nhau<a href="https://tiennhm.io.vn/blog/character-sets-and-collations-in-mysql#collate-where" class="hash-link" aria-label="Đường dẫn trực tiếp đến collate-where" title="Đường dẫn trực tiếp đến collate-where" translate="no">​</a></h4>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain"> users</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">WHERE</span><span class="token plain"> name </span><span class="token keyword" style="color:#00009f">COLLATE</span><span class="token plain"> latin1_general_ci </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Alice'</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725685364/blog/images/collate-where-latin1_general_ci_oiaxdc.webp" loading="lazy" decoding="async" alt="collate-where-latin1_general_ci"></p>
<p>Ta thấy, với collation <code>latin1_general_ci</code>, <code>Alice</code>, <code>ALICE</code> và <code>alice</code> được xem là giống nhau, nên trả về tất cả các dòng có <code>name</code> là <code>Alice</code>.</p>
<p>Lưu ý, nếu không chỉ định collation, MySQL sẽ sử dụng collation mặc định của cột (trong trường hợp này là <code>latin1_bin</code>). Ví dụ:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain"> users</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">WHERE</span><span class="token plain"> name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Alice'</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725685354/blog/images/collate-where-latin1_bin_dsgdsn.webp" loading="lazy" decoding="async" alt="collate-where-latin1_bin"></p>
<p>Ta thấy, với collation <code>latin1_bin</code>, <code>Alice</code>, <code>ALICE</code> và <code>alice</code> được xem là khác nhau, nên chỉ trả về dòng có <code>name</code> là <code>Alice</code>.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="collate-having">Dùng với <code>HAVING</code> để lọc kết quả theo collation khác nhau<a href="https://tiennhm.io.vn/blog/character-sets-and-collations-in-mysql#collate-having" class="hash-link" aria-label="Đường dẫn trực tiếp đến collate-having" title="Đường dẫn trực tiếp đến collate-having" translate="no">​</a></h4>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain"> users</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">GROUP</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">BY</span><span class="token plain"> name </span><span class="token keyword" style="color:#00009f">COLLATE</span><span class="token plain"> latin1_general_ci</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">HAVING</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">COUNT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="42-mức-độ-ưu-tiên-của-collation">4.2. Mức độ ưu tiên của collation<a href="https://tiennhm.io.vn/blog/character-sets-and-collations-in-mysql#42-m%E1%BB%A9c-%C4%91%E1%BB%99-%C6%B0u-ti%C3%AAn-c%E1%BB%A7a-collation" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4.2. Mức độ ưu tiên của collation" title="�Đường dẫn trực tiếp đến 4.2. Mức độ ưu tiên của collation" translate="no">​</a></h3>
<p>Mệnh đề <code>COLLATE</code> có độ ưu tiên cao (cao hơn <code>||</code>). Hai biểu thức sau sẽ tương đương:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">x </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> y </span><span class="token keyword" style="color:#00009f">COLLATE</span><span class="token plain"> z</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">x </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">y </span><span class="token keyword" style="color:#00009f">COLLATE</span><span class="token plain"> z</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>Ví dụ:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Alice'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Alice'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">COLLATE</span><span class="token plain"> utf8_general_ci</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Tương đương với:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Alice'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'Alice'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">COLLATE</span><span class="token plain"> utf8_general_ci</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="43-độ-tương-thích-của-collation">4.3. Độ tương thích của collation<a href="https://tiennhm.io.vn/blog/character-sets-and-collations-in-mysql#43-%C4%91%E1%BB%99-t%C6%B0%C6%A1ng-th%C3%ADch-c%E1%BB%A7a-collation" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4.3. Độ tương thích của collation" title="Đường dẫn trực tiếp đến 4.3. Độ tương thích của collation" translate="no">​</a></h3>
<p>Nếu hai collation không tương thích, MySQL sẽ báo lỗi. Ví dụ:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Alice'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">COLLATE</span><span class="token plain"> utf8_bin </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Alice'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">COLLATE</span><span class="token plain"> utf8_general_ci</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Sẽ báo lỗi:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Error Code: 1253. COLLATION 'utf8_bin' is not valid for CHARACTER SET 'utf8mb4'</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">5. Kết luận<a href="https://tiennhm.io.vn/blog/character-sets-and-collations-in-mysql#conclusion" class="hash-link" aria-label="Đường dẫn trực tiếp đến 5. Kết luận" title="Đường dẫn trực tiếp đến 5. Kết luận" translate="no">​</a></h2>
<p>Trong bài viết này, chúng ta đã tìm hiểu về các bảng mã và cách so sánh chuỗi trong MySQL, những vấn đề cần lưu ý khi làm việc với các bảng mã khác nhau. Hy vọng bài viết này giúp bạn hiểu rõ hơn về collation và cách so sánh chuỗi trong MySQL.</p>
<p>Nếu bạn có bất kỳ câu hỏi hoặc ý kiến đóng góp nào, hãy để lại bình luận bên dưới. Cảm ơn bạn đã đọc bài viết!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="references">Tham khảo<a href="https://tiennhm.io.vn/blog/character-sets-and-collations-in-mysql#references" class="hash-link" aria-label="Đường dẫn trực tiếp đến Tham khảo" title="Đường dẫn trực tiếp đến Tham khảo" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://dev.mysql.com/doc/refman/8.0/en/charset.html" target="_blank" rel="noopener noreferrer" class="">MySQL Character Sets and Collations</a></li>
<li class=""><a href="https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html" target="_blank" rel="noopener noreferrer" class="">MySQL String Comparison</a></li>
</ul>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="mysql" term="mysql"/>
        <category label="character-sets" term="character-sets"/>
        <category label="collations" term="collations"/>
        <category label="tips-and-tricks" term="tips-and-tricks"/>
        <category label="database" term="database"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Các loại kiểm thử API]]></title>
        <id>https://tiennhm.io.vn/blog/api-testing-types</id>
        <link href="https://tiennhm.io.vn/blog/api-testing-types"/>
        <updated>2024-01-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Bài viết giới thiệu về các loại kiểm thử API phổ biến trong phát triển phần mềm, bao gồm Unit Testing, Integration Testing, Functional Testing, Load Testing, Security Testing và nhiều loại testing khác. Mỗi loại testing được giải thích về mục đích, cách thực hiện và khi nào nên sử dụng. API testing là một phần quan trọng trong quy trình phát triển phần mềm để đảm bảo chất lượng và độ tin cậy của API.]]></summary>
        <content type="html"><![CDATA[<p align="right"><img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Ftiennhm.github.io%2Fblog%2Fapi-testing-types&amp;label=%E2%9A%AAView&amp;labelColor=%2337d67a&amp;countColor=%23555555&amp;style=flat&amp;labelStyle=upper" loading="lazy" decoding="async"></p>
<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p>Bài viết giới thiệu về các loại kiểm thử API phổ biến trong phát triển phần mềm, bao gồm Unit Testing, Integration Testing, Functional Testing, Load Testing, Security Testing và nhiều loại testing khác. Mỗi loại testing được giải thích về mục đích, cách thực hiện và khi nào nên sử dụng. API testing là một phần quan trọng trong quy trình phát triển phần mềm để đảm bảo chất lượng và độ tin cậy của API.</p></div></div>
<p>Giới thiệu về các loại kiểm thử API.</p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725712660/blog/images/api-testing-types_tci9xy.gif" loading="lazy" decoding="async" alt="API Testing Types"></p>
<p>Giải thích 9 loại kiểm thử API.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="smoke-testing">Smoke Testing<a href="https://tiennhm.io.vn/blog/api-testing-types#smoke-testing" class="hash-link" aria-label="Đường dẫn trực tiếp đến Smoke Testing" title="Đường dẫn trực tiếp đến Smoke Testing" translate="no">​</a></h3>
<p>Kiểm thử này được thực hiện sau khi phát triển API hoàn tất. Đơn giản là kiểm tra xem API có hoạt động và không gây ra lỗi gì không.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="functional-testing-kiểm-thử-chức-năng">Functional Testing (Kiểm thử chức năng)<a href="https://tiennhm.io.vn/blog/api-testing-types#functional-testing-ki%E1%BB%83m-th%E1%BB%AD-ch%E1%BB%A9c-n%C4%83ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến Functional Testing (Kiểm thử chức năng)" title="Đường dẫn trực tiếp đến Functional Testing (Kiểm thử chức năng)" translate="no">​</a></h3>
<p>Loại kiểm thử này tạo ra một kế hoạch kiểm thử dựa trên các yêu cầu chức năng và so sánh kết quả nhận được với kết quả mong đợi.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="integration-testing-kiểm-thử-tích-hợp">Integration Testing (Kiểm thử tích hợp)<a href="https://tiennhm.io.vn/blog/api-testing-types#integration-testing-ki%E1%BB%83m-th%E1%BB%AD-t%C3%ADch-h%E1%BB%A3p" class="hash-link" aria-label="Đường dẫn trực tiếp đến Integration Testing (Kiểm thử tích hợp)" title="Đường dẫn trực tiếp đến Integration Testing (Kiểm thử tích hợp)" translate="no">​</a></h3>
<p>Kiểm thử này kết hợp nhiều cuộc gọi API để thực hiện các kiểm thử end-to-end. Các giao tiếp trong dịch vụ (intra-service) và truyền dữ liệu được kiểm tra.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="regression-testing-kiểm-thử-hồi-quy">Regression Testing (Kiểm thử hồi quy)<a href="https://tiennhm.io.vn/blog/api-testing-types#regression-testing-ki%E1%BB%83m-th%E1%BB%AD-h%EF%BF%BD%EF%BF%BD%E1%BB%93i-quy" class="hash-link" aria-label="Đường dẫn trực tiếp đến Regression Testing (Kiểm thử hồi quy)" title="Đường dẫn trực tiếp đến Regression Testing (Kiểm thử hồi quy)" translate="no">​</a></h3>
<p>Kiểm thử này đảm bảo rằng các bản sửa lỗi hoặc tính năng mới không làm hỏng các hành vi hiện có của API.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="load-testing-kiểm-thử-tải">Load Testing (Kiểm thử tải)<a href="https://tiennhm.io.vn/blog/api-testing-types#load-testing-ki%E1%BB%83m-th%E1%BB%AD-t%E1%BA%A3i" class="hash-link" aria-label="Đường dẫn trực tiếp đến Load Testing (Kiểm thử tải)" title="Đường dẫn trực tiếp đến Load Testing (Kiểm thử tải)" translate="no">​</a></h3>
<p>Loại kiểm thử này kiểm tra hiệu suất của ứng dụng bằng cách mô phỏng các tải khác nhau. Sau đó, chúng ta có thể tính toán được khả năng đáp ứng của ứng dụng.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="stress-testing">Stress Testing<a href="https://tiennhm.io.vn/blog/api-testing-types#stress-testing" class="hash-link" aria-label="Đường dẫn trực tiếp đến Stress Testing" title="Đường dẫn trực tiếp đến Stress Testing" translate="no">​</a></h3>
<p>Chúng ta tạo ra các tình huống tải cao để kiểm tra xem API có thể hoạt động bình thường hay không.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-testing-kiểm-thử-bảo-mật">Security Testing (Kiểm thử bảo mật)<a href="https://tiennhm.io.vn/blog/api-testing-types#security-testing-ki%E1%BB%83m-th%E1%BB%AD-b%E1%BA%A3o-m%E1%BA%ADt" class="hash-link" aria-label="Đường dẫn trực tiếp đến Security Testing (Kiểm thử bảo mật)" title="Đường dẫn trực tiếp đến Security Testing (Kiểm thử bảo mật)" translate="no">​</a></h3>
<p>Loại kiểm thử này kiểm tra các API trước tất cả các mối đe dọa bên ngoài có thể xảy ra.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ui-testing-kiểm-thử-giao-diện-người-dùng">UI Testing (Kiểm thử giao diện người dùng)<a href="https://tiennhm.io.vn/blog/api-testing-types#ui-testing-ki%E1%BB%83m-th%E1%BB%AD-giao-di%E1%BB%87n-ng%C6%B0%E1%BB%9Di-d%C3%B9ng" class="hash-link" aria-label="Đường dẫn trực tiếp đến UI Testing (Kiểm thử giao diện người dùng)" title="Đường dẫn trực tiếp đến UI Testing (Kiểm thử giao diện người dùng)" translate="no">​</a></h3>
<p>Kiểm thử này kiểm tra các tương tác UI với các API để đảm bảo dữ liệu có thể được hiển thị đúng cách.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="fuzz-testing">Fuzz Testing<a href="https://tiennhm.io.vn/blog/api-testing-types#fuzz-testing" class="hash-link" aria-label="Đường dẫn trực tiếp đến Fuzz Testing" title="Đường dẫn trực tiếp đến Fuzz Testing" translate="no">​</a></h3>
<p>Loại kiểm thử này chèn dữ liệu đầu vào không hợp lệ hoặc không mong đợi vào API và cố gắng làm cho API bị treo. Bằng cách này, nó xác định các lỗ hổng của API.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tài-liệu-tham-khảo">Tài liệu tham khảo<a href="https://tiennhm.io.vn/blog/api-testing-types#t%C3%A0i-li%E1%BB%87u-tham-kh%E1%BA%A3o" class="hash-link" aria-label="Đường dẫn trực tiếp đến Tài liệu tham khảo" title="Đường dẫn trực tiếp đến Tài liệu tham khảo" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://www.linkedin.com/posts/alexxubyte_systemdesign-coding-interviewtips-activity-7157050982437195776-s5hC" target="_blank" rel="noopener noreferrer" class="">https://www.linkedin.com/posts/alexxubyte_systemdesign-coding-interviewtips-activity-7157050982437195776-s5hC</a></li>
</ul>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="api" term="api"/>
        <category label="testing" term="testing"/>
        <category label="types" term="types"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Lý thuyết hệ thống số trong máy tính]]></title>
        <id>https://tiennhm.io.vn/blog/data-representation</id>
        <link href="https://tiennhm.io.vn/blog/data-representation"/>
        <updated>2024-01-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Lý thuyết hệ thống số trong máy tính: hệ nhị phân, hệ thập phân, hệ bát phân, hệ thập lục phân.]]></summary>
        <content type="html"><![CDATA[<p align="right"><img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Ftiennhm.github.io%2Fblog%2Fdata-representation&amp;label=%E2%9A%AAView&amp;labelColor=%2337d67a&amp;countColor=%23555555&amp;style=flat&amp;labelStyle=upper" loading="lazy" decoding="async"></p>
<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p>Bài viết giới thiệu về lý thuyết hệ thống số trong máy tính, bao gồm các hệ số phổ biến như hệ nhị phân (binary), hệ thập phân (decimal), hệ bát phân (octal) và hệ thập lục phân (hexadecimal). Bài viết giải thích cách biểu diễn và chuyển đổi giữa các hệ số, giúp hiểu cách máy tính lưu trữ và xử lý dữ liệu ở cấp độ thấp. Đây là kiến thức nền tảng quan trọng trong Computer Architecture và Assembly Language.</p></div></div>
<p>Bài viết này giới thiệu về cách biểu diễn các hệ số trong máy tính.</p>
<p><a href="https://github.com/ITUTE/CAAL/raw/main/TienNHM/Slides-VN/C1-Number-systems.pdf" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://img.shields.io/badge/PDF-Download-green.svg" alt="" class="img_ev3q"></a></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192052/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-01_yrpbbk.webp" loading="lazy" decoding="async" alt="1"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192053/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-02_cpdnhb.webp" loading="lazy" decoding="async" alt="2"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192053/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-03_vazlup.webp" loading="lazy" decoding="async" alt="3"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192053/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-04_edjjzj.webp" loading="lazy" decoding="async" alt="4"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192053/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-05_zgfd8m.webp" loading="lazy" decoding="async" alt="5"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192054/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-06_dp3s7c.webp" loading="lazy" decoding="async" alt="6"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192054/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-07_ts1oot.webp" loading="lazy" decoding="async" alt="7"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192054/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-08_my4tmw.webp" loading="lazy" decoding="async" alt="8"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192054/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-09_j3zdmw.webp" loading="lazy" decoding="async" alt="9"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192055/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-10_rimzst.webp" loading="lazy" decoding="async" alt="10"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192065/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-11_uxxoqb.webp" loading="lazy" decoding="async" alt="11"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192065/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-12_tzqwyb.webp" loading="lazy" decoding="async" alt="12"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192065/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-13_baby4a.webp" loading="lazy" decoding="async" alt="13"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192066/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-14_zdferu.webp" loading="lazy" decoding="async" alt="14"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192066/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-15_n6fpnf.webp" loading="lazy" decoding="async" alt="15"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192066/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-16_lhclki.webp" loading="lazy" decoding="async" alt="16"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192066/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-17_qr5esm.webp" loading="lazy" decoding="async" alt="17"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192066/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-18_rhoxid.webp" loading="lazy" decoding="async" alt="18"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192067/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-19_x3pzij.webp" loading="lazy" decoding="async" alt="19"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192074/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-20_a3jdr1.webp" loading="lazy" decoding="async" alt="20"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192074/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-21_wlfn4x.webp" loading="lazy" decoding="async" alt="21"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192075/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-22_s3szc5.webp" loading="lazy" decoding="async" alt="22"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192075/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-23_b7pqpe.webp" loading="lazy" decoding="async" alt="23"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192052/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-24_cjlak9.webp" loading="lazy" decoding="async" alt="24"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192052/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-25_g5ygkq.webp" loading="lazy" decoding="async" alt="25"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192052/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-26_demfqv.webp" loading="lazy" decoding="async" alt="26"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192054/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-27_a3abog.webp" loading="lazy" decoding="async" alt="27"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192053/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-28_ijwwjc.webp" loading="lazy" decoding="async" alt="28"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192053/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-29_j7j67i.webp" loading="lazy" decoding="async" alt="29"></p>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="number-system" term="number-system"/>
        <category label="data-representation" term="data-representation"/>
        <category label="CAAL" term="CAAL"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Biểu diễn số nguyên dương trong các hệ số]]></title>
        <id>https://tiennhm.io.vn/blog/unsigned-integer-representation</id>
        <link href="https://tiennhm.io.vn/blog/unsigned-integer-representation"/>
        <updated>2024-01-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Biểu diễn số nguyên dương trong hệ thập phân, hệ nhị phân và hệ thập lục phân]]></summary>
        <content type="html"><![CDATA[<p align="right"><img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Ftiennhm.github.io%2Fblog%2Funsigned-integer-representation&amp;label=%E2%9A%AAView&amp;labelColor=%2337d67a&amp;countColor=%23555555&amp;style=flat&amp;labelStyle=upper" loading="lazy" decoding="async"></p>
<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p>Bài viết giải thích cách biểu diễn số nguyên dương (unsigned integer) trong các hệ số khác nhau: hệ thập phân (decimal), hệ nhị phân (binary) và hệ thập lục phân (hexadecimal). Bài viết bao gồm cách chuyển đổi giữa các hệ số, cách máy tính lưu trữ số nguyên dương, và các ví dụ minh họa cụ thể. Đây là kiến thức nền tảng quan trọng để hiểu cách máy tính xử lý dữ liệu số ở cấp độ thấp.</p></div></div>
<p>Trong bài viết này, chúng ta sẽ tìm hiểu về cách biểu diễn số nguyên dương trong các hệ số: hệ thập phân, hệ nhị phân và hệ thập lục phân.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lý-thuyết">Lý thuyết<a href="https://tiennhm.io.vn/blog/unsigned-integer-representation#l%C3%BD-thuy%E1%BA%BFt" class="hash-link" aria-label="Đường dẫn trực tiếp đến Lý thuyết" title="Đường dẫn trực tiếp đến Lý thuyết" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-các-hệ-số-đếm-thường-sử-dụng-trong-máy-tính">1. Các hệ số đếm thường sử dụng trong máy tính<a href="https://tiennhm.io.vn/blog/unsigned-integer-representation#1-c%C3%A1c-h%E1%BB%87-s%E1%BB%91-%C4%91%E1%BA%BFm-th%C6%B0%E1%BB%9Dng-s%E1%BB%AD-d%E1%BB%A5ng-trong-m%C3%A1y-t%C3%ADnh" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1. Các hệ số đếm thường sử dụng trong máy tính" title="Đường dẫn trực tiếp đến 1. Các hệ số đếm thường sử dụng trong máy tính" translate="no">​</a></h3>
<ul>
<li class="">Cơ số của một hệ: là số chữ số được dùng để biểu diễn các giá trị.</li>
<li class="">Các hệ cơ bản:<!-- -->
<ul>
<li class="">Hệ nhị phân (B) hay hệ cơ số 2: dùng 2 chữ số 0,1 để biểu diễn tất cả các giá trị.</li>
</ul>
<blockquote>
<p>Ví dụ: 1001<sub>2</sub> = 1001B</p>
</blockquote>
<ul>
<li class="">Hệ bát phân (O) hay hệ cơ số 8: dùng 8 chữ số từ 0-7 để biểu diễn tất cả các giá trị.</li>
</ul>
<blockquote>
<p>Ví dụ: 762<sub>8</sub> = 762O</p>
</blockquote>
<ul>
<li class="">Hệ thập phân (D) hay hệ cơ số 10: dùng 10 chữ số từ 0-9 để biểu diễn tất cả các giá trị.</li>
</ul>
<blockquote>
<p>Ví dụ: 1981<sub>10</sub> = 1981D = 1981</p>
</blockquote>
<ul>
<li class="">Hệ thập lục phân (H) hay hệ cơ số 16: Dùng 16 chữ - số: 10 số 0,1,2,3,4,5,6,7,8,9 và 6 chữ cái A,B,C,D,E,F để biểu diễn tất cả các số.</li>
</ul>
<blockquote>
<p>Ví dụ: 1B5E<sub>16</sub> = 1B5EH</p>
</blockquote>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-chuyển-đổi-số-nguyên-dương-sang-hệ-thập-phân">2. Chuyển đổi số nguyên dương sang hệ thập phân<a href="https://tiennhm.io.vn/blog/unsigned-integer-representation#2-chuy%E1%BB%83n-%C4%91%E1%BB%95i-s%E1%BB%91-nguy%C3%AAn-d%C6%B0%C6%A1ng-sang-h%E1%BB%87-th%E1%BA%ADp-ph%C3%A2n" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2. Chuyển đổi số nguyên dương sang hệ thập phân" title="Đường dẫn trực tiếp đến 2. Chuyển đổi số nguyên dương sang hệ thập phân" translate="no">​</a></h3>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702198414/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-convert-to-decimal_xfbzdr.webp" loading="lazy" decoding="async" alt="convert-to-decimal"></p>
<p><strong>Ví dụ:</strong></p>
<ul>
<li class="">Chuyển đổi số 1001<sub>2</sub> sang hệ thập phân:</li>
</ul>
<blockquote>
<p>1001<sub>2</sub> = 1 × 2<sup>3</sup> + 0 × 2<sup>2</sup> + 0 × 2<sup>1</sup> + 1 × 2<sup>0</sup> = 1 × 8 + 0 × 4 + 0 × 2 + 1 × 1 = 9</p>
</blockquote>
<ul>
<li class="">Chuyển đổi số 1E4A<sub>16</sub> sang hệ thập phân:</li>
</ul>
<blockquote>
<p>1E4A<sub>16</sub> = 1 × 16<sup>3</sup> + 14 × 16<sup>2</sup> + 4 × 16<sup>1</sup> + 10 × 16<sup>0</sup> = 7754</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-chuyển-đổi-số-nguyên-dương-từ-hệ-thập-phân-sang-các-hệ-khác">3. Chuyển đổi số nguyên dương từ hệ thập phân sang các hệ khác<a href="https://tiennhm.io.vn/blog/unsigned-integer-representation#3-chuy%E1%BB%83n-%C4%91%E1%BB%95i-s%E1%BB%91-nguy%C3%AAn-d%C6%B0%C6%A1ng-t%E1%BB%AB-h%E1%BB%87-th%E1%BA%ADp-ph%C3%A2n-sang-c%C3%A1c-h%E1%BB%87-kh%C3%A1c" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3. Chuyển đổi số nguyên dương từ hệ thập phân sang các hệ khác" title="Đường dẫn trực tiếp đến 3. Chuyển đổi số nguyên dương từ hệ thập phân sang các hệ khác" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="31-từ-hệ-thập-phân-sang-hệ-nhị-phân">3.1. Từ hệ thập phân sang hệ nhị phân<a href="https://tiennhm.io.vn/blog/unsigned-integer-representation#31-t%E1%BB%AB-h%E1%BB%87-th%E1%BA%ADp-ph%C3%A2n-sang-h%E1%BB%87-nh%E1%BB%8B-ph%C3%A2n" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3.1. Từ hệ thập phân sang hệ nhị phân" title="Đường dẫn trực tiếp đến 3.1. Từ hệ thập phân sang hệ nhị phân" translate="no">​</a></h4>
<p>Để chuyển đổi một số nguyên dương từ hệ thập phân sang hệ nhị phân:</p>
<ul>
<li class="">Ta thực hiện phép chia cho 2, được phần kết quả <code>m</code> và phần dư <code>r</code> (1 hoặc 0).</li>
<li class="">Tiếp tực thực hiện phép chia phần kết quả <code>m</code> cho 2, cho đến khi kết quả <code>m = 0</code> thì dừng.</li>
<li class="">Khi đó, giá trị nhị phân cần tìm chính là việc viết lần lượt phần dư <code>r</code> từ dưới lên.</li>
</ul>
<p>** Ví dụ:**</p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702200158/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-dec2bin_ylfq9g.webp" loading="lazy" decoding="async" alt="dec2bin"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="32-từ-hệ-thập-phân-sang-hệ-thập-lục-phân">3.2. Từ hệ thập phân sang hệ thập lục phân<a href="https://tiennhm.io.vn/blog/unsigned-integer-representation#32-t%E1%BB%AB-h%E1%BB%87-th%E1%BA%ADp-ph%C3%A2n-sang-h%E1%BB%87-th%E1%BA%ADp-l%E1%BB%A5c-ph%C3%A2n" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3.2. Từ hệ thập phân sang hệ thập lục phân" title="Đường dẫn trực tiếp đến 3.2. Từ hệ thập phân sang hệ thập lục phân" translate="no">​</a></h4>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702200909/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-dec2hexpng_kjh3au.webp" loading="lazy" decoding="async" alt="dec2hex"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="33-từ-hệ-thập-phân-sang-hệ-bát-phân">3.3. Từ hệ thập phân sang hệ bát phân<a href="https://tiennhm.io.vn/blog/unsigned-integer-representation#33-t%E1%BB%AB-h%E1%BB%87-th%E1%BA%ADp-ph%C3%A2n-sang-h%E1%BB%87-b%C3%A1t-ph%C3%A2n" class="hash-link" aria-label="Đường dẫn tr��ực tiếp đến 3.3. Từ hệ thập phân sang hệ bát phân" title="Đường dẫn trực tiếp đến 3.3. Từ hệ thập phân sang hệ bát phân" translate="no">​</a></h4>
<p>Việc chuyển đổi số nguyên dương từ hệ thập phân sang hệ bát phân là tương tự như việc chuyển đổi từ thập phân sang nhị phân/ thập lục phân, chỉ khác ở đây là ta thực hiện phép chia cho 8.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-chuyển-đổi-số-nguyên-dương-giữa-hệ-nhị-phân-hệ-thập-lục-phân-và-hệ-bát-phân">4. Chuyển đổi số nguyên dương giữa hệ nhị phân, hệ thập lục phân và hệ bát phân<a href="https://tiennhm.io.vn/blog/unsigned-integer-representation#4-chuy%E1%BB%83n-%C4%91%E1%BB%95i-s%E1%BB%91-nguy%C3%AAn-d%C6%B0%C6%A1ng-gi%E1%BB%AFa-h%E1%BB%87-nh%E1%BB%8B-ph%C3%A2n-h%E1%BB%87-th%E1%BA%ADp-l%E1%BB%A5c-ph%C3%A2n-v%C3%A0-h%E1%BB%87-b%C3%A1t-ph%C3%A2n" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4. Chuyển đổi số nguyên dương giữa hệ nhị phân, hệ thập lục phân và hệ bát phân" title="Đường dẫn trực tiếp đến 4. Chuyển đổi số nguyên dương giữa hệ nhị phân, hệ thập lục phân và hệ bát phân" translate="no">​</a></h3>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192054/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-06_dp3s7c.webp" loading="lazy" decoding="async" alt="6"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702192054/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-07_ts1oot.webp" loading="lazy" decoding="async" alt="7"></p>
<p>** Ví dụ:** Chuyển đổi số 1011111011111110<sub>2</sub> sang hệ thập lục phân (H) và hệ bát phân (O).</p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702201384/docs/caal/01-data-representation-computer-arithmetic/C1-Number-systems-bin2oct2hex_dbezc6.webp" loading="lazy" decoding="async" alt="bin2oct2hex"></p>
<blockquote>
<p>Vậy: 1011111011111110<sub>2</sub> = BEFE<sub>16</sub> = 137376<sub>8</sub></p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="các-công-cụ-hỗ-trợ-chuyển-đổi-số-nguyên-dương-giữa-các-hệ-số">Các công cụ hỗ trợ chuyển đổi số nguyên dương giữa các hệ số<a href="https://tiennhm.io.vn/blog/unsigned-integer-representation#c%C3%A1c-c%C3%B4ng-c%E1%BB%A5-h%E1%BB%97-tr%E1%BB%A3-chuy%E1%BB%83n-%C4%91%E1%BB%95i-s%E1%BB%91-nguy%C3%AAn-d%C6%B0%C6%A1ng-gi%E1%BB%AFa-c%C3%A1c-h%E1%BB%87-s%E1%BB%91" class="hash-link" aria-label="Đường dẫn trực tiếp đến Các công cụ hỗ trợ chuyển đổi số nguyên dương giữa các hệ số" title="Đường dẫn trực tiếp đến Các công cụ hỗ trợ chuyển đổi số nguyên dương giữa các hệ số" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-calculator-windows">1. Calculator (Windows)<a href="https://tiennhm.io.vn/blog/unsigned-integer-representation#1-calculator-windows" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1. Calculator (Windows)" title="Đường dẫn trực tiếp đến 1. Calculator (Windows)" translate="no">​</a></h3>
<p>Để thực hiện chuyển đổi số nguyên dương giữa các hệ số, bạn làm theo các bước sau:</p>
<ul>
<li class="">Bước 1: Mở <code>Calculator</code> trên máy tính.</li>
<li class="">Bước 2: Chọn <code>View</code> &gt; <code>Programmer</code> hoặc nhấn tổ hợp phím <code>Alt + 3</code>.</li>
<li class="">Bước 3: Nhập số cần chuyển đổi vào ô <code>Dec</code> (hệ thập phân).</li>
<li class="">Bước 4: Chọn hệ số cần chuyển đổi ở các ô <code>Bin</code> (hệ nhị phân), <code>Oct</code> (hệ bát phân) và <code>Hex</code> (hệ thập lục phân).</li>
</ul>
<p>Lưu ý: Khi nhập số vào ô <code>Dec</code>, bạn chỉ được nhập các chữ số từ 0-9. Nếu muốn nhập đầu vào là số ở các hệ khác, bạn cần chọn lại hệ số trước khi nhập.</p>
<div class="row"><div class="col" style="display:flex;justify-content:center;flex-direction:column"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702201865/docs/caal/01-data-representation-computer-arithmetic/Calculator-01_vr079k.webp" loading="lazy" decoding="async" alt="Calculator-01"><h4 style="padding:20px">Hình 1. Chọn <code>View &amp;gt; Programmer</code>.</h4></div><div class="col" style="display:flex;justify-content:center;flex-direction:column"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1702201865/docs/caal/01-data-representation-computer-arithmetic/Calculator-02_jzmxts.webp" loading="lazy" decoding="async" alt="Calculator-02"><h4 style="padding:20px">Hình 2. Chọn hệ số trước khi nhập dữ liệu.</h4></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-rapidtables-online">2. RapidTables (Online)<a href="https://tiennhm.io.vn/blog/unsigned-integer-representation#2-rapidtables-online" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2. RapidTables (Online)" title="Đường dẫn trực tiếp đến 2. RapidTables (Online)" translate="no">​</a></h3>
<p>Bạn có thể sử dụng trang web <a href="https://www.rapidtables.com/convert/number/index.html" target="_blank" rel="noopener noreferrer" class="">RapidTables</a> để chuyển đổi số nguyên dương giữa các hệ số.</p>
<img src="https://slorber-api-screenshot.netlify.app/https%3A%2F%2Fwww.rapidtables.com/showcase/" loading="lazy" decoding="async">
<p><strong>Ngoài ra bạn còn có thể sử dụng các trang web sau:</strong></p>
<ul>
<li class=""><a href="https://www.binaryhexconverter.com/" target="_blank" rel="noopener noreferrer" class="">BinaryHexConverter</a></li>
<li class=""><a href="https://binaryhexconverter.com/decimal-to-hex-converter" target="_blank" rel="noopener noreferrer" class="">BinaryHex</a></li>
<li class="">...</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bài-tập">Bài tập<a href="https://tiennhm.io.vn/blog/unsigned-integer-representation#b%C3%A0i-t%E1%BA%ADp" class="hash-link" aria-label="Đường dẫn trực tiếp đến Bài tập" title="Đường dẫn trực tiếp đến Bài tập" translate="no">​</a></h2>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-write-each-of-the-following-decimal-numbers-in-binary">1. Write each of the following decimal numbers in binary:<a href="https://tiennhm.io.vn/blog/unsigned-integer-representation#1-write-each-of-the-following-decimal-numbers-in-binary" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1. Write each of the following decimal numbers in binary:" title="Đường dẫn trực tiếp đến 1. Write each of the following decimal numbers in binary:" translate="no">​</a></h4>
<blockquote>
<p>Chuyển các số thập phân (hệ 10) sang nhị phân (hệ 2)</p>
</blockquote>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">a. 2    =&gt; 0000 0010  	      	g. 15   =&gt; 0000 1111</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">b. 7    =&gt; 0000 0111            h. 16   =&gt; 0001 0000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">c. 5 	=&gt; 0000 0101	      	i. 20   =&gt; 0001 0100</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">d. 8    =&gt; 0000 1000         	j. 27   =&gt; 0001 1011</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">e. 9 	=&gt; 0000 1001         	k. 32   =&gt; 0010 0000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">f. 12   =&gt; 0000 1100         	l. 64   =&gt; 0100 0000</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-write-each-of-the-following-binary-numbers-in-decimal">2. Write each of the following binary numbers in decimal:<a href="https://tiennhm.io.vn/blog/unsigned-integer-representation#2-write-each-of-the-following-binary-numbers-in-decimal" class="hash-link" aria-label="Đ�ường dẫn trực tiếp đến 2. Write each of the following binary numbers in decimal:" title="Đường dẫn trực tiếp đến 2. Write each of the following binary numbers in decimal:" translate="no">​</a></h4>
<blockquote>
<p>Chuyển các số nhị phân (hệ 2) sang thập phân (hệ 10)</p>
</blockquote>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">a. 00000101 =&gt; 5        		g.00110000 =&gt; 48</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">b. 00001111 =&gt; 15	      		h.00100111 =&gt; 39</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">c. 00010000 =&gt; 16	      		i.01000000 =&gt; 64</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">d. 00010110 =&gt; 22	      		j.01100011 =&gt; 99</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">e. 00001011 =&gt; 11 	      		k.10100000 =&gt; 160</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">f. 00011100 =&gt; 28	      		l.10101010 =&gt; 170</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-write-each-of-the-following-binary-numbers-in-hexadecimal">3. Write each of the following binary numbers in hexadecimal:<a href="https://tiennhm.io.vn/blog/unsigned-integer-representation#3-write-each-of-the-following-binary-numbers-in-hexadecimal" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3. Write each of the following binary numbers in hexadecimal:" title="Đường dẫn trực tiếp đến 3. Write each of the following binary numbers in hexadecimal:" translate="no">​</a></h4>
<blockquote>
<p>Chuyển các số hệ nhị phân (hệ 2) sang hệ thập lục phân (hệ 16)</p>
</blockquote>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">a. 00000101 =&gt; 0005h    g.00110000 =&gt; 0030h</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">b. 00001111 =&gt; 000Fh    h.00100111 =&gt; 0027h</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">c. 00010000 =&gt; 0010h    i.01001000 =&gt; 0048h</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">d. 00010110 =&gt; 0016h    j.01100011 =&gt; 0063h</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">e. 00001011 =&gt; 000Bh    k.10100000 =&gt; 00A0h</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">f. 00011100 =&gt; 001Ch    l.10101011 =&gt; 00ABh</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-write-each-of-the-following-hexadecimal-numbers-in-binary">4. Write each of the following hexadecimal numbers in binary:<a href="https://tiennhm.io.vn/blog/unsigned-integer-representation#4-write-each-of-the-following-hexadecimal-numbers-in-binary" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4. Write each of the following hexadecimal numbers in binary:" title="Đường dẫn trực tiếp đến 4. Write each of the following hexadecimal numbers in binary:" translate="no">​</a></h4>
<blockquote>
<p>Chuyển các số hệ thập lục phân (hệ 16) sang hệ nhị phân (hệ 2)</p>
</blockquote>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">a. 0005h    =&gt; 0000 0101    g. 0030h    =&gt; 0011 0000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">b. 000Fh    =&gt; 0101 1111    h. 0027h    =&gt; 0010 0111</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">c. 0010h    =&gt; 0001 0000    i. 0048h    =&gt; 0100 1000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">d. 0016h    =&gt; 0001 0110    j. 0063h    =&gt; 0110 0011</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">e. 000Bh    =&gt; 0000 1011    k. A064h    =&gt; 1010 0000 0110 0100</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">f. 001Ch    =&gt; 0001 1100    l. ABDEh    =&gt; 1010 1011 1101 1110</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-write-each-of-the-following-hexadecimal-numbers-in-decimal">5. Write each of the following hexadecimal numbers in decimal:<a href="https://tiennhm.io.vn/blog/unsigned-integer-representation#5-write-each-of-the-following-hexadecimal-numbers-in-decimal" class="hash-link" aria-label="Đường dẫn trực tiếp đến 5. Write each of the following hexadecimal numbers in decimal:" title="Đường dẫn trực tiếp đến 5. Write each of the following hexadecimal numbers in decimal:" translate="no">​</a></h4>
<blockquote>
<p>Chuyển các số hệ thập lục phân (hệ 16) sang thập phân (hệ 10)</p>
</blockquote>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">a. 00D5h =&gt; 213         g. 0B30h =&gt; 2864</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">b. 002Fh =&gt; 47          h. 06DFh =&gt; 1759</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">c. 0110h =&gt; 272			i. 1AB6h =&gt; 6838</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">d. 0216h =&gt; 534			j. 0A63h =&gt; 2659</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">e. 004Bh =&gt; 75			k. 02A0h =&gt; 672</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">f. 041Ch =&gt; 1052		l. 1FABh =&gt; 8107</span><br></span></code></pre></div></div>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="number-system" term="number-system"/>
        <category label="data-representation" term="data-representation"/>
        <category label="CAAL" term="CAAL"/>
        <category label="unsigned-integer" term="unsigned-integer"/>
        <category label="binary" term="binary"/>
        <category label="hexadecimal" term="hexadecimal"/>
        <category label="decimal" term="decimal"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Hướng dẫn cài đặt Apache Zeppelin trên Windows]]></title>
        <id>https://tiennhm.io.vn/blog/install-zeppelin-on-windows</id>
        <link href="https://tiennhm.io.vn/blog/install-zeppelin-on-windows"/>
        <updated>2024-01-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Bài viết hướng dẫn chi tiết cách cài đặt Apache Zeppelin trên Windows. Apache Zeppelin là công cụ phân tích dữ liệu mã nguồn mở với giao diện web, hỗ trợ nhiều ngôn ngữ như Scala, Python, SQL, SparkSQL, Hive. Bài viết bao gồm các bước cài đặt Java, tải và cấu hình Zeppelin, và cách khởi chạy ứng dụng. Zeppelin giúp data scientists và analysts thực hiện data analysis tương tác và trực quan với notebooks tương tự Jupyter.]]></summary>
        <content type="html"><![CDATA[<p align="right"><img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Ftiennhm.github.io%2Fblog%2Finstall-zeppelin-on-windows&amp;label=%E2%9A%AAView&amp;labelColor=%2337d67a&amp;countColor=%23555555&amp;style=flat&amp;labelStyle=upper" loading="lazy" decoding="async"></p>
<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p>Bài viết hướng dẫn chi tiết cách cài đặt Apache Zeppelin trên Windows. Apache Zeppelin là công cụ phân tích dữ liệu mã nguồn mở với giao diện web, hỗ trợ nhiều ngôn ngữ như Scala, Python, SQL, SparkSQL, Hive. Bài viết bao gồm các bước cài đặt Java, tải và cấu hình Zeppelin, và cách khởi chạy ứng dụng. Zeppelin giúp data scientists và analysts thực hiện data analysis tương tác và trực quan với notebooks tương tự Jupyter.</p></div></div>
<p>Apache Zeppelin là một công cụ phân tích dữ liệu mã nguồn mở, được thiết kế để thực hiện các nhiệm vụ phân tích dữ liệu tương tác và trực quan. Nó cung cấp một giao diện người dùng web để phân tích dữ liệu bằng nhiều ngôn ngữ lập trình khác nhau như Scala, Python, SQL, SparkSQL, Hive, Markdown, Shell, v.v. Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu cách cài đặt Apache Zeppelin trên Windows.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-cài-đặt-java">1. Cài đặt Java<a href="https://tiennhm.io.vn/blog/install-zeppelin-on-windows#1-c%C3%A0i-%C4%91%E1%BA%B7t-java" class="hash-link" aria-label="Đường dẫn trực tiếp đến 1. Cài đặt Java" title="Đường dẫn trực tiếp đến 1. Cài đặt Java" translate="no">​</a></h2>
<p>Để cài đặt Apache Zeppelin, chúng ta cần cài đặt Java trước. Có thể tải Java từ trang chủ của Oracle tại địa chỉ <a href="https://www.oracle.com/java/technologies/javase-downloads.html" target="_blank" rel="noopener noreferrer" class="">https://www.oracle.com/java/technologies/javase-downloads.html</a>. Trong bài viết này, chúng ta sẽ sử dụng Java 8.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Link tải trực tiếp</div><div class="admonitionContent_BuS1"><p><a href="https://javadl.oracle.com/webapps/download/GetFile/1.8.0_331-b09/165374ff4ea84ef0bbd821706e29b123/windows-i586/jre-8u331-windows-x64.exe" target="_blank" rel="noopener noreferrer" class="">https://javadl.oracle.com/webapps/download/GetFile/1.8.0_331-b09/165374ff4ea84ef0bbd821706e29b123/windows-i586/jre-8u331-windows-x64.exe</a></p></div></div>
<p>Sau khi tải về, chúng ta tiến hành cài đặt Java bình thường.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-cài-đặt-apache-zeppelin---version-082">2. Cài đặt Apache Zeppelin - Version 0.8.2<a href="https://tiennhm.io.vn/blog/install-zeppelin-on-windows#2-c%C3%A0i-%C4%91%E1%BA%B7t-apache-zeppelin---version-082" class="hash-link" aria-label="Đường dẫn trực tiếp đến 2. Cài đặt Apache Zeppelin - Version 0.8.2" title="Đường dẫn trực tiếp đến 2. Cài đặt Apache Zeppelin - Version 0.8.2" translate="no">​</a></h2>
<p>Sau khi cài đặt Java xong, chúng ta tiến hành tải Apache Zeppelin về từ trang chủ của Apache Zeppelin tại địa chỉ <a href="https://zeppelin.apache.org/download.html" target="_blank" rel="noopener noreferrer" class="">https://zeppelin.apache.org/download.html</a>. Trong bài viết này, chúng ta sẽ sử dụng Apache Zeppelin phiên bản 0.8.2.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Link tải trực tiếp</div><div class="admonitionContent_BuS1"><p><a href="https://dlcdn.apache.org/zeppelin/zeppelin-0.8.2/zeppelin-0.8.2-bin-all.tgz" target="_blank" rel="noopener noreferrer" class="">https://dlcdn.apache.org/zeppelin/zeppelin-0.8.2/zeppelin-0.8.2-bin-all.tgz</a></p></div></div>
<p>Bạn hãy tải file <code>zeppelin-0.8.2-bin-all.tgz</code> về và giải nén ra một thư mục bất kỳ. Trong bài viết này, chúng ta sẽ giải nén vào thư mục <code>D:\Programs\zeppelin-0.8.2-bin-all</code>.</p>
<p>Bạn có thể sử dụng phần mềm <a href="https://www.7-zip.org/" target="_blank" rel="noopener noreferrer" class="">7-Zip</a> hoặc <a href="https://www.win-rar.com/" target="_blank" rel="noopener noreferrer" class="">WinRAR</a> để giải nén file <code>zeppelin-0.8.2-bin-all.tgz</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-cài-đặt-python3---version-3121">3. Cài đặt Python3 - Version 3.12.1<a href="https://tiennhm.io.vn/blog/install-zeppelin-on-windows#3-c%C3%A0i-%C4%91%E1%BA%B7t-python3---version-3121" class="hash-link" aria-label="Đường dẫn trực tiếp đến 3. Cài đặt Python3 - Version 3.12.1" title="Đường dẫn trực tiếp đến 3. Cài đặt Python3 - Version 3.12.1" translate="no">​</a></h2>
<p>Apache Zeppelin hỗ trợ nhiều ngôn ngữ lập trình khác nhau. Trong bài viết này, chúng ta sẽ sử dụng Python3. Bạn có thể tải Python3 từ trang chủ của Python tại địa chỉ <a href="https://www.python.org/downloads/" target="_blank" rel="noopener noreferrer" class="">https://www.python.org/downloads/</a>. Trong bài viết này, chúng ta sẽ sử dụng Python3 phiên bản 3.12.1.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Link tải trực tiếp</div><div class="admonitionContent_BuS1"><p><a href="https://www.python.org/ftp/python/3.12.1/python-3.12.1-amd64.exe" target="_blank" rel="noopener noreferrer" class="">https://www.python.org/ftp/python/3.12.1/python-3.12.1-amd64.exe</a></p></div></div>
<p>Lưu ý khi cài đặt Python3, bạn chọn chế độ cài đặt <code>Customize installation</code> và chọn <code>Add Python 3.12 to PATH</code> như hình dưới đây:</p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725683997/blog/images/install-python-01_geyq8d.webp" loading="lazy" decoding="async" alt="Install Python - 01"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725684076/blog/images/install-python-02_iyv4ib.webp" loading="lazy" decoding="async" alt="Install Python - 02"></p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725684069/blog/images/install-python-03_fxtqgs.webp" loading="lazy" decoding="async" alt="Install Python - 02"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-tạo-môi-trường-ảo-python3-cho-apache-zeppelin">4. Tạo môi trường ảo Python3 cho Apache Zeppelin<a href="https://tiennhm.io.vn/blog/install-zeppelin-on-windows#4-t%E1%BA%A1o-m%C3%B4i-tr%C6%B0%E1%BB%9Dng-%E1%BA%A3o-python3-cho-apache-zeppelin" class="hash-link" aria-label="Đường dẫn trực tiếp đến 4. Tạo môi trường ảo Python3 cho Apache Zeppelin" title="Đường dẫn trực tiếp đến 4. Tạo môi trường ảo Python3 cho Apache Zeppelin" translate="no">​</a></h2>
<p>Sau khi cài đặt Python3 xong, chúng ta tiến hành tạo một môi trường ảo Python3 cho Apache Zeppelin. Để tạo môi trường ảo Python3, chúng ta sử dụng công cụ <code>venv</code> của Python3.</p>
<p>Đầu tiên, chúng ta mở Command Prompt (hoặc Windows PowerShell) lên và chạy lần lượt các lệnh sau:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token builtin class-name">cd</span><span class="token plain"> D:</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Programs</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">zeppelin-0.8.2-bin-all</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> python</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">venv</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">python </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> venv python</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">venv</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">python</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">venv</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Scripts</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">activate.bat</span><br></span></code></pre></div></div>
<p>Sau đó, chuyển tới thư mục <code>D:\Programs\zeppelin-0.8.2-bin-all\python\venv\Scripts</code> và chạy lệnh sau để active môi trường ảo Python3:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">activate.bat</span><br></span></code></pre></div></div>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725683844/blog/images/create-python-virtual-environment_g5vufa.webp" loading="lazy" decoding="async" alt="Create Python Virtual Environment"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-cài-đặt-các-thư-viện-python3-cần-thiết">5. Cài đặt các thư viện Python3 cần thiết<a href="https://tiennhm.io.vn/blog/install-zeppelin-on-windows#5-c%C3%A0i-%C4%91%E1%BA%B7t-c%C3%A1c-th%C6%B0-vi%E1%BB%87n-python3-c%E1%BA%A7n-thi%E1%BA%BFt" class="hash-link" aria-label="Đường dẫn trực tiếp đến 5. Cài đặt các thư viện Python3 cần thiết" title="Đường dẫn trực tiếp đến 5. Cài đặt các thư viện Python3 cần thiết" translate="no">​</a></h2>
<p>Sau khi active môi trường ảo Python3, chúng ta tiến hành cài đặt các thư viện Python3 cần thiết cho Apache Zeppelin. Để cài đặt các thư viện Python3 cần thiết, chúng ta sử dụng công cụ <code>pip</code> của Python3.</p>
<p>Các bạn tiếp tục chạy lần lượt các lệnh sau:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pip </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">py4j</span><span class="token operator" style="color:#393A34">==</span><span class="token number" style="color:#36acaa">0.10</span><span class="token plain">.4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pip </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">pypandoc</span><span class="token operator" style="color:#393A34">==</span><span class="token number" style="color:#36acaa">1.5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pip </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">pyspark</span><span class="token operator" style="color:#393A34">==</span><span class="token number" style="color:#36acaa">2.2</span><span class="token plain">.1</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-sửa-một-số-tập-tin-liên-quan">6. Sửa một số tập tin liên quan<a href="https://tiennhm.io.vn/blog/install-zeppelin-on-windows#6-s%E1%BB%ADa-m%E1%BB%99t-s%E1%BB%91-t%E1%BA%ADp-tin-li%C3%AAn-quan" class="hash-link" aria-label="Đường dẫn trực tiếp đến 6. Sửa một số tập tin liên quan" title="Đường dẫn trực tiếp đến 6. Sửa một số tập tin liên quan" translate="no">​</a></h2>
<p>Sau khi cài đặt các thư viện Python3 cần thiết, chúng ta tiến hành sửa file <code>zeppelin-env.cmd</code> và <code>common.cmd</code> để Apache Zeppelin có thể sử dụng được Python3.</p>
<p>Chuyển tới thư mục <code>D:\Programs\zeppelin-0.8.2-bin-all\bin</code>, lần lượt mở file <code>zeppelin-env.cmd</code> và <code>common.cmd</code> lên và thêm vào ngay sau dòng bắt đầu bằng <code>REM</code> cuối cùng:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token assign-left variable environment constant" style="color:#36acaa">PATH</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">C:</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Program Files </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x86</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Common Files</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Oracle</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Java</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">javapath</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">D:</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Programs</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">zeppelin-0.8.2-bin-all</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">python</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">venv</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Scripts</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>Lưu ý: Đường dẫn <code>D:\Programs\zeppelin-0.8.2-bin-all\python\venv\Scripts</code> là đường dẫn tới thư mục <code>Scripts</code> của môi trường ảo Python3 mà chúng ta đã tạo ở bước 4. Nếu bạn tạo môi trường ảo Python3 ở một thư mục khác, bạn hãy thay đổi đường dẫn tương ứng.</p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725683939/blog/images/edit-zeppelin-env-cmd_z2exjv.webp" loading="lazy" decoding="async" alt="Edit zeppelin-env.cmd"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-thay-thế-một-số-tập-tin">7. Thay thế một số tập tin<a href="https://tiennhm.io.vn/blog/install-zeppelin-on-windows#7-thay-th%E1%BA%BF-m%E1%BB%99t-s%E1%BB%91-t%E1%BA%ADp-tin" class="hash-link" aria-label="Đường dẫn trực tiếp đến 7. Thay thế một số tập tin" title="Đường dẫn trực tiếp đến 7. Thay thế một số tập tin" translate="no">​</a></h2>
<p>Tải các file patches tại <a href="https://cloud.cntt.io/s/G69GLQ9MKwWpAZy" target="_blank" rel="noopener noreferrer" class="">https://cloud.cntt.io/s/G69GLQ9MKwWpAZy</a>. Lần lượt thay thế như sau:</p>
<ul>
<li class="">spark-interpreter-0.8.2.jar</li>
</ul>
<blockquote>
<p>D:\Programs\zeppelin-0.8.2-bin-all\interpreter\spark\spark-interpreter-0.8.2.jar</p>
</blockquote>
<ul>
<li class="">py4j-0.10.4-src.zip</li>
</ul>
<blockquote>
<p>D:\Programs\zeppelin-0.8.2-bin-all\interpreter\spark\pyspark\py4j-0.10.4-src.zip</p>
</blockquote>
<ul>
<li class="">spark.zip</li>
</ul>
<blockquote>
<p>D:\Programs\zeppelin-0.8.2-bin-all\interpreter\spark\pyspark\spark.zip</p>
</blockquote>
<ul>
<li class="">resultiterable.py</li>
</ul>
<blockquote>
<p>D:\Programs\zeppelin-0.8.2-bin-all\python\venv\Lib\site-packages\pyspark\resultiterable.py</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-chạy-apache-zeppelin">8. Chạy Apache Zeppelin<a href="https://tiennhm.io.vn/blog/install-zeppelin-on-windows#8-ch%E1%BA%A1y-apache-zeppelin" class="hash-link" aria-label="Đường dẫn trực tiếp đến 8. Chạy Apache Zeppelin" title="Đường dẫn trực tiếp đến 8. Chạy Apache Zeppelin" translate="no">​</a></h2>
<p>Sau khi thực hiện xong các bước trên, chúng ta tiến hành chạy Apache Zeppelin. Để chạy Apache Zeppelin, chúng ta chuyển tới thư mục <code>D:\Programs\zeppelin-0.8.2-bin-all\bin</code>, mở Command Prompt (hoặc Windows PowerShell) lên và chạy lệnh sau:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">zeppelin.cmd</span><br></span></code></pre></div></div>
<p>Kết quả trên Command Prompt (hoặc Windows PowerShell) sẽ như sau:</p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725684170/blog/images/run-apache-zeppelin_xzj3vw.webp" loading="lazy" decoding="async" alt="Run Apache Zeppelin"></p>
<p>Sau khi chạy và thấy logs báo <code>Done, zeppelin server started</code>, chúng ta mở trình duyệt web lên và truy cập vào địa chỉ <a href="http://localhost:8080/" target="_blank" rel="noopener noreferrer" class="">http://localhost:8080</a> để sử dụng Apache Zeppelin.</p>
<p>Màn hình trang chủ của Apache Zeppelin sẽ như sau:</p>
<p align="center"><img src="https://res.cloudinary.com/tiennhm/image/upload/v1725684163/blog/images/welcome-apache-zeppelin_icrah5.webp" loading="lazy" decoding="async" alt="Apache Zeppelin Home Page"></p>
<p>Như vậy, chúng ta đã cài đặt thành công Apache Zeppelin trên Windows.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tổng-kết">Tổng kết<a href="https://tiennhm.io.vn/blog/install-zeppelin-on-windows#t%E1%BB%95ng-k%E1%BA%BFt" class="hash-link" aria-label="Đường dẫn trực tiếp đến Tổng kết" title="Đường dẫn trực tiếp đến Tổng kết" translate="no">​</a></h2>
<p>Trong bài viết này, chúng ta đã cùng nhau tìm hiểu cách cài đặt Apache Zeppelin trên Windows. Hy vọng bài viết này sẽ giúp ích cho các bạn trong quá trình học tập và làm việc.</p>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="apache" term="apache"/>
        <category label="zeppelin" term="zeppelin"/>
        <category label="installation" term="installation"/>
        <category label="tutorial" term="tutorial"/>
        <category label="windows" term="windows"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Những tài khoản Linkedin mà bất cứ lập trình viên nào cũng nên theo dõi]]></title>
        <id>https://tiennhm.io.vn/blog/top-linked-accounts-to-follow-for-developers</id>
        <link href="https://tiennhm.io.vn/blog/top-linked-accounts-to-follow-for-developers"/>
        <updated>2023-12-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Bài viết giới thiệu danh sách các tài khoản LinkedIn mà mọi lập trình viên nên theo dõi để cập nhật xu hướng công nghệ mới nhất, học hỏi kinh nghiệm từ các chuyên gia và developers hàng đầu, và tìm hiểu về các công nghệ mới. Danh sách bao gồm các influencers, công ty công nghệ, và cộng đồng developers nổi tiếng trong ngành, giúp developers mở rộng network và cập nhật kiến thức liên tục.]]></summary>
        <content type="html"><![CDATA[<p align="right"><img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Ftiennhm.github.io%2Fblog%2Ftop-linked-accounts-to-follow-for-developers&amp;label=%E2%9A%AAView&amp;labelColor=%2337d67a&amp;countColor=%23555555&amp;style=flat&amp;labelStyle=upper" loading="lazy" decoding="async"></p>
<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p>Bài viết giới thiệu danh sách các tài khoản LinkedIn mà mọi lập trình viên nên theo dõi để cập nhật xu hướng công nghệ mới nhất, học hỏi kinh nghiệm từ các chuyên gia và developers hàng đầu, và tìm hiểu về các công nghệ mới. Danh sách bao gồm các influencers, công ty công nghệ, và cộng đồng developers nổi tiếng trong ngành, giúp developers mở rộng network và cập nhật kiến thức liên tục.</p></div></div>
<p>Bạn là một lập trình viên và bạn muốn cập nhật những xu hướng công nghệ mới nhất? Bạn muốn tìm hiểu những kinh nghiệm của những lập trình viên khác? Bạn muốn tìm hiểu những công nghệ mới nhất?</p>
<p>Hãy theo dõi những tài khoản Linkedin mà bất cứ lập trình viên nào cũng nên theo dõi ở bài viết này nhé! <sup><a href="https://tiennhm.io.vn/blog/top-linked-accounts-to-follow-for-developers#user-content-fn-1-52a059" id="user-content-fnref-1-52a059" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="linkedin-là-gì">Linkedin là gì?<a href="https://tiennhm.io.vn/blog/top-linked-accounts-to-follow-for-developers#linkedin-l%C3%A0-g%C3%AC" class="hash-link" aria-label="Đường dẫn trực tiếp đến Linkedin là gì?" title="Đường dẫn trực tiếp đến Linkedin là gì?" translate="no">​</a></h2>
<p>Linkedin được thành lập vào tháng 12 năm 2002 và được ra mắt vào tháng 5 năm 2003. Linkedin là một mạng xã hội chuyên nghiệp lớn nhất thế giới với hơn 950 triệu thành viên tại hơn 200 quốc gia và vùng lãnh thổ trên toàn thế giới, nơi mà các nhà tuyển dụng và những người tìm việc có thể kết nối với nhau. <sup><a href="https://tiennhm.io.vn/blog/top-linked-accounts-to-follow-for-developers#user-content-fn-2-52a059" id="user-content-fnref-2-52a059" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">2</a></sup></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="danh-sách-tài-khoản-linkedin-bạn-nên-theo-dõi">Danh sách tài khoản Linkedin bạn nên theo dõi<a href="https://tiennhm.io.vn/blog/top-linked-accounts-to-follow-for-developers#danh-s%C3%A1ch-t%C3%A0i-kho%E1%BA%A3n-linkedin-b%E1%BA%A1n-n%C3%AAn-theo-d%C3%B5i" class="hash-link" aria-label="Đường dẫn trực tiếp đến Danh sách tài khoản Linkedin bạn nên theo dõi" title="Đường dẫn trực tiếp đến Danh sách tài khoản Linkedin bạn nên theo dõi" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://www.linkedin.com/in/akshaymarch7/" target="_blank" rel="noopener noreferrer" class="">Akshay Saini 🚀</a></li>
</ul>
<blockquote>
<p>Một trong những người dạy JavaScript giỏi nhất thế giới, với gần 520.000 followers (12.2023).</p>
</blockquote>
<ul>
<li class=""><a href="https://www.linkedin.com/in/jehakjerrylee/" target="_blank" rel="noopener noreferrer" class="">Jerry (Je Hak) Lee 💡</a></li>
</ul>
<blockquote>
<p>Forbes 30 under 30, với hơn 300.000 followers (12.2023), thường chia sẻ những câu chuyện và bài học thú vị thông qua hình ảnh, quotes.</p>
</blockquote>
<ul>
<li class=""><a href="https://www.linkedin.com/in/kunal-kushwaha/" target="_blank" rel="noopener noreferrer" class="">Kunal Kushwaha</a></li>
</ul>
<blockquote>
<p>Một giáo viên, Youtuber, người đam mê chia sẻ cho cộng đồng. Với hơn 150.000 followers (12.2023), Kunal thường chia sẻ những bài học, kiến thức về lập trình, kinh nghiệm làm việc,...</p>
</blockquote>
<ul>
<li class=""><a href="https://www.linkedin.com/in/hiteshchoudhary/" target="_blank" rel="noopener noreferrer" class="">Hitesh Choudhary</a></li>
</ul>
<blockquote>
<p>AI, Video content và những bài học thú vị về lập trình, kinh nghiệm làm việc,... với khoảng 175.000 followers (12.2023).</p>
</blockquote>
<ul>
<li class=""><a href="https://www.linkedin.com/in/love-babbar-38ab2887" target="_blank" rel="noopener noreferrer" class="">Love Babbar</a></li>
</ul>
<blockquote>
<p>Founder - Codehelp | SSB Recommended | TedX Speaker | Ex-Amazon | Ex-Microsoft với gần 500.000 followers (12.2023).</p>
</blockquote>
<ul>
<li class=""><a href="https://www.linkedin.com/in/tanaypratap" target="_blank" rel="noopener noreferrer" class="">Tanay Pratap</a></li>
</ul>
<blockquote>
<p>Founder &amp; CEO, Invact Inc. | Fixing Education | xMicrosoft, với gần 180.000 followers (12.2023).</p>
</blockquote>
<ul>
<li class=""><a href="https://www.linkedin.com/in/pascalbornet" target="_blank" rel="noopener noreferrer" class="">Pascal BORNET</a></li>
</ul>
<blockquote>
<p>Top Artificial Intelligence (AI) Voice, với hơn 1.300.000 followers (12.2023).</p>
</blockquote>
<ul>
<li class=""><a href="https://www.linkedin.com/in/alliekmiller/" target="_blank" rel="noopener noreferrer" class="">Allie K. Miller</a></li>
</ul>
<blockquote>
<p>AI Entrepreneur, Advisor, and Investor | Former Amazon, IBM | LinkedIn Top Voice for AI 2019-2023, với hơn 1.300.000 followers (12.2023).</p>
</blockquote>
<ul>
<li class=""><a href="https://www.linkedin.com/in/bernardmarr/" target="_blank" rel="noopener noreferrer" class="">Bernard Marr</a></li>
</ul>
<blockquote>
<p>Trí tuệ nhân tạo (AI), BigData, Blockchain và Internet vạn vật (IoT)..., với hơn 1.400.000 followers (12.2023).</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tài-liệu-tham-khảo">Tài liệu tham khảo<a href="https://tiennhm.io.vn/blog/top-linked-accounts-to-follow-for-developers#t%C3%A0i-li%E1%BB%87u-tham-kh%E1%BA%A3o" class="hash-link" aria-label="Đường dẫn trực tiếp đến Tài liệu tham khảo" title="Đường dẫn trực tiếp đến Tài liệu tham khảo" translate="no">​</a></h2>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetStickyNavbar_Vzrq sr-only" id="footnote-label">Footnotes<a href="https://tiennhm.io.vn/blog/top-linked-accounts-to-follow-for-developers#footnote-label" class="hash-link" aria-label="Đường dẫn trực tiếp đến Footnotes" title="Đường dẫn trực tiếp đến Footnotes" translate="no">​</a></h2>
<ol>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-1-52a059">
<p><a href="https://www.masaischool.com/blog/a-list-of-useful-linkedin-profiles-to-follow-for-developers/" target="_blank" rel="noopener noreferrer" class="">https://www.masaischool.com/blog/a-list-of-useful-linkedin-profiles-to-follow-for-developers/</a>, "Những tài khoản Linkedin mà bất cứ lập trình viên nào cũng nên theo dõi" <a href="https://tiennhm.io.vn/blog/top-linked-accounts-to-follow-for-developers#user-content-fnref-1-52a059" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-2-52a059">
<p><a href="https://about.linkedin.com/" target="_blank" rel="noopener noreferrer" class="">https://about.linkedin.com</a>, "Giới thiệu về Linkedin" <a href="https://tiennhm.io.vn/blog/top-linked-accounts-to-follow-for-developers#user-content-fnref-2-52a059" data-footnote-backref="" aria-label="Back to reference 2" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="linkedin" term="linkedin"/>
        <category label="developer" term="developer"/>
        <category label="follow" term="follow"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Markdown Cheat Sheet - Cách tạo một file README trên Github với Markdown]]></title>
        <id>https://tiennhm.io.vn/blog/markdown-cheat-sheet</id>
        <link href="https://tiennhm.io.vn/blog/markdown-cheat-sheet"/>
        <updated>2023-11-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Bài viết là một Markdown Cheat Sheet đầy đủ hướng dẫn cách tạo file README trên GitHub với Markdown. Markdown là ngôn ngữ đánh dấu nhẹ, dễ đọc và dễ viết, được sử dụng rộng rãi trên GitHub để tạo documentation. Bài viết bao gồm tất cả các syntax cơ bản của Markdown như headings, lists, links, images, code blocks, tables, và nhiều tính năng khác, kèm ví dụ cụ thể cho từng loại.]]></summary>
        <content type="html"><![CDATA[<p align="right"><img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Ftiennhm.github.io%2Fblog%2Fmarkdown-cheat-sheet&amp;label=%E2%9A%AAView&amp;labelColor=%2337d67a&amp;countColor=%23555555&amp;style=flat&amp;labelStyle=upper" loading="lazy" decoding="async"></p>
<div class="summaryBox_OzMR" role="note" aria-label="Tóm tắt bài viết"><div class="summaryBox__header_j6b_"><svg class="summaryBox__icon_hw7e" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg><strong class="summaryBox__title_oG71">Tóm tắt</strong></div><div class="summaryBox__content_gl1R"><p>Bài viết là một Markdown Cheat Sheet đầy đủ hướng dẫn cách tạo file README trên GitHub với Markdown. Markdown là ngôn ngữ đánh dấu nhẹ, dễ đọc và dễ viết, được sử dụng rộng rãi trên GitHub để tạo documentation. Bài viết bao gồm tất cả các syntax cơ bản của Markdown như headings, lists, links, images, code blocks, tables, và nhiều tính năng khác, kèm ví dụ cụ thể cho từng loại.</p></div></div>
<p>Bạn có thể tạo một file README trên Github với Markdown. Nhưng markdown là gì và cách tạo một file README trên Github với Markdown như thế nào? Hãy cùng tìm hiểu ở bài viết này nhé!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="markdown-là-gì">Markdown là gì?<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#markdown-l%C3%A0-g%C3%AC" class="hash-link" aria-label="Đường dẫn trực tiếp đến Markdown là gì?" title="Đường dẫn trực tiếp đến Markdown là gì?" translate="no">​</a></h2>
<p>Markdown là một ngôn ngữ mã nguồn mở, được sử dụng để viết các file README, với cú pháp dễ hiểu và dễ đọc. Có thể được đọc trên nhiều nền tảng khác nhau, bao gồm những nền tảng web, trên máy tính, và trên các thiết bị di động.</p>
<p>Các định dạng file markdown phổ biến: <code>.markdown</code>, <code>.md</code>, <code>.mkd</code>, <code>.mkdown</code>, <code>.text</code>, <code>.mdown</code>...</p>
<p>Markdown là một trong số những markup language được sử dụng phổ biến nhất. Bên cạnh Markdown, bạn có thể sử dụng các markup language khác như <a href="https://www.w3schools.com/html/" target="_blank" rel="noopener noreferrer" class="">HTML</a>, <a href="https://www.w3schools.com/xml/" target="_blank" rel="noopener noreferrer" class="">XML</a>...</p>
<p>Đặc biệt, bạn hoàn toàn có thể sử dụng cú pháp của các thẻ HTML trong file file markdown.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cú-pháp-markdown">Cú pháp Markdown<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#c%C3%BA-ph%C3%A1p-markdown" class="hash-link" aria-label="Đường dẫn trực tiếp đến Cú pháp Markdown" title="Đường dẫn trực tiếp đến Cú pháp Markdown" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="định-dạng-text">Định dạng text<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#%C4%91%E1%BB%8Bnh-d%E1%BA%A1ng-text" class="hash-link" aria-label="Đường dẫn trực tiếp đến Định dạng text" title="Đường dẫn trực tiếp đến Định dạng text" translate="no">​</a></h3>
<p>Markdown hỗ trợ các kiểu định dạng text như sau:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token italic punctuation" style="color:#393A34">*</span><span class="token italic content">In nghiêng</span><span class="token italic punctuation" style="color:#393A34">*</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token italic punctuation" style="color:#393A34">_</span><span class="token italic content">In nghiêng</span><span class="token italic punctuation" style="color:#393A34">_</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">In đậm</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:#393A34">__</span><span class="token bold content">In đậm</span><span class="token bold punctuation" style="color:#393A34">__</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content italic punctuation" style="color:#393A34">*</span><span class="token bold content italic content">In đậm và nghiêng</span><span class="token bold content italic punctuation" style="color:#393A34">*</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:#393A34">__</span><span class="token bold content italic punctuation" style="color:#393A34">_</span><span class="token bold content italic content">In đậm và nghiêng</span><span class="token bold content italic punctuation" style="color:#393A34">_</span><span class="token bold punctuation" style="color:#393A34">__</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token strike punctuation" style="color:#393A34">~~</span><span class="token strike content">Gạch ngang</span><span class="token strike punctuation" style="color:#393A34">~~</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token italic punctuation" style="color:#393A34">*</span><span class="token italic content strike punctuation" style="color:#393A34">~~</span><span class="token italic content strike content">In nghiêng và gạch ngang</span><span class="token italic content strike punctuation" style="color:#393A34">~~</span><span class="token italic punctuation" style="color:#393A34">*</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content strike punctuation" style="color:#393A34">~~</span><span class="token bold content strike content">In đậm và gạch ngang</span><span class="token bold content strike punctuation" style="color:#393A34">~~</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Kiểu</span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">sub</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">subscript</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">sub</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">: H</span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">sub</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">2</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">sub</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">O</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Kiểu</span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">sup</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">superscript</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">sup</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">: E = mc</span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">sup</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">2</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">sup</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p>Kết quả:</p>
<ul>
<li class=""><em>In nghiêng</em></li>
<li class=""><em>In nghiêng</em></li>
<li class=""><strong>In đậm</strong></li>
<li class=""><strong>In đậm</strong></li>
<li class=""><em><strong>In đậm và nghiêng</strong></em></li>
<li class=""><em><strong>In đậm và nghiêng</strong></em></li>
<li class=""><del>Gạch ngang</del></li>
<li class=""><em><del>In nghiêng và gạch ngang</del></em></li>
<li class=""><strong><del>In đậm và gạch ngang</del></strong></li>
<li class="">Kiểu<sub>subscript</sub>: H<sub>2</sub>O</li>
<li class="">Kiểu<sup>superscript</sup>: E = mc<sup>2</sup></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="thanh-kẻ-ngang">Thanh kẻ ngang<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#thanh-k%E1%BA%BB-ngang" class="hash-link" aria-label="Đường dẫn trực tiếp đến Thanh kẻ ngang" title="Đường dẫn trực tiếp đến Thanh kẻ ngang" translate="no">​</a></h3>
<p>Để tạo thanh kẻ ngang, hãy sử dụng cú pháp sau (dùng tối thiểu 4 dấu <code>-</code>):</p>
<div class="language-mardown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mardown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">----</span><br></span></code></pre></div></div>
<p>Kết quả:</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="header">Header<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#header" class="hash-link" aria-label="Đường dẫn trực tiếp đến Header" title="Đường dẫn trực tiếp đến Header" translate="no">​</a></h3>
<p>Có tất cả 6 header trong Markdown, bạn có thể sử dụng 1-6 <code>#</code> để tạo header.</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> Header 1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Header 2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">###</span><span class="token title important"> Header 3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">####</span><span class="token title important"> Header 4</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">#####</span><span class="token title important"> Header 5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">######</span><span class="token title important"> Header 6</span><br></span></code></pre></div></div>
<p>Kết quả:</p>
<ul>
<li class="">
<h1>Header 1</h1>
</li>
<li class="">
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="header-2">Header 2<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#header-2" class="hash-link" aria-label="Đường dẫn trực tiếp đến Header 2" title="Đường dẫn trực tiếp đến Header 2" translate="no">​</a></h2>
</li>
<li class="">
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="header-3">Header 3<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#header-3" class="hash-link" aria-label="Đường dẫn trực tiếp đến Header 3" title="Đường dẫn trực tiếp đến Header 3" translate="no">​</a></h3>
</li>
<li class="">
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="header-4">Header 4<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#header-4" class="hash-link" aria-label="Đường dẫn trực tiếp đến Header 4" title="Đường dẫn trực tiếp đến Header 4" translate="no">​</a></h4>
</li>
<li class="">
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="header-5">Header 5<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#header-5" class="hash-link" aria-label="Đường dẫn trực tiếp đến Header 5" title="Đường dẫn trực tiếp đến Header 5" translate="no">​</a></h5>
</li>
<li class="">
<h6 class="anchor anchorTargetStickyNavbar_Vzrq" id="header-6">Header 6<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#header-6" class="hash-link" aria-label="Đường dẫn trực tiếp đến Header 6" title="Đường dẫn trực tiếp đến Header 6" translate="no">​</a></h6>
</li>
</ul>
<p>Trong đó, Header 1 là header lớn nhất, Header 6 là header nhỏ nhất. Thông thường, Header 1 sẽ được sử dụng để tạo tiêu đề, các Header khác sẽ được sử dụng để tạo các section trong file README.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="danh-sách">Danh sách<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#danh-s%C3%A1ch" class="hash-link" aria-label="Đường dẫn trực tiếp đến Danh sách" title="Đường dẫn trực tiếp đến Danh sách" translate="no">​</a></h3>
<p>Có 2 loại danh sách trong Markdown, danh sách đánh thứ tự và danh sách không đánh thứ tự.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="danh-sách-đánh-thứ-tự">Danh sách đánh thứ tự<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#danh-s%C3%A1ch-%C4%91%C3%A1nh-th%E1%BB%A9-t%E1%BB%B1" class="hash-link" aria-label="Đường dẫn trực tiếp đến Danh sách đánh thứ tự" title="Đường dẫn trực tiếp đến Danh sách đánh thứ tự" translate="no">​</a></h4>
<p>Để tạo danh sách đánh thứ tự, bạn có thể sử dụng các số nguyên như sau:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> Item 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">2.</span><span class="token plain"> Item 2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">3.</span><span class="token plain"> Item 3</span><br></span></code></pre></div></div>
<p>Kết quả:</p>
<ol>
<li class="">Item 1</li>
<li class="">Item 2</li>
<li class="">Item 3</li>
</ol>
<p>Lưu ý: Markdown sẽ tự động đánh thứ tự các item trong danh sách. Ví dụ, khi bạn viết:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> Item 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> Item 2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> Item 3</span><br></span></code></pre></div></div>
<p>Kết quả:</p>
<ol>
<li class="">Item 1</li>
<li class="">Item 2</li>
<li class="">Item 3</li>
</ol>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="danh-sách-không-đánh-thứ-tự">Danh sách không đánh thứ tự<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#danh-s%C3%A1ch-kh%C3%B4ng-%C4%91%C3%A1nh-th%E1%BB%A9-t%E1%BB%B1" class="hash-link" aria-label="Đường dẫn trực tiếp đến Danh sách không đánh thứ tự" title="Đường dẫn trực tiếp đến Danh sách không đánh thứ tự" translate="no">​</a></h4>
<p>Để tạo danh sách không đánh thứ tự, bạn có thể sử dụng các dấu <code>-</code> hoặc <code>+</code> như sau:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Item 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Item 2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Item 3</span><br></span></code></pre></div></div>
<p>Kết quả:</p>
<ul>
<li class="">Item 1</li>
<li class="">Item 2</li>
<li class="">Item 3</li>
</ul>
<p>Bạn có thể sử dụng cả 2 loại danh sách trong 1 file README. Ví dụ:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Item 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Item 2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token list punctuation" style="color:#393A34">+</span><span class="token plain"> Item 2.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token list punctuation" style="color:#393A34">+</span><span class="token plain"> Item 2.2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Item 3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Item 3.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Item 3.2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token list punctuation" style="color:#393A34">+</span><span class="token plain"> Item 3.2.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token list punctuation" style="color:#393A34">+</span><span class="token plain"> Item 3.2.2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Item 3.3</span><br></span></code></pre></div></div>
<p>Kết quả:</p>
<ul>
<li class="">Item 1</li>
<li class="">Item 2<!-- -->
<ul>
<li class="">Item 2.1</li>
<li class="">Item 2.2</li>
</ul>
</li>
<li class="">Item 3<!-- -->
<ul>
<li class="">Item 3.1</li>
<li class="">Item 3.2<!-- -->
<ul>
<li class="">Item 3.2.1</li>
<li class="">Item 3.2.2</li>
</ul>
</li>
<li class="">Item 3.3</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="blockquote">Blockquote<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#blockquote" class="hash-link" aria-label="Đường dẫn trực tiếp đến Blockquote" title="Đường dẫn trực tiếp đến Blockquote" translate="no">​</a></h3>
<p>Blockquote là một cách để đánh dấu một đoạn văn bản. Bạn có thể sử dụng <code>&gt;</code> như sau:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token blockquote punctuation" style="color:#393A34">&gt;</span><span class="token plain"> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token blockquote punctuation" style="color:#393A34">&gt;&gt;</span><span class="token plain"> Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token blockquote punctuation" style="color:#393A34">&gt;&gt;</span><span class="token plain"> Pellentesque ornare sem lacinia quam venenatis vestibulum.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token blockquote punctuation" style="color:#393A34">&gt;</span><span class="token plain"> Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi.</span><br></span></code></pre></div></div>
<p>Kết quả:</p>
<blockquote>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.</p>
<blockquote>
<p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.
Pellentesque ornare sem lacinia quam venenatis vestibulum.</p>
</blockquote>
</blockquote>
<blockquote>
<p>Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi.</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="code">Code<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#code" class="hash-link" aria-label="Đường dẫn trực tiếp đến Code" title="Đường dẫn trực tiếp đến Code" translate="no">​</a></h3>
<p>Để đánh dấu một block code, bạn có thể sử dụng dấu ``` như sau:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token code-snippet code keyword" style="color:#00009f">`print('Hi')`</span><span class="token plain">: để viết code trong cùng 1 dòng</span><br></span></code></pre></div></div>
<pre><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">&lt;br /&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Cách viết code trong 1 block</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;br /&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">print("Hello World")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;br /&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">print("Nice to meet you!")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;br /&gt;</span><br></span></code></pre></div></div></pre>
<p>Bên cạnh đó, bạn có thể highlight một block code bằng cách thêm ngôn ngữ như sau:</p>
<pre><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">br </span><span class="token operator" style="color:#393A34">/</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Cách viết code trong 1 block</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">br </span><span class="token operator" style="color:#393A34">/</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Hello World"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">br </span><span class="token operator" style="color:#393A34">/</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Nice to meet you!"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">br </span><span class="token operator" style="color:#393A34">/</span><span class="token operator" style="color:#393A34">&gt;</span><br></span></code></pre></div></div></pre>
<p>Kết quả:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Cách viết code trong 1 block</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Hello World"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Nice to meet you!"</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>Danh sách các ngôn ngữ được hỗ trợ, bạn có thể xem tại <a href="https://github.com/github-linguist/linguist/blob/master/lib/linguist/languages.yml" target="_blank" rel="noopener noreferrer" class="">đây</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="link">Link<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#link" class="hash-link" aria-label="Đường dẫn trực tiếp đến Link" title="Đường dẫn trực tiếp đến Link" translate="no">​</a></h3>
<p>Để tạo link, bạn có thể sử dụng cú pháp như sau:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token url" style="color:#36acaa">[</span><span class="token url content" style="color:#36acaa">Link trang web của tôi.</span><span class="token url" style="color:#36acaa">](</span><span class="token url" style="color:#36acaa">https://tiennhm.github.io</span><span class="token url" style="color:#36acaa">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token url" style="color:#36acaa">[</span><span class="token url content" style="color:#36acaa">Gửi mail cho tôi.</span><span class="token url" style="color:#36acaa">](</span><span class="token url" style="color:#36acaa">mailto:tiennhm.it@gmail.com</span><span class="token url" style="color:#36acaa">)</span><br></span></code></pre></div></div>
<p>Kết quả:</p>
<p><a href="https://tiennhm.github.io/" target="_blank" rel="noopener noreferrer" class="">Link trang web của tôi.</a>
<a href="mailto:tiennhm.it@gmail.com" target="_blank" rel="noopener noreferrer" class="">Gửi mail cho tôi.</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="image">Image<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#image" class="hash-link" aria-label="Đường dẫn trực tiếp đến Image" title="Đường dẫn trực tiếp đến Image" translate="no">​</a></h3>
<p>Để đính kèm 1 image, bạn có thể sử dụng cú pháp như sau:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token url operator" style="color:#393A34">!</span><span class="token url" style="color:#36acaa">[</span><span class="token url content" style="color:#36acaa">Ảnh của TienNHM</span><span class="token url" style="color:#36acaa">](</span><span class="token url" style="color:#36acaa">https://github.com/TienNHM.png</span><span class="token url" style="color:#36acaa">)</span><br></span></code></pre></div></div>
<p>Kết quả:</p>
<p><img decoding="async" loading="lazy" src="https://github.com/TienNHM.png" alt="Ảnh của TienNHM" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="image-link">Image link<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#image-link" class="hash-link" aria-label="Đường dẫn trực tiếp đến Image link" title="Đường dẫn trực tiếp đến Image link" translate="no">​</a></h3>
<p>Để đính kèm 1 image vào link, bạn có thể sử dụng cú pháp như sau:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token url" style="color:#36acaa">[</span><span class="token url content" style="color:#36acaa">![Ảnh của TienNHM</span><span class="token url" style="color:#36acaa">](</span><span class="token url" style="color:#36acaa">https://github.com/TienNHM.png</span><span class="token url" style="color:#36acaa">)</span><span class="token plain">](https://tiennhm.github.io)</span><br></span></code></pre></div></div>
<p>Kết quả:</p>
<p><a href="https://tiennhm.github.io/" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://github.com/TienNHM.png" alt="Ảnh của TienNHM" class="img_ev3q"></a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="table">Table<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#table" class="hash-link" aria-label="Đường dẫn trực tiếp đến Table" title="Đường dẫn trực tiếp đến Table" translate="no">​</a></h3>
<p>Table là một cách trình bày dữ liệu dạng bảng, trực quan. Bạn có thể sử dụng cú pháp như sau:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token table table-header-row punctuation" style="color:#393A34">|</span><span class="token table table-header-row table-header important"> Column 1 </span><span class="token table table-header-row punctuation" style="color:#393A34">|</span><span class="token table table-header-row table-header important"> Column 2 </span><span class="token table table-header-row punctuation" style="color:#393A34">|</span><span class="token table table-header-row table-header important"> Column 3 </span><span class="token table table-header-row punctuation" style="color:#393A34">|</span><span class="token table table-header-row"></span><br></span><span class="token-line" style="color:#393A34"><span class="token table table-header-row"></span><span class="token table table-line punctuation" style="color:#393A34">|</span><span class="token table table-line"> </span><span class="token table table-line punctuation" style="color:#393A34">--------</span><span class="token table table-line"> </span><span class="token table table-line punctuation" style="color:#393A34">|</span><span class="token table table-line"> </span><span class="token table table-line punctuation" style="color:#393A34">--------</span><span class="token table table-line"> </span><span class="token table table-line punctuation" style="color:#393A34">|</span><span class="token table table-line"> </span><span class="token table table-line punctuation" style="color:#393A34">--------</span><span class="token table table-line"> </span><span class="token table table-line punctuation" style="color:#393A34">|</span><span class="token table table-line"></span><br></span><span class="token-line" style="color:#393A34"><span class="token table table-line"></span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> Item 1   </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> Item 2   </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> Item 3   </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows"></span><br></span><span class="token-line" style="color:#393A34"><span class="token table table-data-rows"></span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> Item 4   </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> Item 5   </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> Item 6   </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><br></span></code></pre></div></div>
<p>Kết quả:</p>
<table><thead><tr><th>Column 1</th><th>Column 2</th><th>Column 3</th></tr></thead><tbody><tr><td>Item 1</td><td>Item 2</td><td>Item 3</td></tr><tr><td>Item 4</td><td>Item 5</td><td>Item 6</td></tr></tbody></table>
<p>Bạn cũng có thể canh lề table bằng cách sử dụng dấu <code>:</code> như sau:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token table table-header-row punctuation" style="color:#393A34">|</span><span class="token table table-header-row table-header important"> Column 1 </span><span class="token table table-header-row punctuation" style="color:#393A34">|</span><span class="token table table-header-row table-header important"> Column 2 </span><span class="token table table-header-row punctuation" style="color:#393A34">|</span><span class="token table table-header-row table-header important"> Column 3 </span><span class="token table table-header-row punctuation" style="color:#393A34">|</span><span class="token table table-header-row"></span><br></span><span class="token-line" style="color:#393A34"><span class="token table table-header-row"></span><span class="token table table-line punctuation" style="color:#393A34">|</span><span class="token table table-line"> </span><span class="token table table-line punctuation" style="color:#393A34">:-------</span><span class="token table table-line"> </span><span class="token table table-line punctuation" style="color:#393A34">|</span><span class="token table table-line"> </span><span class="token table table-line punctuation" style="color:#393A34">:------:</span><span class="token table table-line"> </span><span class="token table table-line punctuation" style="color:#393A34">|</span><span class="token table table-line"> </span><span class="token table table-line punctuation" style="color:#393A34">-------:</span><span class="token table table-line"> </span><span class="token table table-line punctuation" style="color:#393A34">|</span><span class="token table table-line"></span><br></span><span class="token-line" style="color:#393A34"><span class="token table table-line"></span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> Canh trái Item 1 </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> Canh giữa Item 2 </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> Canh phải Item 3 </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows"></span><br></span><span class="token-line" style="color:#393A34"><span class="token table table-data-rows"></span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> Lorem ipsum dolor sit amet, consectetur adipiscing elit.  </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> Lorem ipsum dolor sit amet, consectetur adipiscing elit. </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> Lorem ipsum dolor sit amet, consectetur adipiscing elit. </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><br></span></code></pre></div></div>
<p>Kết quả:</p>
<table><thead><tr><th style="text-align:left">Column 1</th><th style="text-align:center">Column 2</th><th style="text-align:right">Column 3</th></tr></thead><tbody><tr><td style="text-align:left">Canh trái Item 1</td><td style="text-align:center">Canh giữa Item 2</td><td style="text-align:right">Canh phải Item 3</td></tr><tr><td style="text-align:left">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</td><td style="text-align:center">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</td><td style="text-align:right">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kết-luận">Kết luận<a href="https://tiennhm.io.vn/blog/markdown-cheat-sheet#k%E1%BA%BFt-lu%E1%BA%ADn" class="hash-link" aria-label="Đường dẫn trực tiếp đến Kết luận" title="Đường dẫn trực tiếp đến Kết luận" translate="no">​</a></h2>
<p>Trong bài viết này, mình đã giới thiệu các cú pháp cơ bản thường được sử dụng để tạo 1 file README bằng markdown. Hy vọng bạn thấy có ích và thích nó. Đừng ngại khi bạn có thể share bài viết này cho bạn bè nhé!</p>
<p>Trong phần tiếp theo, mình sẽ hướng dẫn các bạn sử dụng một số cú pháp nâng cao trong markdown.</p>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="markdown" term="markdown"/>
        <category label="github" term="github"/>
        <category label="cheatsheet" term="cheatsheet"/>
        <category label="readme" term="readme"/>
    </entry>
</feed>