<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Databases on miti99</title><link>https://miti99.com/tags/databases/</link><description>Recent content in Databases on miti99</description><generator>Hugo -- gohugo.io</generator><language>vi</language><lastBuildDate>Wed, 08 Jul 2026 09:22:18 +0700</lastBuildDate><atom:link href="https://miti99.com/tags/databases/index.xml" rel="self" type="application/rss+xml"/><item><title>Newsletter #85</title><link>https://miti99.com/post/2026/02/28/</link><pubDate>Sat, 28 Feb 2026 00:00:00 +0700</pubDate><guid>https://miti99.com/post/2026/02/28/</guid><description>&lt;p&gt;&lt;em&gt;Mời bạn thưởng thức Newsletter #85.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="how-i-use-claude-code"&gt;&lt;a class="link" href="https://boristane.com/blog/how-i-use-claude-code/" target="_blank" rel="noopener"
&gt;How I Use Claude Code&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Tác giả chia sẻ quy trình làm việc hiệu quả khi sử dụng Claude Code trong 9 tháng qua, với một nguyên tắc cốt lõi: không bao giờ để Claude viết mã cho đến khi bạn đã xem xét và phê duyệt một kế hoạch viết tay. Phương pháp này tách biệt hai giai đoạn tư duy và thực thi, giúp ngăn chặn sự lãng phí công sức, giữ người lập trình kiểm soát các quyết định kiến trúc, và tạo ra kết quả tốt hơn nhiều.&lt;/p&gt;
&lt;p&gt;Quy trình được chia thành ba giai đoạn chính. Giai đoạn Nghiên cứu bắt đầu bằng việc yêu cầu Claude đọc sâu phần cơ sở mã liên quan và viết báo cáo chi tiết vào tệp &lt;code&gt;research.md&lt;/code&gt;. Giai đoạn Lập kế hoạch tạo ra tệp &lt;code&gt;plan.md&lt;/code&gt; với hướng dẫn triển khai cụ thể. Điều thú vị nhất là Vòng lặp ghi chú (Annotation Cycle) - tác giả mở tệp kế hoạch trong trình soạn thảo và thêm ghi chú trực tiếp vào tài liệu để sửa các giả định sai, từ chối phương án không phù hợp, hoặc bổ sung kiến thức lĩnh vực. Quá trình này lặp lại 1-6 lần cho đến khi kế hoạch hoàn chỉnh.&lt;/p&gt;
&lt;p&gt;Giai đoạn Triển khai diễn ra sau khi mọi quyết định đã được xác nhận, với câu lệnh chuẩn yêu cầu Claude thực thi toàn bộ kế hoạch, đánh dấu hoàn thành từng tác vụ, chạy kiểm tra kiểu liên tục, và không dừng cho đến khi tất cả hoàn thành. Tác giả nhấn mạnh việc thực thi nên trở nên &amp;ldquo;nhàm chán&amp;rdquo; - công việc sáng tạo đã diễn ra trong các vòng lặp ghi chú, và khi kế hoạch đúng, thực thi phải thẳng tiến. Cách tiếp cận này loại triệt để các giả định sai được xây đắp chồng chất trong 15 phút, giúp người lập trình luôn ngồi ghế lái và đưa ra các quyết định quan trọng.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tách biệt tư duy và thực thi: luôn viết kế hoạch trước khi viết mã&lt;/li&gt;
&lt;li&gt;Vòng lặp ghi chú: thêm ghi chú trực tiếp vào kế hoạch để tinh chỉnh và sửa lỗi sai&lt;/li&gt;
&lt;li&gt;Tệp markdown làm trạng thái chia sẻ: giúp duy trì ngữ cảnh và quyết định&lt;/li&gt;
&lt;li&gt;Chạy trong một phiên dài: tận dụng tích lũy ngữ cảnh thay vì chia nhỏ phiên&lt;/li&gt;
&lt;li&gt;Giữ quyền kiểm soát: người lập trình đưa ra quyết định, Claude thực thi cơ khí&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="next-generation-db-ingestion-at-pinterest"&gt;&lt;a class="link" href="https://medium.com/pinterest-engineering/next-generation-db-ingestion-at-pinterest-66844b7153b7" target="_blank" rel="noopener"
&gt;Next-Generation DB Ingestion at Pinterest&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Pinterest chia sẻ hành trình xây dựng khung làm việc nhập liệu cơ sở dữ liệu thế hệ mới dựa trên Change Data Capture (CDC), thay thế hệ thống batch cũ kỹ gặp nhiều hạn chế. Hệ thống cũ có độ trễ dữ liệu cao (trên 24 giờ), xử lý kém hiệu quả do chạy full-table batch hàng ngày dù thay đổi thực tế dưới 5%, thiếu hỗ trợ xóa theo hàng cho tuân thủ, và phức tạp trong vận hành với nhiều quy trình độc lập.&lt;/p&gt;
&lt;p&gt;Giải pháp mới là khung làm việc thống nhất sử dụng Debezium/TiCDC, Kafka, Flink, Spark và Iceberg, cung cấp dữ liệu trong vài phút thay vì ngày, chỉ xử lý các bản ghi thay đổi để tiết kiệm chi phí, hỗ trợ xóa theo hàng và xử lý tăng dần. Kiến trúc gồm ba lớp chính: lớp CDC bắt thay đổi cơ sở dữ liệu với độ trễ dưới 1 giây và ghi vào Kafka; lớp Streaming (Flink) xử lý sự kiện gần thời gian thực vào bảng CDC Iceberg trên S3; lớp Batch (Spark) định kỳ lấy thay đổi từ bảng CDC và dùng &lt;code&gt;Merge Into&lt;/code&gt; để upsert vào bảng Iceberg cơ sở.&lt;/p&gt;
&lt;p&gt;Bài viết chi tiết nhiều tối ưu hóa quan trọng. Phân vùng bảng cơ sở bằng băm của khóa chính sử dụng hàm &lt;code&gt;bucket()&lt;/code&gt; giúp phân tán đều bản ghi và cải thiện hiệu suất upsert. Với vấn đề tệp nhỏ, thiết lập &lt;code&gt;WRITE DISTRIBUTED BY PARTITION&lt;/code&gt; giảm số lượng tệp nhỏ và cải thiện hiệu suất. Bucket Join cho các bảng lớn, sử dụng bảng tạm trung gian để bỏ qua toàn bộ thao tác trộn của bảng cơ sở, giúp giảm 40%+ chi phí tính toán và độ trễ đáng kể. Pinterest chọn Merge-on-Read (MOR) thay vì Copy-on-Write (COW) vì chi phí lưu trữ của COW cao hơn nhiều.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Từ batch sang CDC: giảm độ trễ từ 24 giờ xuống 15-60 phút&lt;/li&gt;
&lt;li&gt;Kiến trúc hai bảng: bảng CDC (append-only, &amp;lt;5 phút) và bảng cơ sở (snapshot, 15-60 phút)&lt;/li&gt;
&lt;li&gt;Tối ưu hóa phân vùng bucket: phân tán đều bản ghi, upsert song song hiệu quả&lt;/li&gt;
&lt;li&gt;Bucket Join với bảng tạm: giảm 40%+ chi phí tính toán&lt;/li&gt;
&lt;li&gt;Merge-on-Read: ưu tiên vì chi phí lưu trữ thấp hơn Copy-on-Write&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="thank-you-ai"&gt;&lt;a class="link" href="https://www.kraxel.org/blog/2026/01/thank-you-ai/" target="_blank" rel="noopener"
&gt;Thank you, AI&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Một câu chuyện ngắn về hậu quả không mong muốn của AI scrapers. Tác giả đã chạy máy chủ git tự lưu trữ công khai từ năm 2011 (và CVS trước đó), nhưng buộc phải đóng cửa sau khi các bot AI tấn công giao diện cgit với hàng loạt yêu cầu vô bổ đến mức &amp;ldquo;gây chết&amp;rdquo; máy chủ. Thay vì chiến đấu với scrapers, tác giả quyết định chuyển tất cả kho lưu trữ sang GitLab và GitHub - hầu hết đã có bản sao sẵn ở đó.&lt;/p&gt;
&lt;p&gt;Điều đáng chú ý là ngay cả khi dịch vụ git đã bị tắt, AI scrapers vẫn tiếp tục tấn công. Hàng triệu phản hồi 404 không đủ để thuyết phục bot rằng dịch vụ cgit không còn tồn tại, và các tệp nhật ký đã lấp đầy đĩa nhanh đến mức logrotate không kịp xử lý, gây ra một lần sự cố khác. Tác giả đã di chuyển blog từ WordPress sang Jekyll từ 2018 nên là các trang tĩnh, ít bị ảnh hưởng hơn, nhưng vẫn phải điều chỉnh cấu hình logrotate để ngăn vấn đề tương tự. Câu chuyện này là lời nhắc nhở về tác động của AI scrapers đối với các dịch vụ tự lưu trữ quy mô nhỏ.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI scrapers tấn công máy chủ git tự lưu trữ đến mức không thể phục hồi&lt;/li&gt;
&lt;li&gt;Chuyển sang GitLab/GitHub thay vì xây dựng lại máy chủ&lt;/li&gt;
&lt;li&gt;Scrapers vẫn tiếp tục gửi yêu cầu sau khi dịch vụ tắt, lấp đầy đĩa bằng nhật ký&lt;/li&gt;
&lt;li&gt;Trang tĩnh (Jekyll) an toàn hơn trang động (WordPress)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="java-ui-in-2026-the-complete-guide"&gt;&lt;a class="link" href="https://robintegg.com/2026/02/08/java-ui-in-2026-the-complete-guide" target="_blank" rel="noopener"
&gt;Java UI in 2026: The Complete Guide&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Hướng dẫn toàn diện về các framework UI Java năm 2026, bao phủ web, desktop, mobile và terminal interfaces. Tác giả khẳng định đây không phải là các dự án lỗi thời (legacy) mà là công nghệ production-ready, được bảo trì actively và đang chạy tại các doanh nghiệp lớn, phục vụ hàng triệu người dùng trên toàn thế giới.&lt;/p&gt;
&lt;p&gt;Bài viết phân loại frameworks theo 4 nhóm chính. Web UI có Vaadin (server-driven, viết toàn bộ bằng Java), Apache Wicket (component-oriented từ 2004), TeaVM (biên dịch Java bytecode sang JavaScript/WebAssembly), HTMX + Spring Boot (hypermedia-driven), j2html (type-safe HTML builder) và PrimeFaces (thư viện 100+ component cho Jakarta EE). Desktop UI có JavaFX (tiêu chuẩn hiện đại với CSS styling), JCEF (wrapper Chromium), Swing với FlatLaf (được làm mới), và Eclipse RCP/NetBeans Platform cho ứng dụng mô-đun phức tạp. Mobile có Codename One (write-once-run-anywhere, cloud builds, không cần Mac cho iOS) và Gluon Mobile (mở rộng JavaFX với GraalVM). Terminal có JLine (console input) và Lanterna (GUI toolkit cho terminal).&lt;/p&gt;
&lt;p&gt;Insights quan trọng: Java UI ecosystem mạnh mẽ và production-ready, không còn là legacy technology. Frameworks hiện đại tập trung vào developer experience, type safety và native performance. Java vẫn là lựa chọn hàng đầu cho enterprise applications nhờ tính ổn định và hiệu năng, với sự phân biệt rõ ràng giữa server-driven (Vaadin), client-side (TeaVM) và hybrid approaches.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java UI production-ready: không phải legacy, đang chạy tại doanh nghiệp lớn&lt;/li&gt;
&lt;li&gt;Web UI đa dạng: từ server-driven (Vaadin) đến client-side (TeaVM)&lt;/li&gt;
&lt;li&gt;Desktop hiện đại: JavaFX là tiêu chuẩn, Swing được hồi sinh với FlatLaf&lt;/li&gt;
&lt;li&gt;Mobile thực tế: Codename One và Gluon Mobile giúp viết Java cho iOS/Android&lt;/li&gt;
&lt;li&gt;Terminal UI: JLine và Lanterna cho console applications&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="java-full-stack-development-in-2026"&gt;&lt;a class="link" href="https://www.ophion.org/2026/02/java-full-stack-development-in-2026/" target="_blank" rel="noopener"
&gt;Java Full Stack Development in 2026&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Tác giả chia sẻ kinh nghiệm chuyển đổi ứng dụng &lt;a class="link" href="https://www.scanii.com" target="_blank" rel="noopener"
&gt;www.scanii.com&lt;/a&gt; từ stack webpack+TypeScript+Spring Boot truyền thống sang kiến trúc đơn giản hơn với server-side rendering, đạt được nhiều cải thiện đáng kể: codebase được hợp nhất với đơn giản &amp;ldquo;Run&amp;rdquo; target trong IntelliJ, thời gian build frontend giảm xuống 0 với tự động reload, partial page rendering như SPA nhưng vẫn có thể dùng React nếu muốn, 100 điểm Lighthouse performance score, và dễ debug hơn không cần source maps hay transpilation.&lt;/p&gt;
&lt;p&gt;Ba bước chính để di chuyển: Chọn template engine (tác giả dùng JTE vì có toàn bộ JDK trong template và view model map tốt với Page objects), loại bỏ bundler và sử dụng importmaps (chuẩn HTML) thay vì webpack/TypeScript, kết hợp với webjars để serve dependencies trực tiếp từ Spring Boot mà không cần CDN bên thứ ba. Cung cấp tính tương tác với Turbo và Stimulus từ Hotwire.dev (theo hướng dẫn của Rails) để đạt automatic partial page updates và familiar MVC framework cho JavaScript vẫn cần thiết.&lt;/p&gt;
&lt;p&gt;Pain points và giải pháp: Thiếu HOT Reloading được giải quyết bằng logic tối giản client-side (poll server changes) và server-side (monitor filesystem changes), nhanh hơn solution frontend trước đó. CSRF protection trở nên phức tạp với server-side rendering vì Spring Security relied on random tokens trong mỗi form, gây vấn đề với Turbo page caching. Tác giả build custom CSRF filter dựa trên header Sec-Fetch-Site, không cần tokens trong templates hay issues với partial page reloads.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Server-side rendering: codebase hợp nhất, build time 0, debug dễ dàng hơn&lt;/li&gt;
&lt;li&gt;Importmaps thay vì bundler: theo chuẩn HTML, kết hợp webjars serve dependencies từ Spring Boot&lt;/li&gt;
&lt;li&gt;Turbo + Stimulus: partial page updates như SPA mà không cần React&lt;/li&gt;
&lt;li&gt;CSRF custom filter: dùng Sec-Fetch-Site header thay vì tokens&lt;/li&gt;
&lt;li&gt;Small teams: phù hợp cho team generalist thay vì specialized teams&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sharding-databases-with-spring-boot-patterns-pitfalls-and-failure-modes"&gt;&lt;a class="link" href="https://dev.to/adamthedeveloper/sharding-databases-with-spring-boot-patterns-pitfalls-and-failure-modes-4p37" target="_blank" rel="noopener"
&gt;Sharding Databases with Spring Boot: Patterns, Pitfalls, and Failure Modes&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Hướng dẫn chi tiết về triển khai sharding database sử dụng Spring Boot - kỹ thuật phân tán dữ liệu quan trọng để giải quyết vấn đề hiệu quả và khả năng mở rộng của các ứng dụng lớn. Bài viết đề cập các pattern chính: Sharding theo chiều ngang (phân tán dữ liệu dựa trên trường cụ thể như user ID đến nhiều database/table khác nhau), Sharding theo chiều dọc (phân tán theo logic kinh doanh, mỗi shard xử lý nhóm chức năng riêng), và Sharding logic sử dụng thuật toán hash modulo để định tuyến dữ liệu đến shard phù hợp.&lt;/p&gt;
&lt;p&gt;Các vấn đề và lỗi phổ biến khi sharding: SQL không tương thích vì các truy vấn hoạt động tốt trên database đơn có thể lỗi trên hệ thống sharding, distributed transaction dựa trên XA không đảm bảo hiệu quả trong môi trường cao đồng thời, độ phức tạp quản lý tăng lên khi phải xác định database/table để truy xuất dữ liệu, và thách thức truy vấn chéo khi cần kết hợp giữa các shard yêu cầu tổng hợp dữ liệu. Giới hạn số lượng shard quan trọng vì quá nhiều shard dẫn đến hiệu suất kém do tổng hợp dữ liệu.&lt;/p&gt;
&lt;p&gt;Khuyến nghị và thực hành tốt nhất: Ưu tiên transaction đơn database, có thể sử dụng transaction cục bộ trong cùng database để tránh distributed transaction. Cẩn thận với phụ thuộc phiên bản vì lỗi tương thích giữa Spring Boot và ShardingSphere thường gặp. Cấu hình minh bạch sử dụng Spring Boot Starter để quản lý cấu hình sharding hiệu quả. Theo dõi hiệu suất để đảm bảo việc sharding thực sự cải thiện hiệu suất không gây thêm độ trễ.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ba pattern sharding: ngang (theo trường), dọc (theo logic), logic (hash modulo)&lt;/li&gt;
&lt;li&gt;Pitfalls phổ biến: SQL không tương thích, XA transaction kém hiệu quả, độ phức tạp tăng&lt;/li&gt;
&lt;li&gt;Cross-shard queries: thách thức tổng hợp dữ liệu từ nhiều shard&lt;/li&gt;
&lt;li&gt;Giới hạn shard: quá nhiều shard làm giảm hiệu suất do tổng hợp&lt;/li&gt;
&lt;li&gt;Transaction cục bộ: ưu tiên single-DB transaction thay vì distributed&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="go-made-me-fast-rust-made-me-care-aws-made-me-pay"&gt;&lt;a class="link" href="https://dev.to/tirixa-hub/go-made-me-fast-rust-made-me-care-aws-made-me-pay-2f82" target="_blank" rel="noopener"
&gt;Go Made Me Fast, Rust Made Me Care, AWS Made Me Pay&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết thảo luận về lựa chọn ngôn ngữ lập trình cho kiến trúc cloud, tập trung vào sự đánh đổi giữa Go và Rust khi hệ thống phát triển từ &amp;ldquo;hợp lý&amp;rdquo; thành &amp;ldquo;đắt tiền&amp;rdquo;. Tác giả chia sẻ kinh nghiệm thực tế về sự khác biệt giữa hai ngôn ngữ trong bối cảnh AWS, nơi chi phí được tính theo chu kỳ CPU, lượng bộ nhớ và lưu lượng mạng.&lt;/p&gt;
&lt;p&gt;Go giúp phát triển nhanh với mô hình đồng trình đơn giản, thư viện chuẩn mạnh mẽ và dự đoán được. Tuy nhiên bộ thu gom rác (GC) của Go trở thành điểm yếu khi hệ thống mở rộng - nó yêu cầu bộ nhớ phụ, tiêu tốn CPU và gây độ trễ không đáng tin cậy. Rust không phải là phép màu tốc độ, mà buộc nhà phát triển phải đối mặt với các vấn đề cấp thấp như phân bổ bộ nhớ, sở hữu dữ liệu và hành vi cache. Điều này dẫn đến thiết kế hệ thống hiệu quả hơn với bộ nhớ ổn định, độ trễ nhất quán và mật độ container cao hơn.&lt;/p&gt;
&lt;p&gt;AWS đóng vai trò như thực tế khắc nghiệt - nó không quan tâm đến trải nghiệm nhà phát triển, chỉ tính phí theo tài nguyên sử dụng. Sự khác biệt chi phí không nằm ở ngôn ngữ mà ở hiệu quả sử dụng tài nguyên. Bài học quan trọng: Go vẫn hoàn hảo cho API và logic nghiệp vụ, trong khi Rust phù hợp cho đường dẫn dữ liệu cao throughput. Điểm ngọt ngào là sử dụng cả hai ngôn ngữ một cách có chủ đích, với Rust trong các phần nhạy cảm hiệu năng để tối ưu hóa hóa đơn AWS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go nhanh phát triển: GC đơn giản, thư viện mạnh, nhưng GC overhead khi scale&lt;/li&gt;
&lt;li&gt;Rust ép tư duy: đối mặt vấn đề cấp thấp, thiết kế hiệu quả hơn, bộ nhớ ổn định&lt;/li&gt;
&lt;li&gt;AWS tính phí thực tế: không quan tâm DX, chỉ tính CPU/memory/network&lt;/li&gt;
&lt;li&gt;Hybrid approach: Go cho API/business logic, Rust cho high-throughput data paths&lt;/li&gt;
&lt;li&gt;Sweet spot: Rust tối ưu phần nhạy cảm hiệu năng để giảm hóa đơn AWS&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-cloud-is-not-your-computer-why-go-and-rust-developers-secretly-miss-the-monolith"&gt;&lt;a class="link" href="https://dev.to/tirixa-hub/the-cloud-is-not-your-computer-why-go-and-rust-developers-secretly-miss-the-monolith-594c" target="_blank" rel="noopener"
&gt;The Cloud Is Not Your Computer: Why Go and Rust Developers Secretly Miss the Monolith&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết phân tích sự thật rằng đám mây không phải là máy tính của bạn mà là một cuộc đàm phán phức tạp. Tác giả trải nghiệm qua nhiều nền tảng từ bare metal đến AWS và nhận ra rằng dù viết code Go hay Rust cảm thấy kiểm soát được thì khi triển khai lên cloud, mọi thứ trở nên bất định. Sự khác biệt chính giữa cloud và máy tính cục bộ là: máy tính cục bộ cho cảm giác kiểm soát trực tiếp, còn cloud khiến bạn đang thuê xác suất chứ không phải chạy phần mềm.&lt;/p&gt;
&lt;p&gt;Go - ngôn ngữ của những người lạc quan - thừa nhận thất bại như một giá trị, trong khi Rust - ngôn ngữ của những người kiểm soát cực đoan - đòi hỏi sự chính xác biên dịch. Các nhà phát triển trầm trồ kiến trúc monolith vì chúng có thể dự đoán, triển khai và hiểu được. Khi có lỗi, họ chỉ cần SSH vào một máy, kiểm tra log và sửa. Ngày nay họ phải mở nhiều công cụ giám sát khác nhau mà vẫn không hiểu tại sao 503 xảy ra.&lt;/p&gt;
&lt;p&gt;Bài học rút ra là Go và Rust đang phát triển mạnh trong cloud vì chúng là ngôn ngữ trung thực trong môi trường không trung thực. Go đón nhận thất bại như một giá trị, Rust thực thi sự chính xác tại thời điểm biên dịch. Đám mây là hỗn loạn, còn Go và Rust là kỷ luật. Sự căng thẳng đó chính là lý do chúng thuộc về nhau. Cloud là về quản lý sự bất định, không phải kiểm soát - và Go, Rust là công cụ tốt nhất để điều hướng sự bất định đó.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloud vs máy tính: cloud là thuê xác suất, không phải chạy phần mềm&lt;/li&gt;
&lt;li&gt;Monolith đáng nhớ: dự đoán được, SSH vào máy để debug, dễ hiểu&lt;/li&gt;
&lt;li&gt;Microservices chaos: nhiều công cụ giám sát, vẫn không hiểu tại sao 503&lt;/li&gt;
&lt;li&gt;Go lạc quan: thừa nhận thất bại như giá trị, handle gracefully&lt;/li&gt;
&lt;li&gt;Rust kiểm soát: thực thi chính xác tại compile, catch errors sớm&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="bonus"&gt;Bonus
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Hình ảnh:&lt;/strong&gt;
&lt;img src="https://substackcdn.com/image/fetch/$s_!V-F7!,w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57c857fb-0db2-4701-93f7-343fac614657_2250x2862.png"
loading="lazy"
alt="Must-Know Software Architecture Patterns"
&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Bài viết đã được review và cập nhật bởi Claude Code với Opus 4.7 (1M context).&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Newsletter #80</title><link>https://miti99.com/post/2026/02/03/</link><pubDate>Tue, 03 Feb 2026 00:00:00 +0700</pubDate><guid>https://miti99.com/post/2026/02/03/</guid><description>&lt;p&gt;&lt;em&gt;Mời bạn thưởng thức Newsletter #80.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="thư-mục-kỹ-năng-của-tác-nhân"&gt;&lt;a class="link" href="https://www.skills.sh/" target="_blank" rel="noopener"
&gt;Thư Mục Kỹ Năng Của Tác Nhân&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Skills.sh là một hệ sinh thái mở dành cho các kỹ năng của tác nhân trí tuệ nhân tạo, nơi tập hợp hàng ngàn kỹ năng có thể tái sử dụng để nâng cao khả năng của các tác nhân trí tuệ nhân tạo. Mỗi kỹ năng là một khả năng chuyên biệt có thể được cài đặt chỉ với một lệnh duy nhất, giúp các tác nhân trí tuệ nhân tạo tiếp cận các kiến thức quy trình chuẩn hóa.&lt;/p&gt;
&lt;p&gt;Trang web cung cấp bảng xếp hạng các kỹ năng phổ biến nhất với số lần cài đặt thực tế, cho phép người dùng dễ dàng tìm kiếm và khám phá các kỹ năng phù hợp với nhu cầu của mình. Các kỹ năng hàng đầu bao gồm các công cụ tìm kiếm kỹ năng, hướng dẫn tốt nhất cho React và Next.js, các quy trình thiết kế web, và nhiều kỹ năng khác liên quan đến phát triển giao diện, máy chủ, kiểm thử, và vận hành.&lt;/p&gt;
&lt;p&gt;Điểm đặc biệt của hệ sinh thái này là tính cộng đồng và khả năng mở rộng - bất kỳ ai cũng có thể đóng góp và chia sẻ các kỹ năng của mình, tạo nên một kho tàng kiến thức tập thể liên tục phát triển. Các tác nhân có thể tận dụng các kỹ năng này để thực hiện các tác vụ phức tạp một cách chuyên nghiệp và hiệu quả hơn, từ viết mã, kiểm thử, đến triển khai và vận hành.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kho kỹ năng mở với hàng ngàn kỹ năng có thể cài đặt bằng một lệnh&lt;/li&gt;
&lt;li&gt;Bảng xếp hạng theo số lần cài đặt và xu hướng 24 giờ&lt;/li&gt;
&lt;li&gt;Hỗ trợ nhiều loại tác nhân và khung làm việc phổ biến&lt;/li&gt;
&lt;li&gt;Cộng đồng sôi nổi với các kỹ năng từ Vercel, Anthropic, Expo, Supabase&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="kết-quả-khảo-sát-nhà-phát-triển-go-2025"&gt;&lt;a class="link" href="https://go.dev/blog/survey2025" target="_blank" rel="noopener"
&gt;Kết quả Khảo sát Nhà phát triển Go 2025&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Go Team đã công bố kết quả khảo sát nhà phát triển Go năm 2025 với dữ liệu từ 5.379 người tham gia. Khảo sát lần này tập trung vào cảm nhận của nhà phát triển về ngôn ngữ Go, các trường hợp sử dụng, thách thức và môi trường phát triển.&lt;/p&gt;
&lt;p&gt;Ba phát hiện quan trọng nhất từ khảo sát: các nhà phát triển Go cần hỗ trợ về việc xác định và áp dụng các phương pháp tốt nhất, tận dụng tối đa thư viện chuẩn, và mở rộng ngôn ngữ với các tính năng hiện đại hơn. Hầu hết các nhà phát triển Go hiện đang sử dụng công cụ phát triển hỗ trợ bởi trí tuệ nhân tạo khi tìm kiếm thông tin hoặc viết mã lặp lại, nhưng mức độ hài lòng chỉ ở mức trung bình do lo ngại về chất lượng mã nguồn. Một tỷ lệ đáng ngạc nhiên là số người tham gia cho biết họ thường xuyên cần xem lại tài liệu cho các lệnh go cơ bản như &lt;code&gt;go build&lt;/code&gt;, &lt;code&gt;go run&lt;/code&gt;, và &lt;code&gt;go mod&lt;/code&gt;, cho thấy có chỗ cải thiện lớn cho hệ thống trợ giúp của lệnh &lt;code&gt;go&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Về mức độ hài lòng, 91% người tham gia cho biết họ hài lòng khi làm việc với Go, trong đó gần 2/3 là &amp;ldquo;rất hài lòng&amp;rdquo;. Con số này đã ổn định kể từ năm 2019. Các trường hợp sử dụng chính vẫn là dòng lệnh và dịch vụ ứng dụng lập trình, với 55% người tham gia xây dựng cả hai. Hơn 1/3 xây dựng công cụ cơ sở hạ tầng đám mây, và 11% làm việc với các mô hình máy học, công cụ, hoặc tác nhân.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;91% nhà phát triển Go hài lòng với ngôn ngữ, mức ổn định kể từ năm 2019&lt;/li&gt;
&lt;li&gt;53% người tham gia sử dụng công cụ trí tuệ nhân tạo hàng ngày nhưng chỉ 13% &amp;ldquo;rất hài lòng&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Thách thức lớn nhất: tuân thủ điển lệ Go, thiếu tính năng từ ngôn ngữ khác, tìm mô-đun tin cậy&lt;/li&gt;
&lt;li&gt;60% phát triển trên macOS, 58% trên Linux, 96% triển khai lên hệ thống dựa trên Linux&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="một-đánh-giá-trung-thực-về-go"&gt;&lt;a class="link" href="https://benraz.dev/blog/golang_review.html" target="_blank" rel="noopener"
&gt;Một Đánh Giá Trung Thực Về Go&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết này chia sẻ trải nghiệm cá nhân của tác giả sau vài tháng làm việc với Go, với cái nhìn từ một người có nền tảng Rust. Tác giả phân tích những điểm mạnh và điểm yếu của ngôn ngữ này từ góc nhìn thực tế.&lt;/p&gt;
&lt;p&gt;Về điểm mạnh, Go làm rất tốt việc xử lý đồng thời với goroutines và channels được tích hợp sâu vào ngôn ngữ, tránh được vấn đề &amp;ldquo;colored functions&amp;rdquo; mà nhiều ngôn ngữ khác gặp phải. Hệ thống kiểu đơn giản, không cho phép kế thừa phức tạp, với struct embedding là một tính năng thú vị. Các giao diện trong Go không cần được triển khai một cách rõ ràng, giúp giảm mã soạn sẵn. Cú pháp của Go cũng được đánh giá là gọn gàng, với quy tắc khả kiến dựa trên chữ hoa chữ thường rất trực quan.&lt;/p&gt;
&lt;p&gt;Tuy nhiên, tác giả cũng chỉ ra những điểm yếu đáng kể. Thiếu kiểu liệt kê thực sự là một vấn đề lớn - giải pháp thay thế với hằng số và iota không đảm bảo an toàn kiểu và không có kiểm tra đầy đủ. Go cũng thiếu bất biến đúng đắn: hằng số chỉ hoạt động với giá trị thời gian biên dịch, còn biến bình thường thì có thể bị biến đổi bất cứ lúc nào. Hệ thống xử lý lỗi tuy đơn giản nhưng không thực sự hữu dụng - kiểu lỗi chỉ là một giao diện với phương thức Error(), khiến việc xử lý lỗi theo loại trở nên khó khăn, đôi khi phải phân tích chuỗi để xác định loại lỗi.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Goroutines và channels là một trong những mô hình đồng thời tốt nhất hiện có&lt;/li&gt;
&lt;li&gt;Hệ thống kiểu đơn giản, giao diện không cần triển khai rõ ràng&lt;/li&gt;
&lt;li&gt;Thiếu kiểu liệt kê thực sự với kiểm tra đầy đủ&lt;/li&gt;
&lt;li&gt;Hằng số chỉ là thời gian biên dịch, không có bất biến thực sự cho giá trị thời gian chạy&lt;/li&gt;
&lt;li&gt;Xử lý lỗi thiếu thông tin kiểu, thường phải phân tích chuỗi lỗi&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="những-thách-thức-của-soft-delete"&gt;&lt;a class="link" href="https://atlas9.dev/blog/soft-delete.html" target="_blank" rel="noopener"
&gt;Những Thách Thức Của Soft Delete&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết này phân tích các vấn đề của mẫu xóa mềm phổ biến (thêm cột &lt;code&gt;archived_at&lt;/code&gt; hoặc &lt;code&gt;deleted&lt;/code&gt; vào bảng) và đề xuất các giải pháp thay thế. Tác giả chỉ ra rằng xóa mềm tuy đơn giản ban đầu nhưng tạo ra nhiều phức tạp: dữ liệu chết tích lũy trong cơ sở dữ liệu, truy vấn phải luôn lọc bỏ các bản ghi đã lưu trữ, việc di chuyển dữ liệu trở nên phức tạp, và việc khôi phục không đơn giản như chỉ đặt &lt;code&gt;archived_at = null&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Tác giả đề xuất ba giải pháp thay thế cho PostgreSQL. Cách đầu tiên là lưu trữ ở cấp ứng dụng - phát ra sự kiện khi xóa và lưu trữ ở dịch vụ khác. Cách thứ hai là sử dụng trình kích hoạt để sao chép các hàng vào bảng lưu trữ trước khi xóa. Cách thứ ba là Thu thập dữ liệu thay đổi dựa trên nhật ghi trước với Debezium hoặc các công cụ tương tự. Mỗi cách đều có sự đánh đổi riêng về độ phức tạp vận hành, độ tin cậy, và chi phí hạ tầng.&lt;/p&gt;
&lt;p&gt;Nếu bắt đầu dự án mới hôm nay, tác giả sẽ chọn cách tiếp cận dựa trên trình kích hoạt vì đơn giản thiết lập, giữ bảng chính sạch sẽ, và không cần thêm hạ tầng phức tạp. Bảng lưu trữ dễ truy vấn khi cần và dễ bỏ qua khi không dùng.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Xóa mềm với &lt;code&gt;archived_at&lt;/code&gt; tạo ra nhiều phức tạp: truy vấn phức tạp, dữ liệu chết tích lũy, di chuyển dữ liệu khó khăn&lt;/li&gt;
&lt;li&gt;Lưu trữ ở cấp ứng dụng: đơn giản cho cơ sở dữ liệu nhưng dễ mất dữ liệu nếu có lỗi, hạ tầng phức tạp&lt;/li&gt;
&lt;li&gt;Cách tiếp cận dựa trên trình kích hoạt: đơn giản, giữ bảng sạch, lưu trữ dễ truy vấn và dọn dẹp&lt;/li&gt;
&lt;li&gt;Thu thập dữ liệu thay đổi (Debezium): không thay đổi mã ứng dụng nhưng hạ tầng phức tạp&lt;/li&gt;
&lt;li&gt;Bản sao không xử lý DELETE: ý tưởng mới, chưa kiểm tra, có thể hoạt động cho lưu trữ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="được-trả-lương-tối-thiểu-để-giải-một-bài-toán-bất-khả-thi"&gt;&lt;a class="link" href="https://tiespetersen.substack.com/p/i-got-paid-minimum-wage-to-solve" target="_blank" rel="noopener"
&gt;Được Trả Lương Tối Thiểu Để Giải Một Bài Toán Bất Khả Thi&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết này kể về câu chuyện có thật của tác giả - một sinh viên khoa học máy tính được trả lương tối thiểu để lau cửa hàng Albert Heijn. Thay vì làm công việc một cách bình thường, tác giả đã biến nó thành một bài toán tối ưu hóa: chuyển bản đồ cửa hàng thành đồ thị, xây dựng trình soạn thảo trực quan bằng Processing, và viết bộ tối ưu hóa lộ trình bằng C++ sử dụng thuật toán luyện giả kim.&lt;/p&gt;
&lt;p&gt;Tuy nhiên, giải pháp đầu tiên của thuật toán là một thảm họa - một con đường ngắn nhất về mặt kỹ thuật nhưng hoàn toàn vô dụng trong thực tế với hàng десят rẽ sắc góc. Tác giả nhận ra mình đang tối ưu hóa sai thứ: khoảng cách không phải là tất cả, số lần rẽ quay quan trọng hơn, đà chuyển động quan trọng hơn. Sau khi thêm &amp;ldquo;hình phạt rẽ&amp;rdquo; vào hàm chi phí, thuật toán tạo ra những con đường mượt mà hơn dù dài hơn một chút.&lt;/p&gt;
&lt;p&gt;Bài viết mở rộng bài học này sang nhiều khía cạnh khác của cuộc sống. Các thuật toán mạng xã hội tối ưu hóa cho mức độ tương tác chứ không phải hạnh phúc. Các thuật toán gợi ý tối ưu hóa cho thời gian xem khiến người dùng xem các lý thuyết âm mưu 6 tiếng liên tục. Các mô hình ngôn ngữ lớn tối ưu hóa cho việc nghe có tự tin chứ không phải đúng sự thật. Các doanh nghiệp tối ưu hóa cho lợi nhuận mà bỏ qua môi trường và đạo đức. Sự chính xác về mặt kỹ thuật là vô giá trị nếu bạn đang giải sai vấn đề.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thuật toán luyện giả kim có thể giải bài toán người bán du lịch cho việc lau nhà siêu thị&lt;/li&gt;
&lt;li&gt;Tối ưu hóa sai chỉ số (khoảng cách) tạo ra giải pháp kỹ thuật hoàn hảo nhưng thực tế vô dụng&lt;/li&gt;
&lt;li&gt;Lộ trình A ngắn nhất nhưng không thể đi được; lộ trình B dài hơn nhưng thực tế&lt;/li&gt;
&lt;li&gt;Mạng xã hội, hệ thống gợi ý, LLM đều tối ưu hóa cho sai mục tiêu&lt;/li&gt;
&lt;li&gt;Sự chính xác kỹ thuật vô nghĩa nếu đang giải sai vấn đề từ đầu&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="hoàn-thành-lệnh-trong-intellij-idea-ít-phím-tắt-hơn"&gt;&lt;a class="link" href="https://foojay.io/today/command-completion-intellij-idea/" target="_blank" rel="noopener"
&gt;Hoàn Thành Lệnh Trong IntelliJ IDEA Ít Phím Tắt Hơn&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết giới thiệu tính năng hoàn thành lệnh mới trong IntelliJ IDEA - một phần mở rộng của tính năng hoàn thành mã thông thường cho phép người dùng khám phá và thực thi các hành động của môi trường phát triển tích hợp ngay từ trình soạn thảo mà không cần nhớ các phím tắt. Thay vì phải nhớ hàng tá phím tắt, bạn chỉ cần gõ &lt;code&gt;.&lt;/code&gt; để xem các lệnh trong danh sách hoàn thành thông thường hoặc &lt;code&gt;..&lt;/code&gt; để chỉ xem các lệnh.&lt;/p&gt;
&lt;p&gt;Tính năng này giúp sửa lỗi và cảnh báo trong mã, thực hiện các hành động ở cấp tệp hoặc cấp lớp như định dạng lại mã hoặc tối ưu hóa nhập khẩu, hỗ trợ tái cấu trúc và biến đổi mã như tạo lớp, phương thức, trường, hoặc chuyển đổi lớp thành bản ghi. Bạn cũng có thể dùng nó để điều hướng, đổi tên lớp, và thậm chí thêm JavaDoc. Một số lệnh còn có bí danh giúp bạn không cần nhớ tên chính xác.&lt;/p&gt;
&lt;p&gt;Hoàn thành lệnh bổ sung cho các tính năng hiện có như hoàn thành hậu tố và mẫu trực tiếp, giữ cho bạn trong trạng thái lập trình mượt mà. Bạn có thể tập trung vào những gì mình muốn làm thay vì làm thế nào để làm. Tính năng này giúp khám phá các tính năng mạnh mẽ mà bạn có thể chưa từng biết đến.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gõ &lt;code&gt;..&lt;/code&gt; để xem tất cả các lệnh có sẵn trong ngữ cảnh hiện tại&lt;/li&gt;
&lt;li&gt;Sửa lỗi, cảnh báo, thực hiện hành động cấp tệp mà không cần nhớ phím tắt&lt;/li&gt;
&lt;li&gt;Hỗ trợ tái cấu trúc, tạo mã, biến đổi mã sang Java hiện đại&lt;/li&gt;
&lt;li&gt;Có thể dùng trong tệp chỉ đọc sau khi bật trong cài đặt&lt;/li&gt;
&lt;li&gt;Bí danh cho các lệnh giúp không cần nhớ tên chính xác&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="bonus"&gt;Bonus
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Images:&lt;/strong&gt;
&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/8d53556e-5fbc-4ceb-ac64-cc5f3b211c5d_2250x2624.png"
loading="lazy"
alt="The Must-Know Fundamentals of Distributed Systems"
&gt;
&lt;img src="https://substackcdn.com/image/fetch/$s_!yb_V!,w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16cec58a-02f8-4daf-8669-d1208ac5fc18_2360x2960.jpeg"
loading="lazy"
alt="What Happens When You Enter Google.com"
&gt;
&lt;img src="https://substackcdn.com/image/fetch/$s_!LIIv!,w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F631f49cf-2eff-4941-ba22-b2c482eb24ec_2360x2960.png"
loading="lazy"
alt="Understanding the Linux Directory Structure"
&gt;
&lt;img src="https://substackcdn.com/image/fetch/$s_!gxq4!,w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11498f7e-5457-425f-9d50-90f5ebc31187_2360x2960.jpeg"
loading="lazy"
alt="Symmetric vs. Asymmetric Encryption"
&gt;
&lt;img src="https://substackcdn.com/image/fetch/$s_!XFaF!,w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5140ecd2-ac9e-46d1-bde6-00f727309778_800x1003.jpeg"
loading="lazy"
alt="Network Troubleshooting Test Flow"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Videos:&lt;/strong&gt;
&lt;a class="link" href="https://www.youtube.com/watch?v=oP6DS_x5K0Y" target="_blank" rel="noopener"
&gt;Tác Nhân Trí Tuệ Nhân Tạo Là Gì &amp;amp; Chúng Hoạt Động Như Thế Nào?&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Bài viết đã được review và cập nhật bởi Claude Code với Opus 4.7 (1M context).&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Newsletter #78</title><link>https://miti99.com/post/2026/02/01/</link><pubDate>Sun, 01 Feb 2026 00:00:00 +0700</pubDate><guid>https://miti99.com/post/2026/02/01/</guid><description>&lt;p&gt;&lt;em&gt;Mời bạn thưởng thức Newsletter #78.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="hai-năm-tới-của-kỹ-thuật-phần-mềm"&gt;&lt;a class="link" href="https://addyosmani.com/blog/next-two-years/" target="_blank" rel="noopener"
&gt;Hai Năm Tới Của Kỹ Thuật Phần Mềm&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Ngành công nghệ đang đứng trước một điểm ngoặt quan trọng. AI coding đã phát triển từ autocomplete đơn thuần thành các agent có thể tự thực hiện nhiệm vụ phát triển. Sự bùng nổ kinh tế từng thúc đẩy làn sóng tuyển dụng đã nhường chỗ cho yêu cầu hiệu quả: công ty giờ ưu tiên lợi nhuận hơn tăng trưởng, nhân viên giàu kinh nghiệm hơn người mới tốt nghiệp, và team nhỏ hơn nhưng được trang bị công cụ tốt hơn.&lt;/p&gt;
&lt;p&gt;Bài viết khám phá năm câu hỏi then chốt sẽ định hình kỹ thuật phần mềm đến năm 2026, với hai kịch bản đối lập cho mỗi câu hỏi. Đây không phải dự báo, mà là những lăng kính để chuẩn bị: (1) Vấn đề junior developer - tuyển dụng có thể sụt giảm khi AI tự động hóa nhiệm vụ cấp nhập môn, hoặc hồi phục khi phần mềm lan rộng mọi ngành; (2) Vấn đề kỹ năng - kỹ năng lập trình cốt lõi có thể teo đi khi AI viết phần lớn code, hoặc trở nên quan trọng hơn khi developer tập trung vào giám sát; (3) Vấn đề vai trò - vai trò developer có thể thu hẹp thành kiểm toán code AI, hoặc mở rộng thành kiến trúc sư điều phối hệ thống; (4) Chuyên gia hay đa năng - chuyên gia hẹp có nguy cơ bị thay thế, T-shaped engineer (biết rộng một chút, sâu một vài lĩnh vực) sẽ được ưu tiên; (5) Vấn đề giáo dục - bằng CS có còn là tiêu chuẩn vàng hay bị các lộ trình học nhanh hơn (bootcamp, online platform, training nội bộ) vượt mặt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;84% developer dùng AI support thường xuyên, chuyển từ &amp;ldquo;viết code từ đầu&amp;rdquo; sang &amp;ldquo;soạn prompt và ghép các mảnh AI-generated&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Harvard study: khi công ty adopt generative AI, tuyển dụng junior giảm 9-10% trong 6 quý, trong khi senior hầu như không thay đổi&lt;/li&gt;
&lt;li&gt;Big tech tuyển dụng 50% ít hơn fresh graduates trong ba năm qua&lt;/li&gt;
&lt;li&gt;Kỹ năng quan trọng: không phải đánh máy boilerplate mà review code AI để tìm lỗi logic, lỗ hổng bảo mật, mismatch với yêu cầu&lt;/li&gt;
&lt;li&gt;T-shaped developer: chuyên sâu một hai lĩnh vực (vertical stroke), hiểu rộng nhiều domain khác (horizontal stroke)&lt;/li&gt;
&lt;li&gt;45% company planned eliminate bachelor&amp;rsquo;s degree requirements cho một số vị trí kỹ thuật vào năm 2024&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Lập trình viên giỏi nhất sẽ không phải là người code nhanh nhất, mà người biết khi nào không tin AI&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Điều kiện sống sót: cập nhật kỹ năng liên tục, đa năng hóa, tập trung vào yếu tố con người (sáng tạo, tư duy phản biện, cộng tác)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cơ-sở-dữ-liệu-năm-2025-một-năm-đánh-giá"&gt;&lt;a class="link" href="https://www.cs.cmu.edu/~pavlo/blog/2026/01/2025-databases-retrospective.html" target="_blank" rel="noopener"
&gt;Cơ Sở Dữ Liệu Năm 2025: Một Năm Đánh Giá&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết tổng hợp chi tiết các xu hướng và sự kiện quan trọng trong thế giới cơ sở dữ liệu năm 2025. PostgreSQL tiếp tục thống trị với phiên bản 18 ra mắt tháng 11, bổ sung hệ thống nhập xuất bất đồng bộ và hỗ trợ skip scans. Tuy nhiên, tin nóng nhất là làn sóng mua bán các công ty PostgreSQL: Databricks thâu tóm Neon với 1 tỷ USD, Snowflake mua CrunchyData với 250 triệu USD, và Microsoft ra mắt HorizonDB. Cuộc đua PostgreSQL phân tán cũng nóng lên với ba dự án cạnh tranh: Multigres (do Supabase phát triển), Neki (PlanetScale), và PgDog.&lt;/p&gt;
&lt;p&gt;Một xu hướng lớn khác là MCP (Model Context Protocol) - chuẩn giao tiếp giữa mô hình ngôn ngữ và cơ sở dữ liệu. Sau khi OpenAI hỗ trợ MCP vào tháng 3, mọi nhà cung cấp cơ sở dữ liệu đều tung ra MCP server riêng. Tuy nhiên, tác giả cảnh báo về rủi ro bảo mật khi cấp quyền truy cập không giới hạn cho các tác nhân trí tuệ nhân tạo. Thế giới định dạng tệp cũng sôi động với năm định dạng mới ra mắt nhằm cạnh tranh Parquet: FastLanes, F3, Vortex, AnyBlox, và Amudai.&lt;/p&gt;
&lt;p&gt;Năm 2025 chứng kiến nhiều thương vụ mua bán: IBM mua DataStax (3 tỷ USD), Salesforce mua Informatica (8 tỷ USD), và IBM mua Confluent. Hai thương vụ sáp nhập đáng chú ý là Fivetran hợp nhất với dbt Labs để tạo nên &amp;ldquo;gã khổng lồ ETL&amp;rdquo;. Về tài chính, Databricks gây quỹ thành công với hai vòng gọi vốn 4 tỷ và 1 tỷ USD, trong khi nhiều startup cơ sở dữ liệu phải đóng cửa. Năm nay cũng ghi nhận Larry Ellison trở thành người giàu nhất thế giới với tài sản 393 tỷ USD, vượt qua kỷ lục lịch sử của John D. Rockefeller.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PostgreSQL thống trị với phiên bản 18, bổ sung hệ thống nhập xuất bất đồng bộ và skip scans&lt;/li&gt;
&lt;li&gt;Làn sóng mua bán: Databricks mua Neon (1 tỷ USD), Snowflake mua CrunchyData (250 triệu USD), Microsoft ra mắt HorizonDB&lt;/li&gt;
&lt;li&gt;Cuộc đua PostgreSQL phân tán: ba dự án cạnh tranh (Multigres, Neki, PgDog)&lt;/li&gt;
&lt;li&gt;MCP trở thành chuẩn giao tiếp giữa mô hình ngôn ngữ và cơ sở dữ liệu, mọi nhà cung cấp đều tung ra MCP server&lt;/li&gt;
&lt;li&gt;Cảnh báo bảo mật: cần cấp quyền tối thiểu cho tác nhân AI để tránh rủi ro khi chúng &amp;ldquo;hoành hành&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Định dạng tệp: năm định dạng mới cạnh tranh Parquet (FastLanes, F3, Vortex, AnyBlox, Amudai)&lt;/li&gt;
&lt;li&gt;Thương vụ mua bán: IBM-DataStax (3 tỷ USD), Salesforce-Informatica (8 tỷ USD), IBM-Confluent&lt;/li&gt;
&lt;li&gt;Sáp nhập: Fivetran + dbt Labs tạo nên &amp;ldquo;gã khổng lồ ETL&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Nhiều startup đóng cửa: Fauna, PostgresML, Hydra, MyScaleDB, Voltron Data&lt;/li&gt;
&lt;li&gt;Larry Ellison trở thành người giàu nhất lịch sử (393 tỷ USD), vượt kỷ lục của John D. Rockefeller (340 tỷ USD)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="12-dự-báo-cho-năm-2026"&gt;&lt;a class="link" href="https://tomtunguz.com/2026-predictions/" target="_blank" rel="noopener"
&gt;12 Dự Báo Cho Năm 2026&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Tác giả đưa ra 12 dự báo cho năm 2026, tập trung vào sự trỗi dậy của các hệ thống tác nhân AI sẽ thay đổi kiến trúc cơ sở dữ liệu và chuyển đổi web sang thiết kế ưu tiên tác nhân. Dự báo nổi bật nhất: doanh nghiệp chi trả nhiều cho AI agents hơn cho con người lần đầu tiên, với Waymo rides đã đắt hơn Uber 31% nhưng nhu cầu vẫn tăng do ưu tiên an toàn và độ tin cậy. Năm 2026 dự kiến trở thành năm kỷ lục về thanh khoản với các đợt IPO lớn từ SpaceX, OpenAI, Anthropic, Stripe và Databricks, trong đó SpaceX và OpenAI sẽ nằm trong 10 đợt IPO lớn nhất lịch sử.&lt;/p&gt;
&lt;p&gt;Vector databases sẽ hồi sinh và trở thành hạ tầng thiết yếu trong stack AI khi các mô hình đa phương thức và mô hình không gian trạng thái đòi hỏi kiến trúc dữ liệu mới. Theo METR, thời gian thực hiện nhiệm vụ của AI tăng gấp đôi mỗi 7 tháng, và đến cuối 2026, các tác nhân AI sẽ tự chủ thực hiện luồng công việc 8+ giờ, thay đổi căn bản cách công ty phân bổ nhân sự. Ngân sách AI sẽ bị giám sát kỹ lưỡng lần đầu tiên, thúc đẩy sự phổ biến của các ngôn ngữ models nhỏ và mã nguồn mở với chi phí thấp hơn 10 lần.&lt;/p&gt;
&lt;p&gt;Google sẽ tạo khoảng cách với đối thủ thông qua sự đa dạng trong AI: frontier models, suy luận trên thiết bị, tạo video, mã nguồn mở và tích hợp tìm kiếm. Stablecoin sẽ chiếm 30% thanh toán quốc tế vào tháng 12, thay thế các đường ray SWIFT truyền thống. Các mô hình truy cập dữ liệu của tác nhân sẽ gây áp lực và làm vỡ cơ sở dữ liệu hiện tại với số lượng truy vấn tăng ít nhất một cấp độ. Xây dựng trung tâm dữ liệu sẽ đạt 3,5% GDP Mỹ, quy mô tương tự mở rộng đường sắt lịch sử. Web sẽ chuyển sang thiết kế ưu tiên tác nhân vì nhiều quyết định mua hàng hiện được thực hiện thông qua nghiên cứu của tác nhân. Cloudflare sẽ trở thành cổng cho thanh toán của tác nhân thông qua giao thức x402.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Doanh nghiệp chi trả nhiều cho AI agents hơn con người lần đầu, Waymo rides đắt hơn Uber 31% nhưng nhu cầu vẫn tăng&lt;/li&gt;
&lt;li&gt;2026: năm kỷ lục về thanh khoản với IPO từ SpaceX, OpenAI, Anthropic, Stripe, Databricks&lt;/li&gt;
&lt;li&gt;Vector databases hồi sinh và trở thành hạ tầng thiết yếu trong stack AI&lt;/li&gt;
&lt;li&gt;AI agents tự chủ thực hiện luồng công việc 8+ giờ vào cuối 2026 (theo METR: thời gian tăng gấp đôi mỗi 7 tháng)&lt;/li&gt;
&lt;li&gt;Ngân sách AI bị giám sát, ngôn ngữ models nhỏ và mã nguồn mở phổ biến với chi phí thấp hơn 10 lần&lt;/li&gt;
&lt;li&gt;Google tạo khoảng cách thông qua sự đa dạng AI: frontier models, on-device inference, video generation, open-source, search integration&lt;/li&gt;
&lt;li&gt;Agent observability trở thành lớp cạnh tranh nhất trong inference stack&lt;/li&gt;
&lt;li&gt;Stablecoin chiếm 30% thanh toán quốc tế, thay thế SWIFT cho B2B&lt;/li&gt;
&lt;li&gt;Tác nhân gây áp lực cực lớn cho cơ sở dữ liệu với truy vấn tăng ít nhất một cấp độ&lt;/li&gt;
&lt;li&gt;Trung tâm dữ liệu đạt 3,5% GDP Mỹ, quy mô tương tự mở rộng đường sắt&lt;/li&gt;
&lt;li&gt;Web chuyển sang thiết kế ưu tiên tác nhân cho tài liệu và website&lt;/li&gt;
&lt;li&gt;Cloudflare trở thành cổng thanh toán cho tác nhân thông qua giao thức x402&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sổ-tay-garbage-collection"&gt;&lt;a class="link" href="https://gchandbook.org/index.html" target="_blank" rel="noopener"
&gt;Sổ Tay Garbage Collection&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Đây là ấn bản thứ hai của cuốn sách kinh điển về quản lý bộ nhớ tự động. Cuốn sách đầu tiên &amp;ldquo;Garbage Collection&amp;rdquo; của Richard Jones (Wiley, 1996) là một cột mốc quan trọng trong lĩnh vực quản lý bộ nhớ tự động. Phiên bản kế tiếp &amp;ldquo;The Garbage Collection Handbook: The Art of Automatic Memory Management&amp;rdquo; đã ghi nhận trạng thái của lĩnh vực này vào năm 2012. Tuy nhiên, sự phát triển công nghệ đã làm cho quản lý bộ nhớ trở nên thách thức, thú vị và quan trọng hơn bao giờ hết. Ấn bản thứ hai này cập nhật handbook, tổng hợp kiến thức từ các nhà nghiên cứu và phát triển quản lý bộ nhớ tự động trong sáu mươi năm qua.&lt;/p&gt;
&lt;p&gt;Cuốn sách đề cập đến các thách thức mới cho garbage collection do những tiến bộ gần đây trong phần cứng và phần mềm, cũng như môi trường thực thi chương trình. Nó khám phá hậu quả của những thay đổi này đối với người thiết kế và thực thi các bộ thu gom rác hiệu suất cao. Cùng với các thuật toán đơn giản và truyền thống, cuốn sách bao gồm các kỹ thuật tiên tiến nhất: song song, tăng dần, đồng thời và thu gom rác thời gian thực. Các thuật toán và khái niệm thường được mô tả bằng mã giả và hình ảnh minh họa.&lt;/p&gt;
&lt;p&gt;Sự chấp nhận gần như phổ biến garbage collection bởi các ngôn ngữ lập trình hiện đại làm cho việc hiểu kỹ lưỡng chủ đề này trở nên thiết yếu đối với bất kỳ lập trình viên nào. Handbook uy tín này đưa ra cái nhìn chuyên sâu về cách thức hoạt động của các bộ thu gom khác nhau cũng như các vấn đề hiện đang đối mặt với garbage collectors. Với kiến thức này, lập trình viên có thể tự tin chọn và cấu hình trong nhiều lựa chọn garbage collectors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ấn bản thứ hai cập nhật cuốn sách kinh điển về quản lý bộ nhớ tự động (1996, 2012)&lt;/li&gt;
&lt;li&gt;Tổng hợp kiến thức từ 60 năm nghiên cứu và phát triển garbage collection&lt;/li&gt;
&lt;li&gt;Bao gồm thuật toán song song, tăng dần, đồng thời và thời gian thực&lt;/li&gt;
&lt;li&gt;Phân tích chi tiết các bộ thu gom thương mại hiệu suất cao hiện đại&lt;/li&gt;
&lt;li&gt;Giải thích các khía cạnh khó của garbage collection, bao gồm giao diện với hệ thống runtime&lt;/li&gt;
&lt;li&gt;Thêm hơn 90 trang, bao gồm các chương mới về lưu trữ và garbage collection nhận thức năng lượng&lt;/li&gt;
&lt;li&gt;E-book với hơn 37.000 liên kết đến các chương, mục, thuật toán, hình ảnh, nghiên cứu gốc&lt;/li&gt;
&lt;li&gt;Cơ sở dữ liệu trực tuyến với gần 3.400 ấn phẩm liên quan đến garbage collection&lt;/li&gt;
&lt;li&gt;Đã có bản dịch tiếng Trung và tiếng Nhật xuất bản năm 2016&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="vibe-coded-là"&gt;&lt;a class="link" href="https://gabriel-afonso.com/blog/vibe-coded-is-the-new-made-in-china/" target="_blank" rel="noopener"
&gt;Vibe-Coded Là &amp;ldquo;Made in China&amp;rdquo; Mới&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết phân tích khái niệm &amp;ldquo;vibe coding&amp;rdquo; được Andrej Karpathy đưa ra vào đầu năm 2025: một cách lập trình nơi bạn &amp;ldquo;hoàn toàn đầu hàng cho vibes, chấp nhận số mũ, và quên rằng code tồn tại&amp;rdquo; - để LLM xử lý triển khai trong khi bạn tập trung vào những gì muốn xây dựng, không phải cách xây dựng. Tác giả so sánh sự kỳ thị đối với &amp;ldquo;vibe-coded&amp;rdquo; hiện nay với nhãn &amp;ldquo;Made in China&amp;rdquo; trong quá khứ - từng là viết tắt của hàng giá rẻ, vứt đi, dù thực tế đã thay đổi.&lt;/p&gt;
&lt;p&gt;Trước khi lập trình hỗ trợ bởi AI tồn tại, các nhà phát triển mã nguồn mở phải đầu tư lượng thời gian khổng lồ chỉ để đạt được điểm xuất bản. Khó khăn của việc xây dựng phần mềm là một bộ lọc - bạn phải thực sự đứng đằng sau một ý tưởng để đưa nó đến mức đó. Bây giờ rào cản đã biến mất. Mọi người có thể tạo dựng một ứng dụng trong vài giờ mà trước đây mất vài tháng. Quan trọng hơn, mọi người có thể lập trình ở trên trình độ của họ. Bạn không cần hiểu sâu lĩnh vực. Bạn không cần biết tại sao kiến trúc của mình hoạt động. Bạn chỉ cần tầm nhìn và đủ kỹ năng prompting để tạo ra thứ gì đó hoạt động.&lt;/p&gt;
&lt;p&gt;Điều này tạo ra kịch bản nơi tác giả dự án có thể không hiểu code họ phát hành. Họ không thể sửa các trường hợp đặc biệt vì không biết hệ thống thực sự hoạt động thế nào. Họ không thể mở rộng tính năng vì không thiết kế nền tảng. Họ không thể bảo trì dự án dài hạn vì không có &amp;ldquo;sự gắn kết cảm xúc&amp;rdquo; với thứ mất một buổi chiều để xây dựng. Cộng đồng cảm nhận điều này. Sự thiếu tin tưởng không chỉ về chất lượng code, mà còn về tuổi thọ dự kiến.&lt;/p&gt;
&lt;p&gt;Tuy nhiên, một số nhà phát triển tận tâm nhất đã tìm cách sử dụng AI mà không kích hoạt báo động. DHH (tạo ra Ruby on Rails): &amp;ldquo;Bạn không thể để sự lộn xộn và ngại ngùng phủ nhận sự kỳ diệu của AI.&amp;rdquo; Tanner Linsley (tạo TanStack): &amp;ldquo;Ở tỷ lệ nhỏ và có trách nhiệm, có.&amp;rdquo; Boris Cherny (tạo Claude Code): &amp;ldquo;Trong ba mươi ngày qua, 100% đóng góp của tôi cho Claude Code được viết bởi Claude Code.&amp;rdquo; Mô hình: các nhà phát triển quan tâm sâu sắc về chất lượng không từ chối AI. Họ tích hợp nó một cách cẩn thận, vẫn là tác giả trong khi để AI xử lý công việc nặng nhọc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;Vibe coding&amp;rdquo; = để LLM xử lý triển khai, tập trung vào những gì muốn xây dựng không phải cách xây dựng&lt;/li&gt;
&lt;li&gt;Trước AI: khó khăn xây dựng phần mềm là bộ lọc, phải đầu tư thời gian/khổ luyện để xuất bản&lt;/li&gt;
&lt;li&gt;Hiện tại: rào cản biến mất, mọi người có thể code ở trên trình độ của họ&lt;/li&gt;
&lt;li&gt;Vấn đề: tác giả có thể không hiểu code họ phát hành, không thể sửa/mở rộng/bảo trì&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Vibe-coded&amp;rdquo; trở thành nhãn giống &amp;ldquo;Made in China&amp;rdquo; cũ = viết tắt của hàng giá rẻ, vứt đi&lt;/li&gt;
&lt;li&gt;AI output có tính aesthetic nhận biết: giọng văn phong, UI gradient tím, tài liệu sound helpful nhưng hollow&lt;/li&gt;
&lt;li&gt;Sự hoài nghi không vô lý: hệ sinh thái đang cố gắng bảo vệ mình trong khi quy tắc được viết lại&lt;/li&gt;
&lt;li&gt;Các nhà phát triển tận tâm vẫn dùng AI có trách nhiệm: DHH, Tanner Linsley, Boris Cherny&lt;/li&gt;
&lt;li&gt;Thời gian vẫn là bộ lọc: dự án bảo trì 2 năm với người dùng thực sự chứng cam kết không thể giả mạo&lt;/li&gt;
&lt;li&gt;Chúng ta trong giai đoạn chuyển tiếp khó xử, cần tìm bằng chứng mới về cam kết thay vì độ khó tạo ra&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="lỗi-production-khiến-tôi-quan-tâm-đến-undefined-behavior"&gt;&lt;a class="link" href="https://gaultier.github.io/blog/the_production_bug_that_made_me_care_about_undefined_behavior.html" target="_blank" rel="noopener"
&gt;Lỗi Production Khiến Tôi Quan Tâm Đến Undefined Behavior&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Tác giả chia sẻ câu chuyện về một lỗi production trong hệ thống C++ xử lý hàng tỷ euro thanh toán mỗi năm. Lỗi bug report cho thấy endpoint HTTP trả về response không thể: cả hai trường &lt;code&gt;error&lt;/code&gt; và &lt;code&gt;succeeded&lt;/code&gt; đều là &lt;code&gt;true&lt;/code&gt;, dù code logic rõ ràng chỉ set một trong hai. Sau khi điều tra, tác giả phát hiện vấn đề liên quan đến undefined behavior trong C++.&lt;/p&gt;
&lt;p&gt;Vấn đề nằm ở việc khởi tạo struct. Trong C, &lt;code&gt;Response response;&lt;/code&gt; rõ ràng là undefined behavior vì struct không được khởi tạo. Nhưng trong C++, quy tắc phức tạp hơn: nếu struct là non-POD (Plain Old Data) có thành viên non-POD như &lt;code&gt;std::string&lt;/code&gt;, default constructor được gọi. Tuy nhiên, default constructor được compiler tự động tạo ra chỉ khởi tạo các thành viên non-POD, còn các thành viên primitive (&lt;code&gt;bool&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt;, v.v.) thì không. Kết quả: &lt;code&gt;std::string data&lt;/code&gt; được khởi tạo đúng, nhưng &lt;code&gt;error&lt;/code&gt; và &lt;code&gt;succeeded&lt;/code&gt; chứa giá trị rác.&lt;/p&gt;
&lt;p&gt;Giải pháp đơn giản: dùng &lt;code&gt;Response response{};&lt;/code&gt; để force zero initialization tất cả các trường. Hoặc implement default constructor rõ ràng, hoặc định nghĩa default values cho các trường trong struct definition. Bài viết cũng đề cập đến các công cụ phát hiện: clang-tidy, Address Sanitizer (ASan), và tự viết libclang plugin để quét codebase. Tác giả kết luận rằng C++ có quá nhiều cách khởi tạo biến và hầu hết đều sai, trong khi nhiều ngôn ngữ khác (C, Go, Rust) tiếp cận đơn giản hơn: struct là plain data, hoặc compiler force set mỗi trường, hoặc zero-initialize tất cả.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lỗi production trong C++ system xử lý hàng tỷ euro thanh toán mỗi năm&lt;/li&gt;
&lt;li&gt;Bug report: cả &lt;code&gt;error&lt;/code&gt; và &lt;code&gt;succeeded&lt;/code&gt; đều true, dù logic code chỉ set một trong hai&lt;/li&gt;
&lt;li&gt;Nguyên nhân: &lt;code&gt;Response response;&lt;/code&gt; - struct non-POD với &lt;code&gt;std::string&lt;/code&gt; thành viên&lt;/li&gt;
&lt;li&gt;C++ rule phức tạp: default constructor tự động chỉ init non-POD members, primitives thì không&lt;/li&gt;
&lt;li&gt;Giải pháp: &lt;code&gt;Response response{};&lt;/code&gt; force zero initialization, hoặc implement default constructor, hoặc default field values&lt;/li&gt;
&lt;li&gt;C++ có quá nhiều cách khởi tạo biến và hầu hết đều sai&lt;/li&gt;
&lt;li&gt;Tools phát hiện: clang-tidy, Address Sanitizer (ASan), Valgrind, libclang plugin&lt;/li&gt;
&lt;li&gt;ASan báo: &amp;ldquo;load of value 8, which is not a valid value for type &amp;lsquo;bool&amp;rsquo;&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Một số types không trigger undefined behavior: &lt;code&gt;std::byte&lt;/code&gt;, &lt;code&gt;unsigned char&lt;/code&gt;, &lt;code&gt;unsigned char&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Tác giả thích approach của C/Go/Rust: struct là plain data, force set hoặc zero-init&lt;/li&gt;
&lt;li&gt;Undefined behavior nguy hiểm vì code không còn là source of truth, impossible values xuất hiện&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="đừng-sa-vào-anti-ai-hype"&gt;&lt;a class="link" href="https://antirez.com/news/158" target="_blank" rel="noopener"
&gt;Đừng Sa Vào Anti-AI Hype&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Tác giả (người tạo Redis) chia sẻ quan điểm về AI và lập trình. Mặc dù yêu thích viết code từng dòng và theo đuổi phần mềm tối giản với &amp;ldquo;chất lượng con người&amp;rdquo;, ông thừa nhận AI sẽ thay đổi lập trình mãi mãi. Năm 2020 ông nghỉ việc để viết tiểu thuyết về AI và universal basic income. Cuối 2024 ông mở kênh YouTube về AI. Ông từng nghĩ chúng ta có nhiều năm trước khi lập trình được định hình lại hoàn toàn, nhưng không còn tin vậy nữa.&lt;/p&gt;
&lt;p&gt;Gần đây, LLMs hiện tại có thể hoàn thành các subtasks lớn hoặc dự án quy mô trung bình một mình, hầu như không cần hỗ trợ, chỉ cần gợi ý tốt về kết quả cuối cùng. Độ thành công phụ thuộc vào loại lập trình (càng cô lập và càng dễ diễn đạt bằng văn bản thì càng tốt: system programming đặc biệt phù hợp) và khả năng tạo representation tinh thần của vấn đề để giao tiếp với LLM. Nhưng nói chung, hiện rõ ràng rằng với hầu hết dự án, tự viết code không còn hợp lý, trừ khi để giải trí.&lt;/p&gt;
&lt;p&gt;Trong một tuần, chỉ prompting và kiểm tra code để hướng dẫn thỉnh thoảng, trong vài giờ ông hoàn thành bốn tác phẩm: (1) Sửa đổi linenoise library để hỗ trợ UTF-8 và tạo framework cho line editing testing với emulated terminal; (2) Sửa transient failures trong Redis test - vấn đề timing, TCP deadlock; Claude Code iterated, inspected process state và fixed bugs; (3) Pure C library để inference BERT embedding models - Claude Code tạo trong 5 phút, 700 dòng code, cùng output và tốc độ với PyTorch (chậm 15%); (4) Thay đổi Redis Streams internals - Claude Code reproduced work trong 20 phút hoặc ít hơn từ design document.&lt;/p&gt;
&lt;p&gt;Tác giả cảm thấy vinh dự khi code của ông được LLMs ingest, coi đó là sự tiếp nối những gì ông cố gắng cả đời: democratizing code, systems, knowledge. LLMs sẽ giúp chúng ta viết phần mềm tốt hơn, nhanh hơn, và cho phép small teams cạnh tranh với bigger companies - giống như open source software đã làm trong thập niên 90. Tuy nhiên, ông lo ngại về sự tập trung hóa - công nghệ này quá quan trọng để nằm trong tay vài công ty. Ông tin neural networks, ở quy mô, đơn giản là có thể làm những điều incredible, và không có đủ &amp;ldquo;magic&amp;rdquo; trong AI frontier hiện tại để các labs khác không bắt kịp.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tác giả Redis: yêu thích viết code từng dòng, nhưng thừa nhận AI thay đổi lập trình mãi mãi&lt;/li&gt;
&lt;li&gt;LLMs hiện tại có thể hoàn thành subtasks lớn/dự án trung bình một mình, hầu như không cần hỗ trợ&lt;/li&gt;
&lt;li&gt;Trong một tuần: 4 tác phẩm hoàn thành trong vài giờ thay vì tuần nhờ AI&lt;/li&gt;
&lt;li&gt;(1) UTF-8 support cho linenoise library với testing framework&lt;/li&gt;
&lt;li&gt;(2) Sửa transient failures trong Redis test (timing, TCP deadlock)&lt;/li&gt;
&lt;li&gt;(3) Pure C library cho BERT embedding inference - 5 phút, 700 dòng, speed = PyTorch&lt;/li&gt;
&lt;li&gt;(4) Redis Streams internals changes - reproduced trong 20 phút từ design doc&lt;/li&gt;
&lt;li&gt;Tự viết code không còn hợp lý cho hầu hết dự án, trừ giải trí&lt;/li&gt;
&lt;li&gt;Vinh dự code được ingest: democratizing code/systems/knowledge như open source trong 90s&lt;/li&gt;
&lt;li&gt;LLMs giúp viết phần mềm tốt hơn, nhanh hơn, small teams cạnh tranh big companies&lt;/li&gt;
&lt;li&gt;Lo ngại tập trung hóa: công nghệ quá quan trọng để nằm trong tay vài công ty&lt;/li&gt;
&lt;li&gt;Neural networks không có đủ &amp;ldquo;magic&amp;rdquo; để các labs khác không bắt kịp&lt;/li&gt;
&lt;li&gt;Khuyên: đừng từ chối AI, test tools mới với tuần công việc, không phải test 5 phút&lt;/li&gt;
&lt;li&gt;Động lực lập trình: building - giờ có thể build nhiều hơn và tốt hơn với AI&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="performance-hints-của-abseil"&gt;&lt;a class="link" href="https://abseil.io/fast/hints.html" target="_blank" rel="noopener"
&gt;Performance Hints Của Abseil&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Abseil là tập hợp thư viện C++ do Google phát triển, đi kèm với hướng dẫn tối ưu hóa hiệu năng dựa trên kinh nghiệm thực tế của họ. Performance Hints cung cấp các kỹ thuật tối ưu hóa thực tế thay vì micro-optimizations lý thuyết. Dự án bao gồm &amp;ldquo;Performance Tips of the Week&amp;rdquo; - được mô tả như một loại &amp;ldquo;Effective analysis&amp;rdquo; cho tối ưu hóa hiệu năng.&lt;/p&gt;
&lt;p&gt;Các tips quan trọng bao gồm: Tip #70 về việc định nghĩa và đo lường thành công tối ưu hóa, Tip #72 về tối ưu hóa chính quá trình tối ưu hóa, Tip #74 về việc tránh &amp;ldquo;sweeping streetlights&amp;rdquo; - các cạm bẫy tối ưu hóa. Tip #90 thảo luận về cách đưa ra và sử dụng ước lượng trong vòng đời tối ưu hóa. Tip #64 nhấn mạnh tầm quan trọng của API tốt và trừu tượng hóa đúng để tìm kiếm cơ hội tối ưu hóa.&lt;/p&gt;
&lt;p&gt;Abseil tập trung vào các chiến lược tối ưu hóa thực tế cho code C++ hiện đại, bao gồm: hiểu rõ chi phí thực sự của các operations, sử dụng profiler để tìm bottleneck, tránh premature optimization, thiết kế API tốt cho phép tối ưu hóa mà không breaking interface, và hiểu cách compiler optimizations hoạt động. Các tips dựa trên kinh nghiệm thực tế từ việc tối ưu hóa các hệ thống lớn quy mô của Google.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Abseil: thư viện C++ từ Google với hướng dẫn tối ưu hóa hiệu năng thực tế&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Performance Tips of the Week&amp;rdquo; - các tips tối ưu hóa dựa trên kinh nghiệm thực tế&lt;/li&gt;
&lt;li&gt;Tip #70: định nghĩa và đo lường thành công tối ưu hóa&lt;/li&gt;
&lt;li&gt;Tip #72: tối ưu hóa chính quá trình tối ưu hóa&lt;/li&gt;
&lt;li&gt;Tip #74: tránh &amp;ldquo;sweeping streetlights&amp;rdquo; - cạm bẫy tối ưu hóa&lt;/li&gt;
&lt;li&gt;Tip #90: ước lượng trong vòng đời tối ưu hóa&lt;/li&gt;
&lt;li&gt;Tip #64: API tốt và trừu tượng hóa đúng để tìm cơ hội tối ưu hóa&lt;/li&gt;
&lt;li&gt;Tập trung chiến lược thực tế: profiler tìm bottleneck, tránh premature optimization&lt;/li&gt;
&lt;li&gt;Thiết kế API cho phép tối ưu hóa mà không breaking interface&lt;/li&gt;
&lt;li&gt;Hiểu cách compiler optimizations hoạt động&lt;/li&gt;
&lt;li&gt;Kinh nghiệm từ tối ưu hóa các hệ thống lớn quy mô của Google&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="triển-vọng-thị-trường-việc-làm-kỹ-thuật-phần-mềm-2026"&gt;&lt;a class="link" href="https://www.finalroundai.com/blog/software-engineering-job-market-2026" target="_blank" rel="noopener"
&gt;Triển Vọng Thị Trường Việc Làm Kỹ Thuật Phần Mềm 2026&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết phân tích triển vọng thị trường việc làm kỹ thuật phần mềm năm 2026. Kỹ thuật phần mềm từng được coi là nghề nghiệp an toàn nhất, giờ là công việc công nghệ dễ bị tổn thương nhất với layoffs gần như mỗi tuần. Companies đổ lỗi cho AI, nhưng thực tế phức tạp hơn. Dữ liệu Indeed qua FRED cho thấy hiring surge khổng lồ peak giữa 2022, rồi giảm mạnh đến 2024, và thị trường không bao hồi.&lt;/p&gt;
&lt;p&gt;Nguyên nhân thực sự: hiring boom lịch sử 2021-2022 được thúc đẩy bởi digitization. Từ Big Tech đến Startup, ai cũng overhiring. Khi thế giới chuyển online gần như overnight, companies không còn lựa chọn nào ngoài việc speed up digital efforts. FOMO tạo ra rush. Startup thấy cơ hội hiếm: users online nhiều hơn, investors đổ tiền, muốn làm products nhanh hơn. Engineers được thuê trước khi có clear work. Low interest rates cũng đóng vai trò. Sau đó họ nhận ra demand không tăng cùng pace với hiring, extra people thành gánh nặng.&lt;/p&gt;
&lt;p&gt;AI trở thành scapegoat. AI tools rẻ hơn, viết basic code trong vài phút, không đòi salary cả năm. Companies nghĩ: thay 3 engineers bằng 1 engineer với AI tools. Stock market đi lên, cách boost stock price: cut jobs và giải thích có thể làm same work với AI bots rẻ hơn. Nhưng họ vẫn cần engineers, chỉ là có euphoria rồi correction dẫn đến crisis. Giờ back to normal khi tiến đến 2026.&lt;/p&gt;
&lt;p&gt;Lý do lớn khác: large companies thoải mái với remote hiring. Tại sao hire engineer USA với salary rất cao khi có thể hire người từ Asia với fraction of cost? Senior engineer USA có thể $100k/năm, Argentina $60k, India $40k. Math đơn giản cho companies watching bottom line. AI thành PR-friendly excuse: &amp;ldquo;we are replacing jobs with AI&amp;rdquo; nghe forward-thinking hơn là &amp;ldquo;we are shipping jobs overseas&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;AI không phải culprit, nhưng không có nghĩa là không quan trọng. METR study tìm thấy experienced software engineers thực tế 19% less productive khi dùng AI tools cho real-world tasks. AI là tool, không phải replacement. Software engineering jobs sẽ không biến mất, nhưng demand cho basic coding jobs sẽ giảm. Magnus Grimeland (Antler VC) cho rằng AI sẽ tăng demand cho software engineers vì AI systems sẽ mắc lỗi, human engineers vẫn cần để fix errors. More code means more errors.&lt;/p&gt;
&lt;p&gt;US Bureau of Labor Statistics vẫn expect software developer jobs grow ~15%, chậm hơn prediction trước là 22% nhưng growth vẫn là growth. SignalFire báo Meta, Netflix, Uber, Google hire engineers faster hơn people leaving. Hiring ratios sit well above 100 - dấu mạnh engineering work đang tăng, không giảm. What&amp;rsquo;s changing là skill bar. Jobs require actual engineering thinking, designing systems, optimizing performance, ensuring security vẫn rất được demand.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Software engineering: từ career an toàn nhất thành dễ bị tổn thương nhất với layoffs mỗi tuần&lt;/li&gt;
&lt;li&gt;Hiring boom 2021-2022: digitization rush, FOMO, overhiring, low interest rates&lt;/li&gt;
&lt;li&gt;Correction 2022-2024: demand không tăng cùng pace, AI thành scapegoat&lt;/li&gt;
&lt;li&gt;Remote hiring: hire Asia fraction of cost so với USA, AI thành PR-friendly excuse&lt;/li&gt;
&lt;li&gt;METR study: experienced engineers 19% less productive với AI tools cho real-world tasks&lt;/li&gt;
&lt;li&gt;AI là tool, không phải replacement - more code means more errors cần fix&lt;/li&gt;
&lt;li&gt;US Bureau of Labor: software developer jobs vẫn grow 15% (chậm hơn 22% prediction)&lt;/li&gt;
&lt;li&gt;SignalFire: Meta, Netflix, Uber, Google hire faster than people leaving&lt;/li&gt;
&lt;li&gt;What&amp;rsquo;s changing: skill bar - need engineering thinking, system design, performance, security&lt;/li&gt;
&lt;li&gt;Top languages 2026: Python (AI/ML), JavaScript/TypeScript (frontend/full-stack), Go (backend/infrastructure), Java (enterprise), Swift (iOS)&lt;/li&gt;
&lt;li&gt;New opportunities: AI engineering, AI infrastructure, data engineering, AI safety&lt;/li&gt;
&lt;li&gt;AI/ML jobs share tăng từ 10% đến 50% (2023-2025)&lt;/li&gt;
&lt;li&gt;Entry-level jobs giảm 40% so với pre-2022, CS graduates và bootcamp grads tăng&lt;/li&gt;
&lt;li&gt;Gartner: 80% engineering workforce cần upskill để keep pace với generative AI by 2027&lt;/li&gt;
&lt;li&gt;Median salary software engineer US 2026: $130,000&lt;/li&gt;
&lt;li&gt;Market maturing: harder to break in nhưng financial case vẫn strong&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="bonus"&gt;Bonus
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Hình ảnh:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://substackcdn.com/image/fetch/$s_!0P7Z!,w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7546f89c-8b6f-4ced-8d40-4e0137ab5941_2360x2852.png"
loading="lazy"
alt="12 Architectural Concepts Developers Should Know"
&gt;
&lt;img src="https://substackcdn.com/image/fetch/$s_!Co3P!,w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f3c175-c0d6-4d02-992d-114ac588b45c_2252x2752.png"
loading="lazy"
alt="Top Developer Tools You Can Use in 2026"
&gt;
&lt;img src="https://substackcdn.com/image/fetch/$s_!Ty5s!,w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecc68f5e-6353-4487-a779-92bb11440bc5_2360x2960.png"
loading="lazy"
alt="5 Rate Limiting Strategies To Protect the System"
&gt;
&lt;img src="https://substackcdn.com/image/fetch/$s_!dPjo!,w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2543392-5e04-4dd6-b39a-72fdfe3a3048_2360x2770.png"
loading="lazy"
alt="How Live Streaming Works?"
&gt;
&lt;img src="https://substackcdn.com/image/fetch/$s_!MJUT!,w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06243bf8-f149-4075-bc81-99af15be3579_6001x7802.png"
loading="lazy"
alt="5 Leader Election Algorithms Powering Modern Databases"
&gt;
&lt;img src="https://substackcdn.com/image/fetch/$s_!Xrbz!,w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c99d0d5-8e5b-4e82-bb28-9fbd470e3bc6_2250x2624.png"
loading="lazy"
alt="A Guide to Database Sharding"
&gt;
&lt;img src="https://substackcdn.com/image/fetch/$s_!NCWv!,w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0adc9c84-37f2-4a96-96a6-f7f26bbd1b7e_2360x2960.jpeg"
loading="lazy"
alt="Modern Storage Systems"
&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Bài viết đã được review và cập nhật bởi Claude Code với Opus 4.7 (1M context).&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Newsletter #74</title><link>https://miti99.com/post/2025/12/27/</link><pubDate>Sat, 27 Dec 2025 00:00:00 +0700</pubDate><guid>https://miti99.com/post/2025/12/27/</guid><description>&lt;p&gt;&lt;em&gt;Lâu rồi chưa pay 1 cái gì liên quan đến AI (từ thời Claude subscription để thử nghiệm Claude Code). Nay mới mua thử gói &lt;a class="link" href="https://z.ai/subscribe" target="_blank" rel="noopener"
&gt;GLM Coding Plan&lt;/a&gt; của &lt;a class="link" href="https://z.ai" target="_blank" rel="noopener"
&gt;Z.ai&lt;/a&gt; để trải nghiệm. Gói này hiện cho phép dùng model mới nhất của Z.ai là GLM-4.7. Từ nay mình sẽ tranh thủ dùng &lt;a class="link" href="https://claude.com/product/claude-code" target="_blank" rel="noopener"
&gt;Claude Code&lt;/a&gt; với &lt;a class="link" href="https://z.ai/model-api" target="_blank" rel="noopener"
&gt;Z.ai API&lt;/a&gt; để &amp;lsquo;bào&amp;rsquo; cho xứng đáng số tiền bỏ ra^^. Mời bạn thưởng thức Newsletter #74.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="goodbye-microservices-from-100s-of-problem-children-to-1-superstar"&gt;&lt;a class="link" href="https://www.twilio.com/en-us/blog/developers/best-practices/goodbye-microservices" target="_blank" rel="noopener"
&gt;Goodbye Microservices: From 100s of problem children to 1 superstar&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Twilio Segment chia sẻ hành trình từ hơn 100 microservices quay lại monolith. Ban đầu dùng microservices để giải quyết head-of-line blocking - tạo riêng service và queue cho từng đích đến. Nhưng khi scale lên (trung bình 3 đích/tháng), các vấn đề nảy sinh: shared libraries phân kỳ giữa codebase, mỗi service có pattern tải khác nhau khiến scale khó khăn.&lt;/p&gt;
&lt;p&gt;Họ gộp 140+ services thành một service, chuyển về monorepo, xây dựng Traffic Recorder để test nhanh hơn. Kết quả: developer velocity tăng, operational overhead giảm. Trade-off: khó cô lập lỗi hơn, caching kém hiệu quả, nhưng với test suite vững chắc thì đáng đổi.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microservices giải quyết blocking nhưng tạo overhead lớn&lt;/li&gt;
&lt;li&gt;Shared libraries phân kỳ làm mất lợi ích thống nhất&lt;/li&gt;
&lt;li&gt;Monolith tăng velocity, giảm burden&lt;/li&gt;
&lt;li&gt;Traffic Recorder test nhanh hơn&lt;/li&gt;
&lt;li&gt;Cần test suite vững khi chuyển về monolith&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="5-engineering-dogmas-it"&gt;&lt;a class="link" href="https://newsletter.manager.dev/p/5-engineering-dogmas-its-time-to" target="_blank" rel="noopener"
&gt;5 engineering dogmas it&amp;rsquo;s time to retire&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;5 quan điểm cần xem xét lại: (1) &amp;ldquo;Đừng reinvent the wheel&amp;rdquo; - lạm dụng dependencies có rủi ro bảo mật, ví dụ left-pad (11 dòng) từng break build của Facebook/Netflix. (2) &amp;ldquo;Mọi PR phải review&amp;rdquo; - review có giá trị nhưng quy trình bắt buộc làm chậm, một số công ty để engineer tự merge và chỉ review khi cần. (3) &amp;ldquo;Sprints 2-4 tuần&amp;rdquo; - Shape Up với 6-week cycles + cool-down time là giải pháp thay thế. (4) &amp;ldquo;Feature flag cho mọi change&amp;rdquo; - lạm dụng làm codebase phức tạp, tạo cảm giác an toàn giả. (5) &amp;ldquo;Comment = code phức tạp&amp;rdquo; - cân bằng, đôi khi comment tiết kiệm nhiều thời gian.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dependencies cần cân nhắc, có rủi ro bảo mật&lt;/li&gt;
&lt;li&gt;Review có giá trị nhưng quy trình bắt buộc chậm&lt;/li&gt;
&lt;li&gt;Shape Up: 6-week cycles + cool-down&lt;/li&gt;
&lt;li&gt;Feature flag lạm dụng phức tạp, an toàn giả&lt;/li&gt;
&lt;li&gt;Comment đôi khi tiết kiệm thời gian&lt;/li&gt;
&lt;li&gt;Cần cân bằng dogmas với thực tế&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-does-a-database-for-ssds-look-like"&gt;&lt;a class="link" href="https://brooker.co.za/blog/2025/12/15/database-for-ssd.html" target="_blank" rel="noopener"
&gt;What Does a Database for SSDs Look Like?&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Database được thiết kế riêng cho SSDs trông như thế nào? Postgres/MySQL thiết kế cho spinning disks, nhưng SSD hiện tốt hơn ~1000x. Cloud networks cũng tốt hơn 1000x. Tác giả tiếp cận qua 5 góc độ:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Five Minute Rule update 2025: cache giữ pages ~30 seconds cho optimal cost&lt;/li&gt;
&lt;li&gt;Optimal transfer size cho SSD ~32kB&lt;/li&gt;
&lt;li&gt;Durability qua distributed log, không chỉ local disk&lt;/li&gt;
&lt;li&gt;Chỉ incur cross-AZ latency tại commit time&lt;/li&gt;
&lt;li&gt;Use high-quality clocks cho coordination&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tóm lại, giữ relational model/SQL nhưng move durability/scale/HA thành distributed concerns, toss local durability optimizations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cache giữ pages ~30 seconds (thay vì 5 phút năm 1986)&lt;/li&gt;
&lt;li&gt;Transfer size ~32kB optimal cho SSD&lt;/li&gt;
&lt;li&gt;Durability qua distributed log multi-AZ&lt;/li&gt;
&lt;li&gt;Cross-AZ latency chỉ tại commit&lt;/li&gt;
&lt;li&gt;Relational model giữ, distributed concerns thêm&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-economics-of-system-design-finops-auto-scaling-and-spot-instances"&gt;&lt;a class="link" href="https://designgurus.substack.com/p/cloud-cost-optimization-101-5-strategies" target="_blank" rel="noopener"
&gt;The Economics of System Design: FinOps, Auto-Scaling, and Spot Instances&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Cost optimization trong system design thường bị bỏ qua. Khoảng 30% cloud spend là waste. Inefficiencies nhỏ scale lên thành expenses lớn. 5 strategies:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cost-conscious architecture: microservices trade-offs, simplicity&lt;/li&gt;
&lt;li&gt;Right-sizing + auto-scaling: không over-provision, use serverless&lt;/li&gt;
&lt;li&gt;Caching + query optimization: giảm database load&lt;/li&gt;
&lt;li&gt;Hunt idle resources: shutdown forgotten instances&lt;/li&gt;
&lt;li&gt;Monitoring + FinOps: treat cost như performance metric&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Well-designed system không chỉ scalable/performant mà còn cost-efficient.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;30% cloud spend là waste&lt;/li&gt;
&lt;li&gt;Design cost-conscious với simplicity&lt;/li&gt;
&lt;li&gt;Right-sizing + auto-scaling + serverless&lt;/li&gt;
&lt;li&gt;Caching giảm database load&lt;/li&gt;
&lt;li&gt;Shutdown idle resources&lt;/li&gt;
&lt;li&gt;Treat cost như performance metric&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-big-o-complexity-of-vibe-coders"&gt;&lt;a class="link" href="https://www.shiveesh.com/thoughts-and-ideas/the-big-o-complexity-of-vibe-coders" target="_blank" rel="noopener"
&gt;The Big-O Complexity of Vibe Coders&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Vibe coding (dùng LLMs để code) hiện được đánh giá bằng tốc độ, nhưng khi scale thì cost quan trọng hơn. Teams không dùng vibe coding chậm hơn, teams lạm dụng tốn nhiều tokens. Iterations không free - mỗi prompt consumes tokens = cost.&lt;/p&gt;
&lt;p&gt;Workflow nhiều fast iterations có thể O(n²) complexity. Vague prompts expand solution space, precise prompts converge faster. Best vibe coders = lowest Big-O tokens per shipped outcome. Token-efficient vibe coding scales teams.&lt;/p&gt;
&lt;p&gt;Exploratory/creative work inherently inefficient, không nên optimize all.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vibe coding đánh giá bằng tốc độ, cost quan trọng hơn khi scale&lt;/li&gt;
&lt;li&gt;Iterations consumes tokens = cost&lt;/li&gt;
&lt;li&gt;Workflow nhiều iterations có thể O(n²)&lt;/li&gt;
&lt;li&gt;Precise prompts converge nhanh hơn vague&lt;/li&gt;
&lt;li&gt;Best vibe coders = lowest tokens/outcome&lt;/li&gt;
&lt;li&gt;Exploratory work inherently inefficient&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="design-is-more-than-code"&gt;&lt;a class="link" href="https://linear.app/now/design-is-more-than-code" target="_blank" rel="noopener"
&gt;Design is more than code&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Design không chỉ về code. Recent discourse tập trung designers có nên code không, nhưng điều này reductive. Câu hỏi lớn hơn: designers sẽ contributing như thế nào với AI và new tools?&lt;/p&gt;
&lt;p&gt;Design process có 2 stages: designing the problem và designing the solution. Designing the problem: question the problem, không assume - most failures do unclear problem. Designing the solution: conceptual stage (tìm form) và execution stage (build nó). Code/material essential cho execution, nhưng không cho tất cả.&lt;/p&gt;
&lt;p&gt;Tác giả worry về decline trong consideration, không phải tools. Design về finding right problem/intent/vision.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Debate designers coding reductive&lt;/li&gt;
&lt;li&gt;Design comes in many flavors&lt;/li&gt;
&lt;li&gt;Process: design problem → design solution&lt;/li&gt;
&lt;li&gt;Question problem, không assume&lt;/li&gt;
&lt;li&gt;Conceptual → execution stages&lt;/li&gt;
&lt;li&gt;Code essential cho execution, không all&lt;/li&gt;
&lt;li&gt;Worry decline consideration, không tools&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-we-saved-70-cpu-and-60-memory-in-refinery"&gt;&lt;a class="link" href="https://www.honeycomb.io/blog/how-we-saved-70-cpu-60-memory-refinery" target="_blank" rel="noopener"
&gt;How we saved 70% CPU and 60% memory in Refinery&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Honeycomb optimize Refinery telemetry pipeline: giảm 70% CPU và 60% memory. Root cause là dynamic attributes calculation - parse attributes nhiều lần, create intermediate allocations inefficiencies.&lt;/p&gt;
&lt;p&gt;Refactor: (1) Parse attributes chỉ một lần early, (2) Reuse parsed data, (3) Eliminate intermediate allocations, (4) Use efficient data structures.&lt;/p&gt;
&lt;p&gt;Profiling trước khi optimize critical - find bottlenecks first. Trade-off: code phức tạp hơn, harder maintain, nhưng performance gains justify trong case này.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;High resource usage do attributes calculation&lt;/li&gt;
&lt;li&gt;Parse multiple times, intermediate allocations inefficient&lt;/li&gt;
&lt;li&gt;Refactor: parse once, reuse, eliminate allocations&lt;/li&gt;
&lt;li&gt;Result: 70% CPU, 60% memory reduction&lt;/li&gt;
&lt;li&gt;Profiling trước khi optimize&lt;/li&gt;
&lt;li&gt;Trade-off: phức tạp hơn nhưng worth it&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="from-junior-to-senior-7-api-design-patterns-that-scale"&gt;&lt;a class="link" href="https://designgurus.substack.com/p/from-junior-to-senior-7-api-design" target="_blank" rel="noopener"
&gt;From Junior to Senior: 7 API Design Patterns That Scale&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;7 architectural decisions cho scalable APIs - khác biệt junior/senior. Junior focus logic, senior focus system communication. API là critical component của distributed systems.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Resource-Oriented Design (RESTful) thay vì Action-Based (RPC): think resources (nouns), không actions (verbs). Predictability là valuable trait.&lt;/li&gt;
&lt;li&gt;Proper HTTP Status Codes: 2xx/4xx/5xx categories matter cho debugging&lt;/li&gt;
&lt;li&gt;Pagination: Offset (beginner) vs Cursor (scalable, O(1))&lt;/li&gt;
&lt;li&gt;Idempotency Keys prevent duplicate charges&lt;/li&gt;
&lt;li&gt;Rate Limiting protects từ overload&lt;/li&gt;
&lt;li&gt;API Versioning prevents breaking clients&lt;/li&gt;
&lt;li&gt;Documentation critical với OpenAPI/Swagger&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Good API design = stable foundation, poor design = bottleneck.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Junior focus logic, senior focus communication&lt;/li&gt;
&lt;li&gt;RESTful (resources) thay vì RPC (actions)&lt;/li&gt;
&lt;li&gt;HTTP status codes categories matter&lt;/li&gt;
&lt;li&gt;Cursor pagination scalable hơn offset&lt;/li&gt;
&lt;li&gt;Idempotency keys prevent duplicates&lt;/li&gt;
&lt;li&gt;Rate limiting protects overload&lt;/li&gt;
&lt;li&gt;Versioning prevents breaking clients&lt;/li&gt;
&lt;li&gt;Documentation critical&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bonus"&gt;Bonus
&lt;/h2&gt;&lt;h3 id="images"&gt;Images
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://substackcdn.com/image/fetch/$s_!3GQA!,w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f1e76a-8fbf-4e8f-b030-e20037c66f70_3000x3900.png"
loading="lazy"
alt="Evolution of HTTP"
&gt;
&lt;img src="https://substackcdn.com/image/fetch/$s_!Zyn0!,w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F063ae714-8714-4695-8b0e-16a765c5c1a8_2360x2960.png"
loading="lazy"
alt="System Performance Metrics Every Engineer Should Know"
&gt;
&lt;img src="https://substackcdn.com/image/fetch/$s_!ta7a!,w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe42382d5-9be5-443a-9f75-56ecfa22569c_2360x2960.png"
loading="lazy"
alt="Why Is Nginx So Popular?"
&gt;
&lt;img src="https://substackcdn.com/image/fetch/$s_!sXIK!,w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa25e1401-cc6f-49f1-9ed1-6f093a01ac6c_2360x2664.png"
loading="lazy"
alt="Network Debugging Commands Every Engineer Should Know"
&gt;
&lt;img src="https://substackcdn.com/image/fetch/$s_!BXWB!,w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09a8b52f-2b80-4762-92cd-c5d18d5a7a3c_2360x2960.png"
loading="lazy"
alt="Hub, Switch, &amp; Router Explained"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Đánh giá&lt;/strong&gt;: &lt;em&gt;Z.ai xử lý 1 url tương đối nhanh, ban đầu mình cũng thấy khá ok, tuy nhiên thêm càng nhiều thì có vẻ càng bị dài &amp;amp; lạm dụng tiếng Anh. Mình đã phải yêu cầu tóm gọn lại một xíu. Hi vọng sẽ cải thiện được sau (vì lỡ mua rùi và non-refundable hiuhiu)&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Bài viết đã được review và cập nhật bởi Claude Code với Opus 4.7 (1M context).&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Newsletter #73</title><link>https://miti99.com/post/2025/12/20/</link><pubDate>Sat, 20 Dec 2025 00:00:00 +0700</pubDate><guid>https://miti99.com/post/2025/12/20/</guid><description>&lt;p&gt;&lt;em&gt;&lt;del&gt;Gầy đây mình mới biết &lt;a class="link" href="https://openrouter.ai/docs/guides/guides/claude-code-integration" target="_blank" rel="noopener"
&gt;OpenRouter đã hỗ trợ tích hợp Claude Code&lt;/a&gt;, nên nay dùng thử. Bài viết này được thực hiện bởi &lt;a class="link" href="https://claude.com/product/claude-code" target="_blank" rel="noopener"
&gt;Claude Code&lt;/a&gt; + &lt;a class="link" href="https://openrouter.ai/" target="_blank" rel="noopener"
&gt;Open Router&lt;/a&gt; + &lt;a class="link" href="https://openrouter.ai/z-ai/glm-4.5-air:free" target="_blank" rel="noopener"
&gt;Z.AI: GLM 4.5 Air (free)&lt;/a&gt;.&lt;/del&gt; Mời bạn thưởng thức Newsletter #73.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="system-design-deep-dive-time-series-databases-tsdbs-explained"&gt;&lt;a class="link" href="https://designgurus.substack.com/p/system-design-deep-dive-time-series" target="_blank" rel="noopener"
&gt;System Design Deep Dive: Time Series Databases (TSDBs) Explained&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Cơ sở dữ liệu chuỗi thời gian (TSDB) là giải pháp tối ưu cho dữ liệu có thứ tự thời gian, cung cấp khả năng nhập dữ liệu hiệu suất cao và truy vấn nhanh chóng dựa trên thời gian. Khác với cơ sở dữ liệu truyền thống, TSDB tập trung vào dữ liệu có dấu thời gian và xử lý chúng xuất sắc.&lt;/p&gt;
&lt;p&gt;TSDB có đặc điểm nổi bật: nén dữ liệu hiệu quả bằng các kỹ thuật như mã hóa delta và mã hóa độ dài chạy; tự động quản lý vòng đời dữ liệu với chính sách lưu trữ và giảm mẫu; truy phạm vi thời gian nhanh chóng nhờ tính năng chỉ mục thời gian.&lt;/p&gt;
&lt;p&gt;Ứng dụng phổ biến: giám sát hạ tầng theo dõi chỉ số máy chủ và ứng dụng; xử lý dữ liệu cảm biến IoT từ các thiết bị liên tục.&lt;/p&gt;
&lt;p&gt;So với cơ sở dữ liệu quan hệ, TSDB vượt trội ở việc ghi tần suất cao và truy vấn phạm vi thời gian nhanh trên dữ liệu tuần tự, trong khi cơ sở dữ liệu quan hệ phù hợp hơn cho các phép nối phức tạp và cập nhật thường xuyên.&lt;/p&gt;
&lt;p&gt;TSDB sử dụng nén, giảm mẫu và chính sách lưu trữ để quản lý hiệu quả khối lượng dữ liệu lịch sử lớn, giúp giảm phân giải dữ liệu cũ bằng cách tổng hợp vào các khoảng thời gian thô hơn.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TSDB tối ưu cho dữ liệu có thứ tự thời gian với khả năng nhập liệu hiệu suất cao&lt;/li&gt;
&lt;li&gt;Sử dụng các kỹ thuật nén đặc biệt (delta encoding, run-length encoding)&lt;/li&gt;
&lt;li&gt;Tự động quản lý vòng đời dữ liệu với chính sách lưu trữ và giảm mẫu&lt;/li&gt;
&lt;li&gt;Phù hợp cho giám sát hạ tầng và xử lý dữ liệu IoT&lt;/li&gt;
&lt;li&gt;Vượt trội hơn cơ sở dữ liệu quan hệ cho ghi tần suất cao và truy vấn theo thời gian&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-memory-maps-mmap-deliver-25x-faster-file-access-in-go"&gt;&lt;a class="link" href="https://info.varnish-software.com/blog/how-memory-maps-mmap-deliver-25x-faster-file-access-in-go" target="_blank" rel="noopener"
&gt;How Memory Maps (mmap) Deliver 25x Faster File Access in Go&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết trình bày về cơ chế sơ đồ bộ nhớ (mmap) trong Unix, cho phép xử lý tệp như một phần của bộ nhớ ảo. Thay vì sử dụng thao tác tìm kiếm/đọc truyền thống, mmap cung cấp con trỏ trực tiếp đến dữ liệu tệp trong bộ nhớ.&lt;/p&gt;
&lt;p&gt;Các bài kiểm tra hiệu suất cho thấy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tra cứu ngẫu nhiên (ReaderAt): 416.4 ns/op&lt;/li&gt;
&lt;li&gt;Tra cứu ngẫu nhiên (mmap): 3.3 ns/op&lt;/li&gt;
&lt;li&gt;Lặp lại (ReaderAt): 333.3 ns/op&lt;/li&gt;
&lt;li&gt;Lặp lại (mmap): 1.3 ns/op&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Đối với ghi dữ liệu, mmap kém hiệu quả hơn do lỗi trang, với thời gian 1870 ns/op khi trang chưa được ánh xạ. Tác giả đã ứng dụng mmap trong hệ thống tệp HTTP, đạt được cải thiện hiệu suất 25 lần, giúp giảm đáng kể áp lực bộ nhớ và độ trễ.&lt;/p&gt;
&lt;p&gt;Mặc dù có hạn chế khi ghi, mmap vẫn là giải pháp tối ưu cho các ứng dụng yêu cầu tốc độ truy cập tệp cao.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mmap cho phép xử lý tệp như phần của bộ nhớ ảo trong Unix&lt;/li&gt;
&lt;li&gt;Đạt hiệu suất 25 lần nhanh hơn phương pháp truyền thống&lt;/li&gt;
&lt;li&gt;Hiệu quả cao cho đọc dữ liệu nhưng kém hơn khi ghi do lỗi trang&lt;/li&gt;
&lt;li&gt;Phù hợp cho các ứng dụng yêu cầu tốc độ truy cập tệp cao&lt;/li&gt;
&lt;li&gt;Giảm đáng kể áp lực bộ nhớ và độ trễ trong hệ thống&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bloom-filters"&gt;&lt;a class="link" href="https://eli.thegreenplace.net/2025/bloom-filters" target="_blank" rel="noopener"
&gt;Bloom filters&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bloom filters là cấu trúc dữ liệu xác suất để kiểm tra thành viên tập hợp hiệu quả. Được Burton Bloom đề xuất vào năm 1970, chúng hoạt động bằng cách sử dụng nhiều hàm băm để đặt các bit trong một mảng bit.&lt;/p&gt;
&lt;p&gt;Ưu điểm chính:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Không bao có kết quả âm giả&lt;/li&gt;
&lt;li&gt;Hiệu quả về mặt không gian&lt;/li&gt;
&lt;li&gt;Thời gian tìm kiếm hằng số&lt;/li&gt;
&lt;li&gt;Đặc biệt hữu ích khi hầu hết các truy vấn kiểm tra sự không thuộc về tập hợp&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nguyên lý hoạt động:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chèn mục: Băm mục bằng k hàm băm và đặt các bit tương ứng thành 1&lt;/li&gt;
&lt;li&gt;Kiểm tra: Nếu bất kỳ bit nào là 0, chắc chắn mục không có; nếu tất cả là 1, có thể có kết quả dương giả&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Công thức tối ưu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tỷ lệ bit trên phần tử: m/n ≈ -ln(ε)/ln²(2)&lt;/li&gt;
&lt;li&gt;Số hàm băm tối ưu: k = (m/n)·ln(2)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ví dụ thực tế: Với 1 tỷ mục và tỷ lệ lỗi 1%, cần khoảng 1.2GB không gian.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bloom filters là cấu trúc dữ liệu xác suất cho kiểm tra thành viên tập hợp&lt;/li&gt;
&lt;li&gt;Sử dụng nhiều hàm băm để đặt bit trong mảng bit&lt;/li&gt;
&lt;li&gt;Có thể có kết quả dương giả nhưng không bao có kết quả âm giả&lt;/li&gt;
&lt;li&gt;Hiệu quả về mặt không gian và thời gian tìm kiếm hằng số&lt;/li&gt;
&lt;li&gt;Phù hợp cho các hệ thống yêu cầu kiểm tra nhanh sự không thuộc về tập hợp&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-the-heck-is-aead-again"&gt;&lt;a class="link" href="https://ochagavia.nl/blog/what-the-heck-is-aead-again/" target="_blank" rel="noopener"
&gt;What the heck is AEAD again?&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;AEAD là tiêu chuẩn mã hóa hiện đại, kết hợp mã hóa xác thực và dữ liệu liên kết. Giải pháp này đảm bảo bảo vệ cả thông điệp mã hóa và dữ liệu không mã hóa đi kèm, ngăn chặn tấn công thay đổi nội dung. Thay vì thực hiện riêng biệt như trước, thư viện mã hóa hiện đại như libsodium cung cấp API đơn giản, giảm thiểu lỗi. Các thuật toán phổ biến gồm AES256-GCM và ChaCha20-Poly1305, nhưng việc lựa chọn nên dựa trên yêu cầu cụ thể của hệ thống.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AEAD kết hợp mã hóa xác thực và dữ liệu liên kết trong một giải pháp duy nhất&lt;/li&gt;
&lt;li&gt;Đảm bảo bảo vệ cả thông điệp mã hóa và dữ liệu không mã hóa đi kèm&lt;/li&gt;
&lt;li&gt;Ngăn chặn tấn công thay đổi nội dung (tampering)&lt;/li&gt;
&lt;li&gt;Thư viện hiện đại như libsodium cung cấp API đơn giản, giảm thiểu lỗi&lt;/li&gt;
&lt;li&gt;Các thuật toán phổ biến: AES256-GCM và ChaCha20-Poly1305&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ceilometer-khung-đo-lường-thích-ứng-của-uber"&gt;&lt;a class="link" href="https://www.uber.com/in/en/blog/ceilometer-ubers-adaptive-benchmarking-framework/" target="_blank" rel="noopener"
&gt;Ceilometer: Khung đo lường thích ứng của Uber&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Ceilometer là khung đo lường thích ứng của Uber, được thiết kế để hỗ trợ quyết định cơ sở hạ tầng và duy trì tiêu chuẩn hiệu suất cao. Hệ thống này có khả năng hoạt động trên nhiều khung kiểm thử khác nhau, bao gồm cả kiểm thử tổng hợp (synthetic), có trạng thái (stateful) và không trạng thái (stateless).&lt;/p&gt;
&lt;p&gt;Ứng dụng chính:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Định hình (shape qualification): Đánh giá các loại máy chủ mới, từ giai đoạn phát triển của nhà cung cấp đến triển khai thực tế trong môi trường Uber.&lt;/li&gt;
&lt;li&gt;Xác minh thay đổi (change validation): Đánh giá bất kỳ thay đổi nào đối với cơ sở hạ tầng hiện có, hợp tác với chủ sở hữu dịch vụ để đảm bảo hiệu suất chính xác.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Triển khai trong tương lai:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tích hợp AI/ML sâu hơn&lt;/li&gt;
&lt;li&gt;Hỗ trợ hệ sinh thái rộng hơn&lt;/li&gt;
&lt;li&gt;Phát hiện bất thường tiên tiến&lt;/li&gt;
&lt;li&gt;Tích hợp chỉ số sử dụng thành phần&lt;/li&gt;
&lt;li&gt;Kiểm tra xác định liên tục&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ceilometer đã đáp ứng nhu cầu đo lường thích ứng của Uber, thể hiện khả năng thích nghi với các yếu tố quan trọng, và tiếp tục phát triển để đáp ứng các yêu cầu đo lường tiên tiến tại Uber.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ceilometer hỗ trợ quyết định cơ sở hạ tầng và duy trì tiêu chuẩn hiệu suất cao&lt;/li&gt;
&lt;li&gt;Hoạt động trên nhiều khung kiểm thử khác nhau (synthetic, stateful, stateless)&lt;/li&gt;
&lt;li&gt;Hai ứng dụng chính: định hình máy chủ mới và xác minh thay đổi cơ sở hạ tầng&lt;/li&gt;
&lt;li&gt;Tích hợp với chủ sở hữu dịch vụ để đảm bảo hiệu suất chính xác&lt;/li&gt;
&lt;li&gt;Tiếp tục phát triển với các tính năng AI/ML và phát hiện bất tiên tiến&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="useful-patterns-for-building-html-tools"&gt;&lt;a class="link" href="https://simonwillison.net/2025/Dec/10/html-tools/" target="_blank" rel="noopener"
&gt;Useful patterns for building HTML tools&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết trình bày các mẫu hữu ích để xây dựng công cụ HTML - ứng dụng kết hợp HTML, JavaScript và CSS trong một tệp duy nhất. Tác giả đã phát triển hơn 150 công cụ như vậy trong hai năm qua, chủ yếu do LLM viết.&lt;/p&gt;
&lt;p&gt;Các điểm chính bao gồm:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kiến trúc cơ bản: một tệp duy nhất, không sử dụng React, tải phụ thuộc từ CDN&lt;/li&gt;
&lt;li&gt;Tạo mẫu với Artifacts hoặc Canvas&lt;/li&gt;
&lt;li&gt;Sử dụng localStorage để lưu trạng thái hoặc bí mật&lt;/li&gt;
&lt;li&gt;Tận dụng API có CORS và WebAssembly&lt;/li&gt;
&lt;li&gt;Xây dựng công cụ gỡ lỗi để khám phá khả năng&lt;/li&gt;
&lt;li&gt;Phối hợp lại các công cụ trước đó&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bài viết khuyến khích người đọc bắt đầu xây dựng bộ sưu tập công cụ riêng, sử dụng GitHub Pages để lưu trữ và chia sẻ.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Công cụ HTML là ứng dụng kết hợp HTML, JavaScript và CSS trong một tệp duy nhất&lt;/li&gt;
&lt;li&gt;Kiến trúc đơn giản: một tệp, không React, phụ thuộc từ CDN&lt;/li&gt;
&lt;li&gt;Tận dụng localStorage, API có CORS và WebAssembly&lt;/li&gt;
&lt;li&gt;Tác giả đã phát triển hơn 150 công cụ như vậy trong hai năm&lt;/li&gt;
&lt;li&gt;Khuyến khích bắt đầu xây dựng bộ sưu tập công cụ riêng và chia sẻ trên GitHub Pages&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="memory-allocation-in-go"&gt;&lt;a class="link" href="https://nghiant3223.github.io/2025/06/03/memory_allocation_in_go.html" target="_blank" rel="noopener"
&gt;Memory Allocation in Go&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết này phân tích chi tiết cơ chế phân bổ bộ nhớ trong Go, một chủ đề quan trọng để tối ưu hiệu suất ứng dụng. Go sử dụng hệ thống phân cấp với ba thành phần chính: mheap (quản lý bộ nhớ toàn cục), mcentral (trung tâm phân bổ span) và mcache (bộ đệm bộ nhớ trên mỗi processor P).&lt;/p&gt;
&lt;p&gt;Go chia đối tượng thành ba loại dựa trên kích thước: tiny (&amp;lt;16 bytes), small (16-32760 bytes) và large (&amp;gt;32760 bytes). Mỗi loại có cách phân bổ riêng biệt. Tiny objects được xử lý hiệu quả bằng allocator chuyên dụng, trong khi small objects được quản lý qua các span với 68 size class khác nhau. Large objects được phân bổ trực tiếp từ mheap.&lt;/p&gt;
&lt;p&gt;Stack của goroutine cũng được quản lý linh hoạt, bắt đầu với 2KB và có thể tăng gấp đôi khi cần thiết. Go sử dụng cơ chế contiguous stacks để tránh vấn đề performance của segmented stacks.&lt;/p&gt;
&lt;p&gt;Phân tích escape analysis quyết định biến nên được phân bổ trên stack hay heap, đảm bảo an toàn bộ nhớ. Các nghiên cứu tình huống cho thấy cách tối ưu như tái sử dụng slice, nhóm biến thành struct và dùng sync.Pool để giảm số lần phân bổ bộ nhớ.&lt;/p&gt;
&lt;p&gt;Hiểu rõ cơ chế này giúp developer viết mã hiệu quả hơn và tránh các vấn đề về hiệu suất liên quan đến quản lý bộ nhớ.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go sử dụng hệ thống phân cấp ba cấp: mheap, mcentral và mcache&lt;/li&gt;
&lt;li&gt;Đối tượng chia thành three loại: tiny (&amp;lt;16B), small (16-32760B) và large (&amp;gt;32760B)&lt;/li&gt;
&lt;li&gt;Tiny objects dùng allocator chuyên dụng, small objects quản lý qua span&lt;/li&gt;
&lt;li&gt;Stack goroutine bắt đầu 2KB, tăng gấp đôi khi cần&lt;/li&gt;
&lt;li&gt;Escape analysis quyết định stack/heap allocation&lt;/li&gt;
&lt;li&gt;Tối ưu: tái sử dụng slice, group variables, dùng sync.Pool&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="system-design-masterclass-building-a-global-cdn-and-edge-caching-strategy"&gt;&lt;a class="link" href="https://designgurus.substack.com/p/system-design-masterclass-building" target="_blank" rel="noopener"
&gt;System Design Masterclass: Building a Global CDN and Edge Caching Strategy&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết hướng dẫn cách thiết kế mạng phân phối nội dung (CDN) toàn cầu và chiến lược caching tại edge để cung cấp nội dung với tốc độ ánh sáng trên toàn thế giới. CDN hoạt động như một mạng lưới máy chủ phân phối toàn cầu, lưu trữ bản sao nội dung từ máy chủ gốc và phân phối cho người dùng từ vị trí gần nhất.&lt;/p&gt;
&lt;p&gt;Nguyên tắc hoạt động chính:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Đưa nội dung gần với người dùng&lt;/li&gt;
&lt;li&gt;Giảm độ trễ và tải cho máy chủ gốc&lt;/li&gt;
&lt;li&gt;Cải thiện tốc độ tải trang và trải nghiệm người dùng&lt;/li&gt;
&lt;li&gt;Bảo vệ khỏi các tấn công DDoS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Các yếu tố quan trọng khi thiết kế CDN:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Phân loại nội dung: static (hình ảnh, CSS/JS, video) và dynamic (API response, trang cá nhân hóa)&lt;/li&gt;
&lt;li&gt;Cấu hình TTL (Time-to-Live) cho từng loại nội dung&lt;/li&gt;
&lt;li&gt;Xử lý cache invalidation khi nội dung cập nhật&lt;/li&gt;
&lt;li&gt;Sử dụng anycast network để định tuyến thông minh&lt;/li&gt;
&lt;li&gt;Tích hợp với SSL offloading và DDoS protection&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chiến lược caching hiệu quả:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cache static assets với TTL dài (tuần/tháng)&lt;/li&gt;
&lt;li&gt;Sử dụng micro-caching cho dynamic content (vài giây/phút)&lt;/li&gt;
&lt;li&gt;Kết hợp TTL expiry, manual purge và versioning&lt;/li&gt;
&lt;li&gt;Giám sát cache hit ratio để tối ưu hóa&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CDN là mạng lưới máy phân phối nội dung toàn cầu, giảm độ trễ bằng cách lưu cache tại edge&lt;/li&gt;
&lt;li&gt;Phân loại nội dung static/dynamic để áp dụng chiến lược caching phù hợp&lt;/li&gt;
&lt;li&gt;TTL expiry, manual purge và versioning là ba phương pháp chính cho cache invalidation&lt;/li&gt;
&lt;li&gt;Anycast network giúp định tuyến người dùng đến server gần nhất&lt;/li&gt;
&lt;li&gt;Giám sát và tối ưu liên tục là chìa khóa để CDN hoạt động hiệu quả&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="protect-your-api-a-developer"&gt;&lt;a class="link" href="https://designgurus.substack.com/p/system-design-blueprint-designing" target="_blank" rel="noopener"
&gt;Protect Your API: A Developer&amp;rsquo;s Guide to Rate Limiting and Throttling&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết cung cấp hướng dẫn toàn diện về rate limiting và throttling để bảo vệ API khỏi các tấn công và quá tải. Trong kỹ thuật phần mềm, một sự thật cơ bản là tài nguyên là hữu hạn. Mọi hệ thống đều có điểm giới hạn, và nếu không có cơ chế kiểm soát, một đợt tăng traffic đột ngột có thể làm sập toàn bộ hệ thống.&lt;/p&gt;
&lt;p&gt;Rate limiting là cơ chế quản lý luồng dữ liệu, đặt giới hạn về số lần một người dùng có thể thực hiện hành động trong một khoảng thời gian nhất định. Giống như giới tốc độ trên đường cao tốc, nó ngăn chặn xe (dữ liệu) đi quá nhanh gây tai nạn (máy chủ bị crash).&lt;/p&gt;
&lt;p&gt;Các ứng dụng chính:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ngăn chặn tấn công DDoS bằng cách phát hiện và chặn các địa chỉ IP gửi lượng yêu cầu bất thường&lt;/li&gt;
&lt;li&gt;Quản lý tài nguyên và chi phí, đảm bảo công bằng giữa các người dùng&lt;/li&gt;
&lt;li&gt;Ngăn chặn tấn công brute force bằng giới hạn số lần thử đăng nhập&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rate limiting là thành phần quan trọng trong việc xây dựng hệ thống phân tán đáng tin cậy&lt;/li&gt;
&lt;li&gt;Ba thuật toán phổ biến: Token Bucket (cho phép traffic đột phá), Leaky Bucket (luồng ổn định), Fixed Window, Sliding Window&lt;/li&gt;
&lt;li&gt;HTTP status code 429 Too Many Requests được dùng khi bị rate limit&lt;/li&gt;
&lt;li&gt;Cần cân bằng giữa bảo mật và trải nghiệm người dùng&lt;/li&gt;
&lt;li&gt;Triển khai tại application layer hoặc middleware layer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="acid-vs-base-the-system-design-interview"&gt;&lt;a class="link" href="https://designgurus.substack.com/p/acid-vs-base-the-system-design-interview" target="_blank" rel="noopener"
&gt;ACID vs BASE: The System Design Interview&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết giải thích sự khác biệt cơ bản giữa hai triết lý thiết kế cơ sở dữ liệu: ACID và BASE - sự đánh đổi giữa tốc độ và độ tin cậy trong các hệ thống phần mềm lớn.&lt;/p&gt;
&lt;p&gt;Mỗi hệ thống lớn phải cân bằng hai yếu tố đối lập: tốc độ và độ tin cậy. Khi thiết kế cơ sở dữ liệu, bạn buộc phải chọn một triết lý: hệ thống là một người hoàn hảo khắt khe đảm bảo tính chính xác tuyệt đối ngay cả khi có nghĩa là chậm lại, hay một hệ thống linh hoạt và cực nhanh ngay cả khi có nghĩa là dữ liệu không được đồng bộ hóa hoàn hảo trong vài giây?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ACID (Người Hoàn Hảo Khắt Khe)&lt;/strong&gt;
Là tiêu chuẩn vàng cho cơ sở dữ liệu quan hệ trong nhiều thập kỷ. ACID ưu tiên tính nhất quán và an toàn trên hết.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Atomicity: Hoàn toàn hoặc không gì cả - giao dịch được xử lý như một đơn vị duy nhất&lt;/li&gt;
&lt;li&gt;Consistency: Tuân thủ quy tắc - đảm bảo dữ liệu chuyển từ trạng thái hợp lệ sang trạng thái hợp lệ khác&lt;/li&gt;
&lt;li&gt;Isolation: Chờ lượt - các giao dịch đồng thời không can thiệp vào nhau&lt;/li&gt;
&lt;li&gt;Durability: Viết bằng đá - dữ liệu được cam kết sẽ tồn tại vĩnh viễn&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hạn chế của ACID là khó mở rộng ngang (horizontal scaling) khi dữ liệu được phân tán trên nhiều máy chủ.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BASE (Triết lý cho Big Data)&lt;/strong&gt;
Được tạo ra cho kỷ nguyên Big Data và hệ thống phân tán, thường được sử dụng bởi NoSQL databases.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Basically Available: Hệ thống luôn sẵn sàng cung cấp phản hồi&lt;/li&gt;
&lt;li&gt;Soft State: Trạng thái hệ thống có thể thay đổi theo thời gian ngay cả khi không có đầu vào mới&lt;/li&gt;
&lt;li&gt;Eventual Consistency: Dữ liệu sẽ đồng bộ hóa cuối cùng&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Khi nào nên dùng từng triết lý:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ACID: Hệ thống tài chính, quản lý kho, hồ sơ y tế (nơi tính chính xác là quan trọng)&lt;/li&gt;
&lt;li&gt;BASE: Mạng xã hội, phân tích thời gian thực, phân phối nội dung (nơi tốc độ và khả năng mở rộng quan trọng)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ACID là bi quan: giả định mọi thứ sẽ vỡ nên khóa mọi thứ lại&lt;/li&gt;
&lt;li&gt;BASE là lạc quan: giả định mọi thứ sẽ ổn định nên tiếp tục chạy nhanh&lt;/li&gt;
&lt;li&gt;Sự đánh đổi: bạn thường đánh đổi tính nhất quán ngay lập tức để có sẵn cao và hiệu suất&lt;/li&gt;
&lt;li&gt;Quy tắc quyết định: &amp;ldquo;Nếu dữ liệu sai 2 giây, có ai mất tiền không?&amp;rdquo; - Nếu có thì dùng ACID, nếu không thì BASE&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="hash-tables-in-go-and-advantage-of-self-hosted-compilers"&gt;&lt;a class="link" href="https://rushter.com/blog/go-and-hashmaps/" target="_blank" rel="noopener"
&gt;Hash tables in Go and advantage of self-hosted compilers&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết khám phá cách Go triển khai bảng băm (hash table), tập trung vào hiệu quả sử dụng bộ nhớ khi sử dụng &lt;code&gt;map[int]struct{}&lt;/code&gt; so với &lt;code&gt;map[int]bool&lt;/code&gt; để theo dõi các giá trị duy nhất.&lt;/p&gt;
&lt;p&gt;Go thiếu cấu trúc dữ liệu set tích hợp, vì vậy các nhà phát triển sử dụng hash maps để tạo set. Trong các phiên bản trước Go 1.24, việc sử dụng &lt;code&gt;struct{}&lt;/code&gt; giúp tiết kiệm bộ nhớ bằng cách bỏ qua phần giá trị. Tuy nhiên, với Tables Swiss trong Go 1.24, cả hai cách tiếp cận đều có mức sử dụng bộ nhớ giống hệt nhau.&lt;/p&gt;
&lt;p&gt;Điểm thú vị về lưu trữ bộ nhớ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;Các struct cần padding để đảm bảo căn chỉnh bộ nhớ đúng cách&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Lượng bộ nhớ mà một struct sử dụng không luôn bằng tổng của các trường của nó&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bài viết cũng đề cập đến LLM có thể cung cấp thông tin không cập nhật về tối ưu hóa hash table của Go. Trình biên dịch tự托管 (self-hosted) của Go cho phép kiểm tra các chi tiết triển khai, giúp các nhà phát triển hiểu rõ hơn về cách thức hoạt động thực sự của các cấu trúc dữ liệu bên trong.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go thiếu set data structure tích hợp, nên dùng hash maps thay thế&lt;/li&gt;
&lt;li&gt;Go 1.24 với Swiss Tables làm cho cả &lt;code&gt;map[int]struct{}&lt;/code&gt; và &lt;code&gt;map[int]bool&lt;/code&gt; có cùng mức sử dụng bộ nhớ&lt;/li&gt;
&lt;li&gt;Yêu cầu căn chỉnh bộ nhớ có thể ảnh hưởng đến tối ưu hiệu suất&lt;/li&gt;
&lt;li&gt;Cần cân nhắc tính đọc khi chọn giữa &lt;code&gt;bool&lt;/code&gt; và &lt;code&gt;struct{}&lt;/code&gt; implementations&lt;/li&gt;
&lt;li&gt;Trình biên dịch tự托管 của Go giúp kiểm tra chi tiết triển khai&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gist-of-go-concurrency"&gt;&lt;a class="link" href="https://antonz.org/go-concurrency/" target="_blank" rel="noopener"
&gt;Gist of Go: Concurrency&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Một cuốn sách tương tác dạy lập trình đồng thời trong Go thông qua bài tập thực hành, nhắm đến các lập trình viên đã quen thuộc với cơ bản Go. Cuốn sách bao gồm các nguyên lý đồng thời, kỹ thuật đồng bộ hóa và cách tiếp cận kiểm thử với hơn 50 bài tập tự động kiểm tra.&lt;/p&gt;
&lt;p&gt;Điểm khác biệt của cuốn sách này là nó không chỉ giới thiệu về goroutine, channel và select, mà tập trung vào việc giúp người đọc thực sự hiểu và áp dụng các nguyên lý đồng thời. Mỗi bài tập đều đủ đơn giản để có thể giải quyết với một trang mã nhưng lại sát với các kịch bản thực tế.&lt;/p&gt;
&lt;p&gt;Nội dung chính:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Phần 1: Nguyên lý cơ bản - Goroutines, Channels, Pipelines, Time, Context&lt;/li&gt;
&lt;li&gt;Phần 2: Đồng bộ hóa - Wait groups, Data races, Race conditions, Semaphores, Signaling, Atomics&lt;/li&gt;
&lt;li&gt;Phần 3: Các chủ đề khác - Testing, Internals&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Đặc điểm nổi bật:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;500+ ví dụ tương tác&lt;/li&gt;
&lt;li&gt;50 bài tập tự động kiểm tra (có lời giải)&lt;/li&gt;
&lt;li&gt;PDF 448 trang&lt;/li&gt;
&lt;li&gt;Nội dung 100% gốc, không phải do AI tạo ra&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tác giả Anton Zhiyanov đã dựa trên khóa học Go concurrency của mình (250 học viên, đánh giá 5 sao) để tạo ra cuốn sách này, giúp người học nắm vững lập trình đồng thời trong Go một cách thực tế.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tập trung vào hiểu và áp dụng thực tế chứ không chỉ lý thuyết&lt;/li&gt;
&lt;li&gt;Bài tập đơn giản nhưng sát với thực tế&lt;/li&gt;
&lt;li&gt;Kết hợp giữa giải thích rõ ràng và ví dụ cụ thể&lt;/li&gt;
&lt;li&gt;Hỗ trợ đọc trực tuyến và tải PDF&lt;/li&gt;
&lt;li&gt;Phù hợp cho lập trình viên đã biết cơ bản Go&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-state-of-ai-coding-2025--greptile"&gt;&lt;a class="link" href="https://www.greptile.com/state-of-ai-coding" target="_blank" rel="noopener"
&gt;The State of AI Coding 2025 | Greptile&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Báo cáo này là một nghiên cứu đa ngành về các xu hướng gần đây trong phát triển phần mềm AI, khám phá tốc độ đội kỹ sư, việc áp dụng công cụ AI, xu hướng tăng trưởng mô hình và điểm chuẩn hiệu suất.&lt;/p&gt;
&lt;p&gt;Greptile đã thực hiện nghiên cứu này để cung cấp cái nhìn toàn cảnh về trạng thái hiện tại của lập trình AI vào năm 2025. Báo cáo tập trung vào các khía cạnh chính:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tốc độ đội kỹ sư (Engineering Team Velocity)&lt;/strong&gt;
Các công cụ AI đang thay đổi cách các đội kỹ sư làm việc, giúp tăng tốc độ phát triển và cải thiện chất lượng mã nguồn. Nghiên cứu có thể phân tích mức độ cải thiện về thời gian hoàn thành công việc và giảm lỗi.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Việc áp dụng công cụ AI (AI Tool Adoption)&lt;/strong&gt;
Xu hướng sử dụng các công cụ AI trong phát triển phần mềm đang tăng mạnh. Báo cáo có thể đưa ra số liệu thống kê về tỷ lệ sử dụng các công cụ AI IDE, trợ lý lập trình và các nền tảng code review tự động.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Xu hướng tăng trưởng mô hình (Model Growth Trends)&lt;/strong&gt;
Các mô hình AI lớn đang phát triển nhanh chóng về cả quy mô và khả năng. Nghiên cứu có thể so sánh các mô hình khác nhau về hiệu suất, chi phí và ứng dụng thực tế.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chuẩn hiệu suất (Performance Benchmarks)&lt;/strong&gt;
Đánh giá hiệu suất của các giải pháp AI coding thông qua các chỉ số như độ chính xác, tốc độ xử lý và khả năng hiểu ngữ cảnh của codebase.&lt;/p&gt;
&lt;p&gt;Báo cáo này cung cấp dữ liệu quý giá cho các nhà phát triển, quản lý dự án và các tổ chức muốn hiểu rõ hơn về cách AI đang định hình tương lai của ngành phát triển phần mềm.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Điểm chính:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nghiên cứu đa ngành về các xu hướng AI trong phát triển phần mềm&lt;/li&gt;
&lt;li&gt;Tập trung vào tốc độ đội kỹ sư, adoption rate, và hiệu suất mô hình&lt;/li&gt;
&lt;li&gt;Cung cấp điểm chuẩn và số liệu thống kê thực tế&lt;/li&gt;
&lt;li&gt;Giúp các tổ chức hiểu rõ tác động của AI đến quy trình phát triển&lt;/li&gt;
&lt;li&gt;Định hướng cho các chiến lược áp dụng AI coding tools&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bonus"&gt;Bonus
&lt;/h2&gt;&lt;h3 id="images"&gt;Images
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://substackcdn.com/image/fetch/$s_!VQTW!,w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee73de9e-d2ee-407a-ac6e-93679bdd887d_2250x2624.png"
loading="lazy"
alt="A Guide to Retry Pattern in Distributed Systems"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Đánh giá:&lt;/strong&gt; &lt;em&gt;Tốc độ xử lý urls rất chậm, mình mất cực nhiều thời gian so với trước kia để xử lý 1 url. Tóm tắt khi ngắn khi dài, lại còn đôi khi lẫn lộn kí tự tiếng Trung vào nữa (có vẻ là do model của Z.AI)&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Bài viết đã được review và cập nhật bởi Claude Code với Opus 4.7 (1M context).&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Newsletter #8</title><link>https://miti99.com/post/2025/03/24/</link><pubDate>Mon, 24 Mar 2025 00:00:00 +0700</pubDate><guid>https://miti99.com/post/2025/03/24/</guid><description>&lt;p&gt;&lt;em&gt;Mời bạn thưởng thức Newsletter #8.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="let"&gt;&lt;a class="link" href="https://info.michael-simons.eu/2025/02/05/lets-deadlock-all-the-things/" target="_blank" rel="noopener"
&gt;Let&amp;rsquo;s deadlock all the things&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết của Michael Simons kể về một lỗi &amp;ldquo;rookie&amp;rdquo; mà ông gặp phải khi làm việc với Java HttpClient, cho thấy rằng ngay cả những lập trình viên có kinh nghiệm cũng có thể mắc những lỗi cơ bản.&lt;/p&gt;
&lt;p&gt;Tác giả đang cố gắng chuyển đổi code từ &lt;code&gt;HttpURLConnection&lt;/code&gt; cũ sang &lt;code&gt;HttpClient&lt;/code&gt; mới của Java. Trong quá trình này, ông đã cố gắng sử dụng &lt;code&gt;PipedInputStream&lt;/code&gt; và &lt;code&gt;PipedOutputStream&lt;/code&gt; để xử lý request body, bỏ qua cảnh báo trong JavaDoc về việc sử dụng cả hai đối tượng trong cùng một thread có thể gây deadlock.&lt;/p&gt;
&lt;p&gt;Mặc dù code &amp;ldquo;hoạt động&amp;rdquo; trong các test cơ bản, nhưng khi xử lý payload lớn hơn buffer mặc định (1024 bytes), hệ thống sẽ bị deadlock và có thể làm cạn kiệt tất cả các thread có sẵn.&lt;/p&gt;
&lt;p&gt;Tác giả chia sẻ một số bài học rút ra:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Đọc kỹ tài liệu và không bỏ qua các cảnh báo&lt;/li&gt;
&lt;li&gt;Cần có góc nhìn thứ hai từ đồng nghiệp&lt;/li&gt;
&lt;li&gt;Test kỹ hơn, đặc biệt là các trường hợp biên&lt;/li&gt;
&lt;li&gt;AI có thể giúp tạo test input, nhưng không thể thay thế việc hiểu sâu về API&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Cuối cùng, tác giả đã tìm ra giải pháp bằng cách sử dụng virtual thread để xử lý việc ghi dữ liệu, tránh deadlock và cho phép xử lý payload lớn một cách hiệu quả.&lt;/p&gt;
&lt;h2 id="engineers-who-won"&gt;&lt;a class="link" href="https://www.seangoedecke.com/taking-a-position/" target="_blank" rel="noopener"
&gt;Engineers who won&amp;rsquo;t commit&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết của Sean Goedecke thảo luận về một vấn đề phổ biến trong giới kỹ sư phần mềm: việc không dám đưa ra quan điểm trong các cuộc thảo luận kỹ thuật. Tác giả cho rằng mặc dù việc giữ thái độ &amp;ldquo;cởi mở&amp;rdquo; và &amp;ldquo;không cam kết&amp;rdquo; có thể phù hợp với kỹ sư mới vào nghề, nhưng khi bạn là người có nhiều kinh nghiệm nhất trong phòng họp, bạn cần phải đưa ra quan điểm của mình, ngay cả khi chỉ tự tin 55-60%.&lt;/p&gt;
&lt;p&gt;Tác giả chỉ ra rằng việc không đưa ra quan điểm có thể dẫn đến những hậu quả tiêu cực:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Buộc những người ít kinh nghiệm hơn phải tự quyết định&lt;/li&gt;
&lt;li&gt;Có thể dẫn đến việc người kém nhất nhưng nói to nhất trong nhóm đưa ra quyết định tồi&lt;/li&gt;
&lt;li&gt;Tạo gánh nặng cho quản lý khi họ phải đưa ra quyết định kỹ thuật thay vì kỹ sư&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tuy nhiên, tác giả cũng thừa nhận rằng có những trường hợp ngoại lệ hợp lý, đặc biệt là trong môi trường làm việc độc hại nơi các kỹ sư có thể bị trừng phạt vì đưa ra ước tính không chính xác.&lt;/p&gt;
&lt;p&gt;Bài viết kết luận rằng việc đưa ra quan điểm là trách nhiệm của kỹ sư có kinh nghiệm, và việc không làm điều đó có thể được coi là một dạng hèn nhát. Điều quan trọng là phải phân biệt giữa việc đưa ra quan điểm trong môi trường làm việc và việc giữ thái độ cởi mở trong các cuộc thảo luận với đồng nghiệp có cùng trình độ.&lt;/p&gt;
&lt;h2 id="patterns-for-building-realtime-features"&gt;&lt;a class="link" href="https://zknill.io/posts/patterns-for-building-realtime/" target="_blank" rel="noopener"
&gt;Patterns for building realtime features&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết của Zach Knill giới thiệu các mẫu thiết kế phổ biến để xây dựng tính năng realtime trong ứng dụng. Các tính năng realtime giúp ứng dụng cảm giác hiện đại, có tính cộng tác và luôn được cập nhật kịp thời.&lt;/p&gt;
&lt;p&gt;Tác giả giới thiệu 4 mẫu thiết kế chính:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Poke/Pull&lt;/strong&gt;: Server gửi thông báo (&amp;ldquo;poke&amp;rdquo;) cho các client đã đăng ký khi có thay đổi, sau đó client sẽ tự động kéo (&amp;ldquo;pull&amp;rdquo;) dữ liệu mới. Mẫu này dễ tích hợp vào ứng dụng hiện có nhưng có thể gây tải cho server do nhiều client cùng kéo dữ liệu.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Push state&lt;/strong&gt;: Server trực tiếp đẩy trạng thái mới đến client thay vì chỉ gửi thông báo. Mẫu này giải quyết vấn đề tải server nhưng có thể không hiệu quả khi trạng thái lớn hoặc khi client cần biết chính xác điều gì đã thay đổi.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Push operations&lt;/strong&gt;: Server gửi các thao tác thay đổi thay vì toàn bộ trạng thái. Mẫu này giúp client biết chính xác điều gì đã thay đổi và giảm lượng dữ liệu truyền tải, nhưng yêu cầu client phải có logic để áp dụng các thao tác.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Event sourcing&lt;/strong&gt;: Server gửi các sự kiện đã xảy ra thay vì các thao tác. Mẫu này cho phép client có logic phức tạp hơn nhưng yêu cầu client phải hiểu ý nghĩa của mỗi sự kiện.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tác giả cũng thảo luận về các phương thức vận chuyển (transports) như WebSocket, SSE, và các thách thức khi triển khai trong hệ thống phân tán. Trong môi trường có nhiều server replica, việc đồng bộ trạng thái giữa các client kết nối với các server khác nhau có thể phức tạp, và các dịch vụ Pub/Sub có thể giúp giải quyết vấn đề này.&lt;/p&gt;
&lt;h2 id="optimizing-the-databases-at-quora"&gt;&lt;a class="link" href="https://quoraengineering.quora.com/Optimizing-the-databases-at-Quora" target="_blank" rel="noopener"
&gt;Optimizing the databases at Quora&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết từ đội ngũ kỹ sư Quora chia sẻ chi tiết về quá trình tối ưu hóa cơ sở dữ liệu của họ. Quora đã phải đối mặt với nhiều thách thức khi hệ thống phát triển, bao gồm việc xử lý lượng lớn dữ liệu và đảm bảo hiệu suất cho người dùng.&lt;/p&gt;
&lt;p&gt;Các chiến lược tối ưu chính bao gồm:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Phân mảnh dữ liệu (Sharding)&lt;/strong&gt;: Quora đã triển khai sharding để phân phối tải trên nhiều máy chủ cơ sở dữ liệu. Họ sử dụng một chiến lược sharding dựa trên user_id, cho phép họ phân phối dữ liệu người dùng một cách hiệu quả.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tối ưu hóa truy vấn&lt;/strong&gt;: Đội ngũ đã phân tích và tối ưu các truy vấn phổ biến, thêm các chỉ mục phù hợp và loại bỏ các truy vấn không cần thiết.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Caching&lt;/strong&gt;: Quora triển khai nhiều lớp cache khác nhau:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cache ở cấp độ ứng dụng cho dữ liệu thường xuyên truy cập&lt;/li&gt;
&lt;li&gt;Cache ở cấp độ cơ sở dữ liệu cho các kết quả truy vấn phổ biến&lt;/li&gt;
&lt;li&gt;Sử dụng Memcached cho cache phân tán&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Đọc/ghi phân tách (Read/Write Splitting)&lt;/strong&gt;: Hệ thống được thiết kế để phân tách các hoạt động đọc và ghi, cho phép mở rộng độc lập các khả năng đọc và ghi.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Giám sát và cảnh báo&lt;/strong&gt;: Quora đã xây dựng hệ thống giám sát toàn diện để theo dõi hiệu suất cơ sở dữ liệu và phát hiện sớm các vấn đề.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bài viết cũng nhấn mạnh tầm quan trọng của việc:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thường xuyên phân tích và tối ưu hóa hiệu suất&lt;/li&gt;
&lt;li&gt;Xây dựng các công cụ tự động hóa cho việc quản lý cơ sở dữ liệu&lt;/li&gt;
&lt;li&gt;Duy trì sự cân bằng giữa hiệu suất và tính đơn giản của hệ thống&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="failure-mitigation-for-microservices-an-intro-to-aperture"&gt;&lt;a class="link" href="https://careersatdoordash.com/blog/failure-mitigation-for-microservices-an-intro-to-aperture/" target="_blank" rel="noopener"
&gt;Failure Mitigation for Microservices: An Intro to Aperture&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết từ đội ngũ DoorDash giới thiệu về Aperture, một hệ thống quản lý độ tin cậy mã nguồn mở mà họ đã phát triển để giải quyết các vấn đề phổ biến trong kiến trúc microservices.&lt;/p&gt;
&lt;p&gt;Aperture được thiết kế để giải quyết 3 thách thức chính:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Cascading Failures&lt;/strong&gt;: Lỗi lan truyền từ service này sang service khác&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retry Storms&lt;/strong&gt;: Các request thất bại được thử lại nhiều lần&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Death Spirals&lt;/strong&gt;: Lỗi lan truyền ngang trong cùng một service&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Hệ thống hoạt động theo 3 bước chính:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Collect&lt;/strong&gt;: Thu thập metrics từ các node (CPU, memory, latency, error rate) thông qua sidecar và tổng hợp trong Prometheus&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analyze&lt;/strong&gt;: Controller giám sát metrics và theo dõi các sai lệch so với service-level objectives (SLO) được định nghĩa trong file YAML&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actuate&lt;/strong&gt;: Khi các policy được kích hoạt, Aperture sẽ thực hiện các hành động như load shedding hoặc rate limiting phân tán&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;DoorDash đã triển khai Aperture trong một service chính và thử nghiệm với các request nhân tạo. Kết quả cho thấy nó hoạt động như một global rate limiter và load shedder mạnh mẽ, dễ sử dụng.&lt;/p&gt;
&lt;p&gt;Bài viết cũng nhấn mạnh tầm quan trọng của việc:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thiết lập SLO rõ ràng cho mỗi service&lt;/li&gt;
&lt;li&gt;Giám sát liên tục và phát hiện sớm các vấn đề&lt;/li&gt;
&lt;li&gt;Tự động hóa việc xử lý các sự cố&lt;/li&gt;
&lt;li&gt;Duy trì tính đơn giản của hệ thống&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="zero-configuration-service-mesh-with-on-demand-cluster-discovery"&gt;&lt;a class="link" href="https://netflixtechblog.com/zero-configuration-service-mesh-with-on-demand-cluster-discovery-ac6483b52a51" target="_blank" rel="noopener"
&gt;Zero Configuration Service Mesh with On-Demand Cluster Discovery&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết từ đội ngũ Netflix chia sẻ về hành trình chuyển đổi sang service mesh và cách họ giải quyết thách thức về cấu hình cluster trong môi trường microservices phức tạp.&lt;/p&gt;
&lt;p&gt;Netflix đã sớm chuyển sang cloud, bắt đầu từ năm 2008 và hoàn thành vào năm 2010. Trong giai đoạn đầu, họ đã xây dựng các công cụ riêng như Eureka cho service discovery và Ribbon cho IPC (Inter-Process Communication). Tuy nhiên, khi hệ thống phát triển, họ gặp phải nhiều thách thức mới:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hỗ trợ nhiều loại IPC client khác nhau (REST, GraphQL, gRPC)&lt;/li&gt;
&lt;li&gt;Môi trường đa ngôn ngữ (Java, Node.js, Python)&lt;/li&gt;
&lt;li&gt;Nhu cầu về các tính năng phức tạp như adaptive concurrency limiting, circuit breaking&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Để giải quyết các vấn đề này, Netflix quyết định chuyển sang sử dụng service mesh với Envoy làm proxy. Tuy nhiên, họ gặp phải thách thức về việc cấu hình cluster: mỗi service có thể cần giao tiếp với hàng chục cluster khác nhau, và danh sách này thay đổi liên tục.&lt;/p&gt;
&lt;p&gt;Netflix đã hợp tác với Kinvolk và cộng đồng Envoy để phát triển tính năng On-Demand Cluster Discovery (ODCDS). Với tính năng này, proxy có thể tìm kiếm thông tin cluster khi cần thiết, thay vì phải định nghĩa trước tất cả các cluster trong cấu hình.&lt;/p&gt;
&lt;p&gt;Quy trình hoạt động:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Request đến Envoy&lt;/li&gt;
&lt;li&gt;Kiểm tra cluster đích dựa trên header&lt;/li&gt;
&lt;li&gt;Nếu cluster chưa tồn tại, tạm dừng request&lt;/li&gt;
&lt;li&gt;Yêu cầu thông tin cluster từ control plane&lt;/li&gt;
&lt;li&gt;Nhận thông tin cluster và endpoints&lt;/li&gt;
&lt;li&gt;Tiếp tục xử lý request&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Lợi ích chính:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Không cần cấu hình trước các cluster&lt;/li&gt;
&lt;li&gt;Giảm độ phức tạp của hệ thống&lt;/li&gt;
&lt;li&gt;Tiết kiệm bộ nhớ bằng cách chỉ tải thông tin cluster cần thiết&lt;/li&gt;
&lt;li&gt;Dễ dàng chuyển đổi từ hệ thống cũ sang service mesh&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tuy nhiên, cũng có một số nhược điểm:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thêm độ trễ cho request đầu tiên đến một cluster&lt;/li&gt;
&lt;li&gt;Có thể không phù hợp với các service yêu cầu độ trễ rất thấp&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Netflix vẫn đang trong giai đoạn đầu của hành trình service mesh và đang tiếp tục cải thiện hệ thống, đặc biệt là trong việc tối ưu hóa EDS (Endpoint Discovery Service).&lt;/p&gt;
&lt;h2 id="the-quest-to-understand-metric-movements"&gt;&lt;a class="link" href="https://medium.com/pinterest-engineering/the-quest-to-understand-metric-movements-8ab12ae97cda" target="_blank" rel="noopener"
&gt;The Quest to Understand Metric Movements&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết từ đội ngũ Pinterest chia sẻ về cách họ xây dựng hệ thống phân tích nguyên nhân gốc rễ (Root Cause Analysis - RCA) cho các chuyển động của metrics. Khi một metric quan trọng có sự thay đổi bất thường, việc tìm ra nguyên nhân có thể rất phức tạp do có nhiều yếu tố có thể ảnh hưởng.&lt;/p&gt;
&lt;p&gt;Pinterest đã phát triển ba phương pháp tiếp cận chính:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Slice and Dice&lt;/strong&gt;: Phân tích chi tiết các phân đoạn của metric để tìm manh mối về nguyên nhân thay đổi. Ví dụ, khi phân tích tỷ lệ xem video, họ có thể chia nhỏ theo các chiều như quốc gia, loại thiết bị, loại Pin, v.v. Phương pháp này đặc biệt hiệu quả trong việc chẩn đoán các vấn đề về metrics video.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;General Similarity&lt;/strong&gt;: Tìm kiếm các metrics khác có chuyển động tương tự trong cùng khoảng thời gian. Hệ thống sử dụng bốn yếu tố để đo lường độ tương đồng:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pearson correlation: đo mối quan hệ tuyến tính&lt;/li&gt;
&lt;li&gt;Spearman&amp;rsquo;s rank correlation: đo mối quan hệ đơn điệu&lt;/li&gt;
&lt;li&gt;Euclidean similarity: dựa trên khoảng cách Euclidean&lt;/li&gt;
&lt;li&gt;Dynamic time warping: cho phép so sánh các chuỗi thời gian có độ dài khác nhau&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Experiment Effects&lt;/strong&gt;: Phân tích tác động của các thử nghiệm A/B testing lên metrics. Hệ thống sẽ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tính toán tác động của mỗi thử nghiệm lên metric&lt;/li&gt;
&lt;li&gt;Sử dụng Welch&amp;rsquo;s t-test để đánh giá ý nghĩa thống kê&lt;/li&gt;
&lt;li&gt;Lọc các thử nghiệm dựa trên p-value và sự mất cân bằng giữa nhóm kiểm soát và nhóm thử nghiệm&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Các phương pháp này có thể được sử dụng kết hợp với nhau để thu hẹp phạm vi tìm kiếm nguyên nhân. Pinterest đang tiếp tục cải thiện hệ thống bằng cách:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thêm cơ chế phản hồi từ người dùng&lt;/li&gt;
&lt;li&gt;Tích hợp với các nền tảng dữ liệu khác&lt;/li&gt;
&lt;li&gt;Khám phá các mối quan hệ nhân quả giữa các metrics&lt;/li&gt;
&lt;li&gt;Tích hợp RCA vào các công cụ khám phá và trực quan hóa dữ liệu&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="meta"&gt;&lt;a class="link" href="https://cacm.acm.org/research/metas-hyperscale-infrastructure-overview-and-insights/" target="_blank" rel="noopener"
&gt;Meta&amp;rsquo;s Hyperscale Infrastructure: Overview and Insights&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết từ Chunqiang Tang của Meta chia sẻ tổng quan về cơ sở hạ tầng hyperscale của công ty và những bài học kinh nghiệm từ quá trình phát triển. Mặc dù hầu hết các kỹ sư không trực tiếp xây dựng cơ sở hạ tầng hyperscale, việc hiểu về nó rất có ích vì nhiều công nghệ phổ biến ngày nay đã bắt nguồn từ môi trường này.&lt;/p&gt;
&lt;p&gt;Các điểm chính về văn hóa kỹ thuật của Meta:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Move fast&lt;/strong&gt;: Tập trung vào việc triển khai nhanh và lặp lại liên tục:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Triển khai liên tục code mới nhất vào production&lt;/li&gt;
&lt;li&gt;Sử dụng serverless functions cho các sản phẩm&lt;/li&gt;
&lt;li&gt;Cho phép các team nhanh chóng thay đổi ưu tiên&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Technology openness&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sử dụng monorepo cho tất cả dự án&lt;/li&gt;
&lt;li&gt;Không áp dụng quy tắc sở hữu code nghiêm ngặt&lt;/li&gt;
&lt;li&gt;Đóng góp nhiều dự án mã nguồn mở (PyTorch, Llama, Presto, RocksDB)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Research in production&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Không có phòng nghiên cứu riêng biệt&lt;/li&gt;
&lt;li&gt;Các team phát triển sản phẩm trực tiếp thực hiện nghiên cứu&lt;/li&gt;
&lt;li&gt;Đảm bảo các giải pháp hoạt động ở quy mô lớn&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Common infrastructure&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chuẩn hóa phần cứng (một loại server duy nhất cho non-AI workloads)&lt;/li&gt;
&lt;li&gt;Tối ưu hóa ứng dụng cho phần cứng thay vì ngược lại&lt;/li&gt;
&lt;li&gt;Tập trung vào tối ưu hóa toàn cục thay vì cục bộ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Chiến lược AI của Meta bao gồm:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thiết kế đồng bộ toàn bộ stack từ PyTorch đến AI accelerators&lt;/li&gt;
&lt;li&gt;Tối ưu hóa mạng và các mô hình ML như Llama&lt;/li&gt;
&lt;li&gt;Tích hợp chặt chẽ giữa phần cứng và phần mềm&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bài viết cũng nhấn mạnh tầm quan trọng của việc:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Duy trì sự cân bằng giữa tốc độ phát triển và độ ổn định&lt;/li&gt;
&lt;li&gt;Tập trung vào việc tối ưu hóa toàn cục&lt;/li&gt;
&lt;li&gt;Đầu tư vào nghiên cứu và phát triển các công nghệ mới&lt;/li&gt;
&lt;li&gt;Chia sẻ kiến thức và công nghệ với cộng đồng&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="incremental-platforms-monolithic-modular-architecture"&gt;&lt;a class="link" href="https://newsletter.optimistengineer.com/p/incremental-platforms-monolithic" target="_blank" rel="noopener"
&gt;Incremental Platforms: Monolithic Modular Architecture&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết của Marcos F. Lobo giới thiệu về kiến trúc Monolithic Modular, một cách tiếp cận để xây dựng nền tảng có khả năng phát triển bền vững. Kiến trúc này kết hợp sự đơn giản của monolithic với lợi ích của thiết kế modular và tách biệt.&lt;/p&gt;
&lt;p&gt;Đặc điểm chính của kiến trúc này:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Single Deployment&lt;/strong&gt;: Toàn bộ code được đóng gói và triển khai như một ứng dụng duy nhất&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Internal Modularization&lt;/strong&gt;: Ứng dụng được chia thành các module hoặc component riêng biệt, mỗi module có:
&lt;ul&gt;
&lt;li&gt;Interface rõ ràng&lt;/li&gt;
&lt;li&gt;Contract xác định cách giao tiếp với các module khác&lt;/li&gt;
&lt;li&gt;Trách nhiệm duy nhất và được định nghĩa rõ ràng&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Để đạt được kiến trúc này, tác giả đề xuất các nguyên tắc:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Định nghĩa ranh giới và contract rõ ràng&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mỗi module phải có interface công khai&lt;/li&gt;
&lt;li&gt;Sử dụng các pattern như facade để tránh truy cập trực tiếp vào implementation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tách biệt các mối quan tâm&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Đảm bảo mỗi module có một trách nhiệm duy nhất&lt;/li&gt;
&lt;li&gt;Giảm thiểu sự phụ thuộc giữa các module&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tổ chức code và cấu trúc package&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sử dụng cấu trúc package phản ánh sự phân chia module&lt;/li&gt;
&lt;li&gt;Đảm bảo mỗi module có thể được tách riêng trong tương lai&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Testing và tự động hóa&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Test các use case của monolith&lt;/li&gt;
&lt;li&gt;Sử dụng CI/CD để kiểm tra tính toàn vẹn và giao tiếp giữa các module&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Quản lý phụ thuộc và giao tiếp&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sử dụng dependency injection&lt;/li&gt;
&lt;li&gt;Xem xét sử dụng messaging hoặc events để tách biệt các module&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Lợi ích chính:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Đơn giản trong triển khai và vận hành&lt;/strong&gt;: Một artifact duy nhất, giảm overhead&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dễ dàng phát triển và refactor&lt;/strong&gt;: Giao dịch đơn giản, truy cập tài nguyên dễ dàng&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hiệu suất và tính nhất quán&lt;/strong&gt;: Gọi giữa các module trong bộ nhớ, xử lý giao dịch đơn giản&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hỗ trợ Domain-Driven Design&lt;/strong&gt;: Dễ dàng chia hệ thống theo bounded contexts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kiến trúc này đặc biệt phù hợp cho:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dự án giai đoạn đầu&lt;/li&gt;
&lt;li&gt;Nhóm nhỏ&lt;/li&gt;
&lt;li&gt;Hệ thống cần tính nhất quán và toàn vẹn giao dịch&lt;/li&gt;
&lt;li&gt;Nền tảng có thể phát triển dần dần thành kiến trúc phân tán trong tương lai&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bonus-vài-video-hay-ho-đến-từ-bytebytego"&gt;Bonus: Vài video hay ho đến từ &lt;a class="link" href="https://bytebytego.com/" target="_blank" rel="noopener"
&gt;ByteByteGo&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://www.youtube.com/watch?v=3Kqal7QaCCM" target="_blank" rel="noopener"
&gt;How the Garbage Collector Works in Java, Python, and Go!&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="bonus-2-vài-hình-ảnh-hay-ho-đến-từ-bytebytego"&gt;Bonus 2: Vài hình ảnh hay ho đến từ &lt;a class="link" href="https://bytebytego.com/" target="_blank" rel="noopener"
&gt;ByteByteGo&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/c3beec9e-cd04-4748-ae7e-3299b42883f6_2360x2824.png"
loading="lazy"
alt="How to Build Idempotent APIs"
&gt;
&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/2f632296-4214-4ec8-a1d2-280e9b7f2696_1280x1532.gif"
loading="lazy"
alt="12 Algorithms for System Design Interviews"
&gt;
&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/65a92a81-f2c5-4aed-9faa-35a66124cffe_1283x1536.gif"
loading="lazy"
alt="How Kubernetes Works?"
&gt;
&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/a6903386-4b5f-450e-b64d-839c6fdf8238_1280x1601.gif"
loading="lazy"
alt="PostgreSQL 101: The Everything Database"
&gt;
&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/06c5ad46-faaf-479b-bde3-b5de8033b4e9_1280x1664.gif"
loading="lazy"
alt="Top 12 Tips for API Security"
&gt;&lt;/p&gt;
&lt;h2 id="bonus-3-vài-hình-ảnh-hay-ho-đến-từ-designgurus"&gt;Bonus 3: Vài hình ảnh hay ho đến từ &lt;a class="link" href="https://designgurus.io/" target="_blank" rel="noopener"
&gt;DesignGurus&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;&lt;img src="https://www.designgurus.io/_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fdownload%2Fstorage%2Fv1%2Fb%2Fdesigngurus-prod.appspot.com%2Fo%2Fee5726e8e29469477b999c100%3Fgeneration%3D1726724098184989%26alt%3Dmedia&amp;amp;w=3840&amp;amp;q=75&amp;amp;dpl=dpl_3Rx6M949Pc1cQKT3QTdj87FcKNdg"
loading="lazy"
alt="System Design Master Template"
&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Bài viết đã được review và cập nhật bởi Claude Code với Opus 4.7 (1M context).&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Newsletter #2</title><link>https://miti99.com/post/2025/02/16/</link><pubDate>Sun, 16 Feb 2025 00:00:00 +0700</pubDate><guid>https://miti99.com/post/2025/02/16/</guid><description>&lt;i&gt;
Chào các bạn, đến hẹn lại lên, đây là Newsletter #2 của mình. Cuối tuần này mình đi chơi ở Xuyên Mộc, vừa về hôm nay thôi nên giờ mới lên bài.
&lt;p&gt;Thôi không vòng vo nữa, vào ngay Newsletter #2 của MiTi nào.
&lt;/i&gt;&lt;/p&gt;
&lt;h2 id="some-things-to-expect-in-2025"&gt;&lt;a class="link" href="https://lwn.net/Articles/1003780/" target="_blank" rel="noopener"
&gt;Some things to expect in 2025&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết dự đoán một số xu hướng và sự kiện có thể xảy ra trong cộng đồng Linux và phần mềm tự do năm 2025. Đầu tiên, sched-ext sẽ trở thành yếu tố thay đổi cuộc chơi, cho phép tải trình lập lịch CPU từ không gian người dùng thông qua BPF, thúc đẩy sự sáng tạo và thử nghiệm. Mã Rust sẽ được tích hợp nhiều hơn vào kernel, mang lại các tính năng mà người dùng cuối có thể không nhận ra. Bài viết cảnh báo về một nỗ lực backdoor tương tự như XZ có thể xuất hiện, và các dự án chỉ có một người duy trì sẽ bị coi là rủi ro hơn.&lt;/p&gt;
&lt;p&gt;Một dự án lớn có thể phát hiện ra rằng họ đã hợp nhất nhiều mã do AI tạo ra mà tác giả không thực sự hiểu. Đồng thời, sẽ có nhiều nỗ lực tập trung hơn vào việc tạo ra các hệ thống AI tạo sinh thực sự tự do. Các tổ chức hỗ trợ công việc phần mềm tự do sẽ tiếp tục gặp khó khăn. Nhiều sản phẩm dựa trên đám mây sẽ trở thành &amp;ldquo;cục gạch&amp;rdquo; khi nhà sản xuất phá sản hoặc ngừng hỗ trợ. Phần cứng hoàn toàn mở sẽ trở nên phổ biến hơn, và các bản phân phối cho thiết bị di động sẽ chứng kiến sự quan tâm trở lại. Cuối cùng, bài viết nhấn mạnh rằng sự hiếu chiến toàn cầu sẽ tác động đến cộng đồng, và lời kêu gọi được đưa ra là hãy giữ vững các giá trị cốt lõi của cộng đồng trong bối cảnh chính trị phân cực.&lt;/p&gt;
&lt;h2 id="why-you-should-use-compact-table-columns"&gt;&lt;a class="link" href="https://vladmihalcea.com/compact-table-columns/" target="_blank" rel="noopener"
&gt;Why you should use compact table columns&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết giải thích tầm quan trọng của việc sử dụng các kiểu cột (column types) nhỏ gọn trong thiết kế cơ sở dữ liệu để tăng tốc độ truy vấn SQL. Việc sử dụng các kiểu cột nhỏ gọn cho phép lưu trữ nhiều bản ghi và mục chỉ mục hơn trong bộ nhớ cache, giúp giảm thiểu số lần truy cập đĩa. StackOverflow là một ví dụ điển hình, họ đã sử dụng chiến lược này để phục vụ hàng nghìn truy vấn mỗi giây chỉ với một máy chủ SQL duy nhất.&lt;/p&gt;
&lt;p&gt;Bài viết chỉ ra rằng việc sử dụng các khóa chính (Primary Key) và khóa ngoại (Foreign Key) kiểu int hoặc tinyint thay vì UUID hoặc bigint, biểu diễn giá trị enum bằng 1 byte, và giới hạn độ dài của các cột VARCHAR giúp tiết kiệm không gian lưu trữ. Tác giả cũng trình bày các ví dụ cụ thể trên MySQL và PostgreSQL, cho thấy việc sử dụng các kiểu cột nhỏ gọn có thể giảm đáng kể kích thước bảng và chỉ mục, từ đó cải thiện hiệu suất truy vấn. Tuy nhiên, cần lưu ý về việc căn chỉnh cột (column alignment) trong PostgreSQL để đạt hiệu quả tối ưu. Tóm lại, việc lựa chọn kiểu cột phù hợp là một yếu tố quan trọng để tối ưu hóa hiệu suất cơ sở dữ liệu.&lt;/p&gt;
&lt;h2 id="rate-limiting-with-redis-an-essential-guide"&gt;&lt;a class="link" href="https://foojay.io/today/rate-limiting-with-redis-an-essential-guide/" target="_blank" rel="noopener"
&gt;Rate limiting with Redis: An essential guide&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết này giới thiệu về rate limiting (giới hạn tốc độ truy cập), giải thích tầm quan trọng của nó trong việc bảo vệ tài nguyên khỏi bị quá tải, ngăn chặn lạm dụng, đảm bảo truy cập công bằng, quản lý tải, giảm chi phí và bảo vệ hệ thống khỏi downtime. Redis được giới thiệu như một công cụ phổ biến để triển khai rate limiter nhờ tốc độ, độ tin cậy và các tính năng như thao tác nguyên tử, lưu trữ dữ liệu và Lua scripting.&lt;/p&gt;
&lt;p&gt;Bài viết trình bày chi tiết các thuật toán rate limiting phổ biến: Leaky Bucket (ổn định luồng traffic), Token Bucket (xử lý các đợt tăng đột biến), Fixed Window Counter (đơn giản, độ chính xác thấp), Sliding Window Log (độ chính xác cao, tốn nhiều tài nguyên) và Sliding Window Counter (cân bằng giữa độ chính xác và hiệu quả).&lt;/p&gt;
&lt;p&gt;Để chọn thuật toán phù hợp, cần hiểu rõ đặc điểm traffic (dự đoán được, đột biến, hỗn hợp), mức độ chính xác cần thiết, giới hạn tài nguyên (bộ nhớ, CPU, khả năng mở rộng) và trải nghiệm người dùng. Bài viết nhấn mạnh rằng rate limiting không chỉ là việc thiết lập giới hạn mà còn là thiết kế các hệ thống hiệu quả, công bằng và thân thiện với người dùng. Các triển khai cho từng loại rate limiter với Java &amp;amp; Redis sẽ được phát hành hàng tuần.&lt;/p&gt;
&lt;h2 id="why-does-cloudflare-pages-have-such-a-generous-free-tier"&gt;&lt;a class="link" href="https://mattsayar.com/why-does-cloudflare-pages-have-such-a-generous-free-tier/" target="_blank" rel="noopener"
&gt;Why does Cloudflare Pages have such a generous Free tier?&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết của Matt Sayar khám phá lý do tại sao Cloudflare Pages lại có một gói miễn phí hào phóng trong bối cảnh nhiều dịch vụ hosting hiện nay cung cấp các gói miễn phí tương tự. Cloudflare Pages nổi bật với băng thông không giới hạn, điều mà ít nền tảng nào khác có thể cạnh tranh. Các dịch vụ như GitHub Pages, GitLab Pages và Netlify đều có giới hạn băng thông, trong khi Cloudflare cho phép người dùng thoải mái phát triển trang web mà không lo lắng về chi phí phát sinh.&lt;/p&gt;
&lt;p&gt;Tác giả cho rằng việc cung cấp băng thông không giới hạn phù hợp với chiến lược của Cloudflare trong việc phát triển một internet an toàn và nhanh chóng. Một trang web tĩnh nhẹ nhàng và dễ phục vụ, giúp Cloudflare tiết kiệm chi phí. Hơn nữa, khi người dùng trải nghiệm dịch vụ miễn phí, họ có xu hướng có ấn tượng tích cực và có thể chuyển sang sử dụng các sản phẩm trả phí của Cloudflare trong tương lai.&lt;/p&gt;
&lt;p&gt;Bài viết cũng nhấn mạnh rằng Cloudflare đang đầu tư vào việc cải thiện internet và cung cấp nhiều dịch vụ bảo mật miễn phí, từ đó tạo ra một vòng luân chuyển lợi ích cho cả người dùng và công ty. Tác giả kết luận rằng đây là một cơ hội tốt để thử nghiệm các sản phẩm mới của Cloudflare, đặc biệt là trong thời gian gói miễn phí vẫn còn hiệu lực.&lt;/p&gt;
&lt;h2 id="how-i-program-with-llms"&gt;&lt;a class="link" href="https://crawshaw.io/blog/programming-with-llms" target="_blank" rel="noopener"
&gt;How I program with LLMs&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết này tổng hợp những kinh nghiệm cá nhân của tác giả trong việc sử dụng các mô hình ngôn ngữ lớn (LLM) trong lập trình trong năm vừa qua. Tác giả nhấn mạnh rằng việc sử dụng LLM đã mang lại hiệu quả tích cực cho năng suất làm việc, và việc quay trở lại lập trình mà không có chúng trở nên khó khăn. Tác giả thường sử dụng LLM để tự động hóa các bước lặp đi lặp lại và một công cụ có tên sketch.dev đang được phát triển để hỗ trợ lập trình Go.&lt;/p&gt;
&lt;p&gt;Có ba cách chính mà tác giả sử dụng LLM: để tự động hoàn thành code, cho các tác vụ tìm kiếm, và trong các phiên lập trình dựa trên chat. Tác giả thấy rằng LLM đặc biệt hữu ích khi anh ta biết những gì cần viết, nhưng không có đủ năng lượng để bắt đầu một file mới, tra cứu các thư viện cần thiết. LLM cung cấp bản nháp đầu tiên, thường chứa các ý tưởng hay, các dependency cần thiết và một vài lỗi. Việc sửa các lỗi này thường dễ dàng hơn là bắt đầu từ đầu.&lt;/p&gt;
&lt;p&gt;LLM cũng rất hữu ích trong việc tạo ra các code review packet, đặc biệt là khi chúng cần sử dụng nhiều thư viện phổ biến. Tuy nhiên, cần phải biên dịch và chạy thử code do LLM tạo ra trước khi đọc kỹ, vì chúng có thể tạo ra code không biên dịch được.&lt;/p&gt;
&lt;p&gt;Ví dụ, tác giả đã sử dụng LLM để viết một reservoir sampler cho các quartiles của các số float. LLM đã tạo ra một package có cấu trúc tốt, interface tốt và các test, nhưng code ban đầu không biên dịch được và các test chứa các giá trị sai. Tác giả đã sửa các lỗi này và sau đó yêu cầu LLM tạo ra các test tốt hơn bằng cách so sánh kết quả của reservoir sampler với một triển khai tiêu chuẩn. LLM đã tạo ra một fuzz test, nhưng nó chứa một lỗi cú pháp. Sau khi tác giả sửa lỗi này, fuzz test đã hoạt động tốt.&lt;/p&gt;
&lt;p&gt;Nhìn chung, tác giả kết luận rằng LLM có thể là một công cụ hữu ích cho các lập trình viên, nhưng chúng không hoàn hảo và cần được sử dụng một cách cẩn thận. LLM có thể giúp cải thiện năng suất, viết test toàn diện hơn và làm cho code dễ đọc hơn.&lt;/p&gt;
&lt;h2 id="bonus"&gt;Bonus
&lt;/h2&gt;&lt;p&gt;Tuần này có kha khá bonus đến từ nhiều nguồn khác nhau&lt;/p&gt;
&lt;h3 id="bonus-1-một-vài-ebook-mình-tìm-được"&gt;Bonus #1: Một vài ebook mình tìm được
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://info.microsoft.com/rs/157-GQE-382/images/EN-CNTNT-eBook-DesigningDistributedSystems.pdf" target="_blank" rel="noopener"
&gt;Designing Distributed Systems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://drive.google.com/file/d/1U7EchvgzCjTtF5JzGVVCFgjXC-qw7lIG/view" target="_blank" rel="noopener"
&gt;Quastor Summaries&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="bonus-2-vài-ảnh-hay-ho-đến-từ-bytebytego"&gt;Bonus #2: Vài ảnh hay ho đến từ &lt;a class="link" href="https://bytebytego.com/" target="_blank" rel="noopener"
&gt;ByteByteGo&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/11b53f30-8dba-4520-9b1a-425b54b9b84a_1280x1585.gif"
loading="lazy"
alt="Cookies Vs Sessions Vs JWT Vs PASETO"
&gt;
&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/fdbcc119-8f5d-4d27-9a4b-2c8bde82b537_4026x8030.jpeg"
loading="lazy"
alt="Algorithms you should know before taking System Design Interviews"
&gt;
&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/12dffcce-f231-48cc-915f-d53c0f8bce0c_3735x3573.jpeg"
loading="lazy"
alt="Top 6 Load Balancing Algorithms"
&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Bài viết đã được review và cập nhật bởi Claude Code với Opus 4.7 (1M context).&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Newsletter #1</title><link>https://miti99.com/post/2025/02/08/</link><pubDate>Sat, 08 Feb 2025 00:00:00 +0700</pubDate><guid>https://miti99.com/post/2025/02/08/</guid><description>&lt;i&gt;
Xin chào các bạn, đây lại là một lần mình quay viết blog sau chuỗi ngày lười biếng :D
&lt;p&gt;Một vấn đề mình nhận ra nhưng lười sửa đổi đó là mình đọc nhiều blog, nghịch nhiều tool, nhưng không có cái nào mình thật sự nghiêm túc, đủ để viết thành một blog chất lượng cả. Nếu có gì tâm đắc thì mình cũng quá lười để viết lại.&lt;/p&gt;
&lt;p&gt;Vì vậy mình chuyển sang thử một hình thức khác, đó là tổng hợp lại những bài blog hay mà mình đã tìm thấy, đọc được trong tuần vừa qua và tổng hợp lại thành một bản newsletter hàng tuần. Mong được mọi người ủng hộ.&lt;/p&gt;
&lt;p&gt;Không lòng vòng nữa, sau đây là Newsletter #1 của mình.
&lt;/i&gt;&lt;/p&gt;
&lt;h2 id="seconds-since-the-epoch"&gt;&lt;a class="link" href="https://aphyr.com/posts/378-seconds-since-the-epoch" target="_blank" rel="noopener"
&gt;Seconds Since the Epoch&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết này giải thích lý do tại sao thời gian POSIX, thường được cho là số giây kể từ kỷ nguyên Unix (ngày 1 tháng 1 năm 1970), thực tế không chính xác như vậy. Nguyên nhân là do thời gian POSIX bắt nguồn từ Giờ Phối Hợp Quốc Tế (UTC) và tiêu chuẩn giả định rằng mỗi ngày dài đúng 86.400 giây. Tuy nhiên, độ dài của một ngày thay đổi và các nhà thiên văn học định kỳ tuyên bố giây nhuận để giữ cho ngày UTC không trôi quá xa so với ngày mặt trời. Những giây nhuận này gây ra sự gián đoạn trong thời gian POSIX. Bài viết cũng thảo luận về các giải pháp thay thế cho thời gian POSIX và nỗ lực chấm dứt giây nhuận vào năm 2035.&lt;/p&gt;
&lt;h2 id="b-trees-more-than-i-thought-i"&gt;&lt;a class="link" href="https://benjamincongdon.me/blog/2021/08/17/B-Trees-More-Than-I-Thought-Id-Want-to-Know/" target="_blank" rel="noopener"
&gt;B-Trees: More Than I Thought I&amp;rsquo;d Want to Know&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài đăng trên blog này đi sâu vào cấu trúc dữ liệu Cây B, đặc biệt tập trung vào việc sử dụng chúng trong các công cụ lưu trữ cơ sở dữ liệu. Nó giải thích các ràng buộc do I/O đĩa áp đặt và cách Cây B giải quyết các ràng buộc này bằng cách định vị các khóa cùng nhau trên đĩa. Bài viết thảo luận về các trang có rãnh, được sử dụng để bố trí các khóa trên đĩa để tối đa hóa vị trí và nén khóa. Nó cũng bao gồm các kỹ thuật tối ưu hóa khác nhau như cắt ngắn khóa phân tách, các trang tràn và con trỏ anh em. Cuối cùng, bài đăng trên blog đề cập đến một số biến thể Cây B và các tối ưu hóa khác có thể cung cấp các tối ưu hóa trong một số trường hợp nhất định.&lt;/p&gt;
&lt;h2 id="sql-nulls-are-weird"&gt;&lt;a class="link" href="http://raymondtukpe.com/sql-nulls-are-weird.html" target="_blank" rel="noopener"
&gt;SQL NULLs are Weird!&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết này khám phá những hành vi kỳ lạ của giá trị NULL trong SQL, đặc biệt là cách chúng được xử lý trong các ràng buộc UNIQUE. Tác giả chỉ ra rằng, không giống như những gì người ta thường mong đợi, SQL coi tất cả các giá trị NULL là các giá trị riêng biệt. Điều này có nghĩa là một cột có ràng buộc UNIQUE có thể chứa nhiều giá trị NULL vì mỗi giá trị NULL được coi là khác với các giá trị NULL khác. Bài viết tiếp tục thảo luận về cách đảm bảo tính duy nhất khi xử lý các giá trị NULL, sử dụng các cột được tạo và lập chỉ mục một phần.&lt;/p&gt;
&lt;h2 id="understanding-jvm-garbage-collector-performance"&gt;&lt;a class="link" href="https://mill-build.org/blog/6-garbage-collector-perf.html" target="_blank" rel="noopener"
&gt;Understanding JVM Garbage Collector Performance&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết này giải thích cách thức hoạt động của bộ thu gom rác (GC) trong Java Virtual Machine (JVM) và cung cấp các phương pháp cải thiện hiệu suất của nó. Tác giả bắt đầu bằng việc mô tả một GC lý thuyết đơn giản, sau đó đi sâu vào các thuật toán GC thực tế như Mark-and-Sweep và Generational Garbage Collection. Bài viết cũng thảo luận về các tham số cấu hình GC quan trọng, như kích thước heap và các tùy chọn GC khác nhau, đồng thời cung cấp các hướng dẫn về cách điều chỉnh chúng để đạt hiệu suất tối ưu. Cuối cùng, tác giả đưa ra các khuyến nghị cụ thể để cải thiện hiệu suất GC trong các dự án thực tế, bao gồm việc theo dõi và phân tích hành vi GC, cũng như điều chỉnh cấu hình GC dựa trên tải công việc cụ thể.&lt;/p&gt;
&lt;h2 id="a-deep-dive-into-jvm-start-up"&gt;&lt;a class="link" href="https://www.youtube.com/watch?v=ED1oc7gn5uY" target="_blank" rel="noopener"
&gt;A Deep Dive into JVM Start-Up&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bạn có bao giờ thắc mắc điều gì xảy ra &amp;ldquo;đằng sau hậu trường&amp;rdquo; trước khi dòng lệnh System.out.println(&amp;ldquo;Hello World&amp;rdquo;) quen thuộc được thực thi trong ứng dụng Java? Video này sẽ đưa bạn vào một hành trình khám phá sâu sắc quy trình khởi động phức tạp của Java Virtual Machine (JVM). Từ việc phân tích cú pháp các tham số, kiểm tra tài nguyên hệ thống, thiết lập môi trường, đến quá trình tải, liên kết và khởi tạo lớp, bạn sẽ hiểu rõ hơn về những bước cần thiết để JVM &amp;ldquo;tạo ra vũ trụ&amp;rdquo; cho ứng dụng của bạn. Video cũng hé lộ những thay đổi thú vị trong tương lai với Project Leyden, hứa hẹn cải thiện đáng kể thời gian khởi động và hiệu suất của JVM. Đây là một tài liệu tham khảo giá trị cho bất kỳ nhà phát triển Java nào muốn nâng cao hiểu biết về nền tảng cốt lõi mà họ đang sử dụng.&lt;/p&gt;
&lt;h2 id="parallel-processing-with-virtual-threads---a-comparative-analysis"&gt;&lt;a class="link" href="https://www.dhaval-shah.com/parallel-processing-virtual-threads-reactor-vs-jdk/" target="_blank" rel="noopener"
&gt;Parallel processing with Virtual Threads - A comparative analysis&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết này phân tích hiệu suất của việc sử dụng Virtual Threads trong xử lý song song, so sánh giữa hai cách tiếp cận: triển khai dựa trên JDK 21 và Spring Core Reactor. Tác giả bắt đầu bằng việc nêu ra các hạn chế của các luồng hệ điều hành truyền thống, như chi phí tài nguyên cao và khả năng mở rộng hạn chế. Sau đó, bài viết giới thiệu về Virtual Threads, một tính năng mới trong JDK 21, cho phép tạo ra hàng triệu luồng nhẹ với chi phí thấp, đặc biệt hiệu quả cho các tác vụ I/O. Bài viết cung cấp các ví dụ mã cho cả hai phương pháp triển khai và tiến hành phân tích so sánh dựa trên các tiêu chí như thời gian xử lý, sử dụng bộ nhớ và hoạt động của bộ thu gom rác (GC). Kết quả cho thấy, việc sử dụng Virtual Threads với triển khai dựa trên JDK mang lại hiệu suất vượt trội so với Spring Core Reactor, đặc biệt khi xử lý số lượng lớn đối tượng. Tuy nhiên, triển khai dựa trên JDK yêu cầu bộ nhớ nhiều hơn và có thời gian dừng GC dài hơn, nhưng điều này không ảnh hưởng đáng kể đến độ trễ của ứng dụng. Tác giả kết luận rằng, đối với các ứng dụng yêu cầu hiệu suất cao và khả năng mở rộng, Virtual Threads trong JDK 21 là lựa chọn ưu việt.&lt;/p&gt;
&lt;h2 id="bonus-vài-ảnh-hay-ho-đến-từ-bytebytego"&gt;Bonus: Vài ảnh hay ho đến từ &lt;a class="link" href="https://bytebytego.com/" target="_blank" rel="noopener"
&gt;ByteByteGo&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/2ae8b491-b794-446b-8ca5-25ac552161be_1417x1600.png"
loading="lazy"
alt="A Cheatsheet On Message Queues"
&gt;
&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/015e9750-7334-424b-b0c4-9c39bc5dd2d2_1600x1596.png"
loading="lazy"
alt="From Monolith to Microservices: Key Transition Patterns"
&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Bài viết đã được review và cập nhật bởi Claude Code với Opus 4.7 (1M context).&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>