diff --git a/content/post/2025/02/27/index.md b/content/post/2025/02/27/index.md index 27d7cd4..747f0c4 100644 --- a/content/post/2025/02/27/index.md +++ b/content/post/2025/02/27/index.md @@ -47,7 +47,7 @@ Tập Inside Java Newscast #84 điểm lại các hướng phát triển của n Trong video này, Brian Goetz cập nhật tiến độ của Project Valhalla, dự án được ví như cuộc "tái cấu trúc vĩ đại" của Java nhằm hiện đại hóa hệ thống kiểu của ngôn ngữ. Mục tiêu là mang lại hiệu năng tốt hơn trong khi giúp việc lập trình trở nên đơn giản hơn, và video giải thích các tính năng mới cùng định hướng của dự án. -## [Protecting your time from predators in large tech companies](https://registerspill.thorstenball.com/p/how-might-ai-change-programming) +## [How might AI change programming?](https://registerspill.thorstenball.com/p/how-might-ai-change-programming) Thorsten Ball khẳng định AI chắc chắn sẽ thay đổi lập trình, dẫn chứng bằng loạt công cụ Claude đã viết giúp anh: một script Python chuyển RSS của bản tin thành Markdown, một MCP server cho Tailscale, hơn 200 dòng Rust và một máy chủ Go nhỏ hiển thị tệp Markdown, phần lớn chạy được ngay từ lần đầu. Dù AI chưa hiệu quả với mọi kho mã, việc viết và viết lại một số loại mã đã trở nên rất rẻ, và điều đó sẽ thay đổi nghề lập trình giống như trình biên dịch, Internet, quản lý phiên bản hay StackOverflow từng làm. Câu hỏi là thay đổi như thế nào. diff --git a/content/post/2025/03/04/index.md b/content/post/2025/03/04/index.md index 39ca459..9f3c267 100644 --- a/content/post/2025/03/04/index.md +++ b/content/post/2025/03/04/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #5" date: 2025-03-04 -tags: ["AI-Assisted", "Newsletter", "Java", "Reliability", "Software Design", "Engineering Career", "AI Coding"] +tags: ["AI-Assisted", "Newsletter", "Java", "Reliability", "Soft Skills", "Engineering Career", "AI Coding"] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/05/02/index.md b/content/post/2025/05/02/index.md index e795873..a2c493e 100644 --- a/content/post/2025/05/02/index.md +++ b/content/post/2025/05/02/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #15" date: 2025-05-02 -tags: [ "AI-Assisted", "Development", "Java", "Performance", "LLM" ] +tags: [ "AI-Assisted", "Java", "LLMs", "GitHub Copilot", "Microservices", "Spring Boot", "Performance" ] categories: [ "Newsletter" ] --- @@ -13,7 +13,7 @@ Simon Willison tổng kết hơn hai năm sử dụng mô hình ngôn ngữ lớ Về cách làm cụ thể, tác giả dùng LLM để khảo sát các lựa chọn thư viện và cách triển khai ở giai đoạn đầu; khi viết mã nguồn thật thì đưa chỉ dẫn chi tiết như chữ ký hàm và yêu cầu rõ ràng, sau đó tiếp tục yêu cầu chỉnh sửa, tái cấu trúc qua nhiều lượt thay vì bỏ đi kết quả đầu tiên. Điều không thể thiếu là tự chạy và kiểm thử mã nguồn. Bài viết có ví dụ xây dựng một trang tổng hợp lịch sử commit bằng Claude Code chỉ trong khoảng 17 phút với chi phí 0,61 đô la, dù tác giả vẫn phải tự tay cấu hình GitHub Actions. Lợi ích lớn nhất là tốc độ: LLM giúp thực hiện những dự án trước đây không đáng bỏ công, đồng thời khuếch đại chuyên môn sẵn có của lập trình viên. -## [I use Cursor daily - here's how I avoid the garbage parts](https://www.nickcraux.com/blog/cursor-tips) +## ~~[I use Cursor daily - here's how I avoid the garbage parts](https://www.nickcraux.com/blog/cursor-tips)~~ Bài viết chia sẻ kinh nghiệm dùng Cursor hằng ngày, một trình soạn thảo mã nguồn xây dựng trên nền VS Code và tích hợp sâu các mô hình ngôn ngữ lớn như GPT-4. Tác giả đưa ra nhiều mẹo thực tế: các phím tắt quan trọng, cách viết câu lệnh để AI trả lời chính xác hơn, cách tận dụng tính năng trò chuyện với toàn bộ mã nguồn dự án, cùng các chiến lược tối ưu quy trình làm việc và cấu hình Cursor cho phù hợp với từng người và từng dự án. diff --git a/content/post/2025/05/03/index.md b/content/post/2025/05/03/index.md index b575184..32ad421 100644 --- a/content/post/2025/05/03/index.md +++ b/content/post/2025/05/03/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #16" date: 2025-05-03 -tags: [ "AI-Assisted", "Development", "Career", "Code Quality", "Tech Industry" ] +tags: [ "AI-Assisted", "Programming Languages", "Code Quality", "Readability", "Latency", "Tech Industry", "Career" ] categories: [ "Newsletter" ] --- @@ -37,7 +37,7 @@ Sean Goedecke nhận xét rằng trong gần một thập kỷ, làm kỹ sư ph Hệ quả là các công ty buộc phải tập trung vào vài mục tiêu mà ban lãnh đạo thực sự quan tâm, và nhiều hoạt động như đóng góp mã nguồn mở hay trải nghiệm lập trình viên bị cắt ngân sách. Ông khuyên kỹ sư nên chấp nhận rằng lợi ích của mình giờ có thể mâu thuẫn với lợi ích của công ty; bạn vẫn được quyền theo đuổi điều mình cho là đúng, nhưng sẽ phải trả giá, nhất là với các bạn junior. Mặt tích cực là ngành công nghệ đã gần với thực tế hơn và luật chơi cũng rõ ràng hơn: tạo ra giá trị cho công ty thì được thưởng, không tạo ra giá trị thì bị phạt, và "giá trị" nghĩa là thúc đẩy các kế hoạch cụ thể của ban lãnh đạo. -## [Once You're Laid Off, You'll Never Be the Same Again](https://mertbulan.com/2025/01/26/once-you-are-laid-off-you-will-never-be-the-same-again/) +## ~~[Once You're Laid Off, You'll Never Be the Same Again](https://mertbulan.com/2025/01/26/once-you-are-laid-off-you-will-never-be-the-same-again/)~~ Mert Bulan kể lại ngày bị sa thải cùng phần lớn đồng đội. Nhìn lại, anh chỉ ra năm dấu hiệu báo trước: các buổi sự kiện nhóm bị hủy đột ngột; nhân viên nhận thông báo có gói hàng sắp giao (hộp để gửi trả thiết bị); ban lãnh đạo thiếu định hướng rõ ràng và liên tục tái cấu trúc; xuất hiện những cuộc họp bắt buộc không có nội dung cụ thể; và thời điểm công bố kết quả kinh doanh quý ở công ty đại chúng. Điều khiến anh day dứt nhất là mọi nỗ lực vượt mức, từ tự học React Native, nhận dự án đặc biệt từ CEO đến giới thiệu người tài cho công ty, đều không có ý nghĩa gì. Trong đợt sa thải, bạn chỉ là một dòng trong bảng Excel, do những người không hề biết bạn quyết định. diff --git a/content/post/2025/05/04/index.md b/content/post/2025/05/04/index.md index a1f4d9d..7ea5f38 100644 --- a/content/post/2025/05/04/index.md +++ b/content/post/2025/05/04/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #17" date: 2025-05-04 -tags: [ "AI-Assisted", "Development", "Architecture", "Java", "Microservices" ] +tags: [ "AI-Assisted", "Microservices", "Software Architecture", "Domain-Driven Design", "Vibe Coding", "JVM", "Career" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/05/05/index.md b/content/post/2025/05/05/index.md index de5a368..9914965 100644 --- a/content/post/2025/05/05/index.md +++ b/content/post/2025/05/05/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #18" date: 2025-05-05 -tags: [ "AI-Assisted", "Development", "Git", "UI", "AI", "DevOps" ] +tags: [ "AI-Assisted", "Git", "UI Design", "Java", "Distributed Locking", "Markdown", "AI Coding" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/05/06/index.md b/content/post/2025/05/06/index.md index e1adb4e..d5e055b 100644 --- a/content/post/2025/05/06/index.md +++ b/content/post/2025/05/06/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #19" date: 2025-05-06 -tags: [ "AI-Assisted", "Development", "Java", "DevOps", "Kafka", "AI", "Writing" ] +tags: [ "AI-Assisted", "Java", "Kubernetes", "CI/CD", "Kafka", "AI Coding", "Writing" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/05/07/index.md b/content/post/2025/05/07/index.md index bab2c4b..8f0ed9d 100644 --- a/content/post/2025/05/07/index.md +++ b/content/post/2025/05/07/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #20" date: 2025-05-07 -tags: [ "AI-Assisted", "Java", "Development", "Algorithms", "Git" ] +tags: [ "AI-Assisted", "Java", "JDK 24", "Memory Management", "Git", "Vibe Coding", "Algorithms" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/05/08/index.md b/content/post/2025/05/08/index.md index b0ac035..a0b5a8c 100644 --- a/content/post/2025/05/08/index.md +++ b/content/post/2025/05/08/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #21" date: 2025-05-08 -tags: [ "AI-Assisted", "Java", "JVM", "Memory Management", "Spring Boot", "Garbage Collection", "Coding Standards", "AI", "Software Development", "Career Development", "Payment Systems", "Asynchronous Processing", "Concurrency", "Multithreading", "Interfaces", "Microservices" ] +tags: [ "AI-Assisted", "Java", "JVM", "Garbage Collection", "Concurrency", "Spring Boot", "Payment Systems" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/05/09/index.md b/content/post/2025/05/09/index.md index 21119f2..55eedf3 100644 --- a/content/post/2025/05/09/index.md +++ b/content/post/2025/05/09/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #22" date: 2025-05-09 -tags: [ "AI-Assisted", "Security", "Authentication", "Identity Management", "Best Practices", "Career Development", "Productivity", "Workplace", "AI", "Machine Learning", "Language Models", "Research", "Microservices", "DevOps", "Software Architecture", "Development Environments", "Logging", "Software Development", "Concurrency", "Asynchronous Programming", "Programming Patterns", "Performance Optimization", "Experimentation", "Data Engineering" ] +tags: [ "AI-Assisted", "Security", "Authentication", "Career Development", "Language Models", "Microservices", "Asynchronous Programming" ] categories: [ "Newsletter" ] --- @@ -31,7 +31,7 @@ Arjun Iyer (Signadot) cho rằng trong phát triển microservices, thời gian Giải pháp tác giả đề xuất là dùng chung một môi trường với cơ chế cô lập ở tầng ứng dụng gọi là sandbox, tương tự cách Uber làm cho kiểm thử đầu cuối: chỉ những dịch vụ thay đổi chạy trong sandbox, còn yêu cầu được định tuyến động dựa trên header. Cách này tiết kiệm tài nguyên, cho kết quả nhất quán, dễ bảo trì, tạo sandbox gần như tức thì và sát thực tế hơn. Khi triển khai cần chú ý ba điểm: lan truyền ngữ cảnh qua các dịch vụ (có thể dùng chuẩn `baggage` và `tracecontext` của OpenTelemetry), cô lập dữ liệu sao cho một bài kiểm thử không được sửa dữ liệu mà nó không tạo ra, và xử lý hàng đợi để các sandbox không tranh nhau cùng một thông điệp. -## [Logging Practices I Follow](https://www.16elt.com/2023/01/06/logging-practices-I-follow) +## ~~[Logging Practices I Follow](https://www.16elt.com/2023/01/06/logging-practices-I-follow)~~ Eliran Turgeman chia sẻ bộ nguyên tắc ghi log mà anh áp dụng, xuất phát từ nhận xét rằng log là công cụ quan sát cơ bản nhất và người đọc log chủ yếu chính là lập trình viên. Trước khi ghi một dòng log, hãy tự hỏi: dòng này có thực sự cần không, có mang thông tin mà các log khác trong cùng luồng chưa có không; đối tượng sắp ghi có thể phình to trên môi trường thực tế không, nếu có thì chỉ ghi vài chỉ số như độ dài hoặc vài thuộc tính quan trọng; và thông tin này có giúp gỡ lỗi hay hiểu luồng xử lý không. Tiếp theo là giữ log nhất quán trên toàn hệ thống, ví dụ luôn bắt đầu bằng tiền tố `[serviceName](functionName)`, để có thể tìm log mà không cần mở mã nguồn. diff --git a/content/post/2025/05/11/index.md b/content/post/2025/05/11/index.md index 55bf84c..11716e7 100644 --- a/content/post/2025/05/11/index.md +++ b/content/post/2025/05/11/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #24" date: "2025-05-11" -tags: [ "AI-Assisted", "Development", "Performance", "System Design", "Code Quality", "Engineering", "Management" ] +tags: [ "AI-Assisted", "Developer Productivity", "Management", "Code Quality", "System Design", "Performance", "AI" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/05/12/index.md b/content/post/2025/05/12/index.md index 7268ba7..f637368 100644 --- a/content/post/2025/05/12/index.md +++ b/content/post/2025/05/12/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #25" date: "2025-05-12" -tags: [ "AI-Assisted", "Software Engineering", "LLM Research", "Leadership", "Development" ] +tags: [ "AI-Assisted", "Software Engineering", "Career Development", "LLM Research", "Open Source", "AI Coding", "Productivity" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/05/13/index.md b/content/post/2025/05/13/index.md index b1bf767..2c69d71 100644 --- a/content/post/2025/05/13/index.md +++ b/content/post/2025/05/13/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #26" date: "2025-05-13" -tags: [ "AI-Assisted", "Software Design", "Java", "Development", "Architecture", "Programming Patterns", "Technology Trends" ] +tags: [ "AI-Assisted", "Software Design", "Java", "Structured Concurrency", "Git", "Local Development", "AI Agents" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/05/14/index.md b/content/post/2025/05/14/index.md index 2868787..af64d89 100644 --- a/content/post/2025/05/14/index.md +++ b/content/post/2025/05/14/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #27" date: 2025-05-14 -tags: [ "AI-Assisted", "Development", "Frontend", "Vite", "Cloudflare", "Git", "Data Engineering", "Best Practices" ] +tags: [ "AI-Assisted", "Vite", "Cloudflare", "Frontend", "AI Coding", "Data Engineering", "Career Development" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/05/15/index.md b/content/post/2025/05/15/index.md index f65df42..169247e 100644 --- a/content/post/2025/05/15/index.md +++ b/content/post/2025/05/15/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #28" date: 2025-05-15 -tags: [ "AI-Assisted", "Java", "Machine Learning", "Build Automation", "Development" ] +tags: [ "AI-Assisted", "Java", "JDK 24", "Garbage Collection", "Project Reactor", "Machine Learning", "Build Automation" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/05/16/index.md b/content/post/2025/05/16/index.md index 4aa047a..0cd7129 100644 --- a/content/post/2025/05/16/index.md +++ b/content/post/2025/05/16/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #29" date: 2025-05-16 -tags: ["AI-Assisted", "Technology", "Process Optimization", "AI", "Cloud Computing", "Career Development", "Productivity", "Software Development"] +tags: ["AI-Assisted", "Process Optimization", "Vibe Coding", "Cloudflare", "Career Development", "Productivity", "MCP"] categories: ["Newsletter"] draft: false --- diff --git a/content/post/2025/05/17/index.md b/content/post/2025/05/17/index.md index bb6cab5..d2164c9 100644 --- a/content/post/2025/05/17/index.md +++ b/content/post/2025/05/17/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #30" date: 2025-05-17 -tags: ["AI-Assisted", "Education", "LLMs", "Caching", "JavaScript", "Software Development"] +tags: ["AI-Assisted", "Education", "LLMs", "Caching", "JavaScript", "Developer Experience", "PostgreSQL"] categories: ["Newsletter"] draft: false --- diff --git a/content/post/2025/05/18/index.md b/content/post/2025/05/18/index.md index 7cdffb0..19b934b 100644 --- a/content/post/2025/05/18/index.md +++ b/content/post/2025/05/18/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #31" date: 2025-05-18 -tags: ["AI-Assisted", "Technology", "Software Development", "Career Growth", "AI", "Hiring", "Engineering", "DevOps"] +tags: ["AI-Assisted", "Testing", "CI/CD", "Hiring", "LLMs", "Security", "Career Growth"] categories: ["Newsletter"] draft: false --- diff --git a/content/post/2025/07/21/index.md b/content/post/2025/07/21/index.md index 659dad4..b6f31ba 100644 --- a/content/post/2025/07/21/index.md +++ b/content/post/2025/07/21/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #32" date: 2025-07-21 -tags: ["AI-Assisted", "Technology", "Software Development", "Career Growth", "AI", "Hiring", "Engineering", "DevOps"] +tags: ["AI-Assisted", "Claude Code", "AI Coding", "Windsurf", "Vibe Coding", "Web Development", "Software Architecture"] categories: ["Newsletter"] draft: false --- diff --git a/content/post/2025/07/22/index.md b/content/post/2025/07/22/index.md index 78a4a3b..e96c52d 100644 --- a/content/post/2025/07/22/index.md +++ b/content/post/2025/07/22/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #33" date: 2025-07-22 -tags: ["AI-Assisted", "Java", "Performance", "Memory Management", "JavaScript"] +tags: ["AI-Assisted", "Java", "Garbage Collection", "JavaScript", "AI Agents", "Refactoring", "UX"] categories: ["Newsletter"] --- diff --git a/content/post/2025/07/23/index.md b/content/post/2025/07/23/index.md index 6458e07..3319cb6 100644 --- a/content/post/2025/07/23/index.md +++ b/content/post/2025/07/23/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #34" date: 2025-07-23 -tags: [ "AI-Assisted", "Career", "Leadership", "Software Development", "Performance" ] +tags: [ "AI-Assisted", "TDD", "Java", "System Design", "Performance", "Career", "AI Coding" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/07/24/index.md b/content/post/2025/07/24/index.md index 59ddcc8..d93dfab 100644 --- a/content/post/2025/07/24/index.md +++ b/content/post/2025/07/24/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #35" date: 2025-07-24 -tags: [ "AI-Assisted", "WebAssembly", "WASM", "Cross-platform", "Performance" ] +tags: [ "AI-Assisted", "Redis", "Valkey", "Open Source", "Testing", "SOLID", "WebAssembly" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/07/25/index.md b/content/post/2025/07/25/index.md index bd91cd5..7099e82 100644 --- a/content/post/2025/07/25/index.md +++ b/content/post/2025/07/25/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #36" date: 2025-07-25 -tags: [ "AI-Assisted", "Kỹ Thuật Phần Mềm", "Phát Triển Bản Thân", "AI", "Thiết Kế Hệ Thống" ] +tags: [ "AI-Assisted", "Kỹ Thuật Phần Mềm", "Phát Triển Bản Thân", "AI", "Thiết Kế Hệ Thống", "Algorithms", "Code Review" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/07/26/index.md b/content/post/2025/07/26/index.md index 600a780..30723e5 100644 --- a/content/post/2025/07/26/index.md +++ b/content/post/2025/07/26/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #37" date: 2025-07-26 -tags: [ "AI-Assisted", "DevOps", "WebSockets", "Developer Experience", "Git" ] +tags: [ "AI-Assisted", "Nix", "DevOps", "Developer Experience", "AI Coding", "Git", "WebSockets" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/07/28/index.md b/content/post/2025/07/28/index.md index 5a814cf..9be969c 100644 --- a/content/post/2025/07/28/index.md +++ b/content/post/2025/07/28/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #38" date: 2025-07-28 -tags: ["AI-Assisted", "Cursor", "Prompt Engineering", "AI Coding", "System Prompt"] +tags: ["AI-Assisted", "Cursor", "Prompt Engineering", "AI Coding", "Java", "Machine Code", "SQL"] categories: ["Newsletter"] --- @@ -31,7 +31,7 @@ Peter Steinberger, người thường xuyên bị hỏi "tốn bao nhiêu tiền Về nỗi lo giá sẽ tăng, tác giả chỉ ra rằng giá token đã giảm khoảng 1000 lần trong hai năm và cạnh tranh đang tiếp tục đẩy chi phí xuống. Phép tính cho người làm hợp đồng rất đơn giản: với mức 800 USD/ngày, tiết kiệm được một buổi chiều mỗi tháng đã tương đương 200 USD, nghĩa là Claude Max hoàn vốn sau 5 giờ và Cursor chỉ sau 45 phút. Kết luận của ông: thời gian là tài nguyên duy nhất không thể nạp lại, và Claude Max hiện là cách rẻ nhất để "đúc" thêm giờ làm việc. -## [Tests Should Not Contain Logic](https://blog.snork.dev/posts/tests-should-not-contain-logic.html) +## ~~[Tests Should Not Contain Logic](https://blog.snork.dev/posts/tests-should-not-contain-logic.html)~~ Bài viết ngắn này đưa ra một nguyên tắc: bài kiểm thử nên chứa càng ít logic càng tốt, tránh câu lệnh điều kiện và vòng lặp, để khi kiểm thử thất bại ta loại trừ ngay khả năng lỗi nằm ở chính nó. Tác giả minh họa bằng một hàm FizzBuzz có lỗi: vì kiểm tra `n % 3` trước `n % 15`, lời gọi `fizzbuzz(15)` trả về "fizz" thay vì "fizzbuzz". Nếu ngại viết từng câu lệnh khẳng định và dùng vòng lặp tính kết quả mong đợi bằng đúng chuỗi điều kiện ấy, bài kiểm thử sẽ lặp lại chính lỗi của mã nguồn và vẫn vượt qua. Ngược lại, những bài kiểm thử "hiển nhiên" ghi rõ từng giá trị, như `assert fizzbuzz(15) == "fizzbuzz"`, sẽ phát hiện lỗi ngay lập tức. diff --git a/content/post/2025/07/29/index.md b/content/post/2025/07/29/index.md index 426f8e1..ae822ba 100644 --- a/content/post/2025/07/29/index.md +++ b/content/post/2025/07/29/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #39" date: 2025-07-29 -tags: ["AI-Assisted", "Java", "Interview", "Senior Developer", "Programming"] +tags: ["AI-Assisted", "Java", "Interview", "Prompt Engineering", "MCP", "PostgreSQL", "Refactoring"] categories: ["Newsletter"] --- diff --git a/content/post/2025/07/30/index.md b/content/post/2025/07/30/index.md index bcfe17d..154b557 100644 --- a/content/post/2025/07/30/index.md +++ b/content/post/2025/07/30/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #40" date: 2025-07-30 -tags: ["AI-Assisted", "Java", "Testing", "Performance", "Database"] +tags: ["AI-Assisted", "Java", "Concurrency", "Testing", "AI Agents", "Performance", "Database"] categories: ["Newsletter"] --- diff --git a/content/post/2025/07/31/index.md b/content/post/2025/07/31/index.md index 078df87..1acad7d 100644 --- a/content/post/2025/07/31/index.md +++ b/content/post/2025/07/31/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #41" date: 2025-07-31 -tags: ["AI-Assisted", "Performance", "Algorithms", "Programming", "SQL"] +tags: ["AI-Assisted", "Performance", "Algorithms", "AI Coding", "Claude Code", "Vibe Coding", "SQL"] categories: ["Newsletter"] --- diff --git a/content/post/2025/08/01/index.md b/content/post/2025/08/01/index.md index 9f9cddd..290c080 100644 --- a/content/post/2025/08/01/index.md +++ b/content/post/2025/08/01/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #42" date: 2025-08-01 -tags: [ "AI-Assisted", "Thuật toán", "Thiết kế hệ thống", "Go" ] +tags: [ "AI-Assisted", "Thuật toán", "Thiết kế hệ thống", "Go", "Java", "AI Agents", "Career" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/08/02/index.md b/content/post/2025/08/02/index.md index c404b59..5a20b26 100644 --- a/content/post/2025/08/02/index.md +++ b/content/post/2025/08/02/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #43" date: 2025-08-02 -tags: [ "AI-Assisted", "Lập trình", "Tái cấu trúc mã" ] +tags: [ "AI-Assisted", "AI Coding", "Coding Agents", "LLM", "Database", "Caching", "Testing" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/08/03/index.md b/content/post/2025/08/03/index.md index 2319d12..4b0b103 100644 --- a/content/post/2025/08/03/index.md +++ b/content/post/2025/08/03/index.md @@ -8,6 +8,8 @@ tags: "Cursor", "Quy trình phát triển", "Kỹ năng chuyên môn", + "AI Coding", + "Git", ] categories: ["Newsletter"] --- diff --git a/content/post/2025/08/04/index.md b/content/post/2025/08/04/index.md index 6e2d4a0..0a04bf9 100644 --- a/content/post/2025/08/04/index.md +++ b/content/post/2025/08/04/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #45" date: 2025-08-04 -tags: [ "AI-Assisted", "Productivity", "Career", "Paul Graham", "Essay" ] +tags: [ "AI-Assisted", "Productivity", "Career", "Paul Graham", "AI Coding", "Search Platform", "Debugging" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/08/05/index.md b/content/post/2025/08/05/index.md index d34de28..5323ace 100644 --- a/content/post/2025/08/05/index.md +++ b/content/post/2025/08/05/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #46" date: 2025-08-05 -tags: [ "AI-Assisted", "Survey", "Tech Stack", "AI Tools", "Developer Tools" ] +tags: [ "AI-Assisted", "Survey", "Tech Stack", "AI Tools", "Distributed Systems", "TDD", "OOP" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/08/06/index.md b/content/post/2025/08/06/index.md index 3087ac9..3c1c465 100644 --- a/content/post/2025/08/06/index.md +++ b/content/post/2025/08/06/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #47" date: 2025-08-06 -tags: [ "AI-Assisted", "LLM", "Git", "Code Review", "CLI" ] +tags: [ "AI-Assisted", "LLM", "AI Agents", "Git", "Code Review", "CLI", "Concurrency" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/08/07/index.md b/content/post/2025/08/07/index.md index 481a0f9..6b456e7 100644 --- a/content/post/2025/08/07/index.md +++ b/content/post/2025/08/07/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #48" date: 2025-08-07 -tags: [ "AI-Assisted", "Software Development", "Programming", "Code Quality", "Documentation" ] +tags: [ "AI-Assisted", "AI Coding", "Claude Code", "Prompt Engineering", "Pattern Matching", "Code Quality", "Career" ] categories: [ "Newsletter" ] --- @@ -19,7 +19,7 @@ Claude Code thường để lại khoảng trắng thừa ở cuối dòng, vì Ngoài `PostToolUse`, hooks còn có các sự kiện `PreToolUse`, `Notification`, `Stop` và `SubagentStop`, cho phép kiểm tra, biến đổi hoặc chặn hành động ở nhiều bước khác nhau: chạy công cụ phân tích mã, chạy kiểm thử, xác nhận mã biên dịch được, hay ngăn những thao tác rủi ro như commit khi chưa kiểm tra. Tác giả cũng cảnh báo rằng hooks chạy với toàn bộ quyền của người dùng, nên cần đọc kỹ mọi lệnh trước khi thêm vào, vì một hook độc hại có thể xâm hại hệ thống ngay trong những thao tác thường ngày của Claude. Đây là ví dụ thực tế về cách biến những "thói quen xấu" của AI thành việc được sửa tự động, thay vì phải nhắc đi nhắc lại. -## [Docs for AI Agents](https://technicalwriting.dev/ai/agents/) +## ~~[Docs for AI Agents](https://technicalwriting.dev/ai/agents/)~~ Kayce Basques ghi lại suy nghĩ về tài liệu dành cho AI agent và mối quan hệ của nó với tài liệu kỹ thuật nội bộ mà nhóm phát triển viết cho chính mình, như RFC hay hướng dẫn xây dựng dự án. Agent docs giúp kết quả của agent nhất quán hơn, đúng quy ước dự án và chính xác hơn: khi mới dùng Claude Code, tác giả thấy công cụ đoán đúng trang web là Sphinx xây dựng bằng Bazel nhưng lại chạy sai lệnh; chỉ cần ghi lệnh đúng vào agent doc là từ đó nó luôn làm đúng. Mỗi công cụ tìm một file riêng ở thư mục gốc (`CLAUDE.md` cho Claude Code, `GEMINI.md` cho Gemini CLI, `AGENTS.md` cho Codex CLI), và nội dung file được chèn nguyên vẹn vào lời nhắc hệ thống ở mọi lần gọi mô hình, nên cần giữ thật cô đọng. Ngoài ra còn có agent doc cho thư mục con và cấp người dùng. diff --git a/content/post/2025/08/08/index.md b/content/post/2025/08/08/index.md index 604260f..c06891c 100644 --- a/content/post/2025/08/08/index.md +++ b/content/post/2025/08/08/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #49" date: 2025-08-08 -tags: ["AI-Assisted", "PostgreSQL", "Developer-Survey", "Productivity", "Technology-Selection"] +tags: ["AI-Assisted", "PostgreSQL", "LLM", "AI-Coding", "Virtual-Threads", "Developer-Survey", "Technology-Selection"] categories: ["Newsletter"] --- diff --git a/content/post/2025/08/09/index.md b/content/post/2025/08/09/index.md index 8e689de..ce61507 100644 --- a/content/post/2025/08/09/index.md +++ b/content/post/2025/08/09/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #50" date: 2025-08-09 -tags: ["AI-Assisted", "Event-Driven-Architecture", "Legacy-Systems", "Software-Architecture", "Modernization"] +tags: ["AI-Assisted", "AI-Coding", "Claude-Code", "Java", "Concurrency", "System-Design", "Event-Driven-Architecture"] categories: ["Newsletter"] --- diff --git a/content/post/2025/08/31/index.md b/content/post/2025/08/31/index.md index f2dc215..841afe0 100644 --- a/content/post/2025/08/31/index.md +++ b/content/post/2025/08/31/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #51" date: 2025-08-31 -tags: ["AI-Assisted", "Algorithms", "Performance", "Data Structures", "AI Tools", "Search Engine", "Neural Embeddings"] +tags: ["AI-Assisted", "Algorithms", "Data Structures", "Performance", "Claude Code", "HTTP", "Search Engine"] categories: ["Newsletter"] --- diff --git a/content/post/2025/09/07/index.md b/content/post/2025/09/07/index.md index 0840efa..5c0afa2 100644 --- a/content/post/2025/09/07/index.md +++ b/content/post/2025/09/07/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #52" date: 2025-09-07 -tags: [ "AI-Assisted", "Programming", "Best-Practices", "Software-Development", "Work-Life-Balance" ] +tags: [ "AI-Assisted", "Java", "Design-Patterns", "Security", "LLM", "Complexity", "Work-Life-Balance" ] categories: [ "Newsletter" ] --- diff --git a/content/post/2025/09/09/index.md b/content/post/2025/09/09/index.md index 407599d..a56ed26 100644 --- a/content/post/2025/09/09/index.md +++ b/content/post/2025/09/09/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #53" date: 2025-09-09 -tags: ["AI-Assisted", "Technology", "Security", "Gaming", "Programming", "Algorithms", "AI", "DevOps", "Big-Data", "FAANG"] +tags: ["AI-Assisted", "Security", "Gaming", "Algorithms", "Kafka", "Distributed-Systems", "Vibe-Coding"] categories: ["Newsletter"] --- diff --git a/content/post/2025/09/10/index.md b/content/post/2025/09/10/index.md index 4ebd041..ea17221 100644 --- a/content/post/2025/09/10/index.md +++ b/content/post/2025/09/10/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #54" date: 2025-09-10 -tags: ["AI-Assisted", "Technology", "DevOps", "Monorepo", "Software-Engineering", "Deployment", "Uber", "CI/CD"] +tags: ["AI-Assisted", "Monorepo", "Uber", "Deployment", "Unicode", "OAuth", "Caching"] categories: ["Newsletter"] --- @@ -32,7 +32,7 @@ Alex Chesser, lập trình viên với hơn 20 năm kinh nghiệm, cho rằng ph Kế hoạch tác giả đề xuất gồm bốn bước. Trước hết, đặt lịch một buổi "tự nhìn lại nghề nghiệp" dài một giờ, lặp lại hằng tuần. Tiếp theo, trả lời các câu hỏi như bản thân giỏi gì, thích gì, được trả tiền cho việc gì, cần cải thiện điều gì và mục tiêu trong 1–3, 3–5, 5–10 năm tới, rồi đặt mục tiêu theo tiêu chí SMART, không quên sức khỏe, gia đình và đam mê ngoài công việc để tránh kiệt sức. Sau đó, dành thời gian tập trung theo phương pháp deep work hoặc Pomodoro, và cuối cùng lặp lại vòng này mỗi tuần để điều chỉnh mục tiêu. Tác giả nhấn mạnh rằng không đầu tư cho phát triển chuyên môn cũng là một lựa chọn hợp lệ, miễn là bạn quyết định điều đó một cách có ý thức. -## [Database Cache](https://avi.im/blag/2025/db-cache/) +## [Replacing a cache service with a database](https://avi.im/blag/2025/db-cache/) Avi đặt câu hỏi: liệu database có thể thay thế hoàn toàn dịch vụ cache? Cache giải quyết một vấn đề quan trọng là cung cấp dữ liệu tính sẵn với độ trễ cực thấp, thường theo mô hình cache-aside, trong đó ứng dụng làm việc với cả cache lẫn database và tự giữ cho chúng đồng bộ. Để hệ thống đơn giản hơn, ta có thể dùng read replica như một cache: database vốn đã giữ một phần dữ liệu trong bộ nhớ (buffer pool), cả cache lẫn replica đều không yêu cầu nhất quán mạnh, ta dùng lại được chính các câu SQL và không còn phải lo chuyện vô hiệu hóa cache. Với database nhúng như SQLite kết hợp công cụ nhân bản như Litestream, độ trễ mạng thậm chí bằng không. diff --git a/content/post/2025/09/14/index.md b/content/post/2025/09/14/index.md index 6f30828..b25779c 100644 --- a/content/post/2025/09/14/index.md +++ b/content/post/2025/09/14/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #55" date: 2025-09-14 -tags: ["AI-Assisted", "Technology", "Performance", "CPU", "Benchmarking", "System-Administration", "DevOps"] +tags: ["AI-Assisted", "Performance", "CPU", "Durable-Queues", "Cognitive-Load", "Claude-Code", "Hiring"] categories: ["Newsletter"] --- diff --git a/content/post/2025/09/29/index.md b/content/post/2025/09/29/index.md index 94e33c3..fb3b199 100644 --- a/content/post/2025/09/29/index.md +++ b/content/post/2025/09/29/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #56" date: 2025-09-29 -tags: ["AI-Assisted", "Technology", "UUID", "Database", "Java", "Java25", "JDK", "Testing", "Automation", "Playwright", "AI-Development", "Spec-Driven", "Software-Engineering", "Programming-Motivation", "Rust", "Sorting-Algorithms", "ClickHouse", "Query-Optimization", "AI-Coding"] +tags: ["AI-Assisted", "UUID", "Java", "Spec-Driven", "Sorting-Algorithms", "ClickHouse", "AI-Coding"] categories: ["Newsletter"] --- diff --git a/content/post/2025/09/30/index.md b/content/post/2025/09/30/index.md index 1641751..876bc1c 100644 --- a/content/post/2025/09/30/index.md +++ b/content/post/2025/09/30/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #57" date: 2025-09-30 -tags: ["AI-Assisted", "Technology", "Career", "Agentic AI", "Professional Development", "Performance", "Memory Management", "Java", "Programming Languages", "Software Evolution", "Monorepo", "Package Management", "R", "Software Maintenance", "Distributed Systems", "Software Architecture", "System Design", "API Gateway", "Event Sourcing", "Microservices", "Code Quality", "Testing", "Code Maintenance", "Bug Prevention"] +tags: ["AI-Assisted", "Agentic AI", "Career", "Monorepo", "Distributed Systems", "Code Quality", "Java"] categories: ["Newsletter"] --- @@ -30,7 +30,7 @@ Bước nhảy lên 10 lần đến từ Coder Tasks, các môi trường tự ~~- Rust loại bỏ hoàn toàn nhu cầu GC nhờ ownership model~~ ~~- Việc lựa chọn ngôn ngữ ảnh hưởng đáng kể đến hiệu suất và trải nghiệm người dùng~~ -## [Mới Trong Java 25: Generational Shenandoah GC Không Còn Là Tính Năng Thử Nghiệm](https://theperfparlor.com/2025/09/14/new-in-java25-generational-shenandoah-gc-is-no-longer-experimental/) +## ~~[Mới Trong Java 25: Generational Shenandoah GC Không Còn Là Tính Năng Thử Nghiệm](https://theperfparlor.com/2025/09/14/new-in-java25-generational-shenandoah-gc-is-no-longer-experimental/)~~ Java 25 chính thức đưa Generational Shenandoah ra khỏi trạng thái thử nghiệm, sẵn sàng cho môi trường production. Shenandoah vốn là bộ thu gom rác (garbage collector) có thời gian tạm dừng thấp, xuất hiện từ Java 12 và chạy gần như đồng thời với ứng dụng. Phiên bản phân thế hệ, được giới thiệu dưới dạng thử nghiệm ở Java 24, chia bộ nhớ thành vùng dành cho đối tượng trẻ và đối tượng già. Vì phần lớn đối tượng "chết sớm", cách chia này giúp bộ thu gom không phải quét lại những đối tượng sống lâu một cách không cần thiết, từ đó cải thiện hiệu năng và giảm lượng bộ nhớ sử dụng. diff --git a/content/post/2025/10/01/index.md b/content/post/2025/10/01/index.md index f405a9a..388496d 100644 --- a/content/post/2025/10/01/index.md +++ b/content/post/2025/10/01/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #58" date: 2025-10-01 -tags: ["AI-Assisted", "Technology", "Productivity", "Decision Making", "Software Engineering", "Career Development", "Event-Driven", "Distributed Systems", "System Design", "Developer Culture", "Curiosity", "Innovation", "AI", "LLM", "Tool Calls", "Security", "Logging", "Data Protection", "Leadership", "Communication", "AI Coding", "Code Generation", "Claude Code", "Anthropic"] +tags: ["AI-Assisted", "Event-Driven", "Distributed Systems", "Security", "LLM", "Claude Code", "Career Development"] categories: ["Newsletter"] --- diff --git a/content/post/2025/10/03/index.md b/content/post/2025/10/03/index.md index 037d60b..e1d53d8 100644 --- a/content/post/2025/10/03/index.md +++ b/content/post/2025/10/03/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #59" date: 2025-10-03 -tags: ["AI-Assisted", "Technology", "Compression", "Algorithms", "AI", "Programming", "Performance", "Optimization", "CodeAssistant", "AutonomousCoding", "Experience", "WernerVogels", "KentBeck", "SoftwareCost", "FutureOfProgramming", "EngineeringTaste", "TechnicalTaste", "SeanGoedecke", "SoftwareDesign"] +tags: ["AI-Assisted", "Compression", "Branchless Programming", "Performance", "AI Coding", "Future of Programming", "Engineering Taste"] categories: ["Newsletter"] --- diff --git a/content/post/2025/10/12/index.md b/content/post/2025/10/12/index.md index 3096da4..10432cf 100644 --- a/content/post/2025/10/12/index.md +++ b/content/post/2025/10/12/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #60" date: 2025-10-12 -tags: ["AI-Assisted", "Technology", "Go", "Diff Algorithm", "Algorithms", "Performance"] +tags: ["AI-Assisted", "Diff Algorithm", "Go", "Write-Ahead Log", "Cloud Platforms", "Engineering Management", "Career Development"] categories: ["Newsletter"] --- diff --git a/content/post/2025/11/25/index.md b/content/post/2025/11/25/index.md index e2a236f..be60617 100644 --- a/content/post/2025/11/25/index.md +++ b/content/post/2025/11/25/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #61" date: 2025-11-25 -tags: ["AI-Assisted", "Technology", "Machine-Learning", "Software-Engineering", "Compilers", "Performance", "PostgreSQL"] +tags: ["AI-Assisted", "Open Table Formats", "Spec-Driven Development", "Agentic Engineering", "JIT", "Compilers", "PostgreSQL"] categories: ["Newsletter"] --- diff --git a/content/post/2025/12/02/index.md b/content/post/2025/12/02/index.md index 12466dc..39b6a66 100644 --- a/content/post/2025/12/02/index.md +++ b/content/post/2025/12/02/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #62" date: 2025-12-02 -tags: ["AI-Assisted", "Technology", "Multi-Core", "Performance", "Programming", "Systems", "AI-Coding"] +tags: ["AI-Assisted", "Claude Skills", "Environment Variables", "Documentation", "Multi-Core", "Performance", "AI-Coding"] categories: ["Newsletter"] --- diff --git a/content/post/2025/12/03/index.md b/content/post/2025/12/03/index.md index b542514..59b0038 100644 --- a/content/post/2025/12/03/index.md +++ b/content/post/2025/12/03/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #63" date: 2025-12-03 -tags: ["AI-Assisted", "Technology", "SQL", "Database", "Data-Engineering", "Anti-Patterns", "LSM-Tree", "KeyValue-DB"] +tags: ["AI-Assisted", "Software Design", "Code Review", "Software Quality", "AI Agents", "SQL", "Database"] categories: ["Newsletter"] --- diff --git a/content/post/2025/12/06/index.md b/content/post/2025/12/06/index.md index 207b38f..dd61006 100644 --- a/content/post/2025/12/06/index.md +++ b/content/post/2025/12/06/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #64" date: 2025-12-06 -tags: ["AI-Assisted", "Technology", "caching", "database", "performance"] +tags: ["AI-Assisted", "Caching", "Consistent Hashing", "Linux", "Java", "Performance", "Career"] categories: ["Newsletter"] --- diff --git a/content/post/2025/12/08/index.md b/content/post/2025/12/08/index.md index e8fb946..63e126c 100644 --- a/content/post/2025/12/08/index.md +++ b/content/post/2025/12/08/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #65" date: 2025-12-08 -tags: ["AI-Assisted", "Technology", "Engineering", "Leadership", "Scaling", "Infrastructure", "Linux", "Developer Tools"] +tags: ["AI-Assisted", "Engineering Leadership", "Incidents", "Linux", "Build Systems", "Claude Code", "AI Coding"] categories: ["Newsletter"] --- diff --git a/content/post/2025/12/09/index.md b/content/post/2025/12/09/index.md index e40e18b..2e7a7f0 100644 --- a/content/post/2025/12/09/index.md +++ b/content/post/2025/12/09/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #66" date: 2025-12-09 -tags: ["AI-Assisted", "Technology", "Software Architecture", "Books", "Engineering", "Development"] +tags: ["AI-Assisted", "Software Architecture", "Books", "AI Coding", "Testing", "PostgreSQL", "Kafka"] categories: ["Newsletter"] --- diff --git a/content/post/2025/12/10/index.md b/content/post/2025/12/10/index.md index 2611a56..972158b 100644 --- a/content/post/2025/12/10/index.md +++ b/content/post/2025/12/10/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #67" date: 2025-12-10 -tags: ["AI-Assisted", "Build Systems", "Configuration Languages", "Agentic Coding", "AI Development", "Refactoring", "Software Engineering"] +tags: ["AI-Assisted", "Build Systems", "Bazel", "Agentic Coding", "AI Development", "Refactoring", "Software Engineering"] categories: ["Newsletter"] --- @@ -31,7 +31,7 @@ Bài viết dự đoán những hướng phát triển tiếp theo của lập t Ở tầng điều phối nhiều tác tử, tác giả kỳ vọng các kỹ thuật như lấy mẫu Best of N, kết hợp mô hình đắt tiền để lập kế hoạch với mô hình rẻ hơn để thực thi, và dùng tác tử con (subagent) để chạy song song, cô lập ngữ cảnh, với một tác tử chính đứng ra điều phối giúp giảm tải cho người dùng. Chất lượng đầu ra sẽ được nâng lên nhờ cơ chế tự phê bình và tự đánh giá, bộ khung tự đề xuất cải thiện cấu hình, cùng hệ thống bộ nhớ lưu giữ thông tin về người dùng và kho mã vượt ra ngoài cửa sổ ngữ cảnh. Tác giả nhận định tốc độ thay đổi hiện nay là chưa từng có. -## [Why agents DO NOT write most of our code - a reality check](https://octomind.dev/blog/why-agents-do-not-write-most-of-our-code-a-reality-check/) +## ~~[Why agents DO NOT write most of our code - a reality check](https://octomind.dev/blog/why-agents-do-not-write-most-of-our-code-a-reality-check/)~~ Dù chính họ xây dựng tác tử AI, đội ngũ Octomind cho biết phần lớn mã nguồn của công ty vẫn do con người viết. Sau nhiều tháng dùng Cursor, Claude Code và Windsurf, không ai thấy năng suất tăng đáng kể (từ 20% trở lên). Để kiểm chứng, hai kỹ sư dành một tuần xây dựng hoàn toàn bằng AI một tính năng: tạo bản sao kịch bản kiểm thử riêng cho từng nhánh. Ở lần thử đầu, dù đã viết yêu cầu chi tiết và cập nhật tệp quy tắc, tác tử vẫn vấp ở những việc cơ bản như quên sinh lại Prisma client sau khi đổi lược đồ cơ sở dữ liệu, tạo thành phần giao diện mà không gắn vào đâu, viết truy vấn kém hiệu quả, rồi vẫn tự tin báo đã xong. Kết quả là một PR 2.000 dòng cần xem xét và sửa gần như mọi chỗ. Lần thứ hai chia nhỏ công việc vẫn cho ra 1.200 dòng chỉ cho một phần, kèm lỗi xử lý giao dịch (transaction). diff --git a/content/post/2025/12/11/index.md b/content/post/2025/12/11/index.md index cafaf7e..a161907 100644 --- a/content/post/2025/12/11/index.md +++ b/content/post/2025/12/11/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #68" date: 2025-12-11 -tags: ["AI-Assisted", "debugging", "open-source", "programming-languages", "system-performance", "networking", "javascript", "protocols", "algorithms", "system-design"] +tags: ["AI-Assisted", "debugging", "open-source", "system-performance", "networking", "javascript", "algorithms"] categories: ["Newsletter"] --- diff --git a/content/post/2026/01/05/index.md b/content/post/2026/01/05/index.md index 9bd0f94..3cb06d2 100644 --- a/content/post/2026/01/05/index.md +++ b/content/post/2026/01/05/index.md @@ -7,7 +7,7 @@ categories: ["Newsletter"] *Mời bạn thưởng thức Newsletter #76.* -## [TCP vs. UDP vs. gRPC: Chọn giao thức phù hợp cho kiến trúc của bạn](https://designgurus.substack.com/p/an-engineers-guide-to-basic-networking) +## [TCP vs. UDP vs. gRPC: Choosing the Right Protocol for Your Architecture](https://designgurus.substack.com/p/an-engineers-guide-to-basic-networking) Khi viết một hàm, dữ liệu chỉ di chuyển bên trong bộ nhớ của một máy; nhưng phần mềm hiện đại luôn phải giao tiếp với cơ sở dữ liệu, API hay trình duyệt ở nửa kia thế giới. Giao thức mạng chính là bộ quy tắc quy định định dạng dữ liệu, cách mở và đóng một cuộc hội thoại, cũng như cách xử lý khi có sự cố. Bài viết bắt đầu từ tầng vận chuyển với hai nền móng là TCP và UDP. TCP ưu tiên độ tin cậy: trước khi truyền dữ liệu, hai bên thực hiện bắt tay ba bước (SYN, SYN-ACK, ACK); sau đó giao thức đảm bảo mọi byte đến đủ, đúng thứ tự, tự động gửi lại gói bị mất, đồng thời dùng kiểm soát luồng và kiểm soát tắc nghẽn để không làm quá tải bên nhận. Vì vậy TCP phù hợp khi độ chính xác quan trọng hơn tốc độ, như truy vấn cơ sở dữ liệu, email hay trang web. UDP thì ngược lại: không kết nối, không bắt tay, không đánh số gói tin, gói nào rơi giữa đường là mất luôn; đổi lại độ trễ rất thấp, rất hợp với phát video trực tiếp hay trò chơi trực tuyến, nơi bỏ qua một khung hình còn tốt hơn dừng lại chờ khung cũ. diff --git a/content/post/2026/03/14/index.md b/content/post/2026/03/14/index.md index e355c65..43989e2 100644 --- a/content/post/2026/03/14/index.md +++ b/content/post/2026/03/14/index.md @@ -37,7 +37,7 @@ Simon Willison ra mắt một hướng dẫn về các mẫu (pattern) giúp kha Một vài mẫu tiêu biểu: "Viết mã giờ rất rẻ" — chi phí sinh mã gần như bằng không, nhưng mã tốt, tức là có kiểm thử, tài liệu và xử lý lỗi đầy đủ, vẫn có giá, nên cần xây dựng thói quen mới; "Tích lũy những gì bạn biết cách làm" — giữ một kho ví dụ chạy được để kết hợp lại và làm đầu vào cho agent; và "Red/green TDD" — viết kiểm thử trước, xác nhận nó thất bại rồi mới để agent triển khai, kèm lời khuyên chạy bộ kiểm thử ngay từ đầu phiên. Hướng dẫn cũng nêu các phản mẫu cần tránh, điển hình là đẩy mã chưa được xem xét sang cho đồng nghiệp, và liên tục được bổ sung thêm chương mới. -## [Things I Miss About Spring Boot After Switching to Go](https://sushantdhiman.dev/things-i-miss-about-spring-boot-after-switching-to-go/) +## ~~[Things I Miss About Spring Boot After Switching to Go](https://sushantdhiman.dev/things-i-miss-about-spring-boot-after-switching-to-go/)~~ Sushant Dhiman, sau 1,5 năm viết hệ thống production bằng Java và Spring Boot cho một startup rồi chuyển sang Go, chia sẻ những thứ anh nhớ ở hệ sinh thái Spring. Điều đầu tiên là triết lý "batteries included": Spring Boot cung cấp sẵn gần như mọi tính năng cần cho production, trong khi Go theo triết lý tối giản với nhiều thư viện nhỏ thay vì một framework khổng lồ. Cụ thể, anh nhớ dependency injection tự động qua annotation như `@Service` và `@Autowired`, trong khi ở Go phải tự nối các phụ thuộc qua hàm khởi tạo — rõ ràng nhưng mã khởi động sẽ phình to khi hệ thống có hàng trăm phụ thuộc. Tương tự, validation khai báo với `@NotNull` hay `@Email` giúp tránh các chuỗi if/else kiểm tra thủ công bằng biểu thức chính quy. diff --git a/content/post/2026/03/20/index.md b/content/post/2026/03/20/index.md index 0d70641..48d358e 100644 --- a/content/post/2026/03/20/index.md +++ b/content/post/2026/03/20/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #92" date: 2026-03-20 -tags: ["AI-Assisted", "Newsletter", "AI Infrastructure", "Security", "Redis", "Compression", "AI Agents"] +tags: ["AI-Assisted", "Newsletter", "AI Infrastructure", "Machine Learning", "Redis", "Compression", "AI Agents"] categories: ["Newsletter"] --- @@ -26,7 +26,7 @@ Bài viết thuộc loạt MLU-Explain của Jared Wilber và Lucía Santamaría Để chọn điểm phân chia, thuật toán ID3 ưu tiên phép chia mang lại information gain lớn nhất, tức là làm giảm entropy của dữ liệu nhiều nhất. Tuy nhiên, chia quá sâu sẽ khiến cây học cả nhiễu trong dữ liệu huấn luyện thay vì những quy tắc có thể tổng quát hóa, một biểu hiện của sự đánh đổi giữa bias và variance dẫn đến overfitting. Cây quyết định dễ diễn giải, huấn luyện nhanh, ít cần tiền xử lý và chịu tốt giá trị ngoại lệ, nhưng lại kém ổn định: chỉ một thay đổi nhỏ trong dữ liệu cũng có thể làm cấu trúc cây thay đổi hoàn toàn. Các kỹ thuật cắt tỉa (pruning) như giới hạn độ sâu tối đa hay đặt số mẫu tối thiểu ở mỗi lá giúp kiểm soát vấn đề này. -## [Container không phải là ranh giới bảo mật](https://www.lucavall.in/blog/containers-are-not-a-security-boundary) +## ~~[Container không phải là ranh giới bảo mật](https://www.lucavall.in/blog/containers-are-not-a-security-boundary)~~ Dựa trên cuốn Container Security của Liz Rice và quá trình tự tìm hiểu các thành phần Linux bên dưới, Luca Cavallin nhắc lại rằng container không tự động an toàn. Về bản chất, container chỉ là một tiến trình Linux được bao quanh bởi vài lớp cô lập: namespace giới hạn những gì tiến trình nhìn thấy, cgroups giới hạn tài nguyên nó được dùng, nhưng mọi container trên cùng máy chủ vẫn dùng chung một kernel. Vì vậy lỗi kernel, mount cấu hình sai, capabilities quá rộng như CAP_SYS_ADMIN hay tệp setuid bị bỏ quên đều có thể trở thành đường leo thang đặc quyền; chỉ "không chạy bằng root" là chưa đủ. Những nguyên tắc cũ như đặc quyền tối thiểu, phòng thủ nhiều lớp, giảm bề mặt tấn công và giới hạn phạm vi ảnh hưởng vẫn nguyên giá trị. diff --git a/content/post/2026/04/02/index.md b/content/post/2026/04/02/index.md index ea59d3a..a74f01f 100644 --- a/content/post/2026/04/02/index.md +++ b/content/post/2026/04/02/index.md @@ -13,7 +13,7 @@ Sau khi mã nguồn Claude Code CLI bị rò rỉ lên GitHub, Haseeb Qureshi đ Prompt hệ thống được ghép từ khoảng 15 hàm và chia đôi bằng một điểm đánh dấu ranh giới: nửa tĩnh (khoảng 3.000 token hướng dẫn) được lưu bộ nhớ đệm dùng chung cho mọi người dùng, nửa động chứa ngữ cảnh riêng của từng phiên như `CLAUDE.md` hay chỉ dẫn MCP. Kỹ sư nội bộ Anthropic còn nhận prompt khác người dùng bên ngoài, chẳng hạn giới hạn 25 từ giữa các lần gọi công cụ hay một tác tử xác minh đối kháng. Cờ tính năng lúc biên dịch của Bun giúp loại bỏ mã chết và để lộ những tính năng chưa phát hành như `VOICE_MODE` và `KAIROS`. Kết luận của tác giả: trong khoảng 500 nghìn dòng TypeScript, lời gọi API chỉ chiếm vài trăm dòng; mô hình là phần dễ thay thế nhất, còn "harness" (khung vận hành bao quanh) mới là nơi tích lũy nhiều năm kinh nghiệm thực chiến. -## [AI sẽ đẩy nhanh nợ kỹ thuật của bạn](https://securosis.com/ai/ai-will-accelerate-your-tech-debt/) +## ~~[AI sẽ đẩy nhanh nợ kỹ thuật của bạn](https://securosis.com/ai/ai-will-accelerate-your-tech-debt/)~~ Chris Farris cho rằng nhiều tổ chức đang giống những gia đình sống nhờ đồng lương tháng: sau nhiều năm ưu tiên ra tính năng hơn xây kiến trúc bền vững, họ chỉ cách phá sản một sự cố lớn, và mỗi sự cố nhỏ lại ngốn thời gian lẽ ra dùng để trả nợ kỹ thuật. Tác giả ví đầu tư AI lúc này như chính sách giảm thuế: dễ chịu và có thể tăng năng suất trước mắt, nhưng làm vấn đề cấu trúc tệ hơn. Khi chi phí viết mã nguồn gần bằng không, rào cản kinh tế tự nhiên ngăn các tính năng thiếu cân nhắc biến mất, kéo theo nhiều mã hơn, bề mặt tấn công rộng hơn và hệ thống phức tạp hơn cho cùng một đội ngũ vốn đã quá tải. diff --git a/content/post/2026/04/14/index.md b/content/post/2026/04/14/index.md index a4655b8..c0cb535 100644 --- a/content/post/2026/04/14/index.md +++ b/content/post/2026/04/14/index.md @@ -31,7 +31,7 @@ Anthropic công bố kết quả nghiên cứu định tính đa ngôn ngữ l 81% người tham gia cho biết AI đã giúp họ tiến gần hơn tới mục tiêu, chủ yếu qua năng suất (32%), vai trò bạn đồng hành tư duy (17%) và học tập (10%). Mặt khác, trung bình mỗi người nêu 2.3 mối lo: độ tin cậy (27%), mất việc làm (22%), mất quyền tự chủ (22%), suy giảm nhận thức (16%) và thiếu cơ chế quản trị (15%). Lợi ích và rủi ro thường song hành trong cùng một người: ai đánh giá cao sự hỗ trợ cảm xúc từ AI thì khả năng lo ngại bị phụ thuộc cũng cao gấp 3 lần. Người dùng ở khu vực thu nhập thấp lạc quan hơn và xem AI là cơ hội, còn ở khu vực giàu có thì mối quan tâm xoay quanh việc quản lý một cuộc sống phức tạp. -## [Mở rộng monolith lên 1 triệu dòng mã: 113 bài học thực tế từ Tech Lead đến CTO](https://www.semicolonandsons.com/articles/scaling-a-monolith-to-1m-loc-113-pragmatic-lessons-from-tech-lead-to-cto) +## ~~[Mở rộng monolith lên 1 triệu dòng mã: 113 bài học thực tế từ Tech Lead đến CTO](https://www.semicolonandsons.com/articles/scaling-a-monolith-to-1m-loc-113-pragmatic-lessons-from-tech-lead-to-cto)~~ Bài viết đúc kết 113 bài học thực tế từ hành trình mở rộng một monolith lên 1 triệu dòng mã, qua kinh nghiệm của tác giả khi đi từ vị trí Tech Lead lên CTO. Thông điệp xuyên suốt là quyết định kiến trúc quan trọng hơn nhiều so với các tối ưu nhỏ lẻ: thay vì vội thêm cache, hãy sửa tận gốc như truy vấn cơ sở dữ liệu kém hay thiếu index, bởi chỉ một truy vấn chạy lâu cũng có thể kéo hiệu năng toàn hệ thống giảm một nửa. Giám sát (monitoring) và khả năng quan sát (observability) phải được đối xử như thành phần chính của hệ thống, với cảnh báo cho hiệu năng, truy vấn N+1 hay mức đầy của cache, và mục tiêu "inbox zero" cho việc theo dõi lỗi — cảnh báo nào cũng được xử lý. diff --git a/content/post/2026/05/23/index.md b/content/post/2026/05/23/index.md index a9b7175..b331bb7 100644 --- a/content/post/2026/05/23/index.md +++ b/content/post/2026/05/23/index.md @@ -13,7 +13,7 @@ Bài viết lưu giữ lại một bài đăng nổi tiếng trên r/Experienced Về kỹ thuật, mỗi lĩnh vực chỉ có khoảng 10–20 nguyên tắc cốt lõi, và nền tảng thay đổi rất chậm dù công nghệ thay đổi liên tục. Mã nguồn tốt là mã nguồn kỹ sư junior đọc hiểu được, còn mã nguồn tốt nhất là không cần viết dòng nào. Viết tài liệu là kỹ năng bị đánh giá thấp nhất, đi cùng khả năng viết đề xuất thay đổi. Với người mới, SQL là ngôn ngữ "đáng tiền" nhất; kiểm thử rất quan trọng nhưng TDD thì bị thần thánh hóa. Kỹ sư giỏi biết các thực hành tốt nhất, còn kỹ sư senior biết khi nào nên phá vỡ chúng. Điều khiến tác giả tự hào nhất không phải hệ thống lớn nào, mà là giúp người khác làm việc tốt hơn. Người lưu giữ bài viết đồng ý với gần hết, chỉ trừ quan điểm ưa chuộng ngôn ngữ động. -## [How I Use AI to Code](https://www.chrismdp.com/coding-with-ai/) +## [How I Use AI to Code](https://www.chrismdp.com/coding-with-ai-april-2026/) Chris Parsons cho rằng nếu vẫn gắn chặt với IDE như Cursor hay Copilot, bạn đang đi sau một năm: công cụ tốt nhất đã rời trình soạn thảo để chuyển sang dòng lệnh, và ông khuyên dùng Claude Code hoặc Codex CLI. Lập trình là "sân nhà" của AI vì mã nguồn có thể chạy để kiểm chứng ngay. Ông phân biệt "vibe coding" (không kiểm tra kết quả) với "agentic engineering" (chủ động quyết định thay đổi nào cần tự xem, thay đổi nào giao cho kiểm thử và công cụ tự động). Thông điệp chính: kỹ sư cấp cao nên huấn luyện AI viết mã tốt hơn thay vì tự review từng thay đổi, bởi cái khung (harness) bao quanh mô hình quan trọng hơn câu lệnh. diff --git a/content/post/2026/05/30/index.md b/content/post/2026/05/30/index.md index c8222df..e80ae52 100644 --- a/content/post/2026/05/30/index.md +++ b/content/post/2026/05/30/index.md @@ -7,7 +7,7 @@ categories: ["Newsletter"] *Mời bạn thưởng thức Newsletter #107.* -## [Tại sao tôi rời GitHub để chuyển sang Forgejo](https://jorijn.com/en/blog/leaving-github-for-forgejo/) +## ~~[Tại sao tôi rời GitHub để chuyển sang Forgejo](https://jorijn.com/en/blog/leaving-github-for-forgejo/)~~ Jorijn Schrijvershof chia sẻ lý do rời GitHub để chuyển sang Forgejo tự vận hành, đi theo hướng mà chính phủ Hà Lan đã chọn khi ra mắt code.overheid.nl trên cùng nền tảng vào tháng 4/2026. Động lực chính không nằm ở độ ổn định của GitHub mà ở quyền độc lập và kiểm soát: sau khi cựu CEO Thomas Dohmke rời đi vào tháng 8/2025, GitHub trở thành một bộ phận trong mảng CoreAI của Microsoft thay vì có ban lãnh đạo tự chủ. Từ ngày 24/4/2026, GitHub còn bật mặc định việc thu thập dữ liệu người dùng Copilot để huấn luyện AI mà không có tùy chọn từ chối ở cấp kho mã, nên mã nguồn của tác giả có thể thành dữ liệu huấn luyện mỗi khi cộng tác viên dùng Copilot. Ngoài ra, luật Mỹ như FISA Section 702 hay CLOUD Act vẫn áp dụng dù dữ liệu đặt ở đâu, nên lưu trữ tại EU không giải quyết tận gốc. diff --git a/content/post/2026/06/23/index.md b/content/post/2026/06/23/index.md index 41c96bc..a07d0f3 100644 --- a/content/post/2026/06/23/index.md +++ b/content/post/2026/06/23/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #112" date: 2026-06-23 -tags: ["AI-Assisted", "Newsletter", "Typography", "Design", "Software Engineering", "Code Quality", "Engineering Culture", "Productivity", "Java", "Programming", "Go", "Rust", "Kubernetes", "Infrastructure", "PostgreSQL", "Redis", "Database", "Game Development", "AI Coding", "Product Management", "Package Management", "Supply Chain", "Claude Code", "AI Agents", "MCP", "Performance", "Frontend", "Web Development"] +tags: ["AI-Assisted", "Newsletter", "Software Engineering", "Rust", "Kubernetes", "Claude Code", "Performance"] categories: ["Newsletter"] --- diff --git a/content/post/2026/07/09/index.md b/content/post/2026/07/09/index.md index 072b4ec..d4aa246 100644 --- a/content/post/2026/07/09/index.md +++ b/content/post/2026/07/09/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #121" date: 2026-07-09 -tags: ["AI-Assisted", "Newsletter", "Go", "Performance", "System Design", "Programming", "Networking", "AI", "Infrastructure", "Leadership", "Engineering Culture", "Software Architecture", "Distributed Systems", "Databases", "SQLite", "Security", "Code Quality", "Compilers", "Programming Languages", "Linux"] +tags: ["AI-Assisted", "Newsletter", "Go", "Performance", "System Design", "Linux", "Engineering Culture"] categories: ["Newsletter"] --- diff --git a/content/post/2026/07/23/index.md b/content/post/2026/07/23/index.md index 14d946c..9be6eb3 100644 --- a/content/post/2026/07/23/index.md +++ b/content/post/2026/07/23/index.md @@ -1,7 +1,7 @@ --- title: "Newsletter #126" date: 2026-07-23 -tags: ["AI-Assisted", "Go", "Performance", "Backend", "System Design", "Security", "Databases"] +tags: ["AI-Assisted", "Go", "Performance", "Backend", "Concurrency", "Security", "Databases"] categories: ["Newsletter"] --- @@ -19,7 +19,7 @@ Bài viết thuộc loạt "Optimization catalog", phân tích một hiện tư Các phép đo tiếp theo cho thấy SIMD, dù dùng hàm nội tại thử nghiệm của Go hay hợp ngữ viết tay, không vượt trội so với `STOSQ`. Biến thể ghi thẳng ra bộ nhớ có lúc nhanh hơn nhưng kết quả dao động mạnh, vì phụ thuộc việc nhân hệ điều hành cấp phát các trang liền mạch hay rời rạc. Bài viết cũng gợi ý gắn số thế hệ cho từng phần tử để hiếm khi phải xóa thật, nhưng thẻ thế hệ làm mảng lớn hơn và có thể khiến dữ liệu không còn vừa bộ nhớ đệm. Bài học rút ra là hiệu quả tối ưu phụ thuộc bộ xử lý, lệnh máy và kích thước dữ liệu, nên luôn cần đo trên phần cứng thực tế. -## [Engineering High-Performance Parsers with Data-Oriented Design](https://www.arshad.fyi/writings/engineering-high-performance-parsers) +## ~~[Engineering High-Performance Parsers with Data-Oriented Design](https://www.arshad.fyi/writings/engineering-high-performance-parsers)~~ Bài viết chia sẻ nguyên tắc thiết kế phía sau Yuku, một trình phân tích cú pháp JavaScript và TypeScript viết bằng Zig, với luận điểm chính: khi ngữ pháp đã đúng, hiệu năng gần như được quyết định bởi cách biểu diễn cây cú pháp trong bộ nhớ chứ không phải thuật toán phân tích. Thay vì các nút cấp phát rời rạc và liên kết bằng con trỏ, vốn gây hàng chục nghìn lần cấp phát và những lần truy cập bộ nhớ khó đoán, Yuku lưu nút trong một mảng phẳng và dùng chỉ số `u32` làm tham chiếu. Chỉ số chỉ bằng nửa con trỏ và cả cây được giải phóng trong một thao tác, còn thuật toán đệ quy vẫn quen thuộc.