<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>Kudo Khang</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>http://kudokhang.github.io/</id>
  <link href="http://kudokhang.github.io/" rel="alternate"/>
  <link href="http://kudokhang.github.io/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, Kudo Khang</rights>
  <subtitle>AI Engineer viết về AI, kỹ thuật và những bài học nghề nghiệp</subtitle>
  <title>Khang's blogs</title>
  <updated>2026-07-26T07:34:54.369Z</updated>
  <entry>
    <author>
      <name>Kudo Khang</name>
    </author>
    <category term="Researcher Agent" scheme="http://kudokhang.github.io/categories/Researcher-Agent/"/>
    <category term="AI Agent" scheme="http://kudokhang.github.io/tags/AI-Agent/"/>
    <category term="Flue Framework" scheme="http://kudokhang.github.io/tags/Flue-Framework/"/>
    <content>
      <![CDATA[<h2 id="Tong-quan-ve-Flue-Framework"><a href="#Tong-quan-ve-Flue-Framework" class="headerlink" title="Tổng quan về Flue Framework"></a>Tổng quan về Flue Framework</h2><p>Flue là một framework mã nguồn mở được phát triển bằng ngôn ngữ TypeScript bởi đội ngũ Astro [1][6][7]. Điểm đặc trưng lớn nhất của Flue là thiết kế “headless” (không giao diện điều khiển mặc định) và “programmable” (có thể lập trình được), cho phép các AI agent vận hành hoàn toàn tự động thông qua API, webhook hoặc các tác vụ lập lịch (cron) trên môi trường Node.js hoặc Cloudflare Workers [1][4].</p><p>Thay vì chỉ là một thư viện hỗ trợ, Flue đóng vai trò như một “Agent Harness” — một khung vận hành cung cấp sẵn bộ công cụ, ngữ cảnh, bộ nhớ và môi trường thực thi cần thiết để mô hình ngôn ngữ lớn (LLM) có thể làm việc tự chủ [1][4][9]. Cách tiếp cận này giúp giải quyết bài toán kết nối runtime cho agent, cho phép nhà phát triển tập trung vào logic điều phối thay vì phải tự xây dựng hạ tầng quản lý session hay quyền truy cập hệ thống từ đầu [9].</p><h2 id="Kien-truc-va-Cac-thanh-phan-chinh"><a href="#Kien-truc-va-Cac-thanh-phan-chinh" class="headerlink" title="Kiến trúc và Các thành phần chính"></a>Kiến trúc và Các thành phần chính</h2><p>Trái tim của Flue Framework chính là khái niệm <strong>Agent Harness</strong> — một lớp khung bao quanh mô hình ngôn ngữ lớn (LLM), biến nó từ một chatbot đơn thuần thành một tác nhân có khả năng hành động tự chủ [6][7]. Agent Harness không chỉ là một trình bao (wrapper) mà là sự kết hợp chặt chẽ giữa 5 yếu tố cốt lõi:</p><ul><li><strong>Model:</strong> Cho phép tùy chọn linh hoạt các LLM khác nhau tùy theo nhu cầu bài toán [3][6].</li><li><strong>Tools:</strong> Các hàm hoặc công cụ mà Agent có quyền gọi để tương tác với thế giới bên ngoài [7].</li><li><strong>Skills:</strong> Các chỉ dẫn chuyên sâu về kỹ năng, giúp Agent biết cách giải quyết các loại tác vụ cụ thể [6].</li><li><strong>Instructions:</strong> Hệ thống chỉ dẫn định hình hành vi và mục tiêu của Agent [6][7].</li><li><strong>Sandbox:</strong> Môi trường thực thi an toàn, nơi Agent có thể đọc&#x2F;ghi file và chạy mã nguồn mà không gây rủi ro cho hệ thống chính [7].</li></ul><p>Về mặt cấu trúc vận hành, Flue được chia thành ba thành phần chính để tách biệt rõ ràng giữa thực thi, điều phối và giao tiếp [1][3][6]:</p><ol><li><strong>Agent:</strong> Là thực thể thực thi trung tâm. Agent sở hữu “linh hồn” (instructions, skills) và “công cụ” (tools) để tự đưa ra quyết định và hành động nhằm đạt được mục tiêu được giao [6].</li><li><strong>Workflow:</strong> Là hệ thống điều phối các quy trình tự động hóa. Thay vì để Agent tự do hoàn toàn, Workflow cho phép định nghĩa các luồng công việc có cấu trúc, chạy theo lịch trình (cron), webhook hoặc API, giúp đảm bảo tính bền vững và dự đoán được của hệ thống [1][3].</li><li><strong>Channel:</strong> Là lớp giao tiếp và triển khai. Channel định nghĩa cách Agent tương tác với thế giới bên ngoài hoặc nơi nó được vận hành (ví dụ: qua HTTP, Slack, hoặc tích hợp vào các ứng dụng cụ thể), cho phép triển khai linh hoạt từ local cho đến cloud [1][6].</li></ol><p>Một điểm đột phá về mặt kỹ thuật của Flue chính là cơ chế <strong>Virtual Sandbox in-memory</strong> sử dụng thư viện <code>just-bash</code> của Vercel [5]. Thay vì phải khởi tạo các container nặng nề cho mỗi phiên làm việc của Agent, Flue tạo ra một môi trường giả lập trong bộ nhớ cung cấp sẵn các lệnh cơ bản như <code>grep</code>, <code>glob</code> và khả năng đọc&#x2F;ghi file [5]. Giải pháp này không chỉ giúp tăng tốc độ khởi tạo mà còn tối ưu hóa chi phí vận hành đáng kể khi triển khai ở quy mô lớn, vì nó loại bỏ sự phụ thuộc vào hạ tầng container phức tạp mà vẫn đảm bảo tính cô lập cần thiết [5].</p><h2 id="Huong-dan-Cai-dat-va-Trien-khai"><a href="#Huong-dan-Cai-dat-va-Trien-khai" class="headerlink" title="Hướng dẫn Cài đặt và Triển khai"></a>Hướng dẫn Cài đặt và Triển khai</h2><p>Flue Framework được thiết kế với triết lý linh hoạt, cho phép nhà phát triển triển khai AI Agent trên nhiều môi trường runtime khác nhau. Về mặt hạ tầng, Flue hỗ trợ mạnh mẽ cho môi trường <strong>Node.js</strong> và <strong>Cloudflare Workers</strong> [1], giúp Agent có thể vận hành từ máy chủ cục bộ cho đến các môi trường edge computing với độ trễ thấp.</p><p>Một trong những đặc điểm cốt lõi giúp Flue khác biệt là khả năng quản lý môi trường thực thi thông qua các lựa chọn Sandbox đa dạng, đảm bảo an toàn khi Agent thực hiện các tác vụ như chạy code hoặc thao tác với hệ thống file [6][7]:</p><ul><li><strong>Local Sandbox:</strong> Cho phép Agent truy cập trực tiếp vào hệ thống file và tài nguyên cục bộ, phù hợp cho quá trình phát triển và thử nghiệm nhanh [7].</li><li><strong>Virtual Sandbox:</strong> Cung cấp một môi trường ảo hóa trong bộ nhớ (in-memory virtual sandbox), cho phép thực hiện các lệnh như grep, glob hoặc đọc file mà không cần khởi tạo container phức tạp, từ đó tối ưu hóa chi phí vận hành khi triển khai ở quy mô lớn [5].</li><li><strong>Remote Sandbox:</strong> Cho phép kết nối với các môi trường cô lập hoàn toàn từ xa. Một ví dụ điển hình là việc kết hợp Flue với <strong>Daytona</strong> để tạo ra một sandbox cô lập tuyệt đối, giúp Agent có thể clone code, chạy và sửa lỗi trong một môi trường an toàn, loại bỏ rủi ro đối với hệ thống chính [8].</li></ul><p>Về phương thức vận hành, Flue cung cấp khả năng triển khai linh hoạt tùy theo nhu cầu sử dụng [7]. Nhà phát triển có thể tương tác và điều khiển Agent trực tiếp thông qua giao diện dòng lệnh (<strong>CLI</strong>) để thực hiện các tác vụ quản trị hoặc thử nghiệm. Đồng thời, Flue cho phép triển khai Agent như một dịch vụ thông qua giao thức <strong>HTTP</strong>, biến Agent thành một hệ thống headless có thể dễ dàng tích hợp vào các luồng công việc tự động như API, webhook hoặc lập lịch chạy tự động (cron job) [1].</p><h2 id="Quy-trinh-Phat-trien-AI-Agent-voi-Flue"><a href="#Quy-trinh-Phat-trien-AI-Agent-voi-Flue" class="headerlink" title="Quy trình Phát triển AI Agent với Flue"></a>Quy trình Phát triển AI Agent với Flue</h2><p>Quy trình phát triển AI Agent với Flue đi theo hướng tiếp cận “harness-first”, trong đó trọng tâm không nằm ở việc viết nhiều mã điều khiển phức tạp mà tập trung vào việc định nghĩa hành vi và ngữ cảnh.</p><p><strong>1. Luồng định nghĩa và phát triển</strong><br>Thay vì xây dựng logic cứng trong code, Flue cho phép nhà phát triển định nghĩa logic chính của Agent thông qua các tệp Markdown [4]. Cụ thể, kiến trúc này tách biệt giữa runtime và chỉ thị:</p><ul><li><strong>AGENTS.md</strong>: Nơi định nghĩa danh phận, mục tiêu và nguyên tắc hoạt động của Agent.</li><li><strong>Skills</strong>: Các tệp Markdown mô tả chi tiết các quy trình thực hiện tác vụ cụ thể, giúp Agent biết cách vận hành các bước để đạt được kết quả [4].</li><li><strong>Context</strong>: Cung cấp thông tin nền tảng, dữ liệu đặc thù của dự án hoặc người dùng để Agent có căn cứ ra quyết định [4].</li></ul><p>Cách tiếp cận này giúp Agent trở nên linh hoạt, dễ dàng tinh chỉnh hành vi mà không cần khởi động lại hệ thống hay thay đổi cấu trúc mã nguồn.</p><p><strong>2. Cơ chế thực thi tự chủ qua Session</strong><br>Khi Agent vận hành, Flue quản lý quá trình này thông qua khái niệm <strong>Session</strong> [7]. Một session đóng vai trò là môi trường làm việc tạm thời, nơi Agent:</p><ul><li>Tiếp nhận yêu cầu từ người dùng hoặc hệ thống.</li><li>Truy cập vào các công cụ (tools), kỹ năng (skills) và chỉ dẫn (instructions) đã định nghĩa.</li><li>Tương tác trực tiếp với hệ thống tệp (filesystem) thông qua sandbox để đọc&#x2F;ghi dữ liệu [7].</li><li>Tự duy trì trạng thái và bộ nhớ trong suốt phiên làm việc để đảm bảo tính nhất quán của luồng tư duy.</li></ul><p><strong>3. Ví dụ thực tế: Xây dựng Agent sửa lỗi tự động (Autonomous Bug-Fix Agent)</strong><br>Để minh họa cho quy trình này, việc kết hợp Flue với một sandbox mạnh mẽ như Daytona cho phép tạo ra một Agent có khả năng xử lý vòng đời lỗi phần mềm một cách khép kín [8]. Quy trình thực thi tự chủ sẽ diễn ra như sau:</p><ul><li><strong>Tái hiện lỗi</strong>: Agent đọc báo cáo lỗi, phân tích mã nguồn trong sandbox và chạy các lệnh thử nghiệm để xác nhận lỗi hiện hữu [8].</li><li><strong>Sửa lỗi</strong>: Dựa trên các kỹ năng (skills) lập trình đã được định nghĩa, Agent tự đề xuất và thực hiện chỉnh sửa mã nguồn trực tiếp trong môi trường cô lập [8].</li><li><strong>Xác minh</strong>: Agent tự chạy lại các test case để đảm bảo lỗi đã được khắc phục và không gây ra lỗi mới (regression) [8].</li><li><strong>Hoàn tất</strong>: Sau khi xác minh thành công, Agent tự động thực hiện quy trình tạo Pull Request (PR) lên GitHub để gửi bản sửa lỗi cho con người phê duyệt [8].</li></ul><p>Nhờ vào cấu trúc headless và khả năng lập trình cao, Flue biến việc xây dựng những agent phức tạp như trên trở thành một quy trình định nghĩa quy tắc và cấp quyền truy cập công cụ, thay vì viết hàng nghìn dòng code điều phối luồng (orchestration) thủ công.</p><p>🔥</p><h2 id="Nguon-tham-khao"><a href="#Nguon-tham-khao" class="headerlink" title="Nguồn tham khảo"></a>Nguồn tham khảo</h2><ul><li>Flue: Headless, Programmable AI Agent Framework from the Astro Team | Better Stack Community — <a href="https://betterstack.com/community/guides/ai/flue-framework">https://betterstack.com/community/guides/ai/flue-framework</a></li><li>Flue Framework: Open Source Alternative to Devin AI — <a href="https://www.opensourcealternatives.to/item/flue-framework">https://www.opensourcealternatives.to/item/flue-framework</a></li><li>Flue: the open framework for building AI agents - Flavio Copes — <a href="https://flaviocopes.com/flue-framework">https://flaviocopes.com/flue-framework</a></li><li>fks on X: “Introducing Flue — The First Agent Harness Framework Flue is a TypeScript framework for building the next generation of agents, designed around a built-in agent harness. Flue is like Claude Code, but 100% headless and programmable. There’s no baked in assumption like requiring <a href="https://t.co/6oT6r7yqmk">https://t.co/6oT6r7yqmk</a>“ &#x2F; X — <a href="https://x.com/FredKSchott/status/2050274923852210397?lang=en">https://x.com/FredKSchott/status/2050274923852210397?lang=en</a></li><li>Finally, a Programmable AI Agent Framework That Works — <a href="https://www.youtube.com/watch?v=n5cYS6KuyK8">https://www.youtube.com/watch?v=n5cYS6KuyK8</a></li><li>Flue — The Open Agent Framework — <a href="https://flueframework.com/">https://flueframework.com</a></li><li>withastro&#x2F;flue: The sandbox agent framework. — <a href="https://github.com/withastro/flue">https://github.com/withastro/flue</a></li><li>Build an Autonomous Bug-Fix Agent with Flue and Daytona | Daytona — <a href="https://www.daytona.io/docs/en/guides/flue/flue-autonomous-bug-fix-agent">https://www.daytona.io/docs/en/guides/flue/flue-autonomous-bug-fix-agent</a></li><li>Flue: The Agent Harness Framework and Why It Feels Different — <a href="https://www.developersdigest.tech/blog/flue-agent-harness-framework-different-or-just-shiny">https://www.developersdigest.tech/blog/flue-agent-harness-framework-different-or-just-shiny</a></li><li>AI Agent Frameworks: A Detailed Comparison — <a href="https://www.turing.com/resources/ai-agent-frameworks">https://www.turing.com/resources/ai-agent-frameworks</a></li><li>Top AI agent frameworks - Mastra, Eve, and Flue compared — <a href="https://www.paralect.com/stack/top-ai-agent-frameworks">https://www.paralect.com/stack/top-ai-agent-frameworks</a></li><li>Comparing Open-Source AI Agent Frameworks — <a href="https://langfuse.com/blog/2025-03-19-ai-agent-comparison">https://langfuse.com/blog/2025-03-19-ai-agent-comparison</a></li><li>Cách xây dựng AI Agent Từ A-Z: Hướng dẫn từng bước — <a href="https://vinalink.com/cam-nang-ai/cach-xay-dung-ai-agent.html">https://vinalink.com/cam-nang-ai/cach-xay-dung-ai-agent.html</a></li><li>Xây dựng tác nhân AI thông minh: Hướng dẫn đầy đủ từ kế … — <a href="https://vn.linkedin.com/pulse/building-intelligent-ai-agents-complete-guide-from-gireesh-sreedhar-sol7c?tl=vi">https://vn.linkedin.com/pulse/building-intelligent-ai-agents-complete-guide-from-gireesh-sreedhar-sol7c?tl=vi</a></li><li>Các framework giúp xây dựng AI Agents. - — <a href="https://vnpro.vn/thu-vien/cac-framework-giup-xay-dung-ai-agents-5884.html">https://vnpro.vn/thu-vien/cac-framework-giup-xay-dung-ai-agents-5884.html</a></li><li>Chọn Framework AI Agent Phù Hợp Cho Dự Án Của Bạn – Evotek Careers — <a href="https://tuyendung.evotek.vn/chon-framework-ai-agent-phu-hop-cho-du-an-cua-ban">https://tuyendung.evotek.vn/chon-framework-ai-agent-phu-hop-cho-du-an-cua-ban</a></li><li>AI Agent là gì? Hướng dẫn tạo AI Agent với LangGraph và LLM  của OpenAI | 200Lab Blog — <a href="https://200lab.io/blog/ai-agent-la-gi">https://200lab.io/blog/ai-agent-la-gi</a></li></ul>]]>
    </content>
    <id>http://kudokhang.github.io/2026/07/26/Flue-Framework-He-Thong-Xay-Dung-AI-Agent-Headless/</id>
    <link href="http://kudokhang.github.io/2026/07/26/Flue-Framework-He-Thong-Xay-Dung-AI-Agent-Headless/"/>
    <published>2026-07-26T07:31:56.000Z</published>
    <summary>
      <![CDATA[<h2 id="Tong-quan-ve-Flue-Framework"><a href="#Tong-quan-ve-Flue-Framework" class="headerlink" title="Tổng quan về Flue Framework"></a>Tổng]]>
    </summary>
    <title>Flue Framework: Hệ Thống Xây Dựng AI Agent Headless</title>
    <updated>2026-07-26T07:34:54.369Z</updated>
  </entry>
  <entry>
    <author>
      <name>Kudo Khang</name>
    </author>
    <category term="Researcher Agent" scheme="http://kudokhang.github.io/categories/Researcher-Agent/"/>
    <category term="Learning" scheme="http://kudokhang.github.io/tags/Learning/"/>
    <category term="Self-development" scheme="http://kudokhang.github.io/tags/Self-development/"/>
    <category term="Productivity" scheme="http://kudokhang.github.io/tags/Productivity/"/>
    <content>
      <![CDATA[<h2 id="Tom-tat"><a href="#Tom-tat" class="headerlink" title="Tóm tắt"></a>Tóm tắt</h2><p>Bài phân tích cung cấp một khung lý thuyết và thực hành toàn diện về tự học cho người trưởng thành trong kỷ nguyên số, đi từ sự chuyển dịch tư duy sang Heutagogy, quản trị tải nhận thức, vận dụng bộ công cụ kỹ thuật, kỹ năng giám tuyển nội dung cho đến việc nâng cấp hệ điều hành tư duy qua Meta-learning và một lộ trình triển khai chi tiết.</p><p><strong>Phát hiện chính</strong> (xếp theo độ tin cậy):</p><ol><li>Sự chuyển dịch từ SDL sang Heutagogy cho phép người học trưởng thành trở thành ‘kiến trúc sư kiến thức’, tự thiết kế lộ trình học tập dựa trên năng lực thực tế.</li><li>Quản trị tải nhận thức theo thuyết CLT (giảm tải ngoại lai, cân bằng tải nội tại, tăng tải hữu ích) là chiến lược then chốt để tránh ngộ độc thông tin.</li><li>Hiệu ứng Đảo ngược Chuyên gia (Expertise Reversal Effect) tạo ra sự phân hóa trong phương pháp: người mới cần hướng dẫn cấu trúc, chuyên gia cần tự giải quyết vấn đề.</li><li>Sự kết hợp giữa Adaptive Learning (AI), Active Recall và Spaced Repetition tạo nên vòng lặp hấp thu và lưu trữ tri thức khoa học.</li><li>Kỹ năng giám tuyển nội dung (Content Curation) và xây dựng Mạng lưới học tập cá nhân (PLN) là bộ lọc sinh tồn thiết yếu để chống lại tình trạng quá tải thông tin.</li><li>Meta-learning và Meta-skills là lợi thế cạnh tranh bền vững nhất khi các kỹ năng cứng bị AI thay thế nhanh chóng.</li></ol><h2 id="Nen-tang-phuong-phap-luan-Su-chuyen-dich-tu-SDL-sang-Heutagogy"><a href="#Nen-tang-phuong-phap-luan-Su-chuyen-dich-tu-SDL-sang-Heutagogy" class="headerlink" title="Nền tảng phương pháp luận: Sự chuyển dịch từ SDL sang Heutagogy"></a>Nền tảng phương pháp luận: Sự chuyển dịch từ SDL sang Heutagogy</h2><p>Để hiểu về cách tự học hiệu quả trong kỷ nguyên số, trước hết cần nhìn nhận sự tiến hóa trong tư duy giáo dục: một cuộc chuyển dịch sâu sắc từ <strong>Tự định hướng học tập (Self-Directed Learning - SDL)</strong> sang <strong>Heutagogy (Học tập tự chủ)</strong>. </p><p>Ở mức độ cơ bản, SDL thiết lập một mô hình mà người học đóng vai trò chủ động trong việc chẩn đoán nhu cầu, đặt mục tiêu và tự đánh giá kết quả theo tốc độ cá nhân [4]. Trong mô hình này, trọng tâm dịch chuyển từ “giáo viên làm trung tâm” sang “người học làm trung tâm”, cho phép người trưởng thành tận dụng động lực tự thân để làm chủ tiến trình học tập [4][5]. Tuy nhiên, SDL vẫn thường vận hành trong một khuôn khổ (framework) hoặc lộ trình đã được định sẵn bởi một chuyên gia hoặc tổ chức.</p><p>Sự xuất hiện của kỷ nguyên số và sự bùng nổ của tri thức đã đẩy nhu cầu tự chủ lên một cấp độ cao hơn: <strong>Heutagogy</strong>. Nếu SDL là việc người học tự lái xe trên một con đường đã được vạch sẵn, thì Heutagogy là việc người học tự thiết kế bản đồ và chọn điểm đến cho chính mình [1]. Ở cấp độ này, người học không chỉ tự định hướng mà còn tự quyết định <em>cách thức</em> và <em>nội dung</em> học tập dựa trên năng lực thực tế và sự thành thạo (mastery) [1]. Việc kết hợp các công cụ số linh hoạt cho phép cá nhân hóa trải nghiệm giáo dục đến mức tối đa, biến hành trình học tập thành một quá trình thích ứng liên tục thay vì chỉ là hoàn thành một khóa học [1][5].</p><p>Sự chuyển dịch này mang ý nghĩa chiến lược đối với người trưởng thành, bởi nó tương thích hoàn toàn với đặc điểm tâm lý học tập của lứa tuổi này: coi trọng kinh nghiệm cá nhân và học tốt nhất thông qua việc chiêm nghiệm, thấu hiểu những trải nghiệm thực tế [9][10]. Khi đó, người học không còn là một “người tiếp nhận chủ động” (người tiêu thụ kiến thức một cách có chọn lọc) mà trở thành một <strong>“kiến trúc sư kiến thức”</strong>. Họ không chỉ tích lũy thông tin mà còn tự xây dựng hệ thống tri thức riêng, biến dữ liệu số thành năng lực giải quyết vấn đề thực tế thông qua thực hành và trải nghiệm [3][9].</p><p>Tuy nhiên, cần nhìn nhận một điểm mâu thuẫn thú vị giữa lý thuyết tự chủ và thực tế nhận thức. Trong khi Heutagogy khuyến khích sự tự chủ tuyệt đối ngay từ đầu, thì góc nhìn từ khoa học nhận thức — cụ thể là <strong>Hiệu ứng Đảo ngược Chuyên gia (Expert Reversal Effect)</strong> — cảnh báo rằng đối với những người mới bắt đầu (novices), việc thiếu các hướng dẫn trực tiếp hoặc ví dụ mẫu có thể gây ra tình trạng quá tải nhận thức [18]. </p><p>Do đó, sự chuyển dịch từ SDL sang Heutagogy không phải là một bước nhảy vọt tức thời, mà là một lộ trình tiến hóa: người học bắt đầu bằng sự hướng dẫn có cấu trúc (SDL&#x2F;Pedagogy) để xây dựng nền tảng, sau đó dần loại bỏ các “giàn giáo” hỗ trợ để tiến tới sự tự chủ hoàn toàn của Heutagogy. Sự kết hợp này đảm bảo rằng quyền tự chủ không trở thành rào cản khiến người học bị lạc lối trong biển thông tin, mà trở thành động lực để họ không ngừng tối ưu hóa khả năng hấp thu kiến thức trong một thế giới biến động.</p><h2 id="Quan-tri-tai-nhan-thuc-Toi-uu-hoa-‘bang-thong’-cua-bo-nao-trong-moi-truong-so"><a href="#Quan-tri-tai-nhan-thuc-Toi-uu-hoa-‘bang-thong’-cua-bo-nao-trong-moi-truong-so" class="headerlink" title="Quản trị tải nhận thức: Tối ưu hóa ‘băng thông’ của bộ não trong môi trường số"></a>Quản trị tải nhận thức: Tối ưu hóa ‘băng thông’ của bộ não trong môi trường số</h2><p>Trong môi trường số, thách thức lớn nhất của người tự học không còn là sự thiếu hụt thông tin mà là tình trạng “ngộ độc” thông tin (information overload) [2]. Khi đối mặt với luồng dữ liệu khổng lồ và đa nguồn, bộ não dễ rơi vào trạng thái kiệt sức nhận thức. Để giải quyết vấn đề này, việc áp dụng Thuyết Tải nhận thức (Cognitive Load Theory - CLT) trở thành một chiến lược sinh tồn thiết yếu để tối ưu hóa “băng thông” hạn hẹp của trí nhớ làm việc (working memory) [16][19].</p><p>Để tối ưu hóa khả năng hấp thu, người học cần thực hiện quản trị tải nhận thức thông qua ba tác động chiến lược:</p><p><strong>Thứ nhất, triệt tiêu tải nhận thức ngoại lai (Extraneous Load).</strong> Đây là những áp lực không cần thiết lên bộ não, phát sinh từ cách trình bày thông tin kém hoặc các tác nhân gây xao nhãng từ môi trường số [16][19]. Trong kỷ nguyên của thông báo đẩy (push notifications) và đa nhiệm (multitasking), tải ngoại lai thường xuất hiện dưới dạng các Tab trình duyệt mở vô tội vạ hoặc sự ngắt quãng từ mạng xã hội. Việc loại bỏ xao nhãng không chỉ đơn thuần là tắt thông báo, mà là thiết lập một “môi trường học tập tinh khiết” để dành toàn bộ tài nguyên nhận thức cho nội dung chính, tránh lãng phí năng lượng vào những tác vụ không đóng góp cho việc học.</p><p><strong>Thứ hai, cân bằng tải nhận thức nội tại (Intrinsic Load).</strong> Tải nội tại phụ thuộc vào độ phức tạp tự thân của kiến thức và trình độ hiện tại của người học [19]. Khi đối mặt với một khái niệm quá phức tạp, bộ não dễ bị “treo” vì quá tải. Giải pháp tối ưu là chiến thuật “chia nhỏ” (chunking) — chia nhỏ nội dung thành các phần vừa vặn với khả năng xử lý của trí nhớ ngắn hạn và sắp xếp theo trình tự từ đơn giản đến phức tạp [20]. Việc phân rã kiến thức giúp người học không bị choáng ngợp, tạo ra những “chiến thắng nhỏ” để duy trì động lực trước khi tiến tới những cấp độ khó hơn.</p><p><strong>Thứ ba, gia tăng tải nhận thức hữu ích (Germane Load).</strong> Đây là loại tải duy nhất mang lại giá trị, vì nó thúc đẩy việc xây dựng các lược đồ kiến thức (schemas) — những cấu trúc lưu trữ thông tin trong trí nhớ dài hạn [16][17]. Thay vì đọc thụ động, người học cần chủ động kết nối thông tin mới với những gì đã biết, đặt câu hỏi phản biện và thực hành áp dụng. Khi một lược đồ được hình thành vững chắc, thông tin sẽ được nén lại, giúp giảm tải cho trí nhớ làm việc trong những lần tiếp cận sau [17].</p><p>Một điểm then chốt trong quản trị nhận thức mà người trưởng thành cần đặc biệt lưu ý là <strong>Hiệu ứng Đảo ngược Chuyên gia (Expertise Reversal Effect)</strong> [18]. Có một sự mâu thuẫn thú vị ở đây: trong khi các lý thuyết về tự chủ (SDL&#x2F;Heutagogy) khuyến khích người học tự chẩn đoán và tự tìm đường ngay từ đầu [4][5], thì khoa học nhận thức chỉ ra rằng lộ trình này không hiệu quả cho tất cả mọi người ở mọi giai đoạn. </p><p>Cụ thể, với những người mới bắt đầu (novices), việc quá tự do hoặc thiếu hướng dẫn sẽ gây ra tải ngoại lai cực lớn; họ cần những ví dụ mẫu (worked examples) và hướng dẫn trực tiếp để xây dựng những lược đồ cơ bản đầu tiên [18]. Ngược lại, đối với những chuyên gia đã có nền tảng vững chắc, việc tiếp tục cung cấp các ví dụ mẫu chi tiết lại trở nên thừa thãi, thậm chí gây cản trở (tạo ra tải ngoại lai không cần thiết). Lúc này, cách hiệu quả nhất để họ phát triển là thông qua việc tự giải quyết vấn đề (problem-solving) và đối mặt với các thách thức thực tế [18].</p><p>Như vậy, tối ưu hóa băng thông bộ não không phải là cố gắng nhồi nhét nhiều hơn, mà là nghệ thuật điều phối: giảm thiểu rác nhận thức (ngoại lai), chia nhỏ độ khó (nội tại) và tập trung nguồn lực để xây dựng hệ thống tri thức bền vững (hữu ích), đồng thời biết điều chỉnh phương pháp tiếp cận tùy theo cấp độ thành thạo của bản thân.</p><h2 id="Bo-cong-cu-ky-thuat-Tu-luu-tru-thong-minh-den-cung-co-tri-nho-dai-han"><a href="#Bo-cong-cu-ky-thuat-Tu-luu-tru-thong-minh-den-cung-co-tri-nho-dai-han" class="headerlink" title="Bộ công cụ kỹ thuật: Từ lưu trữ thông minh đến củng cố trí nhớ dài hạn"></a>Bộ công cụ kỹ thuật: Từ lưu trữ thông minh đến củng cố trí nhớ dài hạn</h2><p>Để hiện thực hóa khả năng tự hấp thu kiến thức, người trưởng thành cần một “hệ sinh thái” công cụ số không chỉ đóng vai trò lưu trữ, mà phải can thiệp trực tiếp vào quá trình xử lý thông tin của não bộ. Thay vì sử dụng công cụ một cách rời rạc, việc hệ thống hóa chúng theo chức năng nhận thức sẽ tạo ra một quy trình khép kín từ khâu định hướng đến khâu củng cố bền vững.</p><p><strong>1. Quản trị lộ trình: Từ quản lý nội dung sang cá nhân hóa thích ứng</strong></p><p>Trong kỷ nguyên số, thách thức lớn nhất không còn là thiếu hụt thông tin mà là sự choáng ngợp trước khối lượng dữ liệu khổng lồ. Việc sử dụng các Hệ thống quản lý học tập (LMS) như Canvas, Moodle hay Schoology giúp người học chuyển đổi từ trạng thái tiếp nhận thụ động sang quản trị chủ động thông qua việc tổ chức tài nguyên, cộng tác và theo dõi tiến độ [12]. </p><p>Tuy nhiên, bước tiến quan trọng hơn nằm ở sự kết hợp giữa LMS và trí tuệ nhân tạo (AI) để tạo ra <em>Adaptive Learning</em> (Học tập thích ứng). Các nền tảng như Khan Academy hay DreamBox không chỉ cung cấp nội dung mà còn sử dụng AI để phân tích dữ liệu thời gian thực, từ đó tự động điều chỉnh độ khó của bài tập và tốc độ bài giảng theo khả năng tiếp thu của từng cá nhân [11, 21]. Ý nghĩa của sự chuyển dịch này là tối ưu hóa “vùng phát triển gần” (Zone of Proximal Development): người học không bị chán nản bởi kiến thức quá dễ, cũng không bị bỏ cuộc vì nội dung quá khó, giúp tăng mức độ tương tác và khả năng ghi nhớ từ 15-30% [13]. Điều này đặc biệt quan trọng với người trưởng thành, vốn có quỹ thời gian hạn hẹp và cần một lộ trình tối ưu hóa chính xác để đạt được mục tiêu chuyên môn nhanh nhất [14].</p><p><strong>2. Củng cố trí nhớ: Chiến đấu với “Đường cong quên lãng”</strong></p><p>Nếu việc cá nhân hóa lộ trình giúp thông tin đi <em>vào</em> não bộ hiệu quả hơn, thì các kỹ thuật ghi nhớ sâu là công cụ để giữ thông tin <em>ở lại</em> lâu dài. Sai lầm phổ biến của nhiều người tự học là ôn tập thụ động (đọc đi đọc lại tài liệu), điều này dễ tạo ra “ảo giác về sự hiểu biết” (illusion of competence) — cảm giác quen thuộc với văn bản nhưng không thực sự làm chủ kiến thức.</p><p>Để khắc phục, sự kết hợp giữa <strong>Active Recall (Chủ động gợi nhớ)</strong> và <strong>Spaced Repetition (Lặp lại ngắt quãng)</strong> trở thành “bộ đôi vàng” trong khoa học nhận thức [23, 25]:</p><ul><li><strong>Active Recall:</strong> Thay vì đọc lại, người học buộc não bộ phải tự truy xuất thông tin từ trí nhớ (ví dụ: tự đặt câu hỏi và trả lời, thực hiện bài test ngắn). Quá trình nỗ lực gợi nhớ này chính là lúc các kết nối nơ-ron được củng cố mạnh mẽ nhất [24].</li><li><strong>Spaced Repetition:</strong> Dựa trên hiệu ứng giãn cách, thông tin được ôn tập lại vào các khoảng thời gian tăng dần (1 ngày, 3 ngày, 1 tuần, 1 tháng…). Các công cụ như Anki hoặc Quizlet sử dụng thuật toán thông minh để tự động tính toán thời điểm lý tưởng cho mỗi thẻ thông tin dựa trên mức độ ghi nhớ của người dùng, giúp đẩy lùi đường cong quên lãng và chuyển kiến thức từ trí nhớ ngắn hạn sang trí nhớ dài hạn một cách khoa học [24].</li></ul><p><strong>3. Sự giao thoa và đánh đổi trong vận dụng công cụ</strong></p><p>Việc ứng dụng bộ công cụ này không đơn thuần là cài đặt phần mềm, mà là sự vận dụng chiến thuật dựa trên trạng thái nhận thức. Khi kết hợp Active Recall và Spaced Repetition, người học có thể chia nhỏ quá trình học thành các phiên tập trung ngắn, từ đó giảm tải cho trí nhớ làm việc (working memory) và ngăn chặn tình trạng quá tải nhận thức — một rủi ro thường trực trong môi trường số đầy xao nhãng [25].</p><p>Tuy nhiên, cần lưu ý một điểm mâu thuẫn quan trọng: trong khi các công cụ AI và LMS hướng tới sự tự chủ tuyệt đối (Heutagogy), người học ở giai đoạn mới bắt đầu (novice) đôi khi sẽ gặp khó khăn nếu thiếu các hướng dẫn trực tiếp hoặc ví dụ mẫu (theo Hiệu ứng Đảo ngược Chuyên gia). Do đó, bộ công cụ kỹ thuật chỉ phát huy tác dụng tối đa khi người học biết điều chỉnh: sử dụng LMS để tìm kiếm cấu trúc chuẩn lúc mới bắt đầu, và tăng cường Active Recall&#x2F;Spaced Repetition khi tiến sâu vào giai đoạn làm chủ kiến thức.</p><p>Tóm lại, sự phối hợp giữa <strong>AI-driven LMS (Định hướng → Cá nhân hóa)</strong> và <strong>Active Recall&#x2F;Spaced Repetition (Hấp thu → Lưu trữ)</strong> tạo nên một vòng lặp phản hồi liên tục, biến việc tự học từ một quá trình thử-sai ngẫu nhiên thành một hệ thống sản xuất tri thức có dự báo và đo lường được. 👊</p><h2 id="Ky-nang-giam-tuyen-Content-Curation-Bo-loc-sinh-ton-truoc-bien-thong-tin"><a href="#Ky-nang-giam-tuyen-Content-Curation-Bo-loc-sinh-ton-truoc-bien-thong-tin" class="headerlink" title="Kỹ năng giám tuyển (Content Curation): Bộ lọc sinh tồn trước biển thông tin"></a>Kỹ năng giám tuyển (Content Curation): Bộ lọc sinh tồn trước biển thông tin</h2><p>Trong kỷ nguyên số, một nghịch lý đang tồn tại: khả năng tiếp cận tri thức gần như vô hạn nhưng khả năng hấp thu kiến thức thực thụ lại giảm đi do tình trạng quá tải thông tin (information overload). Chính vì vậy, tư duy “thu thập” (collecting) — tức là lưu trữ càng nhiều tài liệu càng tốt — không còn mang lại giá trị cạnh tranh, mà thay vào đó, kỹ năng giám tuyển nội dung (Content Curation) trở thành “bộ lọc sinh tồn” cho người học trưởng thành.</p><p>Sự khác biệt cốt lõi nằm ở chỗ thu thập là hành động thụ động, tạo ra những “nghĩa trang dữ liệu” (digital hoards) nơi thông tin bị chôn vùi và lãng quên. Ngược lại, giám tuyển là một quá trình chủ động, chuyển hóa dữ liệu thô thành tri thức có cấu trúc thông qua việc lựa chọn, phân tích và đặt vào ngữ cảnh cụ thể [26][27]. Khi một người trưởng thành không biết cách giám tuyển, họ dễ rơi vào “ảo giác về sự hiểu biết” — tưởng rằng mình đã nắm bắt vấn đề chỉ vì đã lưu lại nhiều bài viết về nó, trong khi thực tế bộ não chưa hề thiết lập được bất kỳ lược đồ (schema) kiến thức nào.</p><p>Để triển khai kỹ năng này một cách hệ thống, người học cần áp dụng quy trình 5 bước chặt chẽ nhằm tối ưu hóa luồng thông tin đi vào bộ não [27]:</p><ol><li><strong>Xác định mục tiêu học tập:</strong> Thay vì đọc mọi thứ xuất hiện trên feed, hãy bắt đầu bằng câu hỏi: “Tôi cần giải quyết vấn đề cụ thể nào?”. Việc định hướng mục tiêu giúp thu hẹp phạm vi tìm kiếm và giảm tải nhận thức ngoại lai (extraneous load), tránh việc bị phân tâm bởi những thông tin thú vị nhưng không liên quan.</li><li><strong>Thu thập từ nguồn uy tín:</strong> Thiết lập bộ tiêu chuẩn để đánh giá độ tin cậy của nguồn tin. Trong môi trường số, điều này đòi hỏi kỹ năng đọc viết thông tin (information literacy) để phân biệt giữa quan điểm cá nhân, nội dung quảng cáo và kiến thức dựa trên bằng chứng [2][26].</li><li><strong>Lọc, tổ chức và ngữ cảnh hóa:</strong> Đây là bước quan trọng nhất. Thông tin chỉ có giá trị khi nó được gắn với một ngữ cảnh cụ thể. Thay vì sao chép nguyên văn, người học cần tóm tắt, ghi chú lại lý do vì sao thông tin này quan trọng đối với mục tiêu hiện tại và kết nối nó với những gì đã biết.</li><li><strong>Xem xét và cập nhật:</strong> Kiến thức trong kỷ nguyên số có tốc độ lỗi thời rất nhanh. Việc thường xuyên rà soát và loại bỏ những thông tin không còn chính xác giúp hệ thống tri thức cá nhân luôn tinh gọn và hiệu quả [27].</li><li><strong>Chia sẻ và phản hồi:</strong> Thông qua việc chia sẻ kết quả giám tuyển, người học nhận được phản hồi từ cộng đồng, từ đó tinh chỉnh lại góc nhìn và làm sâu sắc thêm sự hiểu biết.</li></ol><p>Để đối phó với sự choáng ngợp trước biển thông tin, người học trưởng thành không nên đơn độc. Giải pháp bền vững là xây dựng Mạng lưới học tập cá nhân (Personal Learning Network - PLN) — một hệ sinh thái gồm các chuyên gia, đồng nghiệp và những người cùng đam mê [28]. Thay vì cố gắng tự mình đọc hết mọi nguồn tin, việc tận dụng PLN cho phép chúng ta “đứng trên vai những người khổng lồ”, nhận được những đề xuất nội dung đã qua tinh lọc từ những bộ óc tin cậy, từ đó tăng tốc độ tiếp cận bản chất vấn đề.</p><p>Cuối cùng, về mặt kỹ thuật lưu trữ, người học cần dịch chuyển từ tư duy “lưu trữ tĩnh” (như lưu bookmark hay copy-paste vào file word) sang hệ thống “gắn thẻ động” (tagging) [28]. Việc sử dụng thẻ (tags) dựa trên chủ đề, mức độ ưu tiên hoặc trạng thái xử lý cho phép thông tin tự kết nối với nhau theo mạng lưới (networked thought) thay vì phân cấp cây thư mục cứng nhắc. Cách tiếp cận này mô phỏng gần đúng hơn cách não bộ hoạt động, giúp việc truy xuất kiến thức trở nên linh hoạt và kích thích sự sáng tạo, biến kho lưu trữ số thành một “bộ não thứ hai” thực thụ hỗ trợ cho quá trình học tập suốt đời.</p><h2 id="Meta-learning-va-Meta-skills-Nang-cap-‘he-dieu-hanh’-tu-duy"><a href="#Meta-learning-va-Meta-skills-Nang-cap-‘he-dieu-hanh’-tu-duy" class="headerlink" title="Meta-learning và Meta-skills: Nâng cấp ‘hệ điều hành’ tư duy"></a>Meta-learning và Meta-skills: Nâng cấp ‘hệ điều hành’ tư duy</h2><p>Trong một kỷ nguyên mà AI không còn là công cụ hỗ trợ mà đang dần thay thế các kỹ năng cứng (hard skills), năng lực cốt lõi để tồn tại và phát triển không còn nằm ở khối lượng kiến thức tích lũy, mà nằm ở <strong>Meta-learning (học cách học)</strong>. Đây được coi là “bí quyết” để tăng tốc độ tiếp thu kiến thức mới và đạt được năng lực trong nhiều lĩnh vực khác nhau, giúp con người thích nghi kịp thời khi các công nghệ mới liên tục tái định nghĩa lại giá trị công việc [30].</p><p>Nếu coi kiến thức chuyên môn là các “ứng dụng” chạy trên máy tính, thì Meta-learning chính là việc nâng cấp “hệ điều hành” tư duy. Việc tập trung vào các <strong>Meta-skills (kỹ năng siêu việt)</strong> — đặc biệt là tư duy phản biện và khả năng thích ứng nhanh — tạo ra lợi thế cạnh tranh bền vững. Theo nghiên cứu, việc học tập cộng tác để phát triển những kỹ năng này giúp tăng khả năng thích nghi nhanh hơn tới 34% so với việc học độc lập [29]. Điều này dẫn tới một kết quả mang tính sinh học: việc luyện tập các kỹ năng siêu việt không chỉ là thay đổi thói quen, mà thực sự tạo ra những thay đổi vật lý trong não bộ, cụ thể là tại vùng <em>anterior cingulate cortex</em>, giúp tăng cường linh hoạt nhận thức [29].</p><p>Tuy nhiên, để “hệ điều hành” này vận hành trơn tru mà không bị quá tải, người học cần những chiến thuật quản lý năng lượng não bộ cụ thể. Kỹ thuật Pomodoro, dựa trên các nghiên cứu thần kinh học, là một ví dụ điển hình về việc tối ưu hóa sự tập trung, giúp não bộ duy trì hiệu suất cao mà không rơi vào trạng thái kiệt sức [30].</p><p>Một điểm quan trọng cần nhìn nhận là sự vận hành của Meta-learning và khả năng thích ứng của não bộ (neuroplasticity) không diễn ra trong một môi trường chân không. Mặc dù các nguồn tài liệu hiện tại tập trung sâu vào phương pháp luận và công cụ, nhưng cần lưu ý rằng nền tảng sinh học — bao gồm giấc ngủ, dinh dưỡng và vận động — đóng vai trò là điều kiện cần để quá trình tái tạo nơ-ron và củng cố trí nhớ diễn ra hiệu quả. Do thiếu dữ liệu chi tiết từ các nguồn tham khảo cung cấp về các chế độ sinh hoạt cụ thể, chúng ta chỉ có thể khẳng định rằng: mọi nỗ lực nâng cấp “hệ điều hành” tư duy thông qua Meta-learning sẽ bị hạn chế nghiêm trọng nếu cơ sở vật chất của não bộ không được chăm sóc.</p><p>Tóm lại, việc chuyển dịch từ tư duy “học cái gì” sang “học như thế nào” không chỉ là một chiến lược học tập, mà là một cuộc nâng cấp về mặt sinh học và tư duy. Khi các kỹ năng cụ thể trở nên lỗi thời nhanh chóng, khả năng tự điều chỉnh, phản biện và tái cấu trúc cách tiếp cận vấn đề chính là tấm vé bảo hiểm cho sự phát triển bền vững của người trưởng thành trong thời đại số.</p><h2 id="Lo-trinh-trien-khai-toi-uu-cho-nguoi-truong-thanh-Tu-ly-thuyet-den-thuc-hanh"><a href="#Lo-trinh-trien-khai-toi-uu-cho-nguoi-truong-thanh-Tu-ly-thuyet-den-thuc-hanh" class="headerlink" title="Lộ trình triển khai tối ưu cho người trưởng thành: Từ lý thuyết đến thực hành"></a>Lộ trình triển khai tối ưu cho người trưởng thành: Từ lý thuyết đến thực hành</h2><p>Để chuyển hóa lý thuyết thành năng lực thực tế, người trưởng thành cần một chiến lược triển khai có hệ thống, không chỉ dừng lại ở việc chọn công cụ mà phải là thiết lập một “hệ sinh thái” học tập cá nhân hóa. Lộ trình này không nên là một đường thẳng cố định, mà là một chu trình lặp (iterative process) gồm ba giai đoạn cốt lõi:</p><p><strong>1. Thiết lập khung lộ trình dựa trên dữ liệu (Data-Driven Roadmap)</strong></p><p>Thay vì bắt đầu bằng việc chọn một khóa học ngẫu nhiên, bước khởi đầu tối ưu là xác định chính xác “vùng thiếu hụt” thông qua dữ liệu thực tế (actionable data) [14]. Đối với người trưởng thành, việc này có nghĩa là đối chiếu năng lực hiện tại với yêu cầu thực tế của công việc hoặc mục tiêu dài hạn để tìm ra lỗ hổng kiến thức.</p><p>Từ bản đồ lỗ hổng này, lộ trình học tập cần được thiết kế theo nguyên tắc phân cấp: đi từ đơn giản đến phức tạp [20]. Việc chia nhỏ thông tin thành các đơn vị kiến thức (chunks) không chỉ giúp giảm tải nhận thức mà còn tạo ra những “chiến thắng nhỏ” (small wins), giúp duy trì hưng phấn. Tuy nhiên, cần lưu ý một nghịch lý trong tiếp cận: trong khi lý thuyết SDL khuyến khích sự tự chủ hoàn toàn [4], thì thực tế nhận thức cho thấy người mới bắt đầu một lĩnh vực vẫn cần những ví dụ mẫu hoặc hướng dẫn trực tiếp để xây dựng lược đồ (schema) cơ bản trước khi có thể tự giải quyết vấn đề một cách độc lập [18].</p><p><strong>2. Mô hình học tập hỗn hợp: Sự giao thoa giữa Kỹ thuật số và Thực chứng</strong></p><p>Một lộ trình tối ưu không thể chỉ dựa thuần túy vào màn hình máy tính. Sự kết hợp giữa học tập kỹ thuật số (Digital Learning) và thực hành trực tiếp tạo nên một mô hình học tập hỗn hợp (Blended Learning) mang lại chiều sâu tri thức [3].</p><ul><li><strong>Học tập kỹ thuật số (Linh hoạt):</strong> Tận dụng các nền tảng Adaptive Learning và AI để tùy chỉnh tốc độ hấp thu, cho phép người học lấp đầy lỗ hổng kiến thức một cách nhanh chóng và cá nhân hóa theo nhu cầu [21].</li><li><strong>Học tập trải nghiệm (Chiều sâu):</strong> Người trưởng thành học tốt nhất khi kiến thức được gắn liền với kinh nghiệm cá nhân [9]. Do đó, phương pháp <em>Learning by doing</em> (học qua làm) là bắt buộc. Việc áp dụng kiến thức vào các dự án thực tế không chỉ giúp củng cố trí nhớ mà còn biến thông tin thành kỹ năng thực thụ [3].</li><li><strong>Học tập cộng tác (Mở rộng):</strong> Tự học không có nghĩa là cô lập. Việc trao đổi ý tưởng và kỹ năng thông qua các nhóm cộng tác giúp người học đối chiếu góc nhìn, phát hiện sai sót trong tư duy và tăng khả năng thích nghi nhanh hơn so với việc học đơn độc [3][29].</li></ul><p><strong>3. Kiểm chứng năng lực và chống “ảo giác hiểu biết” (Mastery Validation)</strong></p><p>Một rủi ro lớn trong tự học là “ảo giác về sự hiểu biết” (illusion of competence) — trạng thái người học cảm thấy mình đã nắm vững kiến thức khi đọc tài liệu hoặc xem video nhưng lại thất bại khi áp dụng thực tế. Để khắc phục, lộ trình triển khai phải tích hợp các cơ chế kiểm chứng khách quan:</p><ul><li><strong>Active Recall (Chủ động gợi nhớ):</strong> Thay vì đọc lại tài liệu một cách thụ động, người học cần buộc não bộ truy xuất thông tin thông qua việc tự đặt câu hỏi hoặc kiểm tra [23][24]. Đây là bộ lọc hiệu quả nhất để phân biệt giữa “quen mặt chữ” và “thực sự hiểu”.</li><li><strong>Spaced Repetition (Lặp lại ngắt quãng):</strong> Sử dụng các thuật toán điều chỉnh tần suất ôn tập (như Anki hoặc Quizlet) để củng cố trí nhớ dài hạn, đảm bảo kiến thức không bị mai một theo thời gian [24][25].</li><li><strong>Đánh giá dựa trên kết quả thực (Performance-based):</strong> Đối chiếu kết quả thực hành với các tiêu chuẩn thành thạo (mastery) tương tự như cách tiếp cận của Math-U-See [1], nơi tiến độ chỉ được ghi nhận khi người học chứng minh được sự thành thạo qua sản phẩm cụ thể, thay vì chỉ hoàn thành số giờ học.</li></ul><p><em>Lưu ý về giới hạn:</em> Mặc dù các công cụ như Active Recall và Spaced Repetition giúp kiểm chứng việc ghi nhớ thông tin, nhưng các nguồn tài liệu hiện tại chưa cung cấp một khung đo lường chuẩn hóa (benchmark) để định lượng mức độ “làm chủ” (mastery) cho mọi lĩnh vực. Do đó, việc kiểm chứng tối thượng vẫn nằm ở khả năng giải quyết các bài toán thực tế trong môi trường làm việc hoặc thông qua phản hồi từ các chuyên gia trong lĩnh vực đó.</p><p><strong>Kết luận lộ trình:</strong> Một chu trình học tập hoàn chỉnh sẽ vận hành theo vòng lặp: <strong>Đo lường lỗ hổng → Lập lộ trình phân cấp → Học số (Linh hoạt) → Thực hành trải nghiệm (Chiều sâu) → Kiểm chứng chủ động (Anti-Illusion) → Cộng tác đối chiếu → Đánh giá và điều chỉnh.</strong> Việc tuân thủ quy trình này biến tự học từ một nỗ lực rời rạc thành một chiến lược phát triển bền vững trong kỷ nguyên số. ☕️</p><h2 id="Nguon-tham-khao"><a href="#Nguon-tham-khao" class="headerlink" title="Nguồn tham khảo"></a>Nguồn tham khảo</h2><ul><li>Self-Directed Learning (Heutagogy) in the Digital Age — <a href="https://demmelearning.com/blog/self-directed-learning-strategies">https://demmelearning.com/blog/self-directed-learning-strategies</a></li><li>Digitization bolstering self-directed learning for information literate adults–A systematic review — <a href="https://www.sciencedirect.com/science/article/pii/S2666557321000197">https://www.sciencedirect.com/science/article/pii/S2666557321000197</a></li><li>7 Adult Learning Strategies for Professional Development | Park University — <a href="https://www.park.edu/blog/adult-learning-strategies-for-professional-development">https://www.park.edu/blog/adult-learning-strategies-for-professional-development</a></li><li>Self-Directed Learning | Education | Research Starters | EBSCO Research — <a href="https://www.ebsco.com/research-starters/education/self-directed-learning">https://www.ebsco.com/research-starters/education/self-directed-learning</a></li><li>Self-directed Learning Theory to Practice: A Footstep towards … — <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC9309162">https://pmc.ncbi.nlm.nih.gov/articles/PMC9309162</a></li><li>NĂNG LỰC TỰ HỌC - CHÌA KHOÁ THÀNH CÔNG TRONG KỈ NGUYÊN … — <a href="https://tuthucductri.edu.vn/nang-luc-tu-hoc-chia-khoa-thanh-cong-trong-ki-nguyen-so-scnwv239.html">https://tuthucductri.edu.vn/nang-luc-tu-hoc-chia-khoa-thanh-cong-trong-ki-nguyen-so-scnwv239.html</a></li><li>Tự học là gì? Phương pháp tự học hiệu quả — <a href="https://www.youtube.com/watch?v=-uag2xjp7sU">https://www.youtube.com/watch?v=-uag2xjp7sU</a></li><li>Phương Pháp Tự Học Hiệu Quả - Tăng Cường Kiến Thức Cho Học Sinh — <a href="https://www.studocu.vn/vn/document/truong-dai-hoc-khoa-hoc-xa-hoi-va-nhan-van/phuong-phap-nghien-cuu-khoa-hoc/phuong-phap-tu-hoc-on-tap-tot/43340319">https://www.studocu.vn/vn/document/truong-dai-hoc-khoa-hoc-xa-hoi-va-nhan-van/phuong-phap-nghien-cuu-khoa-hoc/phuong-phap-tu-hoc-on-tap-tot/43340319</a></li><li>Học tập ở người trưởng thành – Những điều cần lưu ý — <a href="https://career.gpo.vn/hoc-tap-o-nguoi-truong-thanh-nhung-dieu-can-luu-y-a4794.html">https://career.gpo.vn/hoc-tap-o-nguoi-truong-thanh-nhung-dieu-can-luu-y-a4794.html</a></li><li>Adult Learning: Lý thuyết học tập &amp; đào tạo người trưởng thành — <a href="https://vncmd.com/chuyen-de/nhan-su/adult-learning">https://vncmd.com/chuyen-de/nhan-su/adult-learning</a></li><li>What is personalized digital learning: Benefits, myths, and tools | Bina School — <a href="https://www.thebinaschool.com/blog/personalized-digital-learning">https://www.thebinaschool.com/blog/personalized-digital-learning</a></li><li>What Are The Top EdTech Tools For Personalized Learning? | Extreme Networks — <a href="https://www.extremenetworks.com/resources/blogs/what-are-the-top-edtech-tools-for-personalized-learning">https://www.extremenetworks.com/resources/blogs/what-are-the-top-edtech-tools-for-personalized-learning</a></li><li>Personalized Learning Paths? AI Guide for Educators | 2026 — <a href="https://www.thirdrocktechkno.com/blog/personalized-learning-paths-for-student">https://www.thirdrocktechkno.com/blog/personalized-learning-paths-for-student</a></li><li>Best 5 personalised learning platforms for your learning journeys — <a href="https://www.anewspring.com/articles/best-personalised-learning-journey-platforms">https://www.anewspring.com/articles/best-personalised-learning-journey-platforms</a></li><li>10 Knowledge Management Software to Empower Teams | Stonly — <a href="https://stonly.com/blog/knowledge-management-software-tools">https://stonly.com/blog/knowledge-management-software-tools</a></li><li>Cognitive Load Theory: How to Optimize Learning - Let’s Go Learn — <a href="https://www.letsgolearn.com/education-reform/cognitive-load-theory-how-to-optimize-learning">https://www.letsgolearn.com/education-reform/cognitive-load-theory-how-to-optimize-learning</a></li><li>Cognitive-Load Theory: Methods to Manage Working … — <a href="https://journals.sagepub.com/doi/10.1177/0963721420922183">https://journals.sagepub.com/doi/10.1177/0963721420922183</a></li><li>Cognitive Load Theory and its Applications for Learning - Scott H Young — <a href="https://www.scotthyoung.com/blog/2022/01/04/cognitive-load-theory">https://www.scotthyoung.com/blog/2022/01/04/cognitive-load-theory</a></li><li>Cognitive Load Theory - The Decision Lab — <a href="https://thedecisionlab.com/reference-guide/psychology/cognitive-load-theory">https://thedecisionlab.com/reference-guide/psychology/cognitive-load-theory</a></li><li>Cách xây dựng lộ trình học tập cho doanh nghiệp với hệ thống LMS — <a href="https://gitiho.com/blog/xay-dung-lo-trinh-hoc-tap.html">https://gitiho.com/blog/xay-dung-lo-trinh-hoc-tap.html</a></li><li>Học tập cá nhân hóa bằng AI: Cách công nghệ Adaptive Learning cá nhân hóa lộ trình cho từng học sinh - NaviEdu Blog — <a href="https://navi.edu.vn/blog/hoc-tap-ca-nhan-hoa-bang-ai-cach-cong-nghe-adaptive-learning-ca-nhan-hoa-lo-trinh-cho-tung-hoc-sinh">https://navi.edu.vn/blog/hoc-tap-ca-nhan-hoa-bang-ai-cach-cong-nghe-adaptive-learning-ca-nhan-hoa-lo-trinh-cho-tung-hoc-sinh</a></li><li>Hệ Thống Tự Tối Ưu Tự Học Trong Ngành Sản Xuất Là Gì — <a href="https://fmit.vn/tu-dien-quan-ly/self-optimizing-self-learning-systems-manufacturing-industry-la-gi">https://fmit.vn/tu-dien-quan-ly/self-optimizing-self-learning-systems-manufacturing-industry-la-gi</a></li><li>How to learn with active recall and spaced repetition | SC Training — <a href="https://training.safetyculture.com/blog/how-to-use-active-recall-and-spaced-repetition">https://training.safetyculture.com/blog/how-to-use-active-recall-and-spaced-repetition</a></li><li>Active Recall and Spaced Repetition: Powerful Study Methods for Long-Term Learning — <a href="https://www.linkedin.com/pulse/active-recall-spaced-repetition-powerful-study-dr-aniket-srivastava-wcwyc">https://www.linkedin.com/pulse/active-recall-spaced-repetition-powerful-study-dr-aniket-srivastava-wcwyc</a></li><li>Active Recall and Spaced Repetition: How to Use Them — <a href="https://recallify.ai/boost-memory-with-active-recall-and-spaced-repetition">https://recallify.ai/boost-memory-with-active-recall-and-spaced-repetition</a></li><li>Curating Learning Resources: A Subject Matter Expert Guide — <a href="https://elearningindustry.com/from-chaos-to-clarity-a-subject-matter-expert-guide-for-curating-content">https://elearningindustry.com/from-chaos-to-clarity-a-subject-matter-expert-guide-for-curating-content</a></li><li>Master Content Curation for Smarter Learning Today — TechClass — <a href="https://www.techclass.com/resources/lifelong-learning/how-to-avoid-information-overload-curating-learning-content-effectively">https://www.techclass.com/resources/lifelong-learning/how-to-avoid-information-overload-curating-learning-content-effectively</a></li><li>taming the beast: principles to efficiently curate &amp; customize online — <a href="https://files.eric.ed.gov/fulltext/EJ1199113.pdf">https://files.eric.ed.gov/fulltext/EJ1199113.pdf</a></li><li>In the Age of AI: Meta Skills Are Your New Career Advantage — <a href="https://www.peoplekult.com/post/in-the-age-of-ai-meta-skills-are-your-new-career-advantage">https://www.peoplekult.com/post/in-the-age-of-ai-meta-skills-are-your-new-career-advantage</a></li><li>Medium — <a href="https://adam-maj.medium.com/meta-learning-the-secret-to-rapid-learning-and-growth-in-the-age-of-technology-eea8693ae3a3">https://adam-maj.medium.com/meta-learning-the-secret-to-rapid-learning-and-growth-in-the-age-of-technology-eea8693ae3a3</a></li><li>Understanding Meta-Learning: Techniques, Benefits &amp; Strategies — <a href="https://www.lyzr.ai/glossaries/meta-learning">https://www.lyzr.ai/glossaries/meta-learning</a></li></ul>]]>
    </content>
    <id>http://kudokhang.github.io/2026/07/26/Chien-luoc-tu-hoc-hieu-qua-trong-ky-nguyen-so-Tu-phuong-phap-luan-nhan-thuc-den-lo-trinh-toi-uu-hoa-cho-nguoi-truong-thanh/</id>
    <link href="http://kudokhang.github.io/2026/07/26/Chien-luoc-tu-hoc-hieu-qua-trong-ky-nguyen-so-Tu-phuong-phap-luan-nhan-thuc-den-lo-trinh-toi-uu-hoa-cho-nguoi-truong-thanh/"/>
    <published>2026-07-26T07:26:25.000Z</published>
    <summary>
      <![CDATA[<h2 id="Tom-tat"><a href="#Tom-tat" class="headerlink" title="Tóm tắt"></a>Tóm tắt</h2><p>Bài phân tích cung cấp một khung lý thuyết và thực]]>
    </summary>
    <title>Chiến lược tự học hiệu quả trong kỷ nguyên số</title>
    <updated>2026-07-26T07:29:50.124Z</updated>
  </entry>
  <entry>
    <author>
      <name>Kudo Khang</name>
    </author>
    <category term="Learning" scheme="http://kudokhang.github.io/tags/Learning/"/>
    <content>
      <![CDATA[<p>Có một cảm giác khá lạ trong vài năm gần đây: nhiều kỹ năng mà ta từng nghĩ là lợi thế bền vững bỗng trở nên mong manh.</p><p>Viết một đoạn code, dựng một bản kế hoạch, tóm tắt tài liệu, viết email, tạo nội dung, phân tích dữ liệu, tìm kiếm thông tin - rất nhiều việc từng cần nhiều giờ luyện tập nay có thể được AI hỗ trợ trong vài phút. Với những người làm công việc tri thức, cảm giác này vừa hào hứng vừa hơi bất an. Hào hứng vì năng suất được mở rộng rất nhiều. Bất an vì những gì mình tích lũy được trong nhiều năm có vẻ đang bị xói mòn nhanh hơn mình tưởng.</p><p>Công việc hiện tại của tôi là AI Engineer tại Mynavi TechTus, trong một phòng ban R&amp;D. Tôi có cơ hội được nghiên cứu các bài toán AI, các công cụ mới, các xu hướng mới của ngành một cách khá thoải mái, thay vì bị bó buộc vào một dự án cố định. Đây là một môi trường rất thú vị, nhưng cũng khiến tôi cảm nhận rõ hơn tốc độ thay đổi của lĩnh vực này. Có những thứ hôm nay còn mới, vài tháng sau đã trở nên bình thường. Có những kỹ thuật vừa học xong, chưa kịp dùng nhiều thì một công cụ khác đã làm tốt hơn.</p><p>Điều đó không có nghĩa con người hết giá trị. Nhưng nó buộc tôi phải hỏi lại: nếu kiến thức cụ thể ngày càng nhanh lỗi thời, nếu nhiều kỹ năng thao tác ngày càng dễ bị tự động hóa, vậy đâu là thứ còn đáng để luyện lâu dài?</p><p>Càng nghĩ, tôi càng quay về ba việc rất cũ: học, đọc và viết.</p><p>Nghe có vẻ đơn giản, thậm chí hơi hiển nhiên. Nhưng tôi nghĩ trong thời AI, chính những kỹ năng nền này lại trở nên quan trọng hơn. Không phải vì chúng giúp ta chống lại AI, mà vì chúng giúp ta dùng AI tốt hơn, hiểu thế giới sâu hơn, và quan trọng nhất là không giao toàn bộ quyền phán đoán của mình cho máy.</p><h2 id="Hoc-de-khong-bi-dong-bang"><a href="#Hoc-de-khong-bi-dong-bang" class="headerlink" title="Học để không bị đóng băng"></a>Học để không bị đóng băng</h2><p>Trước đây, khi nói đến học, tôi thường nghĩ đến việc học thêm một công nghệ mới, một framework mới, một ngôn ngữ lập trình mới, hoặc một kiến thức chuyên môn cụ thể nào đó. Những thứ này vẫn quan trọng. Nhưng càng làm việc trong lĩnh vực AI, tôi càng thấy học không chỉ là tích lũy thêm kiến thức. Học là khả năng liên tục nhận ra mình đang thiếu gì, rồi chủ động bước vào vùng thiếu đó.</p><p>Có một cách nghĩ tôi thấy rất hữu ích: chia tri thức của mình thành nhiều vùng. Có những thứ mình biết rõ. Có những thứ mình biết là mình không biết. Có những thứ mình tưởng là mình biết, nhưng thực ra hiểu sai hoặc hiểu rất nông. Và nguy hiểm nhất là những thứ mình không biết rằng mình không biết.</p><p><img src="https://i.postimg.cc/gJQRB0zC/vong-tron-nhan-biet.png" alt="Vong-tron-nhan-thuc"></p><center><i>Vòng tròn nhận thức</i></center><p>Vùng “tưởng là biết” thường nguy hiểm hơn cả. Vì khi không biết, ta còn có thể khiêm tốn hỏi thêm. Nhưng khi tưởng rằng mình đã biết, ta rất dễ đưa ra quyết định sai với một sự tự tin thái quá. Trong thời AI, điều này càng đáng sợ hơn. AI có thể đưa ra một câu trả lời mạch lạc, trơn tru, nghe rất hợp lý. Nếu bản thân mình không có đủ nền để nhận ra chỗ sai, chỗ thiếu, chỗ mơ hồ, ta rất dễ bị thuyết phục (cái mà tôi hay nói là bị AI nó dắt mũi).</p><p>Vì vậy, học với tôi trước hết là một cách mở rộng vòng tròn năng lực của mình. Không phải để trở thành người biết mọi thứ, mà để hiểu rõ hơn đâu là vùng mình nắm chắc, đâu là vùng mình còn mù, và đâu là vùng mình cần đi sâu hơn.</p><p>Đó cũng là một phần lý do tôi quay lại trường học tiếp cao học chuyên ngành cơ điện tử mặc dù khá bận với gia đình và công việc hiện tại. Công việc chính của tôi xoay quanh AI, nhưng tôi không muốn chỉ nhìn AI như một thứ tồn tại trong màn hình, trong model, trong prompt hay trong vài dòng code. Tôi muốn có thêm nền về hệ thống, điều khiển, cơ khí, cảm biến, tự động hóa - những thứ giúp AI bước ra khỏi demo và đi vào thực tế rõ hơn. Khi học những môn ngoài vùng quen thuộc, tôi nhận ra rất nhiều lỗ hổng mà trước đây mình không thấy.</p><p>Ngoài việc học trên trường, công việc dạy thêm lập trình cho mấy bạn nhỏ cũng nhắc tôi về chuyện học theo một cách rất thực tế. Khi chuẩn bị một bài lập trình cho học sinh, đặc biệt là các bài lập trình thi đấu, tôi không thể chỉ nhìn đáp án rồi giảng lại. Tôi phải tự đi qua bài toán, thử các hướng giải, kiểm tra độ đúng, độ tối ưu, nghĩ xem vì sao một cách làm sai, vì sao một cách khác tốt hơn, rồi tìm cách diễn đạt sao cho học sinh có thể hiểu.</p><p>Dạy, theo nghĩa đó, là một hình thức học rất nghiêm khắc. Khi phải giải thích cho người khác, mình không thể trốn sau cảm giác “đại khái là hiểu”. Những chỗ mơ hồ sẽ lộ ra ngay.</p><p>Bên cạnh lập trình, tôi còn dạy các bạn THCS, THPT về AI, chính xác hơn là cách sử dụng và làm chủ AI để nâng cao năng suất học tập. Việc này cho tôi cơ hội quan sát rất rõ cách con người học với AI. Có bạn dùng AI rất tốt: biết đặt câu hỏi, biết chia nhỏ vấn đề, biết kiểm tra lại câu trả lời. Nhưng cũng có bạn loay hoay trước khung chat, không biết phải hỏi gì, hoặc chỉ copy một yêu cầu rất chung chung rồi chờ AI làm thay.</p><p>Từ những buổi dạy đó, tôi dần nhận ra một điều: biết dùng AI không chỉ là biết gõ prompt. Nó liên quan rất nhiều đến cách học. Một người học tốt thường biết mình đang vướng ở đâu, biết hỏi tiếp khi chưa hiểu, biết so sánh câu trả lời với kiến thức đã có, và biết tự sửa lại cách hỏi. Ngược lại, nếu không có thói quen học chủ động, AI đôi khi chỉ làm cho sự phụ thuộc trở nên tiện lợi hơn.</p><p>Vì học là một quá trình liên tục, tôi nghĩ mình phải tìm cách enjoy nó. Nếu học chỉ là chạy theo nỗi sợ bị bỏ lại, ta sẽ rất nhanh mệt. Nhưng nếu học là một cách mở rộng thế giới của mình, một cách phát hiện những vùng mới đáng tò mò, thì nó trở thành thứ có thể đi đường dài hơn.</p><h2 id="Doc-de-mo-rong-ban-do-trong-dau"><a href="#Doc-de-mo-rong-ban-do-trong-dau" class="headerlink" title="Đọc để mở rộng bản đồ trong đầu"></a>Đọc để mở rộng bản đồ trong đầu</h2><p>Nếu học giúp tôi biết mình cần bổ sung gì, thì đọc giúp tôi mở rộng bản đồ trong đầu.</p><p>AI có thể trả lời rất nhanh. Nó có thể tóm tắt một bài viết dài, giải thích một khái niệm khó, so sánh nhiều quan điểm, thậm chí đóng vai một người phản biện. Những việc đó thật sự hữu ích. Tôi vẫn dùng AI hằng ngày cho rất nhiều tác vụ như vậy.</p><p>Nhưng càng dùng AI, tôi càng dè chừng với việc để AI tóm tắt thay mình mọi thứ.</p><p>Trước đây, tôi cũng từng nghĩ chức năng summary của AI thật tuyệt. Một bài dài mấy nghìn chữ có thể được rút lại thành vài gạch đầu dòng. Một báo cáo phức tạp có thể biến thành một đoạn ngắn dễ hiểu. Về mặt tiết kiệm thời gian, điều đó quá hấp dẫn.</p><p>Nhưng sau một thời gian, tôi bắt đầu thấy mặt trái của nó. Nếu cái gì cũng được tóm tắt, mình dần mất khả năng ngồi lại với một văn bản dài. Mình đọc nhanh hơn, nhưng cũng dễ nông hơn, thông tin khi đi qua tóm tắt cũng bị rơi rớt đôi phần. Mình biết bài đó “nói gì”, nhưng chưa chắc đã đi qua cách tác giả xây dựng lập luận, cách họ đặt vấn đề, những đoạn họ vòng qua rồi quay lại, những chỗ họ do dự, những chỗ họ tự phản biện.</p><p>Một bài phân tích dài không chỉ có vài ý chính. Nó có nhịp điệu, bối cảnh, giọng điệu và cả những khoảng chậm cần thiết để người đọc tự hình thành phán đoán. Nếu chỉ đọc summary, tôi có thể lấy được thông tin, nhưng bỏ lỡ quá trình suy nghĩ.</p><p>Đây là lý do tôi vẫn cố duy trì thói quen đọc các bài viết và bài phân tích dài mỗi ngày, đặc biệt là về AI. Trong một lĩnh vực thay đổi quá nhanh, đọc giúp tôi không chỉ cập nhật tin tức, mà còn nhìn thấy cách những người khác đang hiểu về sự thay đổi đó. Có người nhìn từ góc độ kỹ thuật, có người nhìn từ kinh doanh, có người nhìn từ giáo dục, có người nhìn từ triết học hoặc xã hội. Mỗi góc nhìn thêm vào làm bản đồ trong đầu mình rộng hơn một chút.</p><p>Ngoài các bài phân tích về AI, tôi vẫn đọc sách và giáo trình để phục vụ việc học thạc sĩ. Đây là một kiểu đọc khác: chậm hơn, có hệ thống hơn, đôi khi khô hơn, nhưng rất cần thiết để xây nền. Nếu chỉ đọc những thứ mới, nhanh, ngắn, dễ tiêu hóa, mình dễ có cảm giác luôn cập nhật nhưng nền lại không sâu.</p><p>Tôi không nghĩ cần cực đoan chống lại việc dùng AI để tóm tắt. Có những lúc summary rất hữu ích: để định hướng ban đầu, để nhớ lại nội dung, để lọc xem một tài liệu có đáng đọc sâu không. Nhưng tôi nghĩ phải giữ lại năng lực đọc trực tiếp văn bản gốc. Vì nếu không, ta sẽ quen với việc tiếp nhận thế giới qua một lớp trung gian quá tiện lợi.</p><p>AI cho tôi câu trả lời, nhưng đọc cho tôi một cái đầu rộng hơn để hiểu câu trả lời đó.</p><h2 id="Viet-de-lam-chu-dong-suy-nghi"><a href="#Viet-de-lam-chu-dong-suy-nghi" class="headerlink" title="Viết để làm chủ dòng suy nghĩ"></a>Viết để làm chủ dòng suy nghĩ</h2><p>Nếu học là cách mở rộng năng lực, đọc là cách mở rộng bản đồ trong đầu, thì viết là cách làm chủ dòng suy nghĩ của mình.</p><p>Tôi càng ngày càng tin rằng mình chưa thật sự hiểu một điều gì đó cho đến khi thử viết nó ra. Khi một ý nghĩ còn nằm trong đầu, nó thường có vẻ hợp lý. Nhưng khi đặt xuống thành câu chữ, những chỗ lỏng sẽ lộ ra: đoạn này chưa rõ, ý kia mâu thuẫn, lập luận này thiếu cầu nối, ví dụ kia chưa đủ thuyết phục.</p><p>Viết không chỉ là tạo content. Viết là một công cụ tư duy.</p><p>Trong thời AI, điều này càng đáng nói hơn. AI có thể viết rất nhanh, rất mượt, rất đúng cấu trúc. Một đoạn văn trơn tru không còn hiếm. Một bài viết đủ mở bài, thân bài, kết luận cũng không còn quá khó tạo ra. Chính vì vậy, chữ nghĩa trở nên rẻ hơn về mặt sản lượng.</p><p>Nhưng tôi không nghĩ kỹ năng viết vì thế mà mất giá. Ngược lại, tôi nghĩ nó càng có giá. Vì trong một biển nội dung được sinh ra tự động, thứ hiếm hơn không phải là câu chữ, mà là một suy nghĩ thật. Một trải nghiệm thật. Một lập trường thật. Một người thật đang cố gắng diễn đạt điều mình quan sát, tin tưởng, nghi ngờ hoặc chưa hiểu hết.</p><p>Tôi đang tập viết bằng những việc nhỏ và lặp lại. Viết các bài chia sẻ nội bộ trong team để hệ thống lại điều mình đang nghiên cứu. Viết báo tuần bằng tay để tự tổng kết công việc và nhìn lại mình đã dùng thời gian như thế nào. Viết blog cá nhân để đưa một số suy nghĩ ra khỏi phạm vi ghi chú riêng.</p><p>Những hình thức viết này phục vụ các mục đích khác nhau. Viết trong team giúp tôi giao tiếp rõ hơn với đồng đội. Viết báo tuần giúp tôi giữ nhịp phản tư. Viết blog buộc tôi gọt lại suy nghĩ để một người khác có thể đọc được. Nhưng điểm chung là chúng đều ép tôi phải rõ ràng hơn với chính mình.</p><p>Công cụ tôi thích nhất cho việc này là Obsidian. Có lẽ vì Obsidian không tạo cảm giác như một nơi chỉ để “soạn thảo văn bản”, mà giống một không gian để tích lũy và nối các mảnh suy nghĩ. Một ý tưởng hôm nay có thể liên kết với một ghi chú cũ. Một đoạn đọc được từ bài phân tích có thể nối với trải nghiệm đi dạy. Một suy nghĩ rời rạc có thể nằm đó vài tuần, rồi một ngày trở thành phần mở đầu của một bài blog.</p><p>AI cũng có vai trò trong quá trình viết của tôi, nhưng không phải vai trò thay thế. Tôi dùng AI để tổ chức lại ý, polish câu chữ, gợi ý cấu trúc, chỉ ra chỗ thiếu, hoặc giúp biến một đống ghi chú thô thành bản nháp dễ đọc hơn. Chính bài viết này cũng được hình thành theo cách đó: ý tưởng, trải nghiệm và quan điểm vẫn phải là của tôi; AI chỉ giúp tôi đẩy nhanh quá trình sắp xếp và hoàn thiện.</p><p>Nếu không có điều gì thật sự để nói, AI chỉ làm cho sự rỗng trở nên trơn tru hơn. Còn nếu đã có chất liệu thật, AI có thể là một cộng sự biên tập rất hữu ích. Và không biết bạn có nhận ra không, bài viết này đang được triển khai từ những ý tưởng thô của tôi, thực hiện bởi Codex và tôi lại review và bổ sung lại lần cuối trước khi đưa lên.</p><h2 id="Tu-duy-de-review-AI"><a href="#Tu-duy-de-review-AI" class="headerlink" title="Tư duy để review AI"></a>Tư duy để review AI</h2><p>Ba việc học, đọc và viết cuối cùng đều dẫn tôi đến một kỹ năng mà tôi nghĩ sẽ ngày càng quan trọng: khả năng xử lý thông tin và review những gì AI sinh ra.</p><p>Trong thời AI, kỹ năng quan trọng không chỉ là biết prompt. Prompt tốt giúp AI trả lời tốt hơn, nhưng tư duy tốt mới giúp mình biết câu trả lời đó có đáng dùng hay không.</p><p>Đây là điểm tôi thấy nhiều người dễ bỏ qua. Vì AI thường tạo ra câu trả lời có vẻ rất hoàn chỉnh. Nó trình bày mạch lạc, dùng từ tự tin, chia ý rõ ràng, đôi khi còn có giọng điệu rất thuyết phục. Một câu trả lời sai nhưng được viết mượt có thể nguy hiểm hơn một câu trả lời vụng về, vì nó làm mình mất cảnh giác.</p><p>Nếu trước đây kỹ năng quan trọng là tìm thông tin, thì bây giờ kỹ năng quan trọng hơn là xử lý thông tin. Câu trả lời này dựa trên giả định nào? Có thiếu dữ kiện nào không? Lập luận có nhảy cóc không? Có đang đánh tráo khái niệm không? Có đúng trong ngữ cảnh của mình không? Nếu áp dụng vào thực tế thì rủi ro là gì?</p><p>Để hỏi được những câu đó, ta cần nền.</p><p>Học giúp mình có kiến thức để nhận ra chỗ AI nói sai hoặc nói quá đà. Đọc giúp mình có nhiều góc nhìn hơn, không bị mắc kẹt trong một câu trả lời duy nhất. Viết giúp mình diễn đạt lại, chất vấn lại, và biến output của AI thành suy nghĩ của mình thay vì bê nguyên xi. Còn tư duy là thứ nối tất cả lại: khả năng kiểm tra giả định, logic, ngữ cảnh và hệ quả.</p><p>Tôi nghĩ đây sẽ là một kỹ năng rất quan trọng của người làm tri thức trong thời gian tới. Không phải ai dùng AI nhiều hơn thì giỏi hơn. Người có lợi thế là người biết dùng AI như một công cụ tăng tốc, nhưng vẫn giữ được quyền phán đoán cuối cùng.</p><p>Nếu không có khả năng xử lý thông tin, ta rất dễ trở thành người duyệt bài cho AI bằng niềm tin thay vì bằng hiểu biết.</p><h2 id="Giu-lai-vai-ky-nang-rat-cu"><a href="#Giu-lai-vai-ky-nang-rat-cu" class="headerlink" title="Giữ lại vài kỹ năng rất cũ"></a>Giữ lại vài kỹ năng rất cũ</h2><p>Tôi không viết những điều này như một lời kêu gọi quay lưng với AI. Ngược lại, công việc của tôi gắn trực tiếp với AI, và tôi tin đây là một trong những công nghệ quan trọng nhất mà thế hệ mình được chứng kiến, AI là một xu hướng tất yếu, là một sự chuyển dịch không thể đảo ngược được nữa.</p><p>Nhưng chính vì AI mạnh, tôi càng thấy mình cần giữ lại và rèn sâu hơn một vài kỹ năng rất cũ.</p><p>Học để biết mình đang thiếu gì và còn có thể học lại khi thế giới đổi luật chơi.</p><p>Đọc để không nhìn thế giới quá hẹp, không đánh đổi toàn bộ chiều sâu lấy tốc độ.</p><p>Viết để làm chủ dòng suy nghĩ, giữ lại tiếng nói của mình giữa một biển nội dung trơn tru.</p><p>Và tư duy để không giao toàn bộ quyền phán đoán cho máy.</p><p>AI có thể giúp tôi đi nhanh hơn. Nhưng tôi vẫn cần học để biết nên đi đâu, đọc để hiểu con đường mình đang đi qua, viết để biến trải nghiệm đó thành suy nghĩ của chính mình, và tư duy để biết khi nào cần dừng lại, nghi ngờ, kiểm chứng.</p><p>Có lẽ trong một thời đại quá mới, vài kỹ năng rất cũ lại là thứ đáng giữ nhất. Hi vọng bài viết này sẽ cung cấp thêm một góc nhìn mới cho những người đang loay hoay đi tìm câu trả lời “đâu là kỹ năng quan trọng nhất trong thời đại AI?” như tôi.</p><!--REFERENCES-->]]>
    </content>
    <id>http://kudokhang.github.io/2026/06/15/Hoc-doc-va-viet-trong-thoi-dai-AI/</id>
    <link href="http://kudokhang.github.io/2026/06/15/Hoc-doc-va-viet-trong-thoi-dai-AI/"/>
    <published>2026-06-15T15:37:17.000Z</published>
    <summary>
      <![CDATA[<p>Có một cảm giác khá lạ trong vài năm gần đây: nhiều kỹ năng mà ta từng nghĩ là lợi thế bền vững bỗng trở nên mong manh.</p>
<p>Viết một đ]]>
    </summary>
    <title>Học, đọc và viết trong thời đại AI</title>
    <updated>2026-06-15T16:11:16.087Z</updated>
  </entry>
  <entry>
    <author>
      <name>Kudo Khang</name>
    </author>
    <category term="Career" scheme="http://kudokhang.github.io/tags/Career/"/>
    <category term="Life" scheme="http://kudokhang.github.io/tags/Life/"/>
    <category term="Personal" scheme="http://kudokhang.github.io/tags/Personal/"/>
    <content>
      <![CDATA[<p>Đầu năm 2025, kế hoạch của mình gói gọn trong hai chữ: <strong>“Ổn định”</strong>. Vợ đang mang bầu, mình chỉ mong một năm bình yên tại FTECH – nơi mình đã gắn bó hơn 3 năm – để dành trọn thời gian chăm lo cho gia đình nhỏ. Nhưng đúng là “đời không như là mơ”, và năm 2025 đã dạy mình rằng sự ổn định đôi khi chỉ là một ảo tưởng nếu chúng ta ngừng chuẩn bị cho những biến động.</p><p>Nhân dịp những ngày cuối năm, ngồi gõ những dòng này khi đã vượt qua 2 tháng thử việc tại bến đỗ mới, mình muốn nhìn lại hành trình “vượt bão” của một năm vừa qua.</p><p>Giờ thì vào bài thôi 🚀</p><h2 id="I-Bien-co-dau-tien-Khi-“on-dinh”-bong-choc-tan-bien"><a href="#I-Bien-co-dau-tien-Khi-“on-dinh”-bong-choc-tan-bien" class="headerlink" title="I. Biến cố đầu tiên: Khi “ổn định” bỗng chốc tan biến"></a>I. Biến cố đầu tiên: Khi “ổn định” bỗng chốc tan biến</h2><p>Cái tin layoff từ FTECH đến vào lúc mình ít ngờ tới nhất. Hơn 3 năm gắn bó, mọi quy trình, con người đã trở nên quá quen thuộc. Giữa lúc vợ bầu bí, cần sự ổn định nhất thì “cơn bão” layoff quét qua. Thật sự lúc đó mình khá sốc 🥹.</p><p>Tuy nhiên, có lẽ nhờ những năm tháng tích lũy, mình nhanh chóng lao vào phỏng vấn và may mắn có ngay offer tốt từ công ty thứ 2. Mọi thứ lúc đó tưởng chừng đã suôn sẻ trở lại, mình tự nhủ: “Chắc ông trời chỉ muốn thử thách mình tí thôi”.</p><h2 id="II-Bien-co-thu-hai-Khi-vua-don-con-chao-doi-cung-la-luc…-nghi-viec"><a href="#II-Bien-co-thu-hai-Khi-vua-don-con-chao-doi-cung-la-luc…-nghi-viec" class="headerlink" title="II. Biến cố thứ hai: Khi vừa đón con chào đời cũng là lúc… nghỉ việc"></a>II. Biến cố thứ hai: Khi vừa đón con chào đời cũng là lúc… nghỉ việc</h2><p>Ở công ty thứ 2, mình bắt đầu làm quen với một môi trường mới: làm Backend (BE). Dù trước đó chuyên về AI Computer Vision, nhưng mình rất hào hứng vì được học thêm skill mới. Mức đãi ngộ tốt, công việc đang dần vào guồng thì… bùm! Một số vấn đề nảy sinh với CEO khiến mình buộc phải đưa ra quyết định nghỉ việc.</p><p>Trớ trêu thay, đó cũng là lúc vợ mình vừa mới sinh con.</p><p>Mất việc ngay lúc gia đình đón thành viên mới, áp lực tài chính và tinh thần đè nặng. Thật sự đây là giai đoạn thử thách bản lĩnh kinh khủng nhất. Rất may mắn, mình vẫn duy trì “nghề tay trái” là đi dạy lập trình và nhận các <a href="/2025/11/07/$1000-Dau-Tien-Tren-UpWork/" title="$1000 Đầu Tiên Trên UpWork">job freelance trên Upwork</a>. Chính những khoản thu nhập này đã trở thành “phao cứu sinh” giúp mình lèo lái con thuyền gia đình qua những ngày giông bão đó 👊.</p><h2 id="III-3-thang-tim-viec-va-nhung-bai-hoc-dat-gia"><a href="#III-3-thang-tim-viec-va-nhung-bai-hoc-dat-gia" class="headerlink" title="III. 3 tháng tìm việc và những bài học đắt giá"></a>III. 3 tháng tìm việc và những bài học đắt giá</h2><p>Tiếp sau đó là hơn 3 tháng tìm việc giữa lúc thị trường đang cực kỳ khó khăn. Mình đã đi phỏng nhiều khắp nơi, tiếp xúc với đủ kiểu người:</p><ul><li>Có những buổi phỏng vấn như một cuộc trao đổi kiến thức đỉnh cao, nơi mình được “wow” vì trình độ và sự cởi mở của họ.</li><li>Cũng có những nơi hỏi đáp rập khuôn, máy móc như thể họ đang đọc kịch bản có sẵn.</li><li>Và không thiếu những màn “phỏng vấn ảo” – tuyển cho có tên tuổi chứ thực chất không có job 😅.</li></ul><p>Nhưng quan trọng nhất, 3 tháng đó không phải là quãng thời gian mình chỉ đi “xin việc”. Đó là 3 tháng mình “cày cuốc” khủng khiếp nhất. Mình tự học thêm các stack công nghệ mới, bắt tay vào build những sản phẩm cá nhân để giải quyết các nỗi đau thực tế (như cái dự án <strong>LectureHub</strong> mình có kể ở <a href="/2025/08/18/LectureHub-Introduction/" title="LectureHub Introduction">bài trước</a>).</p><p>Các con số thì không biết nói dối, nhìn vào dải màu xanh trên GitHub cá nhân của mình trong giai đoạn đó, đó chính là bằng chứng cho sự nỗ lực không ngừng nghỉ. Mình nhận ra rằng: <strong>Học phải đi đôi với hành</strong>.</p><center>  <img src="https://i.ibb.co/BVGg5S9y/git-history.png" alt="Git history" border="0">  <br>  <i>Phần graph có nhiều điểm xanh chính là đợt ở nhà miệt mài code và commit</i></center><blockquote><p>Trong thời đại AI bùng nổ như hiện nay, việc hiện thực hóa ý tưởng thành sản phẩm trở nên dễ dàng hơn trước rất nhiều. Công cụ hỗ trợ tận răng, tài liệu ở khắp mọi nơi, lý do duy nhất khiến bạn không có sản phẩm là do bạn chưa bắt đầu thôi.</p></blockquote><p>Lời khuyên chân thành của mình cho các bạn đang chuẩn bị đi phỏng vấn: Hãy thử tự tay build 1-2 sản phẩm hoàn chỉnh (từ ý tưởng đến deploy). Khi đó, buổi phỏng vấn sẽ không còn là một bài khảo sát lý thuyết khô khan, mà là một buổi “khoe đồ chơi”, nơi bạn có thể tự tin nói về những bài toán thực tế bạn đã giải quyết. Nhà tuyển dụng chắc chắn sẽ đánh giá cao sự chủ động này hơn là những câu trả lời thuộc lòng trong sách giáo khoa.</p><p>Cuối cùng, mình pass vào công ty thứ 3 theo một quy trình “thần tốc”: Thứ 5 Pv, Thứ 6 báo Pass, Thứ 2 đi làm luôn. Dù lương bị giảm sâu so với mức mình kỳ vọng, nhưng giữa lúc “bão” đang to, mình phải chấp nhận để có một bến đỗ tạm thời.</p><p>Nhưng đúng là nếu tính chất công việc không có sự đổi mới, thiếu sáng tạo và không được chủ động, người làm kỹ thuật rất dễ bị “nản”. Đó là lúc mình bắt đầu lướt LinkedIn và bắt gặp một cái duyên mới.</p><h2 id="IV-Ben-do-hien-tai-Cai-duyen-“AI-nup-bong-BE”"><a href="#IV-Ben-do-hien-tai-Cai-duyen-“AI-nup-bong-BE”" class="headerlink" title="IV. Bến đỗ hiện tại: Cái duyên “AI núp bóng BE”"></a>IV. Bến đỗ hiện tại: Cái duyên “AI núp bóng BE”</h2><p>Vô tình thấy HR bên công ty hiện tại tuyển BE với yêu cầu rất cao. Dù nghĩ mình không đủ điều kiện nhưng cứ vào hỏi thử xem sao. Hóa ra, họ cũng đang cần mảng AI!</p><p>Mọi thứ diễn ra rất nhanh. Mình được anh CTO trực tiếp phỏng vấn và đánh giá tốt. Bây giờ, sau 2 tháng thử việc, mình đang được làm việc dưới sự mentor trực tiếp từ ảnh. Môi trường thoải mái, đồng nghiệp nhiệt tình, và quan trọng nhất là công việc luôn đòi hỏi sự đổi mới sáng tạo – đúng thứ mình hằng tìm kiếm 😉.</p><p><img src="https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExbTd0Y3R0MXpldm8xNHJvOGNhbTFwa2p1MDMxbDUzdTNoMW5obTFwNiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/SYCNMcX7puxtsaV1mJ/giphy.gif" alt="Gif cảm thấy phù hợp"></p><h2 id="V-Ket-Thich-nghi-hay-la-chet"><a href="#V-Ket-Thich-nghi-hay-la-chet" class="headerlink" title="V. Kết: Thích nghi hay là chết?"></a>V. Kết: Thích nghi hay là chết?</h2><p>Nhìn lại năm 2025, từ một người muốn ổn định đến việc trải qua 3 công ty trong 1 năm, mình thấy bản thân đã trưởng thành hơn rất nhiều. Dù năm nay hơi buồn vì không có thưởng Tết 🥹, nhưng bù lại, mình có được một môi trường tốt và những bài học xương máu.</p><p>Trong một thị trường biến động mạnh bởi tác động của AI như hiện nay, mình rút ra được 3 điều:</p><ol><li><strong>Nâng cao chất lượng bản thân:</strong> Chỉ có nội lực mới giúp bạn đứng vững khi “bão” tới.</li><li><strong>Kế hoạch dự phòng:</strong> Đừng bao giờ bỏ trứng vào một giỏ. Nghề tay trái, freelance… đôi khi là “phao cứu sinh” lúc ngặt nghèo.</li><li><strong>Luôn cố gắng &amp; Thích nghi:</strong> Không có gì là ổn định vĩnh viễn, chỉ có khả năng thích nghi là vĩnh cửu.</li></ol><p>Cảm ơn mọi người đã lắng nghe câu chuyện của mình. Chúc anh em đồng nghiệp một năm mới bình an và “vững tay chèo” nhé!</p><p><img src="https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExaGcyeDh3d2p3amMwa2k0YjkxaXQxZ2VmOGcxN2RrNGcyZ2J4a2t5ZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LyywQOMnZW4FA8IDx9/giphy.gif" alt="2026"></p>]]>
    </content>
    <id>http://kudokhang.github.io/2026/02/12/Tu-3-Nam-Mot-Cong-Ty-Den-Mot-Nam-Ba-Cong-Ty/</id>
    <link href="http://kudokhang.github.io/2026/02/12/Tu-3-Nam-Mot-Cong-Ty-Den-Mot-Nam-Ba-Cong-Ty/"/>
    <published>2026-02-12T03:00:00.000Z</published>
    <summary>
      <![CDATA[<p>Đầu năm 2025, kế hoạch của mình gói gọn trong hai chữ: <strong>“Ổn định”</strong>. Vợ đang mang bầu, mình chỉ mong một năm bình yên tại F]]>
    </summary>
    <title>Từ 3 Năm Một Công Ty Đến Một Năm Ba Công Ty - Nhìn Lại Năm 2025 Đầy Biến Động</title>
    <updated>2026-02-13T03:57:07.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Kudo Khang</name>
    </author>
    <category term="Technical" scheme="http://kudokhang.github.io/tags/Technical/"/>
    <category term="Freelance" scheme="http://kudokhang.github.io/tags/Freelance/"/>
    <content>
      <![CDATA[<p>Đầu tiên, đây không phải dự án freelance đầu tiên của mình và $1000 cũng không phải con số lớn nhất mình từng kiếm được, nhưng:</p><ul><li>Đây là công việc đầu tiên mình chủ động tìm kiếm thông qua UpWork, mọi thứ được thực hiện và giám sát một cách có quy trình.</li><li>Lần đầu làm việc với người nước ngoài: từ viết proposal, thuyết phục họ để nhận dự án, triển khai công việc một cách độc lập và báo cáo tới khách hàng thông qua report và meeting. Tất cả mọi thứ đều được thực hiện một mình.</li></ul><p>Nhân dịp nhận được món quà từ client, mình muốn viết bài chia sẻ cho mọi về hành trình tìm việc và kiếm tiền trên đó, hy vọng bài viết có thể tới tay và tiếp thêm động lực cho những bạn đang loay loay với những dòng tìm kiếm “Làm sao để kiếm tiền trên upwork”, “làm sao để nhận được công việc đầu tiên trên upwork…” như mình lúc trước.</p><p>À ngoài ra mình sẽ đi sâu thêm một chút kỹ thuật mảng xử lý ảnh, hy vọng có thể hữu ích cho những ai đang gặp bài toán tương tự sẽ có keyword để research.</p><p>Giờ thì vào bài thôi 🚀</p><h2 id="I-Chuan-bi"><a href="#I-Chuan-bi" class="headerlink" title="I. Chuẩn bị"></a>I. Chuẩn bị</h2><p>Có lẽ mình biết đến upwork và freelance thông qua bài viết <a href="https://viblo.asia/p/ki-su-freelancer-o-upwork-3RlL5YxwLbB">Kí sự Freelancer ở Upwork</a> từ năm 2022 của tác giả Thanh Le (một bài viết hay với góc nhìn chân thật của 1 freelancer vất vả để tìm được công việc đầu tiên được thể hiện bởi 1 lối hành văn rất bánh cuốnn). Còn việc mình bắt đầu mò mẫm lên nền tảng đó là đầu năm nay - trong thời gian vừa nghỉ ở cty thứ nhất chờ onboard cty thứ hai, trước khi bắt đầu mình đã tìm kiếm các bài viết, video chia sẻ kinh nghiệm kiếm job trên Upwork, bằng chứng cho sự nghiêm túc tìm kiếm đó là mình đã xem hết video 7 tiếng này (có tua đôi chút nhưng thật sự là mình đã xem hết video đó) 🙂‍↕️</p><p>Mình bắt tay vào việc tìm việc bằng cách tạo tài khoản, chau chuốt profile và nạp $15 cho việc mua connections với tâm thế:</p><ul><li>Xác định việc này sẽ không dễ dàng, cần kiên trì.</li><li>Mục tiêu kiếm được 1 công việc đầu tiên (bao nhiêu tiền cũng được, có người thuê là mừng lắm rồi)</li></ul><p>Giải thích chút:</p><ul><li>Proposal là nội dung mình gửi cho client nhằm show trình độ, năng lực của bản thân rồi van xin họ cho mình nhận job</li><li>Connection: một đơn vị tiền tệ trên upwork, dùng để gửi proposal, boost profile lên top… Phải bỏ tiền thật ra để mua.</li></ul><p>Sau phần chuẩn bị này là chúng ta có thể lả lướt trên upwork để kiếm job rồi.</p><p><img src="https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExc2ViZWhoNzNhZjc2bWw2dGJ4aTRuczh2MmlxMzBvZ2dlenFkcWdkbiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/bAplZhiLAsNnG/giphy.gif" alt="gif lướt lướt"></p><h2 id="II-Cong-viec-dau-tien"><a href="#II-Cong-viec-dau-tien" class="headerlink" title="II. Công việc đầu tiên"></a>II. Công việc đầu tiên</h2><p>Dù đã chuẩn bị tâm thế là sẽ cần thời gian để có được công việc đầu tiên rồi nhưng không thể tránh khỏi tâm lý háo hức, hi vọng ban đầu, cứ chốc chốc lại mở app lên xem có ai phản hồi proposal không (mặc dù app đã bật thông báo ?!?), ngó hết job này tới job nọ xem có cái nào phù hợp không để lưu lại. Nếu bạn hỏi tại sao phải lưu mà không apply luôn thì đó là do mình theo chiến lược của các youtuber bày:</p><blockquote><p>Tìm kiếm và chọn lọc các job thật kỹ càng trước khi apply - vì mỗi lần apply tốn connections chứ không phải free.</p><p>Mỗi ngày gửi 2-3 proposal phù hợp nhất - cũng nhằm tiết kiệm proposal và tránh tình trạng burndown. Thử hình dung bạn gửi cả 15-20 proposal mà không có lấy một phản hồi, khi đó thì “tiền mất tật mang”, không phải chúng ta lên upwork kiếm tiền nữa mà upwork đang kiếm tiền từ chúng ta :))</p></blockquote><p>Sau tầm 2-3 ngày mình may mắn nhận được 1 phản hồi từ 1 job khá phù hợp, nhưng cũng phải sau khoảng 3-4 tuần mới chốt được dự án, lý do là client hình như ít vào check upwork, và mình đòi $1500 cho dự án so với budget họ đề ra ban đầu là $1000 (nếu bạn có hỏi tại sao ban đầu mục tiêu là có việc là được bao nhiêu cũng nhận mà giờ lại đòi gấp rưỡi budget người ta thì nguyên nhân là do tính chất dự án khá khó và cần thời gian để nghiên cứu và triển khai). Cuối cùng, để có job đầu tiên mình chấp nhận $1000 như họ đề xuất.</p><h2 id="III-Co-job-roi-code-thoi"><a href="#III-Co-job-roi-code-thoi" class="headerlink" title="III. Có job rồi, code thôi!!!"></a>III. Có job rồi, code thôi!!!</h2><p>Nói sơ qua về cái job này:</p><ul><li>Client: US, huấn luận viên bóng đá, non-tech nhưng có mindset của 1 engineer, tính cách khá rạch ròi, tử tế và hào phóng.</li><li>Dự án: Với input là 2 video quay 1 trận bóng, cần thiết kế một thuật toán có khả năng:<ul><li>Milestone 1: Ghép 2 input thành 1 video toàn cảnh liền mạch (như tạo ảnh panorama)</li><li>Milestone 2: Tạo ra video mô phỏng camera được di chuyển thủ công “dí” theo những khu vực tập trung bóng và cầu thủ trên sân (bạn có thể hình dung output sẽ như là có một cameraman liên tục điều chỉnh góc quay thủ công để giữ cho khu vực có bóng trên sân luôn nằm trong khung hình)</li><li>Milestone 3: Tự động tạo ra những clip highlight ngắn (như ghi bàn, sút phạt…) để người dùng có thể lấy đăng lên các nền tảng short video như Tiktok, Youtube Short…</li><li>Milestone 4: Trích xuất các thông số, dữ liệu của trận đấu, từ những dự liệu đó xây dựng các mô hình phân tích data để huấn luận viên có được insight trận đấu cũng như của các cầu thủ.</li></ul></li></ul><p><img src="https://i.postimg.cc/3Rqyq28q/sma-architecture-overall-drawio.png" alt="Overall"></p><p>Tính chất dự án hoàn toàn phù hợp với knowledge domain dòi, lôi bàn phím lên gõ gõ xong đóng gói gửi khách rồi lụm $ thôi 🐣.</p><p>Nhưng mà đời không như là mơ, vấn đề ở milestone 1 không phải dùng ffmpeg hay opencv concatenate hai video lại cái là xong, đây là một bài toán image stitching (chính xác hơn là video stitching vì phải đảm bảo tính consistency trên toàn video). Gòi xong, đã làm bài này bao giờ đâu, giờ sao?</p><p>Lúc viết proposal lỡ cam kết chắc nịch là sẽ làm được rồi thì giờ phải cầm keyword đó mà đi research rồi tìm cách giải quyết thôi chứ sao 🥹.</p><p>Sau một vòng research, mình rút ra được một số thông tin:</p><ul><li>Bài toán image stitching không phải mới, bản thân nó là các thuật toán xử lý điểm ảnh, tính toán ma trận biến đổi… không có yếu tố Machine Learning, Deep Learning hay AI gì ở đây cả. Rất dễ để tìm thấy những bài viết, video giải thích, bao gồm cả sample code.</li><li>Tuy nhiên từ image stitching lên video stitching thì lại là một vấn đề lớn, các repo cho bài toán này đều khoảng 9-10 năm trước, thường do các PhD researcher viết bằng C++ và cho mục đích học thuật (nhưng chất lượng khá thấp, còn rất nhiều vấn đề và lỗi trên video demo của họ). Mọi thứ khá bế tắc nhưng mình vẫn tiếp tục tìm kiếm và thử nghiệm vì biết chắc bài toán này có lời giải (vì đã có software thực hiện được việc đó và họ đang bán giải pháp với giá khoảng $100-200 mỗi năm)</li></ul><p>Khi đã biết bài toán chắc chắn có nghiệm rồi thì bắt tay vào giải thôi.</p><p>Đầu tiên mình thử triển khai khai chức năng image stitching, chỉ khoảng 30 - 1 tiếng mình đã triển khai xong (nếu bạn có thắc mắc tiếp là sao mà nhanh vậy thì mình trả lời luôn là trên mạng có nhiều sample code và các thuật toán được hỗ trợ trong OpenCV rồi nên mình lụm về chạy thui 🐣). Code chạy được rồi đó, nhưng làm sao để điều chỉnh kích thước output, khả năng tìm điểm chung, thực hiện ghép nối… điều bắt buộc mình phải tìm hiểu, đi sâu vào giá trị, ý nghĩa của từng tham số.</p><p>Sau nhiều bài viết, video giải thích, mình dừng lại và tập trung vào series giải thích Image Stitching của thầy Shree Nayar, đúng như mô tả của kênh nội dung thầy truyền tải luôn theo nguyên tắc First Principles, tức là sẽ đi từ bản chất cốt lõi của vấn đề đi lên, với 12 video trong series đã giúp mình hiểu một cách sâu sắc về bài toán image stitching cũng như các phép biến đổi ảnh.</p><p>Link series Image Stitching: <a href="https://www.youtube.com/watch?v=J1DwQzab6Jg&list=PL2zRqk16wsdp8KbDfHKvPYNGF2L-zQASc">https://www.youtube.com/watch?v=J1DwQzab6Jg&amp;list=PL2zRqk16wsdp8KbDfHKvPYNGF2L-zQASc</a></p><p>Sau khi đã giải quyết được bài toán cốt lõi image stitching rồi việc triển khai cho video chắc chỉ cần đọc từ frame –&gt; xử lý –&gt; lưu lại, nhưng nếu làm như vậy sẽ gặp ngay vấn đề: output cà giật cà giật qua từng frame. Nguyên nhân là mỗi lần xử lý thuật toán sẽ dự vào 2 ảnh input để tính toán ra ma trận biến đổi mới, mà mỗi frame mỗi khác nên ma trận cũng khác theo, bởi vậy video về tổng thể thì có vẻ oke nhưng nó đang bị liên tục xê dịch một chút so với frame liền kề, vì vậy video output nó giật giật mà nó tiền đình mà nó chóng mặt lắm.</p><p>Lúc này mình giải định, do góc quay camera là cố định, sân bóng cũng cố định nên sẽ tồn lại một ma trận biến đổi M cố định có thể sử dụng cho toàn bộ bước ghép nối. Kết quả thật tuyệt vời, output như đúng như mong đợi. Mình đóng gói code, quay demo và viết report gửi cho khách, họ rất vui và bày tỏ sự ấn tượng với kết quả và tiến độ thực hiện, tuy nhiên họ muốn test trên nhiều video input hơn.</p><p>Và bùm… sau khi test thêm đã phát hiện một lỗi về chất lượng khá nghiêm trọng, phần ghép nối ở giữa không thật sự được matching với nhau 1 cách hợp lý. Đây đúng là một vấn đề lớn, mình khá hoảng vì chưa hình dung được nguyên, nhưng rất may mắn là khách hàng họ đã nghiên cứu bài toán này khoảng 1 năm và họ có một giả thiết cho vấn đề này. Vậy vấn đề này là gì?</p><p>Đó là input được quay bởi GoPro với mode camera góc rộng (fish) tức là video bị biến dạng để có góc quay rộng hơn, chính vì hình ảnh đã bị biến dạng nên nếu mình cầm đúng hình ảnh đó đi xử lý thì sẽ gặp tình trạng không khớp tại điểm nối. Vậy có thể đưa ảnh bị biến dạng về bình thường không? Câu trả lời là “Có”, và keyword cho bài toán này là “Undistoring images”, để thực hiện được nó lại dẫn tới 1 bài toán nữa “Camera Calibration” (tìm hệ số biến dạng gây ra bởi camera).</p><p><img src="https://i.postimg.cc/76RCRSPq/sma-architecture-Stitching-Video-drawio.png" alt="sma-architecture-Stitching-Video-drawio.png"></p><p>Nếu muốn đi sâu hơn các bạn có thể cầm 2 keyword trên để research nhé. À ở đây mình cung cấp thêm 1 keyword nữa là “Gyroflow” - Gyroflow là một phần mềm xử lý hậu kỳ như khử rung, khử biến dạng… cho các esport camera như GoPro. Trước khi cắm đầu cắm cổ triển khai 2 bài toán “Undistoring images” và “Camera Caliration” mình thử dùng Gyroflow để khử biến dạng của video input trước khi đưa vào pipeline “Video Stitiching”, vấn đề đã được giải quyết. Tới đây mình mới quay lại triển khai 2 thuật toán “Undistoring images” và “Camera Caliration”, cũng gặp chút vấn đề và tốn kha khá thời gian nhưng cuối cùng mọi thứ đã hoạt động đúng như mong đợi.</p><p>Tới đây mọi thứ vẻ oke rồi, khách muốn mình làm luôn cái app để có giao diện cho dễ sử dụng, vì khách hàng non-tech nên việc thao tác các dòng lệnh sẽ khá khó khăn cho họ.</p><p>Thực ra trước giờ mình chưa code GUI App bao giờ nhưng may mắn là đây là năm 2025 - The age of AI, khứa Cursor làm mấy task này khá tốt. Bởi vậy mình nhận và triển khai luôn, cũng nhờ vậy mình học được thêm framework CustomTkinter dùng để làm GUI App với Python và build thành công trên cả 3 môi trường phổ biến MacOS, Ubuntu, Windows Mọi thứ khá suôn sẻ, App chạy mượt, UI&#x2F;UX khá oke khách hàng hài lòng, mỉm cười mãn nguyện vì tìm được đúng thằng dev được việc (chỗ này là mình bịa thôi chứ họ có mỉm cười không thì mình không biết 🙂‍↔️)</p><p>Ngoài ra còn một số problems mình phải đối mặt như:</p><ul><li>Đồng bộ hóa 2 video theo 1 mốc thời gian trong thời gian thực,</li><li>Tìm và thử nghiệm video encoder phù hợp, thiết kế pipline cho đọc&#x2F;ghi video riêng phù hợp với kích thước input và output rất lớn và dài</li><li>…<br>Mỗi vấn đề là 1 challenge rất cụ thể nhưng với tinh thần “tới là đón, đụng là chạm” cùng với sự hỗ trợ đắc lực của đàn em: ChatGPT, Grok, Curosr… may mắn là các vấn đề đều đã được giải quyết (vẫn chưa thật sự là tốt nhất nhưng tạm ở thời điểm hiện tại thì mọi thứ đang hoạt động ổn) 👊.</li></ul><p><em>Các bạn có thể xem qua demo tại: <a href="https://www.youtube.com/watch?v=ZNacjRtL9JQ">https://www.youtube.com/watch?v=ZNacjRtL9JQ</a></em></p><p>Tới đây thì mọi thứ khá ổn rồi, chỉ còn 1 vấn đề cuối mà mình đang ráng xử lý để sớm kết thúc dự án đó là <strong>performance</strong>. Thời gian xử lý cho toàn pipeline hện tại đang rất rất là chậm, nguyên nhân là kích thước input rất lớn (độ phân giải input là video 5k3, sau khi stitching nó có thể lên tới 8-9k), các thuật toán xử lý ảnh sử dụng rất nhiều của OpenCV lại đang chạy trên CPU (gần như chưa tận dụng được GPU) và thời lượng input cho 1 trận đấu khá dài (khoảng 25 phút). Mặc dù khách bảo thời gian xử lý như hiện tại vẫn chấp nhận được chỉ cần output ra chính xác là được, nhưng mình lại thấy thời gian xử lý như vậy là quá lâu, khá khó để thương mại hóa, và cũng do mình từng có kinh nghiệm tối ưu hóa bài toán xử lý ảnh này trước đó nên mình đề xuất là cứ để mình làm thử, có kết quả tốt thì mới tính tiền.<br>Chắc là vì cảm động trước tinh thần tận tâm của mình nên khách đã gửi tặng mình chiếc Laptop của ổng, phải nói là rất vui khi mình cầm trên tay một món quà được gửi từ bên US về, nó là một laptop gaming và có cấu hình khá mạnh (thấy ông bảo mua nó 2 năm trước với giá khoảng $2500). Đối với mình, đây là một món quà mang giá trị tinh thần và vật chất rất lớn, với cấu hình mạnh như vậy mình có thể thực hiện dự án một cách dễ dàng hơn, code cũng rất tiện, như các bạn thấy, bây giờ mình còn có thể code trên controler thay vì bàn phím luôn mà</p><p><img src="https://i.postimg.cc/gJ2SsbjH/laptop-wk.jpg" alt="Wukong"></p><h2 id="IV-Ket"><a href="#IV-Ket" class="headerlink" title="IV. Kết"></a>IV. Kết</h2><p>Bài cũng đã dài, mình xin gác phím ở đây (có mấy dòng này mà mình phải viết 2-3 tuần mới xong 🥹). Mặc dù công việc khá bận nhưng mình vẫn cố gắng hoàn thành bài viết, hi vọng nó sẽ mang lại chút giá trị gì đó cho người đọc 🙏.</p><p>Nhân tiện, mình cũng đang open cho cho các job freelance, nên nếu có quý khách hàng nào muốn thuê mướn mình thì <em>do not hesitate to contect me 🤙</em> nha (giai đoạn này đang ôn thi B1 nên chèn tí English zô cho sang 🐥).</p>]]>
    </content>
    <id>http://kudokhang.github.io/2025/11/07/$1000-Dau-Tien-Tren-UpWork/</id>
    <link href="http://kudokhang.github.io/2025/11/07/$1000-Dau-Tien-Tren-UpWork/"/>
    <published>2025-11-07T08:47:29.000Z</published>
    <summary>
      <![CDATA[<p>Đầu tiên, đây không phải dự án freelance đầu tiên của mình và $1000 cũng không phải con số lớn nhất mình từng kiếm được, nhưng:</p>
<ul>]]>
    </summary>
    <title>$1000 Đầu Tiên Trên UpWork</title>
    <updated>2026-02-11T17:52:51.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Kudo Khang</name>
    </author>
    <category term="Technical" scheme="http://kudokhang.github.io/tags/Technical/"/>
    <category term="Productivity" scheme="http://kudokhang.github.io/tags/Productivity/"/>
    <content>
      <![CDATA[<p>Huyền thoại về “10x engineer” – lập trình viên làm việc hiệu quả gấp 10 lần người thường – đã tồn tại hàng thập kỷ, mình tin chắc đó là một mục tiêu, một danh xưng mà bất cứ lập trình viên nào cũng muốn đạt được. Mình từng tin rằng để trở thành “10x engineer” bạn phải là thiên tài: code 1000 dòng&#x2F;ngày, fix bug thần tốc, biết đủ thứ từ backend, frontend đến DevOps, biết sử dụng nhiều tool, lả lướt trên bàn phím bằng phím tắt, thậm chí mình từng nghĩ rằng 10x engineer là mấy nhân vật huyền thoại trong thung lũng Silicon – những người một mình cân cả team. Nhưng kể từ khoảnh khắc ChatGPT được open (<strong>ChatGPT moment</strong>), định nghĩa này đã thay đổi hoàn toàn.</p><blockquote><p>Vậy làm thế nào để trở thành 10x Engineer trong thời đại bùng nổ AI như hiện nay?</p></blockquote><p>Câu trả lời là <strong>mình không biết</strong>. Mình đặt title vậy cho hấp dẫn thôi 😃.</p><p>Trong bài viết này, mình sẽ nói về cách để trở nên năng suất trong công việc lập trình và các task trong cuộc sống bằng cách tận dụng AI, bài viết được chia sẻ dưới góc nhìn và trải nghiệm của một Software Engineer đã học tập và làm việc trước khi AI trở nên phồ biến và so với bây giờ thì công việc của mình đã thay đổi như thế nào nhé.</p><h2 id="I-ChatGPT-–-mot-dau-moc-ro-rang-cho-mot-cuoc-cach-mang"><a href="#I-ChatGPT-–-mot-dau-moc-ro-rang-cho-mot-cuoc-cach-mang" class="headerlink" title="I. ChatGPT – một dấu mốc rõ ràng cho một cuộc cách mạng"></a>I. ChatGPT – một dấu mốc rõ ràng cho một cuộc cách mạng</h2><p>Tất nhiên, AI không phải hôm qua mới có. Nó đã âm thầm phát triển từ những năm 50, từ cái Turing Test xa xưa cho đến khi AlphaGo hạ gục Lee Sedol. bạn có thể xem qua timeline các mốc thời gian kèm các sự kiện đáng chú ý dưới đây</p><pre class="mermaid">timeline    title History of AI    1950 : Turing Test         : Alan Turing đề xuất test để đánh giá trí thông minh máy    1956 : Thuật ngữ "AI" ra đời         : John McCarthy đặt tên cho lĩnh vực    1997 : Deep Blue thắng Kasparov         : Máy tính đầu tiên thắng đương kim vô địch cờ vua    2016 : AlphaGo thắng Lee Sedol         : AI thắng kỳ thủ cờ vây hàng đầu thế giới    2022 : ChatGPT ra mắt         : Bước ngoặt lớn trong AI conversation    2024 : AI trở nên phổ biến         : AI tools, AI agents được sử dụng rộng rãi trong công việc</pre><table><thead><tr><th>Năm</th><th>Sự Kiện Chính</th><th>Mô Tả Ngắn Gọn</th></tr></thead><tbody><tr><td>1950</td><td>Alan Turing đề xuất Turing Test</td><td>Turing xuất bản bài báo “Computing Machinery and Intelligence”, đặt nền tảng cho khái niệm máy móc có thể “nghĩ” như con người.</td></tr><tr><td>1951</td><td>SNARC - Mạng nơ-ron nhân tạo đầu tiên</td><td>Marvin Minsky và Dean Edmonds xây dựng mạng nơ-ron đầu tiên sử dụng ống chân không để mô phỏng nơ-ron.</td></tr><tr><td>1956</td><td>Hội nghị Dartmouth - Sinh ra thuật ngữ “AI”</td><td>John McCarthy tổ chức hội nghị, đánh dấu sự ra đời của lĩnh vực AI, với niềm tin máy móc có thể mô phỏng trí thông minh con người.</td></tr><tr><td>1958</td><td>Perceptron - Mạng nơ-ron đầu tiên</td><td>Frank Rosenblatt phát triển Perceptron, mạng nơ-ron có thể học từ dữ liệu, nền tảng cho học máy hiện đại.</td></tr><tr><td>1960</td><td>ADALINE - Mạng nơ-ron tuyến tính</td><td>Bernard Widrow và Ted Hoff phát triển ADALINE, nền tảng cho tiến bộ trong học máy.</td></tr><tr><td>1966</td><td>ELIZA - Chatbot đầu tiên; Shakey the Robot</td><td>Joseph Weizenbaum tạo ELIZA, chatbot mô phỏng nhà trị liệu; Shakey là robot di động thông minh đầu tiên.</td></tr><tr><td>1969</td><td>Sách “Perceptrons” và giới hạn của mạng nơ-ron đơn giản</td><td>Marvin Minsky và Seymour Papert chỉ ra hạn chế, dẫn đến giảm nghiên cứu mạng nơ-ron.</td></tr><tr><td>1973-1980</td><td>“Mùa đông AI” đầu tiên</td><td>Báo cáo Lighthill dẫn đến cắt giảm tài trợ, làm chậm tiến bộ AI.</td></tr><tr><td>1986</td><td>Xe tự lái đầu tiên</td><td>Ernst Dickmanns phát triển xe Mercedes có thể lái trên đường trống.</td></tr><tr><td>1987-1994</td><td>“Mùa đông AI” thứ hai</td><td>Giảm tài trợ và kỳ vọng, dù có tiến bộ như hệ thống chuyên gia.</td></tr><tr><td>1997</td><td>Deep Blue đánh bại Garry Kasparov</td><td>IBM’s Deep Blue thắng nhà vô địch cờ vua, chứng minh AI có thể xử lý tính toán phức tạp.</td></tr><tr><td>2011</td><td>IBM Watson thắng Jeopardy; Siri ra mắt</td><td>Watson xử lý ngôn ngữ tự nhiên; Apple giới thiệu trợ lý ảo Siri.</td></tr><tr><td>2012</td><td>AlexNet thắng ImageNet</td><td>Mạng nơ-ron sâu của Geoffrey Hinton đánh dấu sự bùng nổ học sâu trong nhận diện hình ảnh.</td></tr><tr><td>2016</td><td>AlphaGo đánh bại Lee Sedol</td><td>DeepMind’s AlphaGo thắng cao thủ cờ vây, sử dụng học tăng cường.</td></tr><tr><td>2020</td><td>GPT-3 ra mắt</td><td>OpenAI phát hành mô hình ngôn ngữ lớn, tạo văn bản giống con người.</td></tr><tr><td>2022</td><td>ChatGPT được phát hành</td><td>OpenAI’s ChatGPT cách mạng hóa giao tiếp AI, dựa trên GPT-3.</td></tr><tr><td>2023</td><td>Bùng nổ AI tạo sinh</td><td>GPT-4, Bing Chat, Google Bard ra mắt, mở rộng ứng dụng AI.</td></tr><tr><td>2024 đến nay</td><td>Tiến bộ liên tục và lo ngại đạo đức</td><td>AI phát triển nhanh, với các cuộc thảo luận về quy định và tác động xã hội (dựa trên xu hướng gần đây).</td></tr></tbody></table><p>Rõ ràng có thể thấy, AI đã có từ lâu rồi, vậy tại sao tới khoảng vài năm trở lại đây chúng ta mới bắt đầu thấy từ ngữ AI tràn ngập khắp mọi nơi? Mình nghĩ câu trả lời nằm ở <strong>tính đột phá</strong> và <strong>khả năng dễ dàng tiếp cập</strong>. AI không còn là vũ khí bí mật được độc quyền bởi chính phủ, công ty lớn, cũng không phải cần trình độ cao siêu để hiểu và sử dụng, bây giờ, với ChatGPT nó đã hiện diện ở khắp mọi nơi, là thực hiện được những điều không tưởng và với chi phí gần như bằng không.</p><p>Cái hay là: ChatGPT biến AI thành <strong>công cụ phổ thông</strong>. Nó không còn là thứ xa vời trong phòng lab nữa, mà nằm ngay trong điện thoại, trong quán cà phê, trong văn phòng và mọi người đang quen với việc sử dụng nó như công nghệ tìm kiếm google ngày trước vậy.</p><p>Với dân lập trình chúng ta, điều này mở ra một chân trời mới: <strong>code không chỉ viết bằng tay, mà còn được viết bằng prompt.</strong></p><h2 id="II-Nhung-chi-biet-ChatGPT-thoi-la-chua-du"><a href="#II-Nhung-chi-biet-ChatGPT-thoi-la-chua-du" class="headerlink" title="II. Nhưng chỉ biết ChatGPT thôi là chưa đủ"></a>II. Nhưng chỉ biết ChatGPT thôi là chưa đủ</h2><p>Đúng, ChatGPT rất mạnh. Nhưng nếu bạn nghĩ làm dev thời nay chỉ cần biết mỗi ChatGPT, thì… chưa đủ.</p><p>Nếu có theo dõi về tin tức, bạn sẽ thấy, các mô hình ngôn ngữ lớn thi nhau ra: ChatGPT, Gemini, Grok, DeepSeek… các bài báo ứng dụng LLM cũng nhiều vô số kể, <strong>công cụ AI cho dev giờ nhiều như một cái chợ</strong>: Cursor, Claude code, Gemini-cli, Codex (OpenAI), Loveable, Google Stitch… chúng thật sự rất tuyệt vời. Nhưng nếu chỉ dừng ở mức “nghe tên” hoặc “xem review trên mạng”, thì bạn mới ở tầng ngoài.</p><p>Cái quan trọng là <strong>phải thực sự dùng</strong>. Trải nghiệm, mày mò và khai phá. Và tất nhiên, cái giá $20&#x2F;tháng cho mỗi tool cũng là rào cản khá đau ví tiền 😅. Nhưng hãy coi nó là đầu tư nghề nghiệp – giống như ngày xưa bạn bỏ tiền mua sách đi học thì bây giờ bạn mua đồ nghề, công cụ đi làm thôi.</p><p>Thú thật, mình cũng chỉ mới thực sự khai phá Cursor và Claude trong vòng 3 tháng trở lại đây (may mắn là mình được client tài trợ mấy tháng đầu để vượt qua cái suy nghĩ rào cản trả phí ban đầu). Nghe thì muộn, nhưng hóa ra lại đúng thời điểm, bởi khái niệm <strong>Vibe Coding</strong> cũng mới trở nên phổ biến đâu đó từ đầu năm nay.</p><h2 id="III-Vibe-Coding-–-khi-code-khong-con-kho-khan"><a href="#III-Vibe-Coding-–-khi-code-khong-con-kho-khan" class="headerlink" title="III. Vibe Coding – khi code không còn khô khan"></a>III. Vibe Coding – khi code không còn khô khan</h2><p><img src="https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmdkMWFvdWJ4YjJ0MDM2em44YXI4Mnp3N3Y5bjFsdjgzMWJzazd5ZCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/WD01fV9KSg4Vw3DYWc/giphy.gif" alt="Let ChatGPT do it"></p><p>Ngày xưa, viết code là mở IDE, mở hàng chục tab chrome để tìm kiếm thông tin, gõ từng dòng, test, debug, chửi thề rồi uống cà phê.</p><p>Giờ thì vibe coding là… <strong>ngồi trò chuyện với AI, vừa nghe nhạc vừa code, như đang ra lệnh với một nhân viên cấp dưới vậy</strong>.</p><ul><li><p>Bạn vứt ý tưởng cho Claude, nó biến thành một cái backlog có đủ epic và user story.</p></li><li><p>Bạn nhờ Cursor viết nhanh một service nhỏ, nó quăng lại code chạy được luôn.</p></li><li><p>Bạn kẹt bug, mở ChatGPT ra “giải ngố”.</p></li><li><p>Cần so sánh library A với B? Hỏi Grok, nó phân tích như một bài review chi tiết.</p></li></ul><p>Code bỗng trở nên <strong>nhẹ nhàng, tự nhiên</strong>, không còn cảnh cặm cụi cả ngày để mở hàng chục tab google để viết được vài chục dòng code.</p><p><em>Tuy nhiên nó cũng không màu hồng lắm đâu, phải trong chăn mới biết chăn có rận, phải vibe code thì mới biết vibe code cũng là một kỹ năng</em></p><h2 id="IV-My-AI-Stack"><a href="#IV-My-AI-Stack" class="headerlink" title="IV. My AI Stack"></a>IV. My AI Stack</h2><p>Với vai trò solo developer&#x2F;freelancer, mình dần hình thành một <strong>flow AI</strong> riêng, kiểu AI tool stacks:</p><ol><li><p><strong>ChatGPT</strong> → chuyên trị giải thích lỗi, clarify kiến thức, tóm tắt docs.</p></li><li><p><strong>Grok</strong> → phân tích, tìm kiếm, so sánh, kiểu “Google search nhưng có não”.</p></li><li><p><strong>Cursor</strong> → code nhanh mấy chức năng đơn giản, file nhỏ.</p></li><li><p><strong>Claude</strong> → chiến big feature. Mình feed cho nó prompt chi tiết, truyền context repo, và để nó đề xuất kiến trúc khi mình đồng ý thì mới để nó generate từng phần.</p></li><li><p><strong>Bolt.new</strong> → dựng nhanh phần FE ban đầu đầu.</p></li></ol><p>Mình biết ngoài kia còn nhiều tools hay ho khác nữa, nhưng với tài chính hiện tại chỉ có thể trả phí cho Cursor và Claude, bộ AI tool stasks trên vẫn đang ổn áp và đáp ứng đủ nhu cầu của mình.</p><p><img src="https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExcDU2Nm5rcnhjcmlxNnB2MHk3eW50eGg0cTd6amFzczk3YTNxY3cybyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/XeOvkqQ49lJ5MD1pw6/giphy.gif" alt="Vibe coding"></p><h3 id="Best-practices-minh-rut-ra"><a href="#Best-practices-minh-rut-ra" class="headerlink" title="Best practices mình rút ra"></a>Best practices mình rút ra</h3><ul><li><p><strong>Prompt chi tiết là chìa khóa</strong>: đừng lười, AI nó không biết đọc suy nghĩ của bạn đâu, bạn không cần thiết phải follow theo mấy prompt template cứng nhắc mà mấy khứa KOL trên facebook share đâu, LLM hoàn toàn có thể hiểu bạn miễn là bạn viết đủ ý. Viết prompt rõ ràng, có context, có ví dụ → kết quả ngon hơn nhiều. Cùng 1 vấn đề, cùng 1 model thì prompt và context chính là 2 thứ quyết định AI có thực hiện được nhiệm vụ của bạn đề ra hay không, nhưng nếu đã thử khoảng 5-7 lần mà nó vẫn không thể hiểu hoặc hiểu nhưng làm sai thì đó là lúc bạn cần đổi model đổi AI Agent khác xem thử. Ví dụ như có lần mình cần chỉnh sửa 1 chức năng UI trên desktop app, mình khá tự tin là cursor sẽ làm được vì đây là 1 vấn đề nhỏ thế nhưng mình đã loay hoay với nó cả 1 buổi sáng mà không xong, lúc đó mình đã phải mua ngay claude để thử, cùng 1 prompt đó đúng 2p sau nó đã fix được vấn đề.</p></li><li><p><strong>Chia nhỏ task</strong>: đừng vứt cả repo cho AI. Làm như vậy sẽ rất tốn token (chính là tiền của bạn đấy) và cũng sớm làm đầy context của AI. Kinh nghiệm của mình là nếu được bạn nên đọc hiểu flow của code, biết vấn đề mình cần sửa và hướng đề xuất nếu có sau đó chỉ đưa đúng phần context cần thiết cho AI. Như vậy sẽ giúp tăng tỉ lệ hoàn thành của nó, tiết kiệm token và bạn thân mình vẫn nắm được flow code không bị phụ thuộc hoàn toàn vào AI.</p></li><li><p><strong>Version Control (Git, Github)</strong>: Chia nhỏ từng vấn đề, thực hiện sau đó lưu giữ chúng bằng những dòng commit thật chi tiết. Trách trường hợp AI nó xóa mất dòng code đã hoạt động, việc bảo nó viết lại chính những dòng đó đôi khí sẽ tốn rất rất nhiều thời gian của bạn đấy.</p></li><li><p><strong>Coi AI như junior dev</strong>: review code nó viết, test lại. Đừng bao giờ assume “AI viết là chắc chạy”, Nhưng cũng đừng khing bỉ nó như như intern thấp kém hạ đẳng, tin mình đi có những dòng code nó viết hiện tại đã thông minh hơn bạn, hơn mình và hơn phần lớn dev ngoài kia rồi đấy.</p></li><li><p><strong>Docs</strong>: Trong ngành lập trình, tài liệu luôn luôn được nhắc đi nhắc lại là rất quan trọng, nào là viết docs cụ thể để cho người khác trong dự án có thể hiểu, để sau này có member khác vào họ có thể hiểu… Tuy nhiên việc viết docs là một việc tốn rất nhiều thời gian, ngoài ra việc giữ cho nó luôn up-to-date là một thách thức (cần biết docs không trực tiếp tạo ra giá trị như những dòng code, và khách hàng, người dùng cuối chỉ cần chức năng thôi). Nhưng trong thời đại này, viết docs cụ thể, giữ cho nó luôn fresh lại là một việc rất rất dễ dàng (cái khó là teammate của bạn có đọc không thôi). Ở đây mình có một số tips thường dùng:</p><ul><li>Dùng <code>gemini-cli</code> để viết docs đọc hiểu codebase… vì <code>gemini-cli</code> miễn phí và nó có context windows cực lớn rất phù hợp cho task vụ này, việc sử dụng nó song song sẽ tiết kiệm được khá nhiều token cho cursor, claude.</li><li>Thường Cursor và clade sẽ viết 1 docs giải thích sau khi hoàn thành 1 nhiệm vụ, với các task lớn thì điều này oke nhưng đôi khi nó sẽ bị “quen” và luôn viết cho những task fix nhỏ, điều này gây tốn thời gian và token, vì vậy hãy bảo nó chỉ viết docs và test khi được yêu cầu.</li><li>Sử dụng mermaid để vẽ diagram: Key words cho các bạn là “sequence diagrams” và “flow diagrams”, việc nhìn hình ảnh trực quan sẽ dễ dàng hơn rất nhiều so với đọc đó. Cần lưu ý mã mermaid thường đôi khi bị lỗi cú pháp nhỏ khiến render lỗi, bạn hãy dùng Grok để fix nhé. Lý do dùng grok vì nó có thể gọi tới tool mermaid để kiểm thử mã và fix lại cho tới khi hoàn thiện.</li></ul></li></ul><p><img src="https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExc2R0cDZiMGpjd2QzdG54MTBsa2d2eGp0bmQ2cHBmZzkxaG5zamF0bCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/0ceTUCNlNR6fjHXNHk/giphy.gif" alt="documents"></p><p>Và như đã nói ở trên, AI không phải thần thánh và vibe coding không hoàn toàn là màu hồng. Đây là một số case dở khóc dở cười mà mình đã gặp phải.</p><h4 id="Case-1-Khi-su-luoi-bieng-phan-tac-dung"><a href="#Case-1-Khi-su-luoi-bieng-phan-tac-dung" class="headerlink" title="Case 1: Khi sự lười biếng phản tác dụng"></a>Case 1: Khi sự lười biếng phản tác dụng</h4><p>Hồi mới xài cursor, mình vừa bổ sung một custom logger và muốn thay thế cho toàn bộ hàm <code>print</code>, mình nghĩ đây là một task vụ supper easy và Cursor chắn chắn sẽ làm được, bởi vậy mình đã “Hey Cursor, tìm kiếm các hàm print trong dự án và thay thế bằng hàm logger tao mới add zô đó”, Nó bảo “Okee, để iemm”, thế là mình nằm chơi game mãi một lúc sau ngó lên thì thấy nó vẫn loay hoay cặm cụi mãi mà chưa xong… Có vẻ nó phải quét toàn bộ dự án, đọc từng file tìm từng dòng code để replace. Mình đành cancel và sử dụng tính năng tìm kiếm và replace trên toàn project của vscode, hơi thủ công tí nhưng chỉ hơn 1 phút mình đã hoàn thành và thực hiện chính xác. –&gt; Bài học rút ra là những task đơn giản như vậy thì nên tự làm đi, sai Cursor tội nó, mà kể cả nó có làm được đúng cũng sẽ tốn thời gian và token.</p><h4 id="Case-2-Cu-click-“Yes”-luc-nua-dem-va-tham-hoa-rm-rf"><a href="#Case-2-Cu-click-“Yes”-luc-nua-dem-va-tham-hoa-rm-rf" class="headerlink" title="Case 2: Cú click “Yes” lúc nửa đêm và thảm họa rm -rf"></a>Case 2: Cú click “Yes” lúc nửa đêm và thảm họa <code>rm -rf</code></h4><p>Một lần khác, mình dùng <code>Atlassian CLI</code> một Agent của atlassian (mình dùng cái này trước claude vì nó free 5M token mỗi ngày và cũng khá được việc) để clone 1 repo của chính mình ra máy để làm việc tiếp, vì task này cũng khá đơn giản mình đã prompt cho nó khá chi tiết nào là mô tả mong muốn, đường dẫn tuyệt đối với vị trí để folder…. và assume nó sẽ thực hiện được, nên mỗi lần nó ask để xin phép dùng tool này tool kia (tool calling) mình đều nhắm mắt say “yes”, “yes, allow allways…”. Và kết quả là… BÙM… <code>rm -rf</code> m* nó các config, folder của hệ điều hành (có thể do mình sử dụng đường dẫn tuyệt đối có <code>~/....</code>). Máy mac của mình phải tự chạy install lại, mình phải thiết lập cấu hình lại để mai còn làm. May là các dữ liệu không bị ảnh hưởng, 12h đêm tỉnh hết cả người luôn.<br>Sau lần đó thôi rút ra một bài học, mỗi khi bọn này xin phép <code>rm -rf</code> cái gì là phải căng mắt nhìn cho thật kỹ, đúng là không thể tin tưởng hoàn toàn mấy khứa này được.</p><p>Tóm lại: Để có thể sử dụng tốt bọn này bạn cần phải có “kiến thức - kinh nghiệm và trải nghiệm”. Giống như bộ giáp của iron man nó rất hiện đại và thần kỳ (rất giống các AI agent hiện tại) nhưng để điều khiển được nó theo ý muốn, bạn sẽ cần thời gian làm quen trước khi có thể làm chủ nó.</p><p><img src="https://iili.io/K1ur1t4.png" alt="Vibe coding"></p><h2 id="V-Notes-app"><a href="#V-Notes-app" class="headerlink" title="V. Notes app"></a>V. Notes app</h2><p>Ủa Notes app thì liên quan ** gì tới AI, tới 10x engineer???</p><p><img src="https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExMmNldTE5MDRsdG4xdml3cmdnOGx6dHltemJ6dm41emJpOGdxZG1mcSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/RSbKpE10UUgqYq6mvP/giphy.gif" alt="monky"></p><p>Có một vấn đề mà ít người nói tới: <strong>AI tạo ra quá nhiều thông tin</strong>. Ngày nào cũng chat, cũng code, bao nhiêu là kiến thức vậy làm sao nuốt hết?</p><p>Với mình, câu trả lời là <strong>Obsidian</strong>. Nó không phải AI, chỉ là một notes app open-source. Nó free, tùy chỉnh mạnh, và quan trọng nhất: mình làm chủ được dữ liệu của mình. Bằng việc notes lại những thông tin hữu ích qua quá trình làm việc với tụi AI, mình đang cố chuyển hóa kiến thức từ các model AI sang mình, và mình tin chắc đây là một action hợp lý nhằm tránh để bản thân rơi vào tình trạng phụ thuộc, thụ động khi dùng AI.</p><p>Mình từng xài Notion 3 năm, cực thích, nhưng vì tính phí nên thôi. Obsidian đủ để mình lưu prompt hay, workflow, tips dùng Cursor&#x2F;Claude… Đến lúc cần chỉ việc lôi ra, không phải chat lại từ đầu.</p><h2 id="VI-Nhin-sang-ben-canh-–-moi-nguoi-dang-dung-AI-the-nao"><a href="#VI-Nhin-sang-ben-canh-–-moi-nguoi-dang-dung-AI-the-nao" class="headerlink" title="VI. Nhìn sang bên cạnh – mọi người đang dùng AI thế nào?"></a>VI. Nhìn sang bên cạnh – mọi người đang dùng AI thế nào?</h2><ul><li><p><strong>Dev xung quanh mình</strong>: nhiều người vẫn copy code sang ChatGPT rồi copy về IDE. Điều đó Ok cho task nhỏ, nhưng với project nhiều file thì AI mù context, không test được, không tự fix bug. Mình từng như vậy, nên hiểu rõ nhược điểm. Nhiều dev còn không biết tới Cursor hay Claude, một số khác thì có nghe nhưng chưa trải nghiệm vì thấy hiện tại vẫn đang ổn, một số khác thì được công ty đầu tư cho Cursor nhưng lại thiếu training cho nhân viên sử dụng, những điều đó sẽ làm AI không được tận dụng một cách triệt để 😫.</p></li><li><p><strong>Giáo viên</strong>: dùng AI soạn bài. Cũng là người đi dạy, mình thấy hoàn toàn hợp lý: nó giúp tiết kiệm thời gian, kiến thức vẫn nằm trong tay người dạy.</p></li><li><p><strong>Dân văn phòng lớn tuổi</strong>: mình từng giúp cô mình (kế toán) làm Excel, OCR giấy tờ, tóm tắt video thành biên bản. Với mình thì dễ, nhưng với họ thì là cứu cánh thực sự.</p></li><li><p><strong>Vợ mình</strong>: điển hình của “Everyday AI user”:</p><ul><li>Chụp hình nhờ ChatGPT xem chỉ tay</li><li>Dùng nó để xem dự báo thời tiết hoặc công thức nấu ăn.</li><li>Đỉnh nhất nhất là có lần bảo ChatGPT: “Soạn bài tiếng anh lớp 11 để tui đi dạy, soạn trong quyển Global Success”, ChatGPT: “Xin lỗi nhưng mình không biết quyển đó là gì?”, Quay qua mình: “ChatGPT ngu như bà heo, có quyển Global Sucess là gì mà cũng không biết”. Bạn có biết quyển đó là gì không 😀.</li></ul></li></ul><h2 id="VII-Ket"><a href="#VII-Ket" class="headerlink" title="VII. Kết"></a>VII. Kết</h2><p>Trở thành <strong>10x engineer trong thời đại AI</strong> không có nghĩa là bạn gõ code nhiều hơn gấp 10 lần.</p><p>Nó có nghĩa là bạn biết <strong>tận dụng sức mạnh của AI để khuếch đại tư duy của mình lên 10 lần</strong>. Là bạn biết chọn đúng tool cho đúng việc, biết cách “trò chuyện” với AI để giải quyết những vấn đề phức tạp, và biết khi nào nên tin nó, khi nào nên tự làm.</p><p>Năng suất của bạn không đến từ tốc độ gõ phím, mà đến từ tốc độ ra quyết định, tốc độ thử nghiệm và tốc độ học hỏi. AI chính là chất xúc tác cho quá trình đó.</p><p><img src="https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExMDMyNjJwOTI4cXhnY3ZlM3QxOXVrZmR0anN2d3M5NWtibno3enU5cSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/WUxwWQpYb2Z14ZUqiS/giphy.gif" alt="robot"></p><blockquote><p>AI doesn’t replace you, It amplifies you.</p></blockquote><p>Và câu hỏi cuối cùng cho bạn: <strong>Bạn đã sẵn sàng và chấp nhận để coi AI như một đồng đội của mình chưa?</strong></p>]]>
    </content>
    <id>http://kudokhang.github.io/2025/09/27/How-to-Become-10x-Engineer-in-the-Age-of-AI/</id>
    <link href="http://kudokhang.github.io/2025/09/27/How-to-Become-10x-Engineer-in-the-Age-of-AI/"/>
    <published>2025-09-27T08:23:20.000Z</published>
    <summary>
      <![CDATA[<p>Huyền thoại về “10x engineer” – lập trình viên làm việc hiệu quả gấp 10 lần người thường – đã tồn tại hàng thập kỷ, mình tin chắc đó là m]]>
    </summary>
    <title>How to Become 10x Engineer in the Age of AI</title>
    <updated>2026-02-13T03:59:44.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Kudo Khang</name>
    </author>
    <category term="LectureHub" scheme="http://kudokhang.github.io/categories/LectureHub/"/>
    <category term="Technical" scheme="http://kudokhang.github.io/tags/Technical/"/>
    <category term="Production" scheme="http://kudokhang.github.io/tags/Production/"/>
    <content>
      <![CDATA[<h2 id="I-Mo-dau"><a href="#I-Mo-dau" class="headerlink" title="I. Mở đầu"></a>I. Mở đầu</h2><p>Ngoài là một software engineer mình còn có nghề tay trái dạy lập trình cho các bạn nhỏ cấp 1, trong quá trình giảng dạy mình thường phải tìm bài tập cho các bạn nhỏ luyện tập, hai nguồn tài liệu mình thường tham khảo nhất đó là <a href="https://laptrinh.codemath.vn/problems/">codemath</a> và <a href="https://lqdoj.edu.vn/problems/">lqdoj</a> (cả hai đều là hệ thống ra đề và chấm bài online được xây dựng dựa trên mã nguồn mở DMOJ). Nói là code cấp 1 nhưng không có nghĩa là bài nào cũng dễ, phải thừa nhận có khá nhiều bài toán hóc búa khiến mình phải mất rất nhiều thời gian để tìm ra lời giải (cũng có nhiều khi tìm mãi mà không ra 😅). Nếu đổi lại vị trí của người giải bài là một học sinh cấp 1 thì rất có thể có gặp các tình huống này:</p><ul><li><p>Làm mãi không AC được một bài –&gt; Chán nản, từ bỏ luyện tập.</p></li><li><p>Google thì khả năng sẽ không có, đăng lên các group hỏi bài như Facebook thì khả năng cũng không ai rảnh để ngồi giải cho.</p></li><li><p>Hỏi AI thì sẽ hên xui vì AI không phải bài nào cũng ra, chưa kể đến việc học sinh có thể sớm bị phụ thuộc vào AI dẫn tới nhiều hệ quả lười tư duy, sáng tạo.</p></li></ul><p>Không chỉ học sinh gặp khó khăn, mà ngay cả giáo viên khi chuẩn bị bài giảng, hướng dẫn học sinh cũng mất khá nhiều thời gian để làm bài, viết lời giải và minh họa phù hợp.</p><p>Đó chính là <strong>nỗi đau thực tế</strong> mà mình muốn giải quyết bằng <strong>LectureHub</strong>.</p><h2 id="II-LectureHub-la-gi"><a href="#II-LectureHub-la-gi" class="headerlink" title="II. LectureHub là gì?"></a>II. LectureHub là gì?</h2><p><img src="https://i.postimg.cc/N0WLckfz/lecturehub-homepage.png" alt="lecturehub homepage"></p><center><i>Giao diện trang web</i></center><p><a href="https://www.lecturehub.tech/">LectureHub</a> là một nền tảng giúp học sinh và giáo viên <strong>tra cứu code, bài giảng, và lời giải</strong> cho các nền tảng ra bài toán tin học.</p><p>Điểm đặc biệt của LectureHub so với việc tự tìm kiếm rải rác trên Google hoặc hỏi AI:</p><ul><li>👨‍💻 <strong>Code bài giải chính xác</strong>: Code đã được AC trên chính nền tảng ra đề.</li><li>🎓 <strong>Không chỉ là code bài giải</strong>: Nền tảng sẽ bao gồm cả bài giảng, sơ đồ thuật toán, trợ lý AI hỏi đáp để giúp cho người dùng có thể thực hiểu được bài toán.</li><li>📂 <strong>Thao tác đơn giản, giao diện thân thiện</strong>: Chỉ với mã đề và một click chuột bạn sẽ có ngay toàn bộ lời giải cho bài toán.</li><li>🌐 <strong>Khả năng mở rộng</strong>: không chỉ dừng lại ở tra cứu, mà có thể trở thành kho tài liệu học tập lớn cho cộng đồng.</li></ul><p>LectureHub tự hào là nền tảng đầu tiên đi đầu trong việc xây dựng kho bài giải cho các bài toán tin ở Việt Nam.</p><h2 id="III-Vi-sao-minh-xay-dung-LectureHub"><a href="#III-Vi-sao-minh-xay-dung-LectureHub" class="headerlink" title="III. Vì sao mình xây dựng LectureHub?"></a>III. Vì sao mình xây dựng LectureHub?</h2><p><img src="https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExcjQ4eWo2MTAzdHdxeW5iajdqZmMwaGtkM3hvMHVranB0ODRmeDl3ciZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/mCRJDo24UvJMA/giphy.gif" alt="Developing"></p><p>Mình từng là một người học đến người dạy, trong suốt quá trình đó, mình nhận thấy:</p><ul><li><p>Việc học tin học thường tốn nhiều thời gian <strong>tìm kiếm nguồn tài liệu</strong> đáng tin cậy.</p></li><li><p>Các nền tảng như Codemath, LQDOJ… tập trung vào <strong>ra đề &amp; chấm bài</strong>, nhưng lại thiếu một <strong>hệ sinh thái tra cứu và học tập liền mạch</strong>.</p></li></ul><p><a href="https://www.lecturehub.tech/">LectureHub</a> ra đời từ nhu cầu cá nhân đó. Nhưng đồng thời, dự án này cũng là cơ hội để mình:</p><ul><li><p>Rèn luyện và showcase những kỹ năng phát triển một sản phầm phần mềm hoàn chỉnh, bao gồm:</p><ul><li>Phân tích nhu cầu và thiết kế hệ thống.</li><li>Kỹ năng Coding, chọn và áp dụng các stack phù hợp.</li><li>Kỹ năng triển khai sản phẩm, giám sát, bảo trì và nâng cấp.</li><li>Cách quảng bá sản phẩm, các chiến lược marketing xây dựng thương hiệu, thu hút người dùng.</li></ul></li><li><p>Ghi chép lại hành trình phát triển, biến nó thành một <strong>series chia sẻ kiến thức trên blog cá nhân</strong>.</p></li><li><p>Đóng góp giá trị cho cộng đồng học sinh, giáo viên và developer.</p></li></ul><h2 id="IV-Gia-tri-cot-loi-LectureHub-mang-lai"><a href="#IV-Gia-tri-cot-loi-LectureHub-mang-lai" class="headerlink" title="IV. Giá trị cốt lõi LectureHub mang lại"></a>IV. Giá trị cốt lõi LectureHub mang lại</h2><ul><li><p>👩‍🎓 <strong>Với học sinh</strong>: tiết kiệm thời gian tìm kiếm, học thêm nhiều cách giải, dễ dàng so sánh các tư duy.</p></li><li><p>👨‍🏫 <strong>Với giáo viên</strong>: có thêm nguồn tư liệu, ví dụ minh họa cho bài giảng.</p></li><li><p>👨‍💻 <strong>Với developer</strong>: thông qua series blog, có thể học hỏi về <strong>system design, backend, cloud, AI</strong> từ một dự án thực tế.</p></li></ul><h2 id="V-Roadmap-phat-trien"><a href="#V-Roadmap-phat-trien" class="headerlink" title="V. Roadmap phát triển"></a>V. Roadmap phát triển</h2><p><a href="https://www.lecturehub.tech/">LectureHub</a> không chỉ dừng lại ở phiên bản MVP. Mình đã vạch ra một lộ trình như sau:</p><ul><li><p><strong>Giai đoạn 1</strong>: Xây dựng kho code bài giải.</p></li><li><p><strong>Giai đoạn 2</strong>: Xây dựng webapp để thuận tiện tra cứu code&#x2F;bài giảng.</p></li><li><p><strong>Giai đoạn 3</strong>: Tích hợp <strong>AI hỗ trợ học tập</strong> – giải thích bài toán.</p></li><li><p><strong>Giai đoạn 4</strong>: Mở rộng thành <strong>cộng đồng chia sẻ</strong>: học sinh, giáo viên, developer có thể cùng nhau đóng góp.</p></li></ul><h2 id="VI-Series-blog-nay-co-gi"><a href="#VI-Series-blog-nay-co-gi" class="headerlink" title="VI. Series blog này có gì?"></a>VI. Series blog này có gì?</h2><p>Song song với việc phát triển <a href="https://www.lecturehub.tech/">LectureHub</a>, mình sẽ viết một <strong>series blog</strong> để chia sẻ hành trình xây dựng:</p><ol><li><p><strong>Thiết kế hệ thống</strong> – Kiến trúc tổng thể của LectureHub. Bao gồm: Repo Design, Database Design, Architecture Design</p></li><li><p><strong>Deployment</strong> – Ứng dụng sẽ được triển khai trên AWS cloud, vì vậy mình cũng chia sẻ thêm về các AWS Service phổ biến cho việc xây dựng một website.</p></li><li><p><strong>Ứng dụng AI</strong> – Tích hợp RAG, chatbot hỗ trợ giải thích bài toán.</p></li><li><p><strong>Các tính năng phụ trợ</strong> - Tạo bộ đề ngẫu nhiên, code bài giải ở nhiều ngôn ngữ khác nhau, tạo slide bài giảng… (nhóm chức năng này sẽ triển khai sau cùng tùy vào hứng thú của người dùng)</p></li></ol><p>Mỗi bài viết sẽ hướng tới <strong>note lại các kiến thức kỹ thuật</strong>, vừa mang lại <strong>giá trị học tập cho cộng đồng</strong>.</p><h2 id="VII-Loi-ket"><a href="#VII-Loi-ket" class="headerlink" title="VII. Lời kết"></a>VII. Lời kết</h2><p><a href="https://www.lecturehub.tech/">LectureHub</a> là dự án xuất phát từ nhu cầu cá nhân, nhưng mình tin rằng nó có thể mang lại giá trị lớn cho cộng đồng học sinh, giáo viên, và những ai yêu thích tin học.</p><p>Series blog này sẽ là hành trình từ <strong>ý tưởng → thiết kế → code → deploy → tích hợp với công nghệ AI</strong>.<br>Nếu bạn quan tâm đến backend, cloud, hay AI trong giáo dục, hãy theo dõi để cùng khám phá.</p><p>👉 Cùng đón chờ bài viết đầu tiên về series này nhé: <strong>LectureHub Overview – Thiết kế hệ thống</strong>.</p><!-- <figure style="text-align:center;">  <img src="https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExYzV2NnF3emkwNmZoN3RiYnlsNXBocm80bGV2eTIwZ202aGNocnZyaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/BDQmMy3ZM8sgRNFkhe/giphy.gif"       alt="Chờ đợi bài viết đầu tiên của series LectureHub">  <figcaption><i>Please waitting...</i></figcaption></figure> --><p><img src="https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExYzV2NnF3emkwNmZoN3RiYnlsNXBocm80bGV2eTIwZ202aGNocnZyaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/BDQmMy3ZM8sgRNFkhe/giphy.gif" alt="Meme"></p><center><i>Please waitting...</i></center><h2 id="VIII-References"><a href="#VIII-References" class="headerlink" title="VIII. References"></a>VIII. References</h2><ul><li>Website: <a href="https://www.lecturehub.tech/">https://www.lecturehub.tech</a></li><li>Github: <a href="https://github.com/LectureHubTeam">https://github.com/LectureHubTeam</a></li><li>Fanpage: <a href="https://www.facebook.com/profile.php?id=61579127122566">https://www.facebook.com/profile.php?id=61579127122566</a></li></ul><!-- MARKDOWN LINKS & IMAGES --><!-- https://www.markdownguide.org/basic-syntax/#reference-style-links -->]]>
    </content>
    <id>http://kudokhang.github.io/2025/08/18/LectureHub-Introduction/</id>
    <link href="http://kudokhang.github.io/2025/08/18/LectureHub-Introduction/"/>
    <published>2025-08-18T07:19:32.000Z</published>
    <summary>
      <![CDATA[<h2 id="I-Mo-dau"><a href="#I-Mo-dau" class="headerlink" title="I. Mở đầu"></a>I. Mở đầu</h2><p>Ngoài là một software engineer mình còn có n]]>
    </summary>
    <title>LectureHub Introduction</title>
    <updated>2026-02-13T03:59:52.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Kudo Khang</name>
    </author>
    <category term="Technical" scheme="http://kudokhang.github.io/tags/Technical/"/>
    <category term="Performance" scheme="http://kudokhang.github.io/tags/Performance/"/>
    <content>
      <![CDATA[<h2 id="I-Mo-dau"><a href="#I-Mo-dau" class="headerlink" title="I. Mở đầu"></a>I. Mở đầu</h2><p>Là một lập trình viên, terminal chắc chắn là một công cụ mà bạn sẽ phải thao tác làm việc với nó mỗi ngày, tuy nhiên với terminal mặc định trông nó sẽ khá kùi pắp, giao diện xấu và chức năng hạn chế. Trong bài viết này mình sẽ hướng dẫn các bạn cách:</p><ul><li>Tùy biến terminal để nó trông màu mè, đẹp đẽ hơn.</li><li>Cung cấp một số tips giúp nâng cao hiệu suất khi làm việc với terminal.</li></ul><h2 id="II-Tuy-chinh-Terminal"><a href="#II-Tuy-chinh-Terminal" class="headerlink" title="II. Tùy chỉnh Terminal"></a>II. Tùy chỉnh Terminal</h2><p>Như đã nói từ đầu, terminal mặc định sẽ rất hạn chế chức năng và khả năng tùy chỉnh từ người dùng vì vậy việc đầu tiên chúng ta cần làm là thay ngay một terminal mới 🫵</p><p>Terminal mới mình chọn ở đây là <code>Tabby</code>, vì một số lý do sau:</p><ul><li>Đẹp</li><li>Tương thích trên cả Mac và Linux (trước đó mình xài <code>Iterm2</code>, cũng khá đẹp nhưng chỉ có thể cài đặt trên Mac)</li><li>Quản lý profile kết nối tới server</li></ul><p><img src="https://i.imgur.com/IxxS7W5.png" alt="[https:&#x2F;&#x2F;tabby.sh&#x2F;](https:&#x2F;&#x2F;tabby.sh&#x2F;)"></p><p><a href="https://tabby.sh/">https://tabby.sh/</a></p><p>Sau khi cài đặt, terminal của chúng ta chưa thể màu mè được như hình minh họa từ trang chủ Tabby đâu, để được như vậy chúng ta cần cài thêm ZSH thay cho Shell mặc định và themes, plugins cho nó nữa.</p><h3 id="Buoc-1-Cai-dat-ZSH"><a href="#Buoc-1-Cai-dat-ZSH" class="headerlink" title="Bước 1: Cài đặt ZSH"></a>Bước 1: Cài đặt ZSH</h3><p>Trong bài này mình sẽ hướng dẫn cài đặt trên Ubuntu, những hệ điều hành khác các bạn hoàn toàn có thể làm tương tự nhé.</p><p>Đầu tiên là cài đặt ZSH:</p><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get update</span><br><span class="line">sudo apt-get install zsh</span><br></pre></td></tr></table></figure><p>Đặt ZSH làm Shell mặc định</p><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chsh -s $(which zsh)</span><br></pre></td></tr></table></figure><p>Sau khi đổi xong các bạn cần restart terminal để thay đổi được áp dụng. Lần đầu vào lại ZSH sẽ hỏi chúng ta về việc khởi tạo file configuration.</p><p><img src="https://i.imgur.com/9myYTi0.png" alt="ZSH"></p><p>Tại đây chúng ta chọn option 0 để tạo một file config rỗng vì phần config chúng ta sẽ dùng của oh-my-zsh framework sẽ được cài đặt ngay sau đây</p><h3 id="Buoc-2-Cai-dat-Oh-my-zsh-framework"><a href="#Buoc-2-Cai-dat-Oh-my-zsh-framework" class="headerlink" title="Bước 2: Cài đặt Oh-my-zsh framework"></a>Bước 2: Cài đặt Oh-my-zsh framework</h3><p>Oh-my-zsh là một framework mở rộng cho Zsh, nó cung cấp một bộ sưu tập các tính năng, themes và plugins để tùy chỉnh và nâng cao trải nghiệm sử dụng Zsh</p><p>Để cài đặt chúng ta chỉ cần:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sh -c <span class="string">&quot;<span class="subst">$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)</span>&quot;</span></span><br></pre></td></tr></table></figure><p>Sau khi cài đặt chúng ta sẽ thấy một giao diện như sau.</p><p><img src="https://i.imgur.com/3W9BJ4X.png" alt="Oh-my-zsh"></p><p>Oh-my-zsh sẽ sử dụng file config <code>.zshrc</code> đã được khởi tạo trước đó và áp dụng những config thay đổi thêm vào.</p><p>Tới đây terminal của chúng ta đã trông màu mè hơn rất nhiều tuy nhiên vẫn chưa hết, chúng ta có thể nâng cao trải nghiệm với việc thay đổi themes và cài đặt thêm plugins</p><h3 id="Buoc-3-Cai-dat-themes"><a href="#Buoc-3-Cai-dat-themes" class="headerlink" title="Bước 3: Cài đặt themes"></a>Bước 3: Cài đặt themes</h3><p>Themes mặc định của Oh-my-zsh là <code>robbyrussell</code> vì giao diện nó khá sơ sài nên chúng ta cần đổi qua theme màu mè khác để nó có thể hiển thị thêm nhiều thông tin.</p><p>Theme mình đang xài là <code>powerlevel10k</code>, để cài đặt chúng ta cần tải nó về với lệnh sau:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> --depth=1 https://github.com/romkatv/powerlevel10k.git <span class="variable">$&#123;ZSH_CUSTOM:-<span class="variable">$HOME</span>/.oh-my-zsh/custom&#125;</span>/themes/powerlevel10k</span><br></pre></td></tr></table></figure><p>Tiếp đó, thay đổi nó trong config bằng cách mở file <code>~/.zshrc</code> và tìm tới dòng <code>ZSH_THEM=”robbyrussell”</code> sửa thành:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ZSH_THEME=<span class="string">&quot;powerlevel10k/powerlevel10k”</span></span><br></pre></td></tr></table></figure><p>Để thay đổi có hiệu lực chúng ta có thể restart terminal hoặc:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><p>Khi theme <code>powerlevel10k</code> được áp dụng thành công, chúng ta sẽ tiến hành tùy chỉnh từng bước từng bước theo hướng dẫn:</p><p><img src="https://i.imgur.com/fTHLEPL.png" alt="powerlevel10k"></p><aside>💡 Nếu thiết lập xong mà muốn thay đổi, bạn có thể gõ `p10k configure` để tiến hành thiết lập lại</aside><p>Các bạn có thể thử nghiệm thêm các theme khác <a href="https://github.com/ohmyzsh/ohmyzsh/wiki/Themes">tại đây</a>.</p><h3 id="Buoc-4-Cai-dat-plugins"><a href="#Buoc-4-Cai-dat-plugins" class="headerlink" title="Bước 4: Cài đặt plugins"></a>Bước 4: Cài đặt plugins</h3><p>ZSH sẽ giúp việc thao tác với terminal thuận tiện hơn với kho plugins đa dạng. Sau đây mình sẽ thực hiện cài 2 plugins mà mình nghĩ bắt buộc phải có cho terminal.</p><h3 id="Dau-tien-zsh-autosuggestions"><a href="#Dau-tien-zsh-autosuggestions" class="headerlink" title="Đầu tiên: zsh-autosuggestions"></a>Đầu tiên: zsh-autosuggestions</h3><p>Plugin này sẽ gợi ý command dựa trên lịch sử gõ của bạn, để cài đặt đầu tiên ta cần tải nó về:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/zsh-users/zsh-autosuggestions <span class="variable">$&#123;ZSH_CUSTOM:-~/.oh-my-zsh/custom&#125;</span>/plugins/zsh-autosuggestions</span><br><span class="line">zsh-autosuggestions</span><br></pre></td></tr></table></figure><p>Khai báo plugin trong config, các bạn mở file  <code>~/.zshrc</code> và tìm tới dòng:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">plugins=(git)</span><br></pre></td></tr></table></figure><p>Thêm <code>zsh-autosuggestions</code> vào:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">plugins=(git zsh-autosuggestions)</span><br></pre></td></tr></table></figure><p>Để thay đổi có hiệu lực chúng ta lại thực hiện:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><aside>💡 File config được viết bằng BashScript các bạn chú ý không thêm dấu `,` kẻo gây lỗi nhé.</aside><h3 id="Tiep-theo-zsh-syntax-highlighting"><a href="#Tiep-theo-zsh-syntax-highlighting" class="headerlink" title="Tiếp theo: zsh-syntax-highlighting"></a>Tiếp theo: zsh-syntax-highlighting</h3><p><code>zsh-syntax-highlighting</code> giúp hiển thị các thành phần trong command với các màu khác nhau để thuận tiện cho việc gõ, ngoài ta những command không đúng sẽ được hiện màu đỏ, việc này sẽ giúp chúng ta nhìn ra sớm để kịp sửa đổi. Việc cài đặt hoàn toàn tương tự như trên, đầu tiên chúng ta cần tải plugin này về máy:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/zsh-users/zsh-syntax-highlighting.git <span class="variable">$&#123;ZSH_CUSTOM:-~/.oh-my-zsh/custom&#125;</span>/plugins/zsh-syntax-highlighting</span><br><span class="line">zsh-syntax-highlighting</span><br></pre></td></tr></table></figure><p>Khai báo nó trong file config <code>~/.zshrc</code>:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">plugins=(git zsh-autosuggestions zsh-syntax-highlighting)</span><br></pre></td></tr></table></figure><p>Và cuối cùng là:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><p>Như vậy là bạn đã biết cách cài một plugin cho ZSH, kho plugins cho ZSH rất nhiều, bạn có thể xem và cài thử <a href="https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins">tại đây</a>.</p><h2 id="III-Nang-cao-hieu-suat-lam-viec-voi-shortcut-va-alias"><a href="#III-Nang-cao-hieu-suat-lam-viec-voi-shortcut-va-alias" class="headerlink" title="III. Nâng cao hiệu suất làm việc với shortcut và alias"></a>III. Nâng cao hiệu suất làm việc với shortcut và alias</h2><h3 id="Shortcut-cho-Terminal"><a href="#Shortcut-cho-Terminal" class="headerlink" title="Shortcut cho Terminal"></a>Shortcut cho Terminal</h3><p>Phím tắt giúp bạn thực hiện các thao tác một cách nhanh chóng và hiệu quả hơn so với việc sử dụng chuột hoặc thao tác bằng cách thủ công. Điều này giảm thời gian mất khi bạn phải di chuyển chuột và thực hiện các thao tác trên giao diện người dùng.</p><p>Làm việc với terminal cũng vậy, việc biết và sử dụng shortcut sẽ giúp đôi tay của bạn lả lướt mượt mà hơn trên bàn phím. Sau đây là một số shortcut hữu ích mà mình thường dùng:</p><ul><li><code>Ctrl + l</code>: Chức năng tương tự <code>clear</code>, giúp clear màn hình trong terminal.</li><li><code>Ctrl + k</code>: Xóa từ vị trí con trỏ đến cuối dòng.</li><li><code>Ctrl + u</code>: Xóa tự trị trí con trỏ tới đầu hàng.</li><li><code>Ctrl + a</code>: Di chuyển con trỏ về đầu dòng.</li><li><code>Ctrl + e</code>: Di chuyển chon trỏ tới cuối dòng.</li><li><code>Ctrl + w</code>: Xóa từng từ từ vị trí con trỏ về tới đầu hàng.</li><li><code>Ctrl + c</code>: Câu này chắc là quen thuộc nhất rồi, dừng lệnh đang chạy.</li><li><code>Ctrl + d</code>: Đóng terminal hoặc thoát khỏi shell hiện tại (Ví dụ đang ở trong container hoặc ssh tới server nào đó, chúng ta có thể dùng <code>Ctrl + d</code> để thoát ra khỏi môi trường đó)</li></ul><p>Các bạn có thể tìm hiểu thêm các Shortcut <a href="https://itsfoss.com/linux-terminal-shortcuts/">tại đây</a> để múa cho ngầu nhé.</p><h3 id="Alias"><a href="#Alias" class="headerlink" title="Alias"></a>Alias</h3><p>Alias trong terminal là một cách để tạo ra shortcut cho những câu lệnh mà chúng ta thường dùng, từ đó rút ngắn thời gian gõ, nâng cao hiệu suất làm việc.</p><p>Để thêm alias vào hệ thống chúng ta sẽ mở tệp cấu hình hệ thống <code>~/.zshrc</code> lên và tiến hành thêm vào cuối file như sau:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Alias</span></span><br><span class="line"><span class="built_in">alias</span> hello=<span class="string">&#x27;echo Hii, Chao Cau!&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Để những sửa đổi trong ~/.zshrc có hiệu lực các bạn nhớ source ~/.zshrc nhé.</span></span><br></pre></td></tr></table></figure><p>Hoặc chúng ta có thể thêm trực tiếp trên terminal như sau:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">alias</span> hello=<span class="string">&#x27;echo Hii, Chao Cau!&#x27;</span></span><br></pre></td></tr></table></figure><p>Sau đó khi gõ <code>hello</code> trên terminal chúng ta sẽ nhận được kết quả như sau:</p><p><img src="https://i.imgur.com/VXLuZJf.png" alt="alias"></p><p>Như vậy các bạn đã hình dung ra alias là gì và cách để thêm nó vào hệ thống của mình rồi đúng không nào, sau đây mình sẽ đưa ra một số alias mình thường dùng để giúp workflow làm việc với Git và Docker được nhanh chóng mau lẹ hơn.</p><h3 id="Git"><a href="#Git" class="headerlink" title="Git"></a>Git</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Alias for Git</span></span><br><span class="line"><span class="built_in">alias</span> gst=<span class="string">&#x27;git status&#x27;</span></span><br><span class="line"><span class="built_in">alias</span> gc=<span class="string">&#x27;git commit&#x27;</span></span><br><span class="line"><span class="built_in">alias</span> gl=<span class="string">&#x27;git pull&#x27;</span></span><br><span class="line"><span class="built_in">alias</span> gp=<span class="string">&#x27;git push&#x27;</span></span><br><span class="line"><span class="built_in">alias</span> gco=<span class="string">&#x27;git checkout&#x27;</span></span><br><span class="line"><span class="built_in">alias</span> gcb=<span class="string">&#x27;git checkout -b&#x27;</span></span><br><span class="line"><span class="built_in">alias</span> gbr=<span class="string">&#x27;git branch&#x27;</span></span><br><span class="line"><span class="built_in">alias</span> glog=<span class="string">&#x27;git log --oneline --graph --all&#x27;</span></span><br></pre></td></tr></table></figure><h3 id="Docker"><a href="#Docker" class="headerlink" title="Docker"></a>Docker</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Alias for Docker</span></span><br><span class="line"><span class="built_in">alias</span> dps=<span class="string">&#x27;docker ps&#x27;</span></span><br><span class="line"><span class="built_in">alias</span> dpsf=<span class="string">&quot;docker ps --format &#x27;table &#123;&#123;.ID&#125;&#125;\t&#123;&#123;.Names&#125;&#125;\t&#123;&#123;.Status&#125;&#125;\t&#123;&#123;.Ports&#125;&#125;&#x27;&quot;</span></span><br><span class="line"><span class="built_in">alias</span> dpsa=<span class="string">&#x27;docker ps -a&#x27;</span></span><br><span class="line"><span class="built_in">alias</span> dpsaf=<span class="string">&quot;docker ps -a --format &#x27;table &#123;&#123;.ID&#125;&#125;\t&#123;&#123;.Names&#125;&#125;\t&#123;&#123;.Status&#125;&#125;\t&#123;&#123;.Ports&#125;&#125;&#x27;&quot;</span></span><br><span class="line"><span class="built_in">alias</span> dexec=<span class="string">&#x27;docker exec -it&#x27;</span></span><br><span class="line"><span class="built_in">alias</span> drm=<span class="string">&#x27;docker rm&#x27;</span></span><br><span class="line"><span class="built_in">alias</span> drmi=<span class="string">&#x27;docker rmi&#x27;</span></span><br><span class="line"><span class="built_in">alias</span> dstopall=<span class="string">&#x27;docker stop $(docker ps -q)&#x27;</span></span><br><span class="line"><span class="built_in">alias</span> dlogs=<span class="string">&#x27;docker logs&#x27;</span></span><br><span class="line"><span class="built_in">alias</span> dc=<span class="string">&#x27;docker compose&#x27;</span></span><br></pre></td></tr></table></figure><p>Nội dung các dòng lệnh trên rất là cơ bản nên mình sẽ không giải thích chức năng cụ thể nhé.</p><aside>⚠️ Một số lưu ý khi đặt tên và sử dụng alias</aside><p>Những thiết lập alias sẽ chỉ hoạt động trên hệ thống của bạn và nếu chỉ mỗi bạn dùng thì bạn có thể thoải sáng tạo đặt tên, tuy nhiên mình muốn lưu ý một số điểm sau:</p><p><strong>Việc đặt tên</strong>:</p><p>Việc đặt tên nên mang ý nghĩa gợi nhớ, liệu bạn có muốn đặt alias cho lệnh <code>git status</code> là <code>hello everybody, sau khi mình gõ dòng này trạng thái git sẽ xuất hiện trên terminal nè</code> hay <code>a</code>, <code>b</code>, <code>c</code>… chẳng hạn. Nếu bạn đặt bằng 1 chữ cái như trên thì tin tốt là bạn có thể giảm thời gian gõ từ 10 ký tự <code>git status</code> về 1, tuy nhiên khi số lượng alias tăng lên thì việc nhớ tên alias sẽ trở thành một vấn đề khó khăn.</p><p>Còn nếu bạn chọn cách đặt tên như cách đầu tiên thì… well, mình không có ý kiến gì cả, chỉ muốn khuyên bạn mỗi khi dùng hãy cẩn thận đừng để đồng nghiệp với sếp thấy bởi vì họ sẽ bắt đầu kì thị bạn đấy 🤧</p><p>Tránh những alias đã được sử dụng trong hệ thống trước đó, ví dụ ta có <code>nano</code> là trình edit văn bản mặc định trên Ubuntu, sẽ ra sao nếu chúng ta đặt một alias như sau</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">alias</span> nano=<span class="string">&quot;echo hello&quot;</span></span><br></pre></td></tr></table></figure><p>Như vậy khi gõ <code>nano</code> trên terminal chúng ta sẽ nhận được dòng <code>hello</code> thay vì vào trình edit văn bản bằng <code>nano</code>.</p><p>Khi đặt 2 alias trùng tên nhau, hệ thống sẽ sử dụng alias cuối cùng</p><h3 id="Tra-cuu-alias-va-xoa-alias"><a href="#Tra-cuu-alias-va-xoa-alias" class="headerlink" title="Tra cứu alias và xóa alias"></a>Tra cứu alias và xóa alias</h3><p>Để kiểm tra xem có những alias nào được khai báo trên hệ thống chúng ta gõ:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">alias</span></span><br></pre></td></tr></table></figure><p>Với câu lệnh trên, nó sẽ hiện ra danh sách alias đang có trên hệ thống. Chúng ta có thể kết hợp với <code>grep</code> để tìm kiếm một alias cụ thể:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">alias</span> | grep <span class="string">&quot;git&quot;</span></span><br></pre></td></tr></table></figure><p>Và cuối cùng, nếu muốn xóa alias chùng ta sẽ sử dụng câu lệnh sau:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">unalias</span> alias1 alias2 alias3</span><br></pre></td></tr></table></figure><h2 id="IV-Tong-ket"><a href="#IV-Tong-ket" class="headerlink" title="IV. Tổng kết"></a>IV. Tổng kết</h2><p>Qua bài viết này mình đã giới thiệu tới các bạn cách để màu mè hóa quy trình làm việc với terminal, hi vọng với những chia sẻ đó sẽ gíúp việc múa code của bạn thanh thoát và điệu nghệ hơn, từ đó đồng nghiệp kính nể, sếp càng iu quý, công ty tăng lương, sớm có tiền mua nhà, cưới vợ, sống một đời viên mãn 🫡.</p><p><img src="https://media4.giphy.com/media/XIqCQx02E1U9W/giphy.gif?cid=7941fdc6kizu2of4mhov6cxqscuoo5x3gyxzl967s14rbcvw&ep=v1_gifs_search&rid=giphy.gif&ct=g" alt="meme"></p><!-- MARKDOWN LINKS & IMAGES --><!-- https://www.markdownguide.org/basic-syntax/#reference-style-links -->]]>
    </content>
    <id>http://kudokhang.github.io/2024/01/06/Tuy-chinh-Terminal-Nang-cao-hieu-suat-va-trai-nghiem-go-code/</id>
    <link href="http://kudokhang.github.io/2024/01/06/Tuy-chinh-Terminal-Nang-cao-hieu-suat-va-trai-nghiem-go-code/"/>
    <published>2024-01-06T09:20:37.000Z</published>
    <summary>
      <![CDATA[<h2 id="I-Mo-dau"><a href="#I-Mo-dau" class="headerlink" title="I. Mở đầu"></a>I. Mở đầu</h2><p>Là một lập trình viên, terminal chắc chắn là]]>
    </summary>
    <title>Tùy chỉnh Terminal: Nâng cao hiệu suất và trải nghiệm gõ code</title>
    <updated>2026-02-13T03:59:58.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Kudo Khang</name>
    </author>
    <category term="Technical" scheme="http://kudokhang.github.io/tags/Technical/"/>
    <content>
      <![CDATA[<h2 id="I-Mo-dau"><a href="#I-Mo-dau" class="headerlink" title="I. Mở đầu"></a>I. Mở đầu</h2><p>Chúng ta thường nghe việc tổ chức source code, viết code sạch code đẹp (clean code) là một việc rất quan trọng trong công việc viết phần mềm, một source code được tổ chức tốt, code tuân theo convention sẽ giúp cho các lập trình viên có thể phối hợp phát triển dự án một cách dễ dàng hơn, giảm thiểu conflict, dễ dàng mở rộng thêm các tính năng mới và bảo trì sau này.</p><p>Trong bài viết này mình xin giới thiệu template cho một AI project mà mình đang áp dụng cho những dự án gần đây.</p><h2 id="II-Cau-truc-du-an"><a href="#II-Cau-truc-du-an" class="headerlink" title="II. Cấu trúc dự án"></a>II. Cấu trúc dự án</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">├── checkpoints</span><br><span class="line">├── conf</span><br><span class="line">│   └── config.yaml</span><br><span class="line">├── data</span><br><span class="line">│   └── logo.png</span><br><span class="line">├── docker</span><br><span class="line">│   ├── Dockerfile</span><br><span class="line">│   └── Dockerfile.dev</span><br><span class="line">├── docs</span><br><span class="line">│   └── README.md</span><br><span class="line">├── python_project_template</span><br><span class="line">│   └── utils</span><br><span class="line">│       ├── __init__.py</span><br><span class="line">│       ├── config.py</span><br><span class="line">│       ├── downloader.py</span><br><span class="line">│       └── logger.py</span><br><span class="line">├── scripts</span><br><span class="line">│   ├── helpers</span><br><span class="line">│   │   └── download_checkpoints.py</span><br><span class="line">│   └── inference.py</span><br><span class="line">└── tests</span><br><span class="line">│    └── test_read_config.py</span><br><span class="line">├── requirements.txt</span><br><span class="line">├── .dockerignore</span><br><span class="line">├── docker-compose.yml</span><br><span class="line">├── .flake8</span><br><span class="line">├── .gitignore</span><br><span class="line">├── pyproject.toml</span><br><span class="line">├── .pre-commit-config.yaml</span><br><span class="line">├── README.md</span><br></pre></td></tr></table></figure><p>Dưới đây sẽ là giải thích chức năng cho từng file và module</p><p><strong>checkpoints</strong>: Thư mục chứa các checkpoint của mô hình phục vụ cho quá trình inference 🦥</p><p><strong>conf</strong>: Chứa các config về đường dẫn, tham số… dưới dạng yaml. Việc gọi các tham số đó ra được thực hiện bởi thư viện <a href="https://hydra.cc/docs/intro/">hydra</a> ䷅.</p><p><strong>data</strong>: Chứa hình ảnh, video, dataset 🌆.</p><p><strong>docker</strong>: File cấu hình Dockerfile định nghĩa cách xây dựng một image Docker cho dự án 🐳.</p><p><strong>docs</strong>: Để giúp cho những lập trình viên khác cùng vào phát triển, cũng như hỗ trợ việc phát triển, bảo trì lâu dài viết document cho dự án là một việc mình nghĩ rất cần thiết, đây sẽ là nơi lưu documents 📝</p><p><strong>python_project_template</strong>: Đây chính là nơi chứa toàn bộ code cho module chính của bạn, trong này sẽ bao gồm modeling, utils… những phần code để khởi chạy project sẽ được bỏ vào đây 👨🏻‍💻.</p><p><strong>scripts</strong>: Chứa các scripts như download checkpoints, inference model… 🏃‍♂️.</p><p><strong>tests</strong>: Để đảm bảo code được chạy đúng sau mỗi lần fix, update… chúng ta nên thiết kế các unit test để kiểm tra. Việc testing sẽ được thực hiện bởi thư viện <a href="https://pypi.org/project/pytest/">pytest</a> 🧪.</p><p><strong>requirements.txt</strong>: Khai báo các thư viện cần thiết để khởi chạy project 🗒️.</p><p><strong>.dockerignore</strong>: File này được sử dụng khi bạn sử dụng Docker để xác định các file và thư mục sẽ không được đóng gói vào container Docker 🐳.</p><p><strong>docker-compose.yml:</strong> File cấu hình docker-compose giúp khởi chạy, quản lý nhiều container một cách dễ dàng nhất 🐙.</p><p><strong>.flake8</strong>: Đây là file cấu hình cho công cụ kiểm tra PEP8, một quy ước viết code Python. PEP8 giúp đảm bảo rằng code của bạn tuân thủ các quy tắc về định dạng, chuẩn mã hóa và phong cách viết code 👓.</p><p><strong>.gitignore</strong>: File này xác định các file và thư mục sẽ không được theo dõi bởi Git. Git sử dụng file <strong><code>.gitignore</code></strong> để bỏ qua các file không cần thiết hoặc nhạy cảm, như file tạm thời, file log, hoặc file chứa thông tin cá nhân. Chúng ta nên dùng <a href="https://www.toptal.com/developers/gitignore">template gitignore</a> để việc ignore được triệt để nhất 🐒.</p><p><strong>pyproject.toml</strong>: Chứa các khai báo, cấu hình cho dự án. Bao gồm thông tin, mô tả của dự án, người phát triển. Ngoài ra một số tool như <a href="https://github.com/psf/black">black</a>, <a href="https://python-poetry.org/">poetry</a>… sẽ sử dụng config được khai báo trong đây 🗒️.</p><p><strong>.pre-commit-config.yaml</strong>: pre-commit là một công cụ giúp kiểm tra và tự động refactor code theo chuẩn PEP8 convention. Các kịch bản kiểm tra sẽ được thiết lập, định nghĩa tại đây ✅.</p><p><strong>README.md</strong>: Và cuối cùng là file README.md nhằm mô tả, hướng dẫn những thông tin của project. Phần này mình follow theo repo <a href="https://github.com/othneildrew/Best-README-Template">Best-README-Template</a> (~11k⭐)</p><p>Trên đây là template cho một AI module project mà mình đang áp dụng, tùy vào tính chất dự án mà bạn đang thực hiện, có thể thêm hoặc bớt để cho phù hợp nhất. Nếu bạn có ideas gì để giúp template này hoàn thiện hơn, rất welcome các bạn contributing để repo hoàn hoàn thiện hơn 🙆🏻‍♂️</p><h2 id="III-References"><a href="#III-References" class="headerlink" title="III. References"></a>III. References</h2><ul><li><a href="https://github.com/KudoKhang/python-project-template">python-project-template</a></li><li><a href="https://github.com/tomas-gajarsky/facetorch">facetorch</a> (template mình xây dựng học hỏi từ repo này mọi người nhé)</li></ul>]]>
    </content>
    <id>http://kudokhang.github.io/2023/06/03/Python-Template-Project-cho-mot-du-an-AI/</id>
    <link href="http://kudokhang.github.io/2023/06/03/Python-Template-Project-cho-mot-du-an-AI/"/>
    <published>2023-06-03T14:11:50.000Z</published>
    <summary>
      <![CDATA[<h2 id="I-Mo-dau"><a href="#I-Mo-dau" class="headerlink" title="I. Mở đầu"></a>I. Mở đầu</h2><p>Chúng ta thường nghe việc tổ chức source cod]]>
    </summary>
    <title>Python Template Project cho một dự án AI</title>
    <updated>2026-02-11T17:53:27.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Kudo Khang</name>
    </author>
    <category term="Technical" scheme="http://kudokhang.github.io/tags/Technical/"/>
    <content>
      <![CDATA[<h2 id="I-Gioi-thieu"><a href="#I-Gioi-thieu" class="headerlink" title="I. Giới thiệu"></a>I. Giới thiệu</h2><p>Còn nhớ hồi mình mới học về Machine Learning (cách đây khoảng 2-3 năm) các bài hướng dẫn trên Blog, YouTube, GitHub đều xài TensorFlow. PyTorch là một FrameWork được Facebook phát triển, tuy ra đời sau nhưng càng ngày càng nhận được sự quan tâm và sử dụng của cộng đồng, lý giải cho sự phát triển nhanh chóng của PyTorch có thể đến từ việc nó xây dựng trên Python (mà Python lại là ngôn ngữ chính được sử dụng trong các task về Machine Learning &#x2F; Deep Learning), hiệu suất, tính tinh hoạt, tận dụng được việc tính toán song song trên nhiều GPU…</p><p>Một thống kê trên HuggingFace về mức độ phổ biến giữa 2 Framework, có đến 92% model sử dụng PyTorch để phát triển mô hình từ đó có thể thấy được mức độ phổ biến của PyTorch là như thế nào.</p><p><img src="https://i.imgur.com/ZLFlavF.png" alt="Number of Models in HuggingFace"></p><p>Thêm một thống kê nữa để chỉ ra sự chuyển dịch của các nhà phát triển từ TensorFlow sang PyTorch.</p><p><img src="https://i.imgur.com/xmb3jdv.png" alt="Tensor with PyTorch"></p><p>Chuyện là mình có một bài toán trong đó có sử dụng cả mô hình TF và PyTorch (được viết cũng một năm rồi), mấy hôm trước mình cần phải triển khai lại mô hình đó từ máy tính bàn sang máy tính nhúng Jetson, vì khác kiến trúc nhân bộ xử lý CPU nên nhiều thư viện bị conflict, không thể cài đặt một cách dễ dàng được. Vì vậy mình cần phải convert model TF sang PyTorch cho đồng bộ. Một hướng xử lý phổ biến đó là convert model TF sang ONNX.</p><p><img src="https://i.imgur.com/dlY0hSt.png" alt="Tf to ONNX"></p><p>Tuy nhiên vì mô hình của mình khá nhỏ và đơn giản nên mình muốn tìm cách liệu có convert TF sang PyTorch một cách trực tiếp không? Câu trả lời là được và để thực hiện chúng ta chỉ cần thực hiện 2 bước chính như sau:</p><ul><li>Xây dựng lại model PyTorch có kiến trúc giống với model TensorFlow</li><li>Tiến hành copy weights (các trọng số) từ checkpoints TF sang model PyTorch</li></ul><p>Chi tiết thực hiện sẽ được trình bày trong mục 2</p><h2 id="II-Thuc-nghiem"><a href="#II-Thuc-nghiem" class="headerlink" title="II. Thực nghiệm"></a>II. Thực nghiệm</h2><p>Mô hình TensorFlow của mình ở đây có nhiệm vụ phân loại 31 ký tự trong bảng chữ cái, kiến trúc model sẽ như sau</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># TensorFlow model</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">_build_model_tensorflow</span>(<span class="params">self</span>):</span><br><span class="line">        self.model = Sequential()</span><br><span class="line">        self.model.add(Conv2D(<span class="number">32</span>, (<span class="number">3</span>, <span class="number">3</span>), padding=<span class="string">&quot;same&quot;</span>, activation=<span class="string">&quot;relu&quot;</span>, input_shape=(<span class="number">28</span>, <span class="number">28</span>, <span class="number">1</span>)))</span><br><span class="line">        self.model.add(Conv2D(<span class="number">32</span>, (<span class="number">3</span>, <span class="number">3</span>), activation=<span class="string">&quot;relu&quot;</span>))</span><br><span class="line">        self.model.add(MaxPooling2D(pool_size=(<span class="number">2</span>, <span class="number">2</span>)))</span><br><span class="line">        self.model.add(Dropout(<span class="number">0.25</span>))</span><br><span class="line"></span><br><span class="line">        self.model.add(Conv2D(<span class="number">64</span>, (<span class="number">3</span>, <span class="number">3</span>), padding=<span class="string">&quot;same&quot;</span>, activation=<span class="string">&quot;relu&quot;</span>))</span><br><span class="line">        self.model.add(Conv2D(<span class="number">64</span>, (<span class="number">3</span>, <span class="number">3</span>), activation=<span class="string">&quot;relu&quot;</span>))</span><br><span class="line">        self.model.add(MaxPooling2D(pool_size=(<span class="number">2</span>, <span class="number">2</span>)))</span><br><span class="line">        self.model.add(Dropout(<span class="number">0.25</span>))</span><br><span class="line"></span><br><span class="line">        self.model.add(Conv2D(<span class="number">64</span>, (<span class="number">3</span>, <span class="number">3</span>), padding=<span class="string">&quot;same&quot;</span>, activation=<span class="string">&quot;relu&quot;</span>))</span><br><span class="line">        self.model.add(Conv2D(<span class="number">64</span>, (<span class="number">3</span>, <span class="number">3</span>), activation=<span class="string">&quot;relu&quot;</span>))</span><br><span class="line">        self.model.add(MaxPooling2D(pool_size=(<span class="number">2</span>, <span class="number">2</span>)))</span><br><span class="line">        self.model.add(Dropout(<span class="number">0.25</span>))</span><br><span class="line"></span><br><span class="line">        self.model.add(Flatten())</span><br><span class="line">        self.model.add(Dense(<span class="number">512</span>, activation=<span class="string">&quot;relu&quot;</span>))</span><br><span class="line">        self.model.add(Dropout(<span class="number">0.5</span>))</span><br><span class="line">        self.model.add(Dense(<span class="number">32</span>, activation=<span class="string">&quot;softmax&quot;</span>))</span><br></pre></td></tr></table></figure><p>Có thể thấy đây là một mạng CNN với các lớp Conv2D, MaxPooling… rất cơ bản, bây giờ chúng ta cần build một model PyTorch với kiến trúc tương tự như vậy:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Build_Model_PyTorch</span>(nn.Module):</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="built_in">super</span>(Build_Model_PyTorch, self).__init__()</span><br><span class="line"></span><br><span class="line">        self.conv1 = nn.Conv2d(<span class="number">1</span>, <span class="number">32</span>, kernel_size=<span class="number">3</span>, padding=<span class="number">1</span>)</span><br><span class="line">        self.conv2 = nn.Conv2d(<span class="number">32</span>, <span class="number">32</span>, kernel_size=<span class="number">3</span>)</span><br><span class="line">        self.pool1 = nn.MaxPool2d(kernel_size=<span class="number">2</span>, stride=<span class="number">2</span>)</span><br><span class="line">        self.dropout1 = nn.Dropout(<span class="number">0.25</span>)</span><br><span class="line"></span><br><span class="line">        self.conv3 = nn.Conv2d(<span class="number">32</span>, <span class="number">64</span>, kernel_size=<span class="number">3</span>, padding=<span class="number">1</span>)</span><br><span class="line">        self.conv4 = nn.Conv2d(<span class="number">64</span>, <span class="number">64</span>, kernel_size=<span class="number">3</span>)</span><br><span class="line">        self.pool2 = nn.MaxPool2d(kernel_size=<span class="number">2</span>, stride=<span class="number">2</span>)</span><br><span class="line">        self.dropout2 = nn.Dropout(<span class="number">0.25</span>)</span><br><span class="line"></span><br><span class="line">        self.conv5 = nn.Conv2d(<span class="number">64</span>, <span class="number">64</span>, kernel_size=<span class="number">3</span>, padding=<span class="number">1</span>)</span><br><span class="line">        self.conv6 = nn.Conv2d(<span class="number">64</span>, <span class="number">64</span>, kernel_size=<span class="number">3</span>)</span><br><span class="line">        self.pool3 = nn.MaxPool2d(kernel_size=<span class="number">2</span>, stride=<span class="number">2</span>)</span><br><span class="line">        self.dropout3 = nn.Dropout(<span class="number">0.25</span>)</span><br><span class="line"></span><br><span class="line">        self.fc1 = nn.Linear(<span class="number">64</span>, <span class="number">512</span>)</span><br><span class="line">        self.dropout4 = nn.Dropout(<span class="number">0.5</span>)</span><br><span class="line">        self.fc2 = nn.Linear(<span class="number">512</span>, <span class="number">32</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">forward</span>(<span class="params">self, x</span>):</span><br><span class="line">        x = self.conv1(x)</span><br><span class="line">        x = nn.functional.relu(x)</span><br><span class="line">        x = self.conv2(x)</span><br><span class="line">        x = nn.functional.relu(x)</span><br><span class="line">        x = self.pool1(x)</span><br><span class="line">        x = self.dropout1(x)</span><br><span class="line"></span><br><span class="line">        x = self.conv3(x)</span><br><span class="line">        x = nn.functional.relu(x)</span><br><span class="line">        x = self.conv4(x)</span><br><span class="line">        x = nn.functional.relu(x)</span><br><span class="line">        x = self.pool2(x)</span><br><span class="line">        x = self.dropout2(x)</span><br><span class="line"></span><br><span class="line">        x = self.conv5(x)</span><br><span class="line">        x = nn.functional.relu(x)</span><br><span class="line">        x = self.conv6(x)</span><br><span class="line">        x = nn.functional.relu(x)</span><br><span class="line">        x = self.pool3(x)</span><br><span class="line">        x = self.dropout3(x)</span><br><span class="line"></span><br><span class="line">        x = x.view(-<span class="number">1</span>, <span class="number">64</span>)</span><br><span class="line">        x = self.fc1(x)</span><br><span class="line">        x = nn.functional.relu(x)</span><br><span class="line">        x = self.dropout4(x)</span><br><span class="line">        x = self.fc2(x)</span><br><span class="line">        x = nn.functional.softmax(x, dim=<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> x</span><br></pre></td></tr></table></figure><p>Thoạt nhìn qua thì thấy model PyTorch dài hơn TensorFlow nhỉ? Tuy nhiên nếu nhìn kỹ thì sẽ thấy các layer của model PyTorch hoàn toàn tương tự với TF (việc nhìn kỹ thì các bạn tự nhìn nhé 👀)</p><p>Sau khi đã build được kiến trúc model tương tự rồi, công việc tiếp theo là copy weights từ model cũ sang model mới</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> keras.models <span class="keyword">import</span> load_model</span><br><span class="line"></span><br><span class="line"><span class="comment"># Load the TF model</span></span><br><span class="line">keras_model = load_model(<span class="string">&quot;checkpoints/classify_character.h5&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># Get the TF model&#x27;s weights as a NumPy array</span></span><br><span class="line">keras_weights = keras_model.get_weights()</span><br><span class="line"></span><br><span class="line"><span class="comment"># Init PyTorch Model</span></span><br><span class="line">torch_model = Build_Model_PyTorch()</span><br><span class="line"></span><br><span class="line"><span class="comment"># Copy weights</span></span><br><span class="line"><span class="keyword">for</span> i, (name, param) <span class="keyword">in</span> <span class="built_in">enumerate</span>(torch_model.named_parameters()):</span><br><span class="line">        <span class="keyword">if</span> <span class="string">&quot;weight&quot;</span> <span class="keyword">in</span> name:</span><br><span class="line">            w = torch.from_numpy(keras_weights[i])</span><br><span class="line"></span><br><span class="line"><span class="comment"># Convert dimensions</span></span><br><span class="line">            <span class="keyword">if</span> w.dim() == <span class="number">3</span>:</span><br><span class="line">                w = w.t()</span><br><span class="line">            <span class="keyword">elif</span> w.dim() == <span class="number">1</span>:</span><br><span class="line">                <span class="keyword">pass</span></span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="keyword">assert</span> w.dim() == <span class="number">4</span></span><br><span class="line">                w = w.permute(<span class="number">3</span>, <span class="number">2</span>, <span class="number">0</span>, <span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">            param.data = w</span><br><span class="line"></span><br><span class="line">    <span class="comment"># Save the PyTorch model&#x27;s weights</span></span><br><span class="line">    torch.save(torch_model.state_dict(), <span class="string">&quot;checkpoints/classify_character.pt&quot;</span>)</span><br></pre></td></tr></table></figure><p>Ở đây có một điểm mà chúng ta cần lưu ý, mô hình TF làm việc với input [B, H, W, C] trong khi PyTorch lại input là [B, C, H, W] (Batch_size, Channel, Height, Width), chính vì vậy mới cần thêm <code>Convert dimensions</code>.</p><p>Ví dụ với sample bên dưới, input cho model TF là [1, 28, 28, 1] thì qua mô hình PyTorch sẽ là [1, 1, 28, 28].</p><p><img src="https://i.imgur.com/2FBZDsK.png" alt="Samples"></p><h2 id="III-Ket-qua"><a href="#III-Ket-qua" class="headerlink" title="III. Kết quả"></a>III. Kết quả</h2><p>Từ trên xuống dưới lần lượt là kết quả dự đoán của mô hình TF và PyTorch.</p><p><img src="https://i.imgur.com/hU8J4p3.png" alt="Compare TF with PyTorch"></p><p>Hy vọng hướng dẫn này sẽ hữu ích cho những bạn nào cần thực hiện convert model như mình.</p><p>Bái bai và hẹn gặp lại trong những bài viết tiếp theo 🫵</p><h2 id="IV-References"><a href="#IV-References" class="headerlink" title="IV. References"></a>IV. References</h2><ul><li><a href="https://github.com/KudoKhang/CodeInBlog/tree/main/TF2Torch">Code in GitHub</a></li><li><a href="https://github.com/onnx/tensorflow-onnx">TensorFlow to ONNX</a></li><li><a href="https://www.assemblyai.com/blog/pytorch-vs-tensorflow-in-2023/">PyTorch and TensorFlow in 2023</a></li></ul>]]>
    </content>
    <id>http://kudokhang.github.io/2023/05/29/Convert-TF-model-sang-PyTorch/</id>
    <link href="http://kudokhang.github.io/2023/05/29/Convert-TF-model-sang-PyTorch/"/>
    <published>2023-05-29T14:36:49.000Z</published>
    <summary>
      <![CDATA[<h2 id="I-Gioi-thieu"><a href="#I-Gioi-thieu" class="headerlink" title="I. Giới thiệu"></a>I. Giới thiệu</h2><p>Còn nhớ hồi mình mới học về]]>
    </summary>
    <title>Convert TF model sang PyTorch</title>
    <updated>2026-02-11T17:53:09.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Kudo Khang</name>
    </author>
    <content>
      <![CDATA[<h2 id="I-Tai-sao-minh-lai-viet-blog-nay"><a href="#I-Tai-sao-minh-lai-viet-blog-nay" class="headerlink" title="I. Tại sao mình lại viết blog này?"></a>I. Tại sao mình lại viết blog này?</h2><ul><li>Note lại những thứ mình đã học, đã nghiên cứu, đã thử nghiệm được trong quá trình làm việc và phát triển bản thân</li><li>Tạo được chút giá trị gì đó để chia sẻ cho cộng đồng</li><li>Không để 12 năm học Ngữ Văn uổng phí 🙈</li></ul><p>Quá trình trở thành lập trình viên của mình hoàn toàn thông qua các tutorial trên blog, Youtube… Mình rất trân trọng những người đã dành thời gian, tâm huyết để chia sẻ kiến thức tới cộng đồng như vậy, điều đó thật sự giúp ích rất nhiều cho những beginner như mình. Mình khao khát một ngày nào đó mình cũng có thể viết được những bài chia sẻ như vậy lại cho cộng đồng, cho những bạn beginner mới.</p><p>Nhưng vì tự cảm thấy kinh nghiệm, kiến thức của bản thân chưa nhiều nên cứ trì hoãn hết lần này đến lần khác, cho đến dạo gần đây tình cờ thấy <a href="https://thanhle.blog/">thanhle.blog</a> của anh Thành Lê, mình thật sự bị ấn tượng bởi technical skill, mindset và cả lối hành văn hóm hỉnh rất thu hút của ảnh, chính vì vậy mình đã về phòng, học đòi, mở máy, gõ gõ để cho ra blog này 👨🏽‍💻. Đây cũng có thể coi là một nơi note lại bản thân để thỉnh thoảng nhìn lại còn biết mình có đang phát triển hơn trước không hay suốt ngầy ấy thời gian vẫn giậm chân một chỗ?</p><h2 id="II-Chu-de-tren-blog-nay"><a href="#II-Chu-de-tren-blog-nay" class="headerlink" title="II. Chủ đề trên blog này"></a>II. Chủ đề trên blog này</h2><p>Công việc hiện tại của mình là một AI Engineer nên, tất nhiên rồi, các bài viết trên blog này sẽ chủ yếu về technical xoay quanh chuyên ngành và công việc của mình hàng ngày. Bên cạnh đó sẽ có một số chủ đề ngoài lề mà mình quan tâm như sách, phim ảnh, thể thao, <del>tán gái</del>… (Work life balance mà 🥸)</p><p>Mình nghĩ các bài viết sẽ được trình bày một cách ngắn gọn thôi (viết nhiều mỏi tay với sợ sai chính tả lắm ✍🏽), rất hy vọng bản thân mình sẽ giữ được thói quen viết bài lên đây, cho ra những bài có giá cho cộng đồng (một ít thôi cũng được 🥹)</p><p>Blog cũng có chức năng bình luận ấy, nếu thấy bài viết tốt hoặc chưa tốt đừng ngần ngại để lại một vài bình luận góp ý cho mình nhé. Thanks 🫵🫵🫵</p>]]>
    </content>
    <id>http://kudokhang.github.io/2023/05/20/Bai-Viet-Dau-Tien/</id>
    <link href="http://kudokhang.github.io/2023/05/20/Bai-Viet-Dau-Tien/"/>
    <published>2023-05-20T16:55:50.000Z</published>
    <summary>
      <![CDATA[<h2 id="I-Tai-sao-minh-lai-viet-blog-nay"><a href="#I-Tai-sao-minh-lai-viet-blog-nay" class="headerlink" title="I. Tại sao mình lại viết blo]]>
    </summary>
    <title>Bài viết đầu tiên</title>
    <updated>2026-02-13T04:01:49.000Z</updated>
  </entry>
</feed>
