<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Engineering Career on miti99</title><link>https://miti99.com/tags/engineering-career/</link><description>Recent content in Engineering Career 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/engineering-career/index.xml" rel="self" type="application/rss+xml"/><item><title>Newsletter #82</title><link>https://miti99.com/post/2026/02/19/</link><pubDate>Thu, 19 Feb 2026 00:00:00 +0700</pubDate><guid>https://miti99.com/post/2026/02/19/</guid><description>&lt;p&gt;&lt;em&gt;Mời bạn thưởng thức Newsletter #82.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="how-the-lobsters-front-page-works"&gt;&lt;a class="link" href="https://blog.nilenso.com/blog/2026/01/20/lobsters-front-page/" target="_blank" rel="noopener"
&gt;How the Lobsters front page works&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết phân tích thuật toán xếp hạng trang chủ của Lobsters - một cộng đồng tập trung vào lĩnh vực máy tính với tính năng agregate liên kết và thảo luận. Vì mã nguồn mở, tác giả đã nghiên cứu cách thức hoạt động của thuật toán sắp xếp bài viết trên trang chủ.&lt;/p&gt;
&lt;p&gt;Công thức cốt lõi của thuật toán khá đơn giản: &lt;code&gt;hotness = -1 × (base + order × sign + age)&lt;/code&gt;, trong đó giá trị hotness càng âm thì bài viết xếp hạng càng cao. Thành phần &lt;code&gt;base&lt;/code&gt; được tính từ tổng các điều chỉnh hotness của thẻ tag (nằm trong khoảng -10 đến +10) cộng với một khoản nhỏ khuyến khích cho bài tự viết. Một thẻ như &lt;code&gt;culture&lt;/code&gt; hay &lt;code&gt;rant&lt;/code&gt; có modifier âm, làm giảm thứ hạng ban đầu.&lt;/p&gt;
&lt;p&gt;Thành phần &lt;code&gt;order&lt;/code&gt; phản ánh mức độ tương tác thông qua logarithm của điểm số, đồng thời tính thêm điểm bình luận (mỗi upvote bình luận bằng nửa upvote bài viết). Điều này có nghĩa là tăng từ 0 lên 100 phiếu ảnh hưởng thứ hạng nhiều hơn nhiều so với tăng từ 1000 lên 1100 phiếu. Thành phần &lt;code&gt;age&lt;/code&gt; tăng tuyến tính theo thời gian, đẩy các bài cũ xuống xếp hạng thấp dần.&lt;/p&gt;
&lt;p&gt;Tác giả nhận xét thuật toán này hoạt động tốt - cho phép bài viết mới có thời gian hiển thị, trừng phạt nội dung chất lượng thấp tạo ra nhiều tranh căng, và đảm bảo không bài nào tồn tại quá lâu trên trang chủ. Tuy nhiên, tính cách của cộng đồng Lobsters không đến từ thuật toán mà từ sự điều_triệt có quan điểm, phạm vi hẹp về máy tính, và hệ thống mời dần dần xây dựng văn hóa. Tác giả cũng chia sẻ trải nghiệm cá nhân về sự ngắt kết nối giá trị với nhóm người dùng tích cực nhất trên site, và nhắc nhở rằng sự tham gia của từng người dùng là quan trọng - các upvote sớm có thể đưa bài viết lên trang chủ.&lt;/p&gt;
&lt;h2 id="software-engineers-can-no-longer-neglect-their-soft-skills"&gt;&lt;a class="link" href="https://www.qu8n.com/posts/most-important-software-engineering-skill-2026" target="_blank" rel="noopener"
&gt;Software engineers can no longer neglect their soft skills&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết lập luận rằng bắt đầu từ năm 2026, kỹ năng giao tiếp đã trở thành kỹ năng quan trọng nhất cho kỹ sư phần mềm - không phải là viết mã, thiết kế hệ thống hay kiến thức chuyên sâu về ngôn ngữ lập trình. AI coding agent đã trở nên rất xuất sắc, tác giả chia sẻ đã chi hơn 500 USD cho Claude Code chỉ trong tháng 12 năm ngoái và sử dụng nó cho hầu hết các tác vụ lập trình không đơn giản.&lt;/p&gt;
&lt;p&gt;Vấn đề cốt lõi là nút thắt đã chuyển từ việc cài triển khai sang việc xác định thông số kỹ thuật. Trong thực tế, các ticket hiếm khi chứa đầy đủ yêu cầu. Để làm được điều đó, kỹ sư cần: đặt câu hỏi để làm rõ các giả định mà mọi người không nhận ra themselves, điều phối các thảo luận đánh đổi, từ chối mở rộng phạm vi mà không làm hỏng mối quan hệ, và đưa ra quyết định cho những việc không ai nghĩ đến cần quy định.&lt;/p&gt;
&lt;p&gt;Trước đây, những kỹ năng này chỉ là tùy chọn cho individual contributor. Một số nhóm cho phép kỹ sư phát triển với kỹ năng giao tiếp trung bình nhưng kỹ năng viết mã xuất sắc. Nay, các phần không liên quan đến viết mã đang trở thành không thể thương lượng. Kỹ sư phần mềm là người giải quyết vấn đề, chúng ta tin rằng mọi vấn đề đều có giải pháp và &amp;ldquo;best practice&amp;rdquo;. Nhưng làm việc với con người phức tạp hơn nhiều. May mắn là chúng ta không thể dùng AI để cải thiện kỹ năng giao tiếp. Giao tiếp tốt đòi hỏi sự thấu cảm - điều mà chúng ta đều cần thêm trong bối cảnh hiện nay.&lt;/p&gt;
&lt;h2 id="dithering---part-2"&gt;&lt;a class="link" href="https://visualrambling.space/dithering-part-2/" target="_blank" rel="noopener"
&gt;Dithering - Part 2&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết là phần thứ hai trong series về dithering - kỹ thuật dùng để mô phỏng nhiều màu sắc hơn so với những gì thực tế có sẵn. Tác giả tập trung vào ordered dithering, một phương pháp sử dụng threshold map để quyết định màu cuối cùng của mỗi pixel. Series này chỉ bao gồm dithering grayscale xuống hai màu đen và trắng.&lt;/p&gt;
&lt;p&gt;Tác giả giải thích cách hoạt động của threshold map: thay vì dùng một ngưỡng đơn để chuyển đổi xám thành đen hoặc trắng, ta sử dụng nhiều ngưỡng khác nhau cùng lúc. Kết quả là một hỗn hợp các pixel đen và trắng phản ánh độ sáng ban đầu - vùng sáng hơn có nhiều pixel trắng hơn, vùng tối hơn có nhiều pixel đen hơn.&lt;/p&gt;
&lt;p&gt;Vấn đề đầu tiên là các ngưỡng được sắp xếp tuần tự tạo ra các vạch dọc không mong muốn. Giải pháp là Bayer matrix - sắp xếp lại các ngưỡng theo mẫu 2x2 tạo ra pattern cross-hatch đặc trưng, giúp phân tán đều các pixel đen và trắng. Tuy nhiên, chỉ có 4 mức ngưỡng thì chuyển giữa các sắc thái vẫn khá gắt. Tác giả giới thiệu Bayer matrix 4x4 với 16 mức ngưỡng, cho phép 16 sắc thái xám khác nhau và chuyển mượt mà hơn.&lt;/p&gt;
&lt;p&gt;Bài viết cũng giới thiệu một số phương pháp sắp xếp threshold map khác nhau: Bayer matrix 8x8 với 64 mức cho gradient chi tiết hơn, Cluster Dot matrix tạo ra cảm giác như báo in truyền thống với các chấm tròn, và Void and Cluster - phương pháp yêu thích của tác giả với blue noise tạo ra texture tự nhiên hơn. Phần tiếp theo sẽ bàn về error diffusion, một phương pháp dithering khác không dùng map.&lt;/p&gt;
&lt;h2 id="what-came-first-the-cname-or-the-a-record"&gt;&lt;a class="link" href="https://blog.cloudflare.com/cname-a-record-order-dns-standards/" target="_blank" rel="noopener"
&gt;What came first: the CNAME or the A record?&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết phân tích một sự cố DNS xảy ra vào ngày 8 tháng 1 năm 2026 khi Cloudflare cập nhật 1.1.1.1 để giảm mức sử dụng bộ nhớ. Thay đổi vô tình đã làm đảo ngược thứ tự của bản ghi CNAME trong phản hồi DNS, gây ra lỗi phân giải cho một số ứng dụng khách trên toàn Internet.&lt;/p&gt;
&lt;p&gt;Vấn đề gốc rễ nằm ở logic gộp chuỗi CNAME. Khi một số bản ghi trong chuỗi CNAME hết hạn, chỉ có phần hết hạn được giải quyết lại. Code cũ sẽ tạo danh sách mới, thêm chuỗi CNAME hiện có rồi thêm các bản ghi mới vào sau. Để tiết kiệm cấp phát bộ nhớ, code mới thay đổi bằng cách thêm CNAME vào cuối danh sách answer hiện có - khiến CNAME xuất hiện sau bản ghi A/AAAA.&lt;/p&gt;
&lt;p&gt;Một số triển khai DNS như getaddrinfo trong glibc và quy trình DNSC trong switch Cisco sử dụng phân tích tuần tự - theo dõi tên mong đợi khi duyệt qua các bản ghi. Khi gặp CNAME, tên mong đợi được cập nhật. Nếu CNAME xuất hiện cuối cùng, các bản ghi A/AAAA bị bỏ qua vì không khớp tên, dẫn đến phản hồi rỗng. systemd-resolved không gặp vấn đề này vì nó phân tích bản ghi vào một tập hợp có thứ tự và có thể tìm kiếm toàn bộ.&lt;/p&gt;
&lt;p&gt;RFC 1034 từ năm 1987 sử dụng cụm &amp;ldquo;possibly preface&amp;rdquo; để nói về CNAME nhưng không dùng từ khóa normative như MUST/SHOULD - RFC 2119 mới ra năm 1997. RFC cũng rõ ràng về thứ tự trong RRset nhưng mơ hồ về thứ tự tương đối giữa các RRset khác nhau trong phần thông điệp. Cloudflare đã hoàn tác thay đổi và viết đề xuất Internet-Draft để làm rõ hành vi tại IETF, giúp cộng đồng DNS điều hướng giao thức này tốt hơn.&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 #70</title><link>https://miti99.com/post/2025/12/13/</link><pubDate>Sat, 13 Dec 2025 00:00:00 +0700</pubDate><guid>https://miti99.com/post/2025/12/13/</guid><description>&lt;p&gt;&lt;em&gt;Mời bạn thưởng thức Newsletter #70.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="the-developer-productivity-paradox-why-faster-coding-doesn"&gt;&lt;a class="link" href="https://gradle.com/blog/developer-productivity-paradox-faster-coding-slower-delivery/" target="_blank" rel="noopener"
&gt;The developer productivity paradox: Why faster coding doesn&amp;rsquo;t mean faster software delivery&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết khám phá Nghịch lý Năng suất Nhà phát triển, nơi các công cụ AI giúp lập trình nhanh hơn nhưng chỉ số tổ chức lại không cải thiện. Mặc dù 90% nhà phát triển sử dụng AI và 80% cảm thấy năng suất hơn, sự bất ổn hệ thống lại tăng do AI có tỷ lệ dự đoán sai cố hữu. Vấn đề gốc rễ là chuyển đổi ngữ cảnh đã hấp thụ lợi ích năng suất, và AI giới thiệu các gián đoạn mới trong quá trình xác thực và gỡ lỗi. Giải pháp là tổ chức cần Kỹ thuật Năng suất Nhà phát triển (DPE) để củng cố hệ thống phân phối, thiết kế lại quy trình làm việc cho hiệu quả luồng công việc, và thay đổi cách đo lường từ các chỉ số hoạt động sang các chỉ số luồng/kết quả.&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;90% nhà phát triển dùng AI nhưng sự bất ổn hệ thống vẫn tăng&lt;/li&gt;
&lt;li&gt;Chuyển đổi ngữ cảnh hấp thụ lợi ích năng suất từ AI&lt;/li&gt;
&lt;li&gt;Cần framework DPE: củng cố hệ thống phân phối, thiết kế lại quy trình làm việc, đo lường kết quả&lt;/li&gt;
&lt;li&gt;Đầu tư vào kỹ thuật nền tảng, vòng lặp phản hồi CI/CD, quản lý luồng giá trị&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-actually-makes-you-senior"&gt;&lt;a class="link" href="https://terriblesoftware.org/2025/11/25/what-actually-makes-you-senior/" target="_blank" rel="noopener"
&gt;What Actually Makes You Senior&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Kỹ năng cốt lõi phân biệt các kỹ sư cấp cao là &lt;strong&gt;giảm thiểu sự mơ hồ&lt;/strong&gt;. Trong khi các kỹ sư cấp trung xuất sắc với các vấn đề được định nghĩa rõ, các kỹ sư cấp cao biến các yêu cầu mơ hồ như &amp;ldquo;cải thiện hiệu suất&amp;rdquo; thành các kế hoạch cụ thể và có thể thực hiện được. Các kỹ sư cấp cao hỏi các câu hỏi quan trọng: &amp;ldquo;Chúng ta thực sự đang cố gắng giải quyết vấn đề gì?&amp;rdquo; và &amp;ldquo;Ai là người dùng ở đây và điều gì gây khó khăn cho họ?&amp;rdquo; Họ xác định các giả định ẩn và đánh giá các nhược điểm tiềm tàng. Giá trị của họ nằm ở việc &lt;strong&gt;giảm thiểu rủi ro dự án&lt;/strong&gt; bằng cách làm cho các vấn đề trừu tượng trở nên cụ thể.&lt;/p&gt;
&lt;p&gt;Bài viết chỉ trích các phương pháp tuyển dụng hiện tại tập trung vào kỹ năng kỹ thuật thay vì giảm thiểu sự mơ hồ, lưu ý rằng nhiều kỹ sư &amp;ldquo;cấp cao&amp;rdquo; có thể giải quyết các vấn đề được định nghĩa rõ nhưng lại bị tê liệt với các thông số kỹ thuật không rõ ràng. Tác giả gợi ý rằng cấp độ cao có thể được phát triển qua thực hành, bắt đầu với các ticket mơ hồ và học cách làm rõ chúng ngay từ đầu thay vì chờ đợi người khác hoặc lập trình ngay lập tức. Công việc cấp cao thường trông vô hình khi làm tốt - các dự án đơn giản chạy trơn tru với ít bất ngờ 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;Kỹ năng cốt lõi: giảm thiểu sự mơ hồ, không chỉ giải quyết các vấn đề được định nghĩa rõ&lt;/li&gt;
&lt;li&gt;Các kỹ sư cấp cao hỏi &amp;ldquo;Chúng ta thực sự đang giải quyết vấn đề gì?&amp;rdquo; và &amp;ldquo;Ai là người dùng?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Giá trị nằm ở việc giảm thiểu rủi ro dự án bằng cách làm các vấn đề trừu tượng trở nên cụ thể&lt;/li&gt;
&lt;li&gt;Phương pháp tuyển dụng sai lầm khi tập trung vào kỹ năng kỹ thuật thay vì giảm thiểu sự mơ hồ&lt;/li&gt;
&lt;li&gt;Cấp độ cao có thể phát triển qua thực hành với các ticket mơ hồ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="becoming-unblockable"&gt;&lt;a class="link" href="https://www.seangoedecke.com/unblockable/" target="_blank" rel="noopener"
&gt;Becoming unblockable&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Tác giả cung cấp các chiến lược cụ thể để trở nên &amp;ldquo;không thể bị chặn&amp;rdquo; - duy trì tiến độ về phía trước bất chấp trở ngại. Lời khuyên chính bao gồm: làm việc trên nhiều nhiệm vụ đồng thời để chuyển giữa luồng công việc khi một trong số bị chặn; sắp xếp thứ tự dự án để xử lý các rào cản tiềm tàng sớm (phần gây tranh cãi, các phụ thuộc); ưu tiên môi trường phát triển ổn định sử dụng các công cụ tiêu chuẩn để tối đa hóa thời gian hiệu quả; gỡ lỗi các vấn đề ngoài khu vực trách nhiệm thay vì chờ đợi các đội khác; xây dựng mối quan hệ với các kỹ sư trên các đội khác để có sự hợp tác không chính thức nhanh hơn; tận dụng các quản lý cấp cao làm &amp;ldquo;hỗ trợ từ trên cao&amp;rdquo; để xóa các rào cản tổ chức; và chọn các dự án phù hợp với các ưu tiên của công ty để có sự ủng hộ của nhà điều hành.&lt;/p&gt;
&lt;p&gt;Tác giả nhấn mạnh rằng việc bị chặn thường phụ thuộc vào sự chuẩn bị, các mối quan hệ, và quản lý dự án chiến lược thay vì các hoàn cảnh bên ngoài. Việc trở nên không thể bị chặn không phải là kỹ thuật mà là sự kết hợp của lập kế hoạch, xây dựng mạng lưới, và tư duy chiến lượ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àm việc trên nhiều nhiệm vụ để chuyển đổi khi bị chặn&lt;/li&gt;
&lt;li&gt;Sắp xếp thứ tự dự án để giải quyết các rào cản sớm&lt;/li&gt;
&lt;li&gt;Môi trường phát triển ổn định với các công cụ tiêu chuẩn&lt;/li&gt;
&lt;li&gt;Gỡ lỗi các vấn đề ngoài trách nhiệm thay vì chờ đợi&lt;/li&gt;
&lt;li&gt;Xây dựng mối quan hệ liên đội để hợp tác nhanh hơn&lt;/li&gt;
&lt;li&gt;Tận dụng các quản lý cấp cao làm hỗ trợ từ trên cao&lt;/li&gt;
&lt;li&gt;Chọn các dự án phù hợp để có sự ủng hộ của nhà điều hành&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="treat-test-code-like-production-code"&gt;&lt;a class="link" href="https://blog.ploeh.dk/2025/12/01/treat-test-code-like-production-code/" target="_blank" rel="noopener"
&gt;Treat test code like production code&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết lập luận rằng mã kiểm thử nên được đối xử với cùng tiêu chuẩn như mã sản xuất vì nó cần bảo trì và khả năng đọc hiểu. Các vấn đề phổ biến trong mã kiểm thử bao gồm vi phạm nguyên tắc DRY, mã zombie, các chờ đợi tùy ý, và xử lý không đồng bộ không phù hợp. Tác giả nhấn mạnh rằng các tiêu chuẩn mã hóa tồn tại chủ yếu cho sự hiểu biết của con người và khả năng bảo trì, không phải cho thực thi máy tính. Vì mã kiểm thử chiếm một phần đáng kể của cơ sở mã, áp dụng các phương pháp tốt như giữ nó DRY ngăn chặn các vấn đề như &amp;ldquo;Phẫu thuật Shotgun&amp;rdquo; nơi các thay đổi yêu cầu sửa đổi trên nhiều bài kiểm thử.&lt;/p&gt;
&lt;p&gt;Bài viết tham khảo các Mẫu Kiểm thử xUnit như là tài nguyên toàn diện cho các phương pháp kiểm thử cụ thể và phản đối quan niệm rằng các bài kiểm thử nên là DAMP thay vì DRY, lưu ý rằng các cụm từ mang tính mô tả và có ý nghĩa không xung đột với việc tránh trùng lặp. Các ngoại lệ tồn tại, đặc biệt trong các phương pháp bảo mật - mã kiểm thử có thể mã hóa cứng mật khẩu và bỏ qua xác thực đầu vào vì nó không được triển khai đến sản xuất. Các miễn lệ đặc thù nền tảng cũng có thể áp dụng, như các quy tắc ConfigureAwait trong .NET hoặc các thể chế mồ côi trong Haskell.&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;Mã kiểm thử cần cùng tiêu chuẩn như mã sản xuất cho khả năng bảo trì&lt;/li&gt;
&lt;li&gt;Các vấn đề phổ biến: vi phạm DRY, mã zombie, chờ đợi tùy ý, không đồng bộ không phù hợp&lt;/li&gt;
&lt;li&gt;Tiêu chuẩn mã hóa phục vụ sự hiểu biết của con người, không phải thực thi máy tính&lt;/li&gt;
&lt;li&gt;Áp dụng DRY trong các bài kiểm thử để ngăn chặn các vấn đề &amp;ldquo;Phẫu thuật Shotgun&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Ngoại lệ cho bảo mật (mã hóa cứng mật khẩu) và các quy tắc đặc thù nền tảng&lt;/li&gt;
&lt;li&gt;Các Mẫu Kiểm thử xUnit là tài nguyên toàn diện cho các phương pháp kiểm thử&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-good-engineers-write-bad-code-at-big-companies"&gt;&lt;a class="link" href="https://www.seangoedecke.com/bad-code-at-big-companies/" target="_blank" rel="noopener"
&gt;How good engineers write bad code at big companies&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết giải thích tại sao các công ty công nghệ lớn lại tạo ra mã có chất lượng thấp đáng ngạc nhiên mặc dù tuyển dụng các kỹ sư có năng lực. Lý do chính là &amp;ldquo;các công ty lớn đầy rẫy các kỹ sư làm việc ngoài lĩnh vực chuyên môn của họ&amp;rdquo; do tỷ lệ nghỉ việc cao - hầu hết nhân viên chỉ ở lại &amp;ldquo;một hoặc hai năm&amp;rdquo; trước khi chuyển đến các đội khác hoặc công ty khác. Hầu hết các thay đổi mã được thực hiện bởi những người mới bắt đầu tương đối làm việc trong các cơ sở mã không quen thuộc. Các &amp;ldquo;lão làng&amp;rdquo; có kinh nghiệm bị quá tải và phát triển chuyên môn của họ là không chính thức thay vì có hệ thống.&lt;/p&gt;
&lt;p&gt;Kỹ sư năng lực trung bình có năng lực nhưng &amp;ldquo;cố gắng làm hết sức trong một môi trường không được thiết lập để tạo ra mã chất lượng&amp;rdquo;. Các công ty công nghệ lớn cố tình ưu tiên sự linh hoạt nội bộ hơn chất lượng phần mềm. Các kỹ sư cá nhân không có sức mạnh để thay đổi động lực tổ chức này. Tác giả lập luận rằng mã xấu là không thể tránh khỏi trong các bối cảnh &amp;ldquo;kỹ thuật không thuần túy&amp;rdquo; nơi các kỹ sư làm việc dưới áp lực thời hạn trên các hệ thống không quen thuộc, đối lập với &amp;ldquo;kỹ thuật thuần túy&amp;rdquo; nơi các sai lầm chủ yếu cho thấy sự thiếu năng lực. Nguyên nhân gốc rễ là &amp;ldquo;hầu hết các kỹ sư công ty lớn bị buộc phải làm hầu hết công việc của họ trong các cơ sở mã không quen thuộc.&amp;rdquo;&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;Mã xấu tại các công ty lớn do các kỹ sư làm việc ngoài chuyên môn&lt;/li&gt;
&lt;li&gt;Tỷ lệ nghỉ việc cao: kỹ sư chỉ ở lại 1-2 năm trước khi chuyển đội&lt;/li&gt;
&lt;li&gt;Hầu hết các thay đổi được thực hiện bởi người mới bắt đầu trong các cơ sở mã không quen thuộc&lt;/li&gt;
&lt;li&gt;Các công ty ưu tiên sự linh hoạt hơn chất lượng phần mềm&lt;/li&gt;
&lt;li&gt;Các kỹ sư cá nhân không có sức mạnh để thay đổi động lực tổ chức&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Kỹ thuật không thuần túy&amp;rdquo; với áp限 thời hạn và hệ thống không quen thuộc tạo ra mã xấu&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-success-trap"&gt;&lt;a class="link" href="https://mikefisher.substack.com/p/the-success-trap" target="_blank" rel="noopener"
&gt;The Success Trap&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết khám phá cách thành công có thể nghịch lý lại giới hạn tự do và các lựa chọn. Nghịch lý của Tiến bộ: Thành công cảm thấy như sự mở rộng nhưng thực sự lại thu hẹp các lựa chọn. Khi các cá nhân và tổ chức phát triển, họ đánh đổi tính có thể lựa chọn để tối ưu hóa, chuyển từ khám phá sang bảo vệ. Bẫy Thành công là một trạng thái nơi các thực thể trở nên quá giỏi trong việc khai thác các thế mạnh hiện có đến nỗi họ ngừng khám phá các cơ hội mới. Điều này tạo ra căng thẳng giữa khai thác (cải thiện những gì hoạt động) và khám phá (thử nghiệm những gì có thể hoạt động tiếp theo).&lt;/p&gt;
&lt;p&gt;Các nghiên cứu trường hợp bao gồm: một kỹ sư cấp cao ngừng xây dựng công việc thực hành do thăng tiến sự nghiệp; Kodak thất bại trong việc đón chụp nhiếp ảnh kỹ thuật số mặc dù phát minh ra nó; và Radiohead cố tình tái tạo lại sau &amp;ldquo;OK Computer&amp;rdquo;. Các giải pháp bao gồm: thể chế hóa sự tò mò trong các tổ chức; duy trì nhiều bản sắc và tư duy người mới bắt đầu; đánh giá tốc độ học tập cao hơn sự ổn định hiệu suất; và thực hành &amp;ldquo;quản lý&amp;rdquo; - nắm giữ thành công một cách nhẹ nhàng và tối ưu hóa cho sự đổi mớ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;Thành công thu hẹp lựa chọn thay vì mở rộng chúng&lt;/li&gt;
&lt;li&gt;Bẫy thành công: quá giỏi khai thác hiện có, ngừng khám phá cơ hội mới&lt;/li&gt;
&lt;li&gt;Căng thẳng giữa khai thác (cải thiện hiện tại) và khám phá (thử nghiệm tương lai)&lt;/li&gt;
&lt;li&gt;Các giải pháp: thể chế hóa tò mò, duy trì tư duy người mới bắt đầu&lt;/li&gt;
&lt;li&gt;Đánh giá tốc độ học tập hơn sự ổn định hiệu suất&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Tự do, không phải thành tựu, là thước đo thành công thực sự&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="writing-a-good-claudemd"&gt;&lt;a class="link" href="https://www.humanlayer.dev/blog/writing-a-good-claude-md" target="_blank" rel="noopener"
&gt;Writing a good CLAUDE.md&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết giải thích rằng các tệp &lt;code&gt;CLAUDE.md&lt;/code&gt; rất quan trọng để đưa Claude vào làm quen với cơ sở mã của bạn vì các LLM không có trạng thái và không biết gì về dự án của bạn khi bắt đầu phiên. Tệp nên bao gồm &lt;strong&gt;CÁI GÌ&lt;/strong&gt; (ngăn xếp công nghệ, cấu trúc), &lt;strong&gt;TẠI SAO&lt;/strong&gt; (mục đích), và &lt;strong&gt;LÀM THẾ NÀO&lt;/strong&gt; (phương pháp làm việc) của dự án.&lt;/p&gt;
&lt;p&gt;Các khuyến nghị chính bao gồm: ít hơn là nhiều hơn - giữ hướng dẫn tối thiểu vì các LLM có thể tuân theo khoảng 150-200 hướng dẫn một cách nhất quán, với các mô hình nhỏ hơn cho thấy sự suy giảm hiệu suất theo cấp số nhân; giữ nó súc tích - nhắm mục tiêu dưới 300 dòng, lý tưởng là dưới 60 dòng như cách tiếp cận của HumanLayer; tính phổ quát - chỉ bao gồm các hướng dẫn liên quan đến tất cả các nhiệm vụ để ngăn Claude bỏ qua nội dung; tiết lộ tiến bộ - lưu trữ các hướng dẫn cụ thể của nhiệm vụ trong các tệp riêng biệt và tham chiếu chúng thay vì bao gồm mọi thứ trong &lt;code&gt;CLAUDE.md&lt;/code&gt;; tránh sử dụng Claude làm công cụ lint - sử dụng các công cụ lint truyền thống thay vì thực thi kiểu mã dựa trên LLM tốn kém; và tạo thủ công - không tự động tạo &lt;code&gt;CLAUDE.md&lt;/code&gt; vì nó là &amp;ldquo;điểm đòn bẩy cao nhất của bộ điều khiển&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Bài viết lưu ý rằng Claude thường bỏ qua &lt;code&gt;CLAUDE.md&lt;/code&gt; khi cho rằng nội dung không liên quan, được củng cố bởi các lời nhắc hệ thống nói với Claude không phản hồi trừ khi &amp;ldquo;rất liên quan đến nhiệm vụ của bạn.&amp;rdquo;&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;CLAUDE.md cần thiết để onboarding Claude vào codebase&lt;/li&gt;
&lt;li&gt;LLM có thể tuân theo 150-200 hướng dẫn nhất quán&lt;/li&gt;
&lt;li&gt;Giữ dưới 300 dòng, lý tưởng dưới 60 dòng&lt;/li&gt;
&lt;li&gt;Chỉ bao gồm hướng dẫn phổ quát cho tất cả các nhiệm vụ&lt;/li&gt;
&lt;li&gt;Sử dụng tiết lộ tiến bộ - tham chiếu các tệp riêng biệt&lt;/li&gt;
&lt;li&gt;Không tự động tạo - tạo thủ công là điểm đòn bẩy cao nhất&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="we-should-all-be-using-dependency-cooldowns"&gt;&lt;a class="link" href="https://blog.yossarian.net/2025/11/21/We-should-all-be-using-dependency-cooldowns" target="_blank" rel="noopener"
&gt;We should all be using dependency cooldowns&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết lập luận rằng các thời gian chờ phụ thuộc là một cách miễn phí, dễ dàng và cực kỳ hiệu quả để giảm thiểu phần lớn các cuộc tấn công chuỗi cung ứng mã nguồn mở. Tác giả phân tích dòng thời gian tấn công điển hình, cho thấy cơ hội của kẻ tấn công thường rất nhỏ - thường chỉ vài giờ đến vài ngày giữa việc phát hành các gói độc hại và việc chúng bị loại bỏ bởi các kho lưu trữ thượng nguồn.&lt;/p&gt;
&lt;p&gt;Các cuộc tấn công chuỗi cung cấp hầu hết tuân theo một mô hình tương tự: xâm phạm → phát hành phiên bản độc hại → người dùng tự động cập nhật → nhà cung cấp phát hiện → thượng nguồn loại bỏ. Các cửa sổ tấn công thường dưới một tuần (8/10 cuộc tấn công được phân tích là &amp;lt;7 ngày). Cuộc tấn công xz-utils là một trường hợp ngoại lệ đáng kể với khoảng 5 tuần.&lt;/p&gt;
&lt;p&gt;Các thời gian chờ trì hoãn cập nhật phụ thuộc theo một khoảng thời gian nhất định, cho phép các nhà cung cấp bảo mật xác định các mối đe dọa trước khi người dùng áp dụng chúng. Đơn giản để thực hiện với cấu hình như &lt;code&gt;cooldown: default-days: 7&lt;/code&gt;. Lợi ích bao gồm: hiệu quả thực nghiệm chống lại các cuộc tấn công có tầm nhìn cao; miễn phí để thực hiện với các công cụ như Dependabot, Renovate; khuyến khích hành vi tích cực từ các nhà cung cấp bảo mật; và có thể ngăn chặn 80-90% sự tiếp xúc với nỗ lực tối thiể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;Phụ thuộc cooldown miễn phí, dễ dàng và hiệu quả chống tấn công chuỗi cung ứng&lt;/li&gt;
&lt;li&gt;Cửa sổ tấn công thường dưới 7 ngày cho hầu hết các cuộc tấn công&lt;/li&gt;
&lt;li&gt;Đơn giản thực hiện: chỉ cần cấu hình cooldown days&lt;/li&gt;
&lt;li&gt;Miễn phí với Dependabot, Renovate và các công cụ tương tự&lt;/li&gt;
&lt;li&gt;Có thể ngăn chặn 80-90% sự tiếp xúc với nỗ lực tối thiểu&lt;/li&gt;
&lt;/ul&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 #5</title><link>https://miti99.com/post/2025/03/04/</link><pubDate>Tue, 04 Mar 2025 00:00:00 +0700</pubDate><guid>https://miti99.com/post/2025/03/04/</guid><description>&lt;i&gt;
Chào các bạn, cuối tuần rồi MiTi hơi lười nên không lên bài. Mời các bạn thưởng thức Newsletter #5 nhé!
&lt;/i&gt;
&lt;h2 id="5-advanced-java-reflection-techniques-for-dynamic-programming"&gt;&lt;a class="link" href="https://dev.to/nithinbharathwaj/5-advanced-java-reflection-techniques-for-dynamic-programming-4ph1" target="_blank" rel="noopener"
&gt;5 Advanced Java Reflection Techniques for Dynamic Programming&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết &amp;ldquo;5 Advanced Java Reflection Techniques for Dynamic Programming&amp;rdquo; của Aarav Joshi đi sâu vào sức mạnh của Java Reflection API, cho phép developer kiểm tra và thao tác cấu trúc của classes và objects trong runtime. Bài viết trình bày 5 kỹ thuật nâng cao: truy cập private members (cẩn trọng); tạo dynamic instances của classes sử dụng tên classes được xác định ở runtime; sử dụng custom annotations để thêm metadata và xử lý nó trong runtime (ví dụ: logging); tạo dynamic proxies để triển khai cross-cutting concerns như logging hoặc transaction management; và thao tác bytecode ở runtime với các thư viện như ByteBuddy để sửa đổi classes trong runtime. Mặc dù các kỹ thuật này mang lại sự linh hoạt và khả năng mở rộng, bài viết nhấn mạnh tầm quan trọng của việc sử dụng chúng một cách thận trọng do các vấn đề tiềm ẩn về maintainability và performance. Reflection là một công cụ mạnh mẽ cho developer Java để tạo ra các ứng dụng dynamic và thích ứng.&lt;/p&gt;
&lt;h2 id="mistakes-you-apparently-just-have-to-make-yourself"&gt;&lt;a class="link" href="https://medium.com/@mcfunley/mistakes-you-apparently-just-have-to-make-yourself-cc2dd2bfc25c" target="_blank" rel="noopener"
&gt;Mistakes You Apparently Just Have to Make Yourself&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết liệt kê những sai lầm mà dường như ai cũng phải tự mình trải qua, bất chấp những lời khuyên. Đó là những &amp;ldquo;kiến thức không thể chuyển giao,&amp;rdquo; những điều bạn phải tự &amp;ldquo;chạm vào bếp nóng&amp;rdquo; mới tin.&lt;/p&gt;
&lt;p&gt;Tác giả đưa ra các ví dụ như: viết lại code từ đầu vì nó quá tệ; nghĩ rằng thêm độ phức tạp vào sẽ giúp phần mềm dễ quản lý hơn; sử dụng công nghệ mới nhất cho một vấn đề chưa từng thấy; tin rằng thêm network hops sẽ làm hệ thống nhanh hơn; nhầm lẫn giữa việc xây dựng hệ thống và dự án mã nguồn mở; viết wrapper cho command line tool; đánh giá thấp sự quan trọng của các khía cạnh khác ngoài lập trình; chỉ tập trung vào functional tests; triển khai code bằng version control tool; nhầm lẫn giữa decoupling logic và separation vật lý; tin rằng quan liêu có thể giải quyết mọi vấn đề hoặc không giải quyết được gì; và gộp code của hai team chỉ vì họ dùng cùng một danh từ.&lt;/p&gt;
&lt;p&gt;Tác giả kết thúc bằng một lời quảng cáo hài hước cho startup Skyliner, như một chiếc &amp;ldquo;áo trói&amp;rdquo; để giúp bạn tránh lặp lại những sai lầm này.&lt;/p&gt;
&lt;h2 id="service-reliability-mathematics"&gt;&lt;a class="link" href="https://addyosmani.com/blog/service-reliability/" target="_blank" rel="noopener"
&gt;Service Reliability Mathematics&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết &amp;ldquo;Service Reliability&amp;rdquo; làm rõ rằng việc đơn giản hóa độ tin cậy dịch vụ thành tỷ lệ phần trăm duy nhất bỏ qua nhiều sắc thái quan trọng. Tác giả Matt Rickard nhấn mạnh rằng không phải tất cả thời gian ngừng hoạt động đều như nhau, và tác động của nó thay đổi theo thời gian và bối cảnh kinh doanh. Mỗi &amp;ldquo;nine&amp;rdquo; (9) bổ sung trong độ tin cậy đòi hỏi nỗ lực kỹ thuật và độ phức tạp hoạt động tăng lên theo cấp số nhân, thường đòi hỏi các thay đổi kiến trúc cơ bản.&lt;/p&gt;
&lt;p&gt;Bài viết chỉ ra những giả định ẩn sau các con số độ tin cậy, chẳng hạn như phân phối đồng đều các lỗi theo thời gian và bỏ qua các tình huống suy giảm một phần. Nó cũng nhấn mạnh các trade-off kỹ thuật liên quan đến việc theo đuổi độ tin cậy cao hơn, chẳng hạn như tốc độ phát triển so với sự ổn định và chi phí so với dự phòng.&lt;/p&gt;
&lt;p&gt;Bài viết kết thúc bằng cách kêu gọi các kỹ sư xem xét tác động kinh doanh thực tế của các loại lỗi khác nhau và tập trung vào việc cung cấp giá trị nhất quán cho người dùng đồng thời duy trì các hoạt động kỹ thuật bền vững, thay vì mù quáng theo đuổi các con số độ tin cậy tùy ý. Các phương pháp tiếp cận hiện đại đang chuyển sang các số liệu sắc thái hơn như error budget và SLO (Service Level Objectives) dựa trên trải nghiệm người dùng.&lt;/p&gt;
&lt;h2 id="how-to-write-a-good-design-document"&gt;&lt;del&gt;&lt;a class="link" href="https://grantslatton.com/how-to-design-document" target="_blank" rel="noopener"
&gt;How to write a good design document&lt;/a&gt;&lt;/del&gt;
&lt;/h2&gt;&lt;p&gt;&lt;del&gt;Bài viết &amp;ldquo;How to Design Document&amp;rdquo; đưa ra lời khuyên hữu ích về cách viết tài liệu thiết kế hiệu quả. Tài liệu thiết kế, theo tác giả, là một báo cáo kỹ thuật phác thảo chiến lược triển khai của một hệ thống trong bối cảnh trade-offs và constraints. Mục tiêu chính là thuyết phục người đọc (và quan trọng nhất là chính tác giả) rằng thiết kế này là tối ưu trong tình hình hiện tại.&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt;Tác giả so sánh việc viết tài liệu thiết kế với việc viết một chứng minh toán học. Để đạt được hiệu quả cao nhất, cần tuân thủ tổ chức tốt, tương tự như tổ chức code. Người viết nên tránh tạo ra &amp;ldquo;spaghetti design docs&amp;rdquo; bằng cách đảm bảo mọi câu văn đều liên kết và dễ hiểu. Mục tiêu là không gây bất ngờ cho người đọc, giúp họ cảm thấy giải pháp rõ ràng ngay cả khi nó đòi hỏi nhiều suy nghĩ phức tạp.&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt;Bài viết cũng nhấn mạnh tầm quan trọng của việc nắm bắt được tâm lý của người đọc và dự đoán những phản đối có thể xảy ra. Hơn nữa, cần chỉnh sửa để loại bỏ mọi từ ngữ thừa thãi, vì sự chú ý của người đọc là một nguồn tài nguyên hạn chế. Tác giả khuyến khích việc thực hành bằng cách đánh giá các tài liệu khác và chắt lọc ý tưởng thành các tweet ngắn gọn.&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt;Cuối cùng, bài viết gợi ý tổ chức tài liệu thành các bullet point có thể tóm tắt trong một câu duy nhất và sử dụng footnote cho các chi tiết phức tạp để không làm gián đoạn mạch chính của tài liệu.&lt;/del&gt;&lt;/p&gt;
&lt;h2 id="picking-your-battles-when-you-are-hyper-rational"&gt;&lt;a class="link" href="https://newsletter.weskao.com/p/picking-your-battles-hyper-rational" target="_blank" rel="noopener"
&gt;Picking your battles when you are hyper-rational&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Wes Kao chia sẻ về xu hướng phổ biến của những người có tư duy logic cao (hyper-rational operators): tập trung vào việc &amp;ldquo;đúng về mặt kỹ thuật&amp;rdquo; mà bỏ qua hiệu quả thực tế. Bài viết khuyến khích bạn nên suy nghĩ về bức tranh lớn hơn thay vì cố gắng sửa những lỗi nhỏ nhặt hoặc giải thích quá nhiều chi tiết không cần thiết.&lt;/p&gt;
&lt;p&gt;Wes đưa ra hai ví dụ cụ thể: một về việc làm rõ các vấn đề về múi giờ với recruiter, và một về việc giải thích lý do nhầm lẫn với hệ thống thanh toán cho bộ phận tài chính. Trong cả hai trường hợp, Wes gần như đã gửi những email dài dòng, giải thích rõ ràng sự nhầm lẫn, nhưng sau đó nhận ra rằng việc này không mang lại giá trị thực tế.&lt;/p&gt;
&lt;p&gt;Thay vào đó, Wes đã chọn những phản hồi ngắn gọn, tập trung vào việc giải quyết vấn đề trước mắt. Bài viết đặt ra câu hỏi: Liệu lời giải thích này có giúp chúng ta tiến gần hơn đến mục tiêu không? Liệu bối cảnh này có giúp ích cho người khác hay chỉ chứng minh rằng tôi đúng về một điều không quan trọng? Tôi đang phục vụ cuộc trò chuyện, hay cái tôi của mình?&lt;/p&gt;
&lt;p&gt;Bài viết kết luận rằng, mặc dù có những lúc cần làm rõ sự nhầm lẫn, nhưng đối với những vấn đề nhỏ và không quan trọng, tốt hơn hết là nên bỏ qua và tập trung vào mục tiêu chính.&lt;/p&gt;
&lt;h2 id="measuring-programmer-influence-kinda-sorta"&gt;&lt;a class="link" href="https://tidyfirst.substack.com/p/measuring-programmer-influence-kinda" target="_blank" rel="noopener"
&gt;Measuring Programmer Influence, Kinda Sorta&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Craig Tataryn từ Tidy First thảo luận về cách sử dụng dữ liệu để đánh giá đóng góp của lập trình viên trong một team lớn, dù ông khẳng định không có câu trả lời đáng tin cậy và rõ ràng. Dữ liệu chỉ có thể cung cấp gợi ý về các loại tác động nhất định từ những hành vi cụ thể. Ông cảnh báo rằng việc sử dụng dữ liệu này để xếp hạng, sa thải, thăng chức hoặc thưởng sẽ làm mất đi tính tin cậy của nó ngay lập tức.&lt;/p&gt;
&lt;p&gt;Phân tích dựa trên dữ liệu từ dự án React cho thấy việc tạo file và thay đổi file tuân theo phân phối Pareto, tức là một số ít lập trình viên tạo ra phần lớn các file và những file này cũng được thay đổi nhiều nhất. Để xác định những người có ảnh hưởng đáng kể, tác giả kết hợp cả số lượng file được tạo và số lần các file đó được người khác thay đổi. Những người tạo nhiều file mà những file đó được chỉnh sửa nhiều sẽ được coi là có ảnh hưởng lớn hơn.&lt;/p&gt;
&lt;p&gt;Ông đưa ra một số cách sử dụng tốt dữ liệu này, như xác định vị trí của bạn so với đồng nghiệp, tìm người để mentor, hoặc xác định những người có ít quyền lực hơn so với tác động thực tế của họ. Tuy nhiên, ông cũng cảnh báo về những cách sử dụng xấu, như dùng dữ liệu để thưởng, đặt hạn ngạch, thăng chức hoặc sa thải. Ông nhấn mạnh rằng nhiều đóng góp quan trọng không thể được ghi lại bằng số liệu và việc quá tập trung vào số liệu có thể dẫn đến những hành vi không mong muốn.&lt;/p&gt;
&lt;p&gt;Tóm lại, bài viết khuyến khích sử dụng dữ liệu một cách cẩn thận và luôn ghi nhớ mục tiêu thực sự là tạo ra tác động tích cực, thay vì chỉ tập trung vào số liệu.&lt;/p&gt;
&lt;h2 id="building-personal-software-with-claude"&gt;&lt;a class="link" href="https://blog.nelhage.com/post/personal-software-with-claude/" target="_blank" rel="noopener"
&gt;Building personal software with Claude&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Trong bài viết này, tác giả chia sẻ trải nghiệm sử dụng Claude để chuyển một phần của Emacs package sang Rust, giúp giảm thời gian thực thi từ 90 giây xuống còn 15ms. Điều đáng nói là Claude đã thực hiện gần như toàn bộ dự án dưới sự giám sát của tác giả mà không cần anh phải viết nhiều code.&lt;/p&gt;
&lt;p&gt;Ban đầu, tác giả chỉ kỳ vọng Claude sẽ là một công cụ hỗ trợ nhỏ, tương tự như một công cụ tìm kiếm tài liệu tốt hơn và Stack Overflow. Tuy nhiên, Claude đã vượt xa những kỳ vọng đó. Tác giả đã tải file obsidian.el lên và yêu cầu Claude viết một chương trình Rust để tăng tốc hàm obsidian-update. Claude đã đọc khoảng 1000 dòng Emacs Lisp, xác định 200 dòng liên quan, thiết kế định dạng JSON và chuyển logic sang khoảng 150 dòng Rust. Mã này thậm chí còn biên dịch và chạy ngay lần đầu tiên.&lt;/p&gt;
&lt;p&gt;Tác giả cũng yêu cầu Claude viết code Emacs để sử dụng chương trình Rust, sử dụng tính năng &amp;ldquo;advice&amp;rdquo; để vá obsidian.el. Kết quả cũng rất ấn tượng, chỉ có một lỗi nhỏ được Claude sửa nhanh chóng. Toàn bộ dự án chỉ mất một buổi chiều.&lt;/p&gt;
&lt;p&gt;Tác giả nhấn mạnh rằng LLM đang cải thiện với tốc độ chóng mặt và việc sử dụng chúng giúp giảm chi phí code. Tuy nhiên, sự hiểu biết về code, kiến trúc tốt và thiết kế vẫn rất quan trọng. Ông cũng gợi ý rằng có thể sẽ trở nên quan trọng hơn bao giờ hết khi viết code dễ xóa để có thể yêu cầu LLM tạo lại từ đầu khi cần thiết.&lt;/p&gt;
&lt;p&gt;Tóm lại, bài viết cho thấy tiềm năng của LLM trong việc giúp các nhà phát triển xây dựng phần mềm cá nhân một cách nhanh chóng và hiệu quả, đồng thời giải phóng họ khỏi những công việc nhàm chán như xử lý các hệ thống xác thực phức tạp và cập nhật các framework mới nhấ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/1112c07d-db40-484e-917b-0071ed7cf354_1280x1532.gif"
loading="lazy"
alt="Git vs GitHub"
&gt;
&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/5fd8bdda-52dd-454f-be79-ad548f17810b_1280x1557.gif"
loading="lazy"
alt="A Cheatsheet on Database Performance"
&gt;
&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/35ae3f82-afa0-47b9-a2a0-58b6c6d8cfb1_1280x1476.gif"
loading="lazy"
alt="18 Common Ports Worth Knowing"
&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 #4</title><link>https://miti99.com/post/2025/02/27/</link><pubDate>Thu, 27 Feb 2025 00:00:00 +0700</pubDate><guid>https://miti99.com/post/2025/02/27/</guid><description>&lt;i&gt;
Chào các bạn, tuần rồi mình có tìm thấy kha khá bài, nhưng cho vào cùng một newsletter thì lại quá dài. Nên hôm nay mình đăng thêm 1 newsletter giữa tuần nữa nhé ^^.
&lt;/i&gt;
&lt;h2 id="management-mantras"&gt;&lt;a class="link" href="https://blog.staysaasy.com/p/management-mantras" target="_blank" rel="noopener"
&gt;Management Mantras&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết này tập trung vào những nguyên tắc quản lý quan trọng để xây dựng một môi trường làm việc hiệu quả và trách nhiệm. Dưới đây là một số điểm chính:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Đừng &amp;ldquo;ban ơn&amp;rdquo; cho ai: Mọi người nên tập trung vào công việc quan trọng nhất của họ và được hỗ trợ bởi những người có trách nhiệm. Việc &amp;ldquo;giúp đỡ&amp;rdquo; có thể là dấu hiệu của sự nhầm lẫn, thiếu sót trong quy trình hoặc làm việc không hiệu quả.&lt;/li&gt;
&lt;li&gt;Nhân viên không cần lòng thương hại: Các công ty không nên tỏ ra ban phát cho nhân viên. Thay vào đó, hãy coi những gì bạn làm cho nhân viên là phần thưởng xứng đáng hoặc là một phần trách nhiệm của bạn để hỗ trợ đội ngũ.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Tôi có thể sửa nó&amp;rdquo;: Đừng đổ lỗi cho người khác khi mọi việc không thành công. Hãy chịu trách nhiệm và tìm cách giải quyết vấn đề. Nếu các dự án bạn tham gia liên tục thất bại, bạn cần xem xét lại năng lực của mình.&lt;/li&gt;
&lt;li&gt;Quản lý là công việc hàng ngày: Quản lý hiệu quả đòi hỏi sự nỗ lực liên tục để thúc đẩy mọi người, giải quyết xung đột và đưa ra phản hồi. Đó là sự tích lũy của những hành động nhỏ hàng ngày chứ không phải những quyết định lớn hiếm hoi.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-ultimate-guide-to-programming-languages-choosing-the-right-tool-for-the-job"&gt;&lt;a class="link" href="https://dev.to/mohammad-reza-mahdiani/the-ultimate-guide-to-programming-languages-choosing-the-right-tool-for-the-job-4be2" target="_blank" rel="noopener"
&gt;The Ultimate Guide to Programming Languages: Choosing the Right Tool for the Job&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết này cung cấp một cái nhìn tổng quan về một số ngôn ngữ lập trình phổ biến nhất trong năm 2025, giúp người đọc đưa ra quyết định sáng suốt khi lựa chọn ngôn ngữ phù hợp cho dự án của 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;&lt;strong&gt;Python:&lt;/strong&gt; Dễ học, đa năng, phù hợp cho machine learning, khoa học dữ liệu, phát triển web, và tự động hóa.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript:&lt;/strong&gt; &amp;ldquo;Ông vua&amp;rdquo; của web, không thể thiếu cho phát triển giao diện người dùng, full-stack development (với Node.js) và ứng dụng đa nền tảng (với Electron và React Native).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Java:&lt;/strong&gt; &amp;ldquo;Trâu cày&amp;rdquo; của doanh nghiệp, ổn định, có khả năng mở rộng cao, bảo mật, phù hợp cho các ứng dụng quy mô lớn, phát triển Android và backend.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C++:&lt;/strong&gt; &amp;ldquo;Cường quốc hiệu năng&amp;rdquo;, thích hợp cho hệ thống lập trình, game engine, và các ứng dụng thời gian thực.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rust:&lt;/strong&gt; Ngôi sao đang lên, tập trung vào an toàn bộ nhớ và hiệu năng cao, phù hợp cho hệ thống lập trình, WebAssembly và mật mã.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Xu hướng năm 2025:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Python vẫn là dẫn đầu trong machine learning, nhưng Julia đang nổi lên trong các tác vụ quan trọng về hiệu năng.&lt;/li&gt;
&lt;li&gt;Solidity và Rust là những người chơi chính trong lĩnh vực blockchain.&lt;/li&gt;
&lt;li&gt;Kotlin Multiplatform và Flutter (Dart) đang được ưa chuộng để thống nhất phát triển ứng dụng di động, web và desktop.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tóm lại:&lt;/strong&gt; Bài viết nhấn mạnh rằng việc lựa chọn ngôn ngữ lập trình phù hợp phụ thuộc vào yêu cầu của dự án, kinh nghiệm của nhóm và mục tiêu dài hạn. Mặc dù không có ngôn ngữ nào phù hợp với mọi trường hợp, nhưng việc hiểu rõ điểm mạnh và hạn chế của từng ngôn ngữ có thể giúp đưa ra quyết định thông minh hơn.&lt;/p&gt;
&lt;h2 id="discovery-coding"&gt;&lt;a class="link" href="http://jimmyhmiller.com/discovery-coding" target="_blank" rel="noopener"
&gt;Discovery Coding&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết giới thiệu &amp;ldquo;Discovery Coding&amp;rdquo; (tạm dịch: Lập trình khám phá) như một phương pháp tiếp cận vấn đề bằng cách viết code trước, thay vì cố gắng thiết kế hoặc suy nghĩ trước. Tác giả so sánh phương pháp này với việc &amp;ldquo;viết khám phá&amp;rdquo; trong văn học, nơi tác giả khám phá ra câu chuyện trong quá trình viế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;&lt;strong&gt;Khái niệm &amp;ldquo;Discovery Coding&amp;rdquo;&lt;/strong&gt;: Thay vì bắt đầu với một kế hoạch chi tiết, người lập trình khám phá suy nghĩ về bối cảnh, các mối quan hệ trong hệ thống và viết code để hiểu rõ vấn đề.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Đối lập với &amp;ldquo;Outlining&amp;rdquo;&lt;/strong&gt;: Discovery Coding trái ngược với phương pháp lập trình dựa trên outline, nơi người lập trình lập kế hoạch chi tiết trước khi viết code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Không phải là Bottom-Up Design&lt;/strong&gt;: Tác giả nhấn mạnh rằng Discovery Coding không giống với thiết kế từ dưới lên (bottom-up design).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lợi ích:&lt;/strong&gt; Ngay cả đối với những người thích lập trình theo outline, Discovery Coding có thể giúp tránh việc áp dụng các giải pháp quen thuộc và buộc họ phải hiểu rõ các ràng buộc của hệ thống.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Công cụ hỗ trợ:&lt;/strong&gt; Các công cụ hỗ trợ lập trình trực tiếp trong một hệ thống đang chạy (live programming) và trực quan hóa code có thể rất hữu ích cho người lập trình khám phá.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lời kêu gọi:&lt;/strong&gt; Tác giả kêu gọi cộng đồng lập trình chấp nhận và tôn trọng sự khác biệt trong cách tư duy của mỗi người, và không nên coi phương pháp tiếp cận kém tổ chức hơn là một phương pháp kém hiệu quả.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tóm lại:&lt;/strong&gt; Bài viết giới thiệu một phương pháp tiếp cận lập trình mới, tập trung vào việc khám phá và hiểu vấn đề thông qua quá trình viết code, và khuyến khích sự chấp nhận sự đa dạng trong cách tư duy của các lập trình viên.&lt;/p&gt;
&lt;h2 id="building-a-best-selling-game-with-a-tiny-team"&gt;&lt;a class="link" href="https://newsletter.pragmaticengineer.com/p/thronefall" target="_blank" rel="noopener"
&gt;Building a best-selling game with a tiny team&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết này tóm tắt một tập của podcast &amp;ldquo;The Pragmatic Engineer&amp;rdquo; với khách mời Jonas Tyroller, một trong hai nhà phát triển của trò chơi indie thành công &amp;ldquo;Thronefall&amp;rdquo;. Thronefall là một trò chơi chiến lược tối giản kết hợp phòng thủ tháp và xây dựng vương quốc, đã bán được 1 triệu bản trong năm đầu tiên ra 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;&lt;strong&gt;Thành công của Thronefall:&lt;/strong&gt; Một trò chơi indie được phát triển bởi chỉ hai người đã bán được 1 triệu bản, chứng tỏ tiềm năng của thị trường game indie.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kỹ năng đa dạng:&lt;/strong&gt; Để thành công trong vai trò nhà phát triển game indie, cần có nhiều kỹ năng khác nhau, bao gồm thiết kế, phát triển, sáng tác nhạc, marketing và xây dựng cộng đồng.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Không cần tuân thủ nghiêm ngặt các best practices:&lt;/strong&gt; Các best practices trong kỹ thuật phần mềm như code review và unit test không phải lúc nào cũng cần thiết cho các game indie nhỏ.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Xây dựng nhiều game:&lt;/strong&gt; Để trở nên giỏi trong việc xây dựng game, cần xây dựng nhiều game khác nhau, từ đơn giản đến phức tạp.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Công cụ hỗ trợ:&lt;/strong&gt; Các công cụ như Unity giúp việc xây dựng game trở nên dễ dàng hơn bao giờ hết.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pathfinding:&lt;/strong&gt; Một trong những thách thức lớn nhất trong quá trình phát triển Thronefall là tìm đường đi (pathfinding) cho các đơn vị trong game.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ChatGPT:&lt;/strong&gt; ChatGPT có thể được sử dụng để tạo code khung, dịch code và trả lời các câu hỏi về các chủ đề không quen thuộc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tìm sự cân bằng:&lt;/strong&gt; Để thành công, game indie cần tìm được sự cân bằng giữa sở thích cá nhân và tính thị trường.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tóm lại:&lt;/strong&gt; Bài viết cung cấp cái nhìn sâu sắc về quá trình phát triển game indie, nhấn mạnh tầm quan trọng của sự đa năng, khả năng thích ứng và sự hiểu biết về thị trường. Nó cũng cho thấy rằng các công cụ và kỹ thuật mới có thể giúp các nhà phát triển game indie tạo ra các sản phẩm thành công.&lt;/p&gt;
&lt;h2 id="serving-a-billion-web-requests-with-boring-code"&gt;&lt;a class="link" href="https://notes.billmill.org/blog/2024/06/Serving_a_billion_web_requests_with_boring_code.html" target="_blank" rel="noopener"
&gt;Serving a billion web requests with boring code&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết chia sẻ kinh nghiệm xây dựng hệ thống API phục vụ hàng triệu người dùng mỗi ngày cho trang web so sánh kế hoạch Medicare của chính phủ Mỹ. Tác giả nhấn mạnh tầm quan trọng của việc sử dụng các công nghệ &amp;ldquo;nhàm chán&amp;rdquo; (đã được chứng minh và đáng tin cậy) và tập trung vào sự đơn giản, rõ ràng trong thiết kế và code.&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;&lt;strong&gt;Ưu tiên sự &amp;ldquo;nhàm chán&amp;rdquo;:&lt;/strong&gt; Tác giả coi việc lựa chọn công nghệ &amp;ldquo;nhàm chán&amp;rdquo; (boring technology) là kim chỉ nam. Các công nghệ được chọn bao gồm:&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Postgres:&lt;/strong&gt; Nền tảng cơ sở dữ liệu đáng tin cậy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Golang:&lt;/strong&gt; Ngôn ngữ lập trình hiệu quả, đơn giản và dễ học.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;React:&lt;/strong&gt; Framework frontend phổ biến và được biết đến rộng rãi.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kiến trúc module:&lt;/strong&gt; Backend được chia thành ba module lớn (druginfo, planinfo, beneinfo), mỗi module có cơ sở dữ liệu riêng và giao tiếp qua gRPC.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gRPC:&lt;/strong&gt; Mặc dù có một số khó khăn với tooling, gRPC giúp định nghĩa interface bằng code và tạo các công cụ, interface thay đổi đồng bộ. grpc-gateway cho phép phục vụ các yêu cầu web.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tính tương thích ngược:&lt;/strong&gt; Tuân thủ nghiêm ngặt yêu cầu tương thích ngược, chỉ thêm và không xóa các trường khỏi interface và cơ sở dữ liệu.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tìm kiếm faceted:&lt;/strong&gt; Sử dụng Postgres để triển khai tìm kiếm faceted bằng cách xây dựng chuỗi truy vấn SQL dựa trên các điều kiện.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ETL:&lt;/strong&gt; Quy trình ETL được tự động hóa bằng shell script và cron job, tạo cơ sở dữ liệu mới hàng ngày từ dữ liệu đầu vào.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logging:&lt;/strong&gt; Sử dụng request ID để theo dõi các yêu cầu và zerolog để ghi log.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documentation:&lt;/strong&gt; Tạo một cuốn sách về cách hệ thống hoạt động bằng Sphinx, được đồng nghiệp đóng góp và sử dụng rộng rãi.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Bài học:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chất lượng phần mềm có thể được viết dưới các ràng buộc của chính phủ.&lt;/li&gt;
&lt;li&gt;Sự đơn giản, rõ ràng và các công nghệ đã được chứng minh có thể giúp xây dựng các hệ thống quy mô lớn.&lt;/li&gt;
&lt;li&gt;Đội ngũ làm việc tích cực, sáng tạo và gắn kết là yếu tố quan trọng để thành công.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="java-language-evolution-in-2025---inside-java-newscast-84"&gt;&lt;a class="link" href="https://www.youtube.com/watch?v=dPzle3EN4CM" target="_blank" rel="noopener"
&gt;Java Language Evolution in 2025 - Inside Java Newscast #84&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Video này trình bày các hướng phát triển của ngôn ngữ Java trong năm 2025, tập trung vào các cải tiến và tính năng mới được phát triển thông qua Project Amber.&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;&lt;strong&gt;Project Amber:&lt;/strong&gt; Giới thiệu về Project Amber và mục tiêu cải thiện Java.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexible Constructor Bodies (Thân hàm tạo linh hoạt):&lt;/strong&gt; Cho phép thực hiện các lệnh trước khi gọi &lt;code&gt;super()&lt;/code&gt; hoặc &lt;code&gt;this()&lt;/code&gt; trong hàm tạo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simplified Main (Hàm main đơn giản hóa):&lt;/strong&gt; Giúp viết code Java dễ dàng hơn, đặc biệt là cho các script nhỏ.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Module Imports (Nhập module):&lt;/strong&gt; Đơn giản hóa việc quản lý và sử dụng các module.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Primitive Patterns (Pattern cho kiểu dữ liệu nguyên thủy):&lt;/strong&gt; Cải thiện khả năng sử dụng pattern matching với các kiểu dữ liệu nguyên thủy trong &lt;code&gt;instanceof&lt;/code&gt; và &lt;code&gt;switch&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deconstruction (Phân rã cấu trúc):&lt;/strong&gt; Khám phá tiềm năng của việc phân rã cấu trúc để trích xuất dữ liệu từ các đối tượng.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Withers:&lt;/strong&gt; Thảo luận về việc sử dụng &amp;ldquo;withers&amp;rdquo; để tạo các bản sao của record với các giá trị đã sửa đổi.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;String Templates (Chuỗi mẫu):&lt;/strong&gt; Cập nhật về tiến độ phát triển của tính năng chuỗi mẫu.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Miscellaneous Work (Các công việc khác):&lt;/strong&gt; Đề cập đến các công việc khác, bao gồm cải tiến serialization.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tóm lại:&lt;/strong&gt; Video cung cấp một cái nhìn tổng quan về các cải tiến quan trọng dự kiến sẽ có mặt trong Java năm 2025, giúp các nhà phát triển Java nắm bắt được hướng phát triển của ngôn ngữ và tận dụng các tính năng mới.&lt;/p&gt;
&lt;h2 id="valhalla---java"&gt;&lt;a class="link" href="https://www.youtube.com/watch?v=Dhn-JgZaBWo" target="_blank" rel="noopener"
&gt;Valhalla - Java&amp;rsquo;s Epic Refactor&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Video cung cấp một bản cập nhật chi tiết về Project Valhalla, một dự án quan trọng nhằm hiện đại hóa hệ thống kiểu của Java, mang lại hiệu năng tốt hơn và đơn giản hóa việc lập trình. Brian Goetz giải thích các tính năng mới và mục tiêu của dự án.&lt;/p&gt;
&lt;h2 id="protecting-your-time-from-predators-in-large-tech-companies"&gt;&lt;a class="link" href="https://registerspill.thorstenball.com/p/how-might-ai-change-programming" target="_blank" rel="noopener"
&gt;Protecting your time from predators in large tech companies&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết đặt ra nhiều câu hỏi thú vị về tương lai của lập trình dưới tác động của AI, nhấn mạnh rằng AI sẽ thay đổi cách chúng ta viết code, nhưng vẫn chưa rõ chính xác như thế nào.&lt;/p&gt;
&lt;h2 id="hands-on-career-the-evolution-of-a-java-champion"&gt;&lt;a class="link" href="https://blog.vanillajava.blog/2025/01/hands-on-career-evolution-of-java.html" target="_blank" rel="noopener"
&gt;Hands-On Career: The Evolution of a Java Champion&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết khám phá cách AI tạo sinh có thể hỗ trợ các nhà phát triển trong việc phát triển sự nghiệp, đồng thời nhấn mạnh tầm quan trọng của việc sử dụng AI một cách có ý thức, đánh giá kết quả cẩn thận và tiếp tục phát triển các kỹ năng cần thiết để thành công trong kỷ nguyên AI. Nó cũng nêu bật tầm quan trọng của việc hiểu rõ các hạn chế của AI và sử dụng nó như một công cụ hỗ trợ, thay vì một sự thay thế hoàn toàn cho trí tuệ con người.&lt;/p&gt;
&lt;h2 id="token-bucket-rate-limiter-redis--java"&gt;&lt;a class="link" href="https://foojay.io/today/token-bucket-rate-limiter-redis-java/" target="_blank" rel="noopener"
&gt;Token Bucket Rate Limiter (Redis &amp;amp; Java)&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bài viết cung cấp hướng dẫn chi tiết về cách triển khai thuật toán Token Bucket Rate Limiter bằng Redis và Java, bao gồm cả ví dụ code, cách thiết lập môi trường kiểm thử và các test case để đảm bảo tính chính xác.&lt;/p&gt;
&lt;h2 id="bonus"&gt;Bonus?
&lt;/h2&gt;&lt;p&gt;Huhu, đợt này hỏng có bonus nào hết nha mọi người :&amp;lt;&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>