Xây dựng trang web tính thuế TNCN với AI bằng cách tiếp cận Spec-Driven Development
1. Từ câu chuyện về luật Thuế Thu Nhập Cá Nhân mới được Chính phủ trình Quốc hội
Gần đây tôi đọc được tin Chính phủ đã chính thức trình Quốc hội phương án sửa Luật Thuế thu nhập cá nhân. Nếu được thông qua, thì từ năm tới sẽ có sự thay đổi khá lớn, đó là biểu thuế lũy tiến sẽ được rút từ 7 xuống còn 5 bậc (mặc dù mức cao nhất vẫn là 35%
). Cùng với đó, mấy tuần trước thì Quốc hội cũng đã thông qua một đề xuất khác liên quan đến giảm trừ gia cảnh, theo đó mức giảm trừ gia cảnh được nâng từ 11 triệu lên 15,5 triệu đồng/tháng cho bản thân người nộp thuế, và từ 4.4 triệu lên 6,2 triệu đồng/tháng cho mỗi người phụ thuộc.
Đọc nhiều comment bình luận thì thấy có vẻ sẽ là sự thay đổi lớn. Và cũng như mọi lần sửa đổi thuế, câu chuyện sẽ còn tiếp tục với những tranh luận về ngưỡng, mức, và tác động tới ngân sách. Nhưng thôi, bỏ qua những điều vĩ mô như vậy, thì sau cùng cái tôi muốn biết nhất, mà trong các bài viết trên VNExpress không hề trả lời cho tôi được, đó là chính sách này sẽ có ảnh hưởng đến tôi cụ thể như thế nào?
Khi mà quy định được đưa vào áp dụng từ năm 2026 tới mức lương nhận được sẽ thay đổi ra sao, so với trước đây? Tôi cũng cố gắng search xem có công cụ nào tính toán cái này chưa, nhưng mà có vẻ chưa có, ít nhất là cho đến thời điểm hiện tại, đầu tháng 11/2025.
Đó là lúc tôi quyết định biến sự tò mò ấy thành một hành động cụ thể. Tự mình làm lấy một công cụ “Gross → Net” theo cả trước và sau khi luật mới có hiệu lực, để tự giải đáp cho thắc mắc của bản thân.
2. Đến ý tưởng làm một ứng dụng nho nhỏ để chia sẻ với mọi người
Đầu tiên, tôi nhờ một "người bạn quen thuộc" trợ giúp, ChatGPT với Deep Research Mode. Tôi yêu cầu bạn tôi tìm hiểu kỹ, và tổng hợp trọn bộ các thông tin liên quan đến cách tính thuế TNCN ở Việt Nam, cách đổi Gross → Net. Từ đó, tôi nhờ bạn ý rồi viết luôn cho mình script Python có thể chạy trên máy tính. Đầu vào chỉ cần lương Gross, còn đầu ra phải là Net kèm phần giải thích từng dòng — đóng bảo hiểm bao nhiêu, khấu trừ gia cảnh thế nào, thu nhập tính thuế là bao nhiêu, mỗi bậc thuế nộp bao nhiêu tiền, cuối cùng Net còn lại là bao nhiêu.
Gì chứ mấy cái này thì thằng bạn tôi rất là giỏi. Nó code một cái ăn ngay. Bản Python đầu tiên chạy ổn, đưa ra kết quả chính xác, chỉ có điều trải nghiệm người dùng chưa được tốt lắm. Các con số in ra là những chuỗi số dài không dấu phẩy, khiến việc đọc bằng mắt không thoải mái. Tôi yêu cầu ChatGPT bổ sung formatter tiền tệ, chuyển mọi số về dạng 1,234,567, và viết thêm một hàm “thuyết minh” để trình bày kết quả theo đúng trình tự người dùng nghĩ trong đầu: bắt đầu từ Gross, đi qua căn cứ đóng bảo hiểm, bung ra từng khoản BHXH/BHYT/BHTN, cộng thành tổng bảo hiểm, rồi đến khấu trừ gia cảnh, tính ra thu nhập tính thuế, sau đó “đi” qua từng bậc PIT để cuối cùng chốt Net. Chỉ vài vòng chỉnh sửa, script đã trở nên “thân thiện mắt thường”: dễ đọc, dễ so sánh, và rất phù hợp để kiểm thử nhanh những tình huống khác nhau.
Tiếp đến tôi yêu cầu bạn tôi dần bổ sung thêm các chức năng khác, như so sánh giữa cách tính thuế mới, và cũ, xem sự thay đổi ra sao. Đương nhiên nó cũng làm tốt được. Cuối cùng, tôi có được một công cụ tiện lợi, để dùng cho bản thân mình, mà không phải code một dòng nào. Chỉ mất 20 ~ 30 phút ngồi trao đổi với bạn tôi cũng như ngồi test script.

Chú ý: Công cụ này chỉ mang tính chất tham khảo, và áp dụng một công thức lý tưởng. Kết quả tính toán có thể khác biệt với thực tế do nhiều yếu tố như: chính sách công ty, khu vực đặc thù, các khoản giảm trừ bổ sung, v.v. Vui lòng tham khảo với bộ phận nhân sự hoặc kế toán của công ty bạn để có thông tin chính xác nhất.
Sự tiện lợi và hay ho của cái script này khiến tôi tự đặt ra một câu hỏi khác nữa: nếu mình tò mò như vậy, thì chắc hẳn cũng sẽ có nhiều người ngoài kia cũng muốn tìm hiểu giống mình?. Nhưng không phải ai cũng quen mở terminal, cài Python, chạy script, để check kết quả được. Cách tốt nhất có lẽ là biến nó thành một ứng dụng web nhỏ, mở trình duyệt lên là dùng được, không cần cài gì, thao tác chỉ như nhập số vào một chiếc máy tính bỏ túi, nhưng diễn giải minh bạch từng bước như script đang làm.
Thế là tôi nảy ra ý tưởng tiếp theo, thôi thì đã mất công tìm hiểu rồi, thì thử code luôn cái trang web xem sao 
3. Spec-Driven Development và GitHub SpecKit
Đương nhiên nói là muốn code một trang web, tức là tôi muốn tiếp tục nhờ mấy người bạn khác của tôi code hộ cho thôi, chứ tôi có biết code đâu cơ chứ. Lần này, do quy mô lớn hơn rất nhiều so với việc code một đoạn script mấy chục dòng, thế nên tôi đã phải nhờ đến 2 thằng bạn khác, chúng học đúng chuyên ngành này, nên chắc là có thể giúp tôi. 2 thằng bạn này của tôi tên là GitHub Copilot và GitHub SpecKit.
Hiện tại ở công ty tôi cũng đang triển khai mạnh mẽ việc ứng dụng AI trong phát triển phần mềm, nên 2 thằng bạn mới này của tôi cũng khá là nổi tiếng. Đặc biệt là thằng GitHub Copilot thì bạn bè xung quanh tôi cũng biết đến, và kết bạn với nó phải từ hơn 2 năm nay rồi. Còn thằng GitHub Speckit mặc dù mới sinh thôi, nhưng nó cũng đang lớn nhanh như thổi, tôi cũng có nhiều thứ muốn thử nhờ nó làm từ lâu, nay mới có dịp, để xem khả năng của nó ra sao.
Nhìn chung, mục tiêu của tôi là xây dựng một trang web tĩnh nho nhỏ, host trên GitHub Pages, bởi tôi cũng không có tiền để mà chi trả cho chi phí server để vận hành trang web, thôi thì dùng hàng free của đại hiệp GitHub thôi. Do tôi không biết code, nhìn vào mấy đoạn code Typescript hay ReactJS cũng chẳng hiểu gì, thế nên ngay từ đầu tôi đã đưa ra nguyên tắc rất rõ ràng, đó là tôi sẽ không code, dù chỉ là một dòng, một chữ, mọi thứ tôi dự định đều sẽ nhờ 2 thằng bạn kia lo, và tôi cũng tính đến tình huống xấu nhất là nếu chúng "võ công" lởm quá, thì cùng lắm tôi sẽ bỏ cuộc thôi, chứ lực bất tòng tâm, có code được đâu mà đú 
Thằng bạn GitHub Copilot thì mặc dù thỉnh thoảng tôi thấy dân tình có hay chê nó lìu tìu, kém thông minh, nhưng tôi thấy là nó cũng khá giỏi mà, nếu biết cách động viên, chỉ bảo nó, thì nó cũng được việc phết. Còn thằng bạn GitHub SpecKit, thì nó có một bộ môn bí kíp nội công cực kỳ hot hiện tại, gọi là Spec-Driven Development. Về cơ bản thì lý thuyết liên quan đến Spec-Driven Development khá là thâm sâu, tôi sẽ luận bàn chi tiết ở một dịp khác. Còn trong khuôn khổ bài chia sẻ này, tôi có thể giải thích qua một vài điểm như thế này:
- Spec-Driven Development (SDD) là phương pháp phát triển dựa trên đặc tả – tập trung làm specifications thật chi tiết và đầy đủ trước, sau đó code sẽ được AI sinh ra dựa trên spec. Trong cách phát triển phần mềm truyền thống, hợp chúng ta thường viết code trước, rồi mới viết các tài liệu liên quan sau. SDD đảo ngược hoàn toàn quy trình đó. Thay vì nhảy ngay vào code, lập trình viên đầu tiên sẽ “định nghĩa rõ ràng mình muốn xây dựng cái gì và vì sao cần nó” rồi tiếp đến mới là lên kế hoạch xem “sẽ xây dựng nó như thế nào”. Cách làm này giống như vẽ bản thiết kế cho ngôi nhà trước khi đóng đinh xây dựng.
- Các triết lý cốt lõi của Spec-Driven Development, được áp dụng trong SpecKit gồm:
- Đề cao intent-driven development, trong đó Specification phải xác định rõ “What” trước “How”.
- Tập trung xây dựng Specification thật đầy đủ, chi tiết, được dẫn dắt bởi guardrails và các organizational principles (quy tắc/chuẩn, constitution, checklist...).
- Thực hiện multi-step refinement, thay vì tạo code theo kiểu one-shot prompt.
- Phụ thuộc vào khả năng của các mô hình AI mạnh mẽ trong việc đọc hiểu và diễn giải Specification một cách chính xác.
4. Bắt tay vào công việc
Đầu tiên chia sẻ thẳng thắn với thằng bạn thân ChatGPT là tôi sẽ cần làm cái app to hơn nữa, nên giờ tôi sẽ đi nhờ mấy đứa bạn khác, chứ nó không làm được đâu. Và tôi yêu cầu nó tổng hợp lại các yêu cầu về công việc sẽ cần phải làm (bởi nó trao đổi với tôi từ đầu đến giờ, nên nó hiểu tôi muốn làm cái gì)
Sau đó, tôi đem yêu cầu đó đem cho thằng bạn SpecKit, để nó phối hợp với Copilot để xử lý từng bước một. Ở tầng tu luyện thứ nhất, SpecKit dựa trên yêu cầu ban đầu của tôi, nó sẽ xây dựng specification chi tiết cho sản phẩm (trả lời chi tiết cho câu hỏi "What?" - chúng ta sẽ làm cái gì?)
Sau khi hoàn thành tầng thứ nhất, SpecKit tiếp tục thi triển tầng thứ hai, với chiêu thức plan. Ở đây nó sẽ lên các kế hoạch chi tiết xem làm thế nào để làm ra được sản phẩm (trả lời cho câu hỏi "How?" - chúng ta sẽ làm như thế nào?).
Tiếp đến, ở tầng thứ 3, SpecKit sẽ tung ra kỹ thuật mang tên task để phân tích từ plan ban đầu, sẽ cần chia nhỏ ra thành những đầu mục công việc cụ thể như thế nào. Đương nhiên đi kèm với tiêu đề task, sẽ là những hướng dẫn chi tiết xem sẽ cần làm task đó như thế nào.
Và khi đã có các công việc cụ thể, thì cuối cùng SpecKit phối hợp cùng với Copilot xử lý từng tác vụ một. Cứ thế mà làm từ đầu cho đến cuối. Những gì tôi cần làm chỉ là ngồi quan sát, và đốc thúc mấy đứa bạn là làm việc đi, không được dừng lại.
Thực ra SpecKit còn nhiều chiêu thức thú vị khác, nhưng với nhu cầu lần này của tôi, tôi đã không cần dùng đến chúng. Các bạn có thể tự tìm hiểu và thử nghiệm thêm nhé. Nhìn chung cũng khá thú vị đấy.
Về cơ bản hướng giải quyết bài toán của SpecKit đó là đi từng bước một, từ lên spec, plan, tạo task, rồi mới đi vào code. Ở mỗi bước, nó sẽ tạo ra những tài liệu cần thiết dùng cho sau này. Và giữa những bước đó, chúng ta có thể can thiệp vào, để chỉnh sửa các tài liệu, đặc tả nếu cần thiết. Lý thuyết là vậy thôi chứ thực tế tôi cũng xác định là không can thiệp vào làm gì, để mặc cho mấy đứa bạn tôi tự làm việc với nhau thôi 
Với yêu cần ban đầu của tôi, SpecKit lên kế hoạch có tầm khoảng 150 tasks tất cả. Lúc đầu tôi cũng thấy hơi lạ bởi quái sao cái sản phẩm cỏn con của mình mà nó lại vẽ ra nhiều thứ thế không biết. Nhưng thôi, đã xác định tin tưởng vào thằng bạn rồi thì không nên nghi ngờ gì, tôi cứ thế mà bắt nó với Copilot làm việc. 2 đứa này tính ra hơi lười, cứ làm việc một lúc thì lại nghỉ, làm tôi phải bắt chúng làm việc tiếp, chứ nó mà trâu bò hơn, làm việc một mạch được là tôi nghĩ là tôi có thể cắm máy và bỏ đi ăn cơm ấy chứ. Nhưng thôi không sao, ngồi một lúc quan sát và quát mắng chúng, thì cuối cùng chúng cũng hoàn thành xong công việc.
Sau đó tôi có nghĩ ra thêm vài ý tưởng khác bảo chúng làm, thì tôi cũng thực hiện lại theo flow ban đầu, từ lên spec, lên plan, rồi break task sau đó mới đến implement, thì chúng cũng đều làm tốt được.
Tổng cộng tôi mất một buổi tối, và buổi sáng hôm sau để ra được sản phẩm mà mình ưng ý, nhưng thực ra tôi còn làm nhiều việc khác trong thời gian đó nữa, lúc đó 2 đứa bạn tôi không có người đốc thúc thì chúng cũng ngồi chơi đợi lệnh, nên nói về thời gian chúng làm việc, chắc đâu đó cũng chỉ tầm 1 ~ 2 tiếng thôi.
5. Thành quả


Hiện tại tôi đã hoàn thành xong trang web của mình, nó được deploy tại địa chỉ https://pit.thangtd.com . Tôi thấy cũng khá tiện dụng và dễ dùng. Các bạn cũng có thể vào dùng thử để xem năm tới, mức đóng thuế của mình sẽ thay đổi như thế nào nhé 
Chú ý: Công cụ này chỉ mang tính chất tham khảo, và áp dụng một công thức lý tưởng. Kết quả tính toán có thể khác biệt với thực tế do nhiều yếu tố như: chính sách công ty, khu vực đặc thù, các khoản giảm trừ bổ sung, v.v. Vui lòng tham khảo với bộ phận nhân sự hoặc kế toán của công ty bạn để có thông tin chính xác nhất.
Về Source code của dự án, cũng như toàn bộ log của quá trình làm việc của SpecKit, cũng được publish tại repo này trên GitHub: https://github.com/thangtd-0050/pit
Ngoài ra, tôi cũng có yêu cầu đứa bạn Copilot làm một bản báo cáo xem mấy đứa đã làm được những gì, thì đây là thành tích mà nó khoe:
- ✅ 100% AI-Generated Code: Toàn bộ source code được sinh ra bởi AI Agent
- ✅ TDD Methodology: Áp dụng nghiêm ngặt Test-Driven Development (RED → GREEN → REFACTOR)
- ✅ Production-Ready: Đã deploy và đang chạy production tại GitHub Pages
- ✅ High Quality: 82.67% test coverage, 0 TypeScript errors, 132 tests passing
Đoạn "100% AI-Generated Code" là nó nói thật đấy, tôi không hề code một dòng, một chữ nào đâu 
Ngoài ra dưới đây là một số thông tin khác về sản phẩm
Core Technologies
| Category | Technology | Version | Purpose |
|---|---|---|---|
| Language | TypeScript | 5.3.3 | Type-safe development với strict mode |
| Framework | React | 18.2.0 | UI library cho SPA |
| Build Tool | Vite | 5.0.10 | Fast build & HMR |
| State Management | Zustand | 4.4.7 | Lightweight global state |
Code Statistics
| Metric | Value | Details |
|---|---|---|
| Total Source Files | 47 files | All .ts and .tsx files in src/ |
| Total Test Files | 11 files | All .test.ts and .test.tsx files in tests/ |
| Total Lines of Code | 3,808 lines | Production source code |
| Total Test Code | 1,838 lines | Test code |
| Code-to-Test Ratio | 1:0.48 | Nearly 1 line of test per 2 lines of code |
| Test Cases | 132 tests | All passing ✅ |
| Test Coverage | 82.67% | Overall project coverage |
| Branch Coverage | 76.79% | Branch coverage |
| Function Coverage | 84.32% | Function coverage |
Coverage Breakdown by Module
| Module | Statements | Branch | Functions | Lines |
|---|---|---|---|---|
| src/App.tsx | 100% | 100% | 100% | 100% |
| src/components | 72.86% | 69.94% | 80.32% | 72.46% |
| src/hooks | 100% | 100% | 100% | 100% |
| src/lib (calculation logic) | ~100% | ~100% | ~100% | ~100% |
| src/services (analytics) | ~95% | ~90% | ~100% | ~95% |
| Overall | 82.67% | 76.79% | 84.32% | 82.63% |
Note: Calculation logic (thuế TNCN, bảo hiểm) đạt 100% coverage để đảm bảo tính chính xác tuyệt đối.
Cũng khá là ấn tượng đấy. Tuy nhiên có điểm tôi thấy đứa bạn này cũng khá hài hước, đó là khi tôi bắt nó làm báo cáo, nó còn mạnh dạn viết thêm cả phần "Lesson Learnt" vào nữa, không biết là ai đã đúc rút ra được mấy bài học này nữa, nhưng không phải là tôi rồi 
🎓 Lessons Learned
- TDD Methodology: Phát hiện bugs sớm, code design tốt hơn, confidence cao khi refactor
- AI Agent: Tăng tốc development 5-10x, consistent code style, full test coverage
- TypeScript Strict Mode: Catch errors at compile time, giảm runtime errors
- Zustand: Simple state management, dễ test, ít boilerplate hơn Redux
- Vite: Build nhanh, HMR instant, DX tuyệt vời
- shadcn/ui: Accessible by default, customizable, modern design
- Detailed Specs: AI Agent làm việc hiệu quả hơn với specs chi tiết
6. Tổng kết
Thực ra để bàn về thần công Spec-Driven Development, hay các cao thủ võ lâm như Copilot, Cursor, Codex, Claude Code ... thì có rất nhiều chuyện để nói, rất nhiều thứ để bàn, có khi vào kỳ Hoa Sơn Luận Kiếm cũng chưa đủ để thảo luận hết được. Trong bài viết này mình chỉ hy vọng là đã có thể chia sẻ với các bạn về câu chuyện từ một vấn đề rất nhỏ trong cuộc sống, giờ đây chúng ta đã có thể triệu hồi một đội ngũ những bằng hữu trên giàng hồ, đến trợ giúp. Chúc các bạn cũng có thể làm quen được với những người bạn tốt này, và hy vọng chúng có thể giúp đỡ cho các bạn nhiều trong công việc 
All rights reserved