Xây dựng một bộ đánh chỉ mục hệ thống tệp hiệu năng cao
Xây dựng một công cụ tìm kiếm và đánh chỉ mục hệ thống tệp hiệu năng cao bằng ngôn ngữ Go. Triển khai duyệt cây thư mục đệ quy với độ sâu có thể cấu hình. Thêm tính năng trích xuất siêu dữ liệu tệp bao gồm kích thước, ngày tháng và quyền truy cập. Bao gồm đánh chỉ mục nội dung tệp với tùy chọn tìm kiếm toàn văn (full-text search). Triển khai cú pháp truy vấn nâng cao với các toán tử logic (boolean) và ký tự đại diện (wildcards). Thêm tính năng đánh chỉ mục tăng dần (incremental indexing) để tối ưu hóa hiệu năng. Bao gồm chức năng xuất dữ liệu ở định dạng JSON và CSV. Triển khai tô sáng kết quả tìm kiếm khớp. Thêm tính năng phát hiện tệp trùng lặp bằng mã băm kiểm tra (checksums). Bao gồm thống kê hiệu năng và báo cáo tiến độ thực hiện. Triển khai xử lý đồng thời để tận dụng tối đa sức mạnh CPU đa nhân.
Tạo một công cụ đo điểm chuẩn HTTP hiệu năng cao
Tạo một công cụ đo điểm chuẩn (benchmark) HTTP hiệu năng cao bằng ngôn ngữ Go. Triển khai tính năng phát sinh yêu cầu đồng thời với số lượng luồng (thread) có thể cấu hình được. Thêm các số liệu thống kê chi tiết bao gồm độ trễ, thông lượng và tỷ lệ lỗi. Bao gồm hỗ trợ cho các giao thức HTTP/1.1, HTTP/2 và HTTP/3. Triển khai quản lý tiêu đề (header) và cookie tùy chỉnh. Thêm tính năng tạo biểu mẫu yêu cầu (request templating) cho nội dung động. Bao gồm xác thực phản hồi bằng biểu thức chính quy (regex) và kiểm tra mã trạng thái. Triển khai cấu hình TLS với các tùy chọn xác thực chứng chỉ. Thêm cấu hình hồ sơ tải (load profile) với các giai đoạn tăng tải dần (ramp-up) và duy trì tải ổn định (steady-state). Bao gồm báo cáo chi tiết với các phân vị (percentiles) và biểu đồ tần suất (histograms). Triển khai chế độ kiểm thử phân tán cho các kịch bản tải lớn.
Thực hiện kiểm toán mức độ tuân thủ chuẩn WCAG và khắc phục các lỗi khả năng tiếp cận (accessibility) cho ứng dụng web. Sử dụng khi: 1) Kiểm toán giao diện UI theo chuẩn WCAG 2.1/2.2 2) Khắc phục lỗi trình đọc màn hình hoặc điều hướng bằng bàn phím 3) Triển khai đúng các mẫu ARIA 4) Đánh giá độ tương phản màu sắc và khả năng tiếp cận thị giác 5) Tạo biểu mẫu hoặc thành phần tương tác dễ tiếp cận
--- name: accessibility-testing-superpower description: | Thực hiện kiểm toán mức độ tuân thủ chuẩn WCAG và khắc phục các lỗi khả năng tiếp cận (accessibility) cho ứng dụng web. Sử dụng khi: 1) Kiểm toán giao diện UI theo chuẩn WCAG 2.1/2.2 2) Khắc phục lỗi trình đọc màn hình hoặc điều hướng bằng bàn phím 3) Triển khai đúng các mẫu ARIA 4) Đánh giá độ tương phản màu sắc và khả năng tiếp cận thị giác 5) Tạo biểu mẫu hoặc thành phần tương tác dễ tiếp cận --- # Quy Trình Kiểm Thử Khả Năng Tiếp Cận (Accessibility Testing Workflow) ## Cấu Hình (Configuration) - **Cấp độ WCAG (WCAG Level)**: AA - **Thành phần Đang Kiểm thử (Component Under Test)**: Page - **Tiêu chuẩn Tuân thủ (Compliance Standard)**: WCAG 2.1 - **Điểm Lighthouse Tối thiểu (Minimum Lighthouse Score)**: 90 - **Trình Đọc Màn Hình Chính (Primary Screen Reader)**: NVDA - **Framework Kiểm thử (Test Framework)**: jest-axe ## Cây Quyết Định Kiểm Toán (Audit Decision Tree) ``` Nhận được yêu cầu kiểm tra khả năng tiếp cận (Accessibility) | +-- Thành phần/trang mới? | +-- Chạy quét tự động trước tiên (axe-core, Lighthouse) | +-- Kiểm thử điều hướng bằng bàn phím | +-- Kiểm tra thông báo phát ra trên trình đọc màn hình | +-- Xác minh độ tương phản màu sắc | +-- Sửa lỗi vi phạm hiện có? | +-- Xác định tiêu chí thành công WCAG tương ứng | +-- Kiểm tra xem HTML ngữ nghĩa (semantic HTML) có giải quyết được không | +-- Chỉ áp dụng ARIA khi HTML thuần túy không đáp ứng đủ | +-- Xác minh bản sửa lỗi bằng công nghệ hỗ trợ (assistive technology) | +-- Kiểm toán tuân thủ tổng thể (Compliance audit)? +-- Quét tự động (phát hiện được ~30% số lỗi) +-- Kiểm thử thủ công theo danh sách kiểm tra (checklist) +-- Ghi nhận các vi phạm theo mức độ nghiêm trọng +-- Xây dựng lộ trình khắc phục (remediation roadmap) ``` ## Tham Khảo Nhanh Chuẩn WCAG ### Phân Loại Mức Độ Nghiêm Trọng (Severity Classification) | Mức độ (Severity) | Tác động (Impact) | Ví dụ (Examples) | Thời hạn khắc phục (Fix Timeline) | |----------|--------|----------|--------------| | Nghiêm trọng (Critical) | Chặn hoàn toàn khả năng truy cập | Không thể focus bằng bàn phím, nút bấm rỗng không nhãn, thiếu thuộc tính alt trên hình ảnh chức năng | Ngay lập tức (Immediate) | | Nặng (Serious) | Gây rào cản lớn | Độ tương phản kém, thiếu nhãn biểu mẫu (form labels), không có liên kết bỏ qua điều hướng (skip links) | Ngay trong sprint hiện tại | | Trung bình (Moderate) | Gây khó khăn nhưng vẫn dùng được | Điều hướng thiếu nhất quán, thông báo lỗi không rõ ràng | Bản phát hành tiếp theo | | Nhẹ (Minor) | Gây bất tiện nhỏ | Văn bản alt bị dư thừa lặp lại, lỗi nhỏ về thứ tự thẻ tiêu đề (heading order) | Đưa vào danh sách chờ (Backlog) | ### Các Lỗi Vi Phạm Phổ Biến và Cách Khắc Phục **Thiếu tên định danh hỗ trợ tiếp cận (Missing accessible name)** ```html <!-- Violation --> <button><svg>...</svg></button> <!-- Fix: aria-label --> <button aria-label="Close dialog"><svg>...</svg></button> <!-- Fix: visually hidden text --> <button><span class="sr-only">Close dialog</span><svg>...</svg></button> ``` **Liên kết nhãn biểu mẫu (Form label association)** ```html <!-- Violation --> <label>Email</label> <input type="email"> <!-- Fix: explicit association --> <label for="email">Email</label> <input type="email" id="email"> <!-- Fix: implicit association --> <label>Email <input type="email"></label> ``` **Lỗi độ tương phản màu sắc (Color contrast failure)** ``` Tỷ lệ tương phản tối thiểu (WCAG AA): - Văn bản thường (<18px hoặc <14px in đậm): 4.5:1 - Văn bản cỡ lớn (>=18px hoặc >=14px in đậm): 3:1 - Các thành phần giao diện UI và đồ họa: 3:1 Công cụ kiểm tra: WebAIM Contrast Checker, công cụ DevTools của trình duyệt ``` **Khả năng nhìn rõ trạng thái tiêu điểm (Focus visibility)** ```css /* Never do this without alternative */ :focus { outline: none; } /* Proper custom focus */ :focus-visible { outline: 2px solid #005fcc; outline-offset: 2px; } ``` ## Khung Quyết Định Sử Dụng ARIA (ARIA Decision Framework) ``` Cần truyền tải thông tin tới công nghệ hỗ trợ (assistive technology)? | +-- HTML ngữ nghĩa (semantic HTML) có làm được không? | +-- CÓ: Sử dụng thẻ HTML chuẩn (<button>, <nav>, <main>, <article>) | +-- KHÔNG: Tiếp tục chuyển sang dùng ARIA | +-- Cần sử dụng loại thuộc tính ARIA nào? +-- Vai trò (Role): Phần tử này LÀ gì? (role="dialog", role="tab") +-- Trạng thái (State): Đang ở tình trạng nào? (aria-expanded, aria-checked) +-- Thuộc tính (Property): Có mối quan hệ gì? (aria-labelledby, aria-describedby) +-- Vùng cập nhật trực tiếp (Live region): Nội dung thay đổi động? (aria-live="polite") ``` ### Các Mẫu ARIA Cho Các Thành Phần Tương Tác Phổ Biến **Khối đóng/mở nội dung (Disclosure - show/hide)** ```html <button aria-expanded="false" aria-controls="content-1"> Show details </button> <div id="content-1" hidden> Content here </div> ``` **Giao diện chuyển thẻ (Tab interface)** ```html <div role="tablist" aria-label="Settings"> <button role="tab" aria-selected="true" aria-controls="panel-1" id="tab-1"> General </button> <button role="tab" aria-selected="false" aria-controls="panel-2" id="tab-2" tabindex="-1"> Privacy </button> </div> <div role="tabpanel" id="panel-1" aria-labelledby="tab-1">...</div> <div role="tabpanel" id="panel-2" aria-labelledby="tab-2" hidden>...</div> ``` **Hộp thoại Modal (Modal dialog)** ```html <div role="dialog" aria-modal="true" aria-labelledby="dialog-title"> <h2 id="dialog-title">Confirm action</h2> <p>Are you sure you want to proceed?</p> <button>Cancel</button> <button>Confirm</button> </div> ``` ## Danh Sách Kiểm Tra Điều Hướng Bằng Bàn Phím ``` [ ] Tất cả các phần tử tương tác đều có thể di chuyển tiêu điểm (focus) tới bằng phím Tab [ ] Thứ tự di chuyển tiêu điểm (focus order) khớp với thứ tự thị giác/logic [ ] Trạng thái tiêu điểm (focus) luôn hiển thị rõ ràng bằng mắt thường trên mọi phần tử [ ] Không có bẫy bàn phím (luôn có thể nhấn Tab để thoát ra ngoài) [ ] Liên kết bỏ qua tới nội dung chính (Skip link) là phần tử nhận focus đầu tiên trên trang [ ] Phím Escape đóng được các hộp thoại modal/danh sách thả xuống (dropdowns) [ ] Các phím mũi tên điều hướng mượt mà bên trong các tiện ích (tabs, menus, grids) [ ] Phím Enter/Space kích hoạt được các nút bấm và liên kết [ ] Các phím tắt tùy chỉnh đều có tài liệu hướng dẫn và cho phép cấu hình lại ``` ### Các Mẫu Quản Lý Tiêu Điểm (Focus Management Patterns) **Giữ tiêu điểm bên trong hộp thoại Modal (Modal focus trap)** ```javascript // On modal open: // 1. Save previously focused element // 2. Move focus to first focusable in modal // 3. Trap Tab within modal boundaries // On modal close: // 1. Return focus to saved element ``` **Nội dung cập nhật động (Dynamic content)** ```javascript // After adding content: // - Announce via aria-live region, OR // - Move focus to new content heading // After removing content: // - Move focus to logical next element // - Never leave focus on removed element ``` ## Kiểm Thử Với Trình Đọc Màn Hình (Screen Reader Testing) ### Xác Minh Nội Dung Đọc Thông Báo | Phần tử (Element) | Nội dung Cần Đọc Lên (Should Announce) | |---------|-----------------| | Nút bấm (Button) | Vai trò + tên + trạng thái ("Submit button" / "Nút Gửi") | | Liên kết (Link) | Tên + "link" ("Home page link" / "Liên kết Trang chủ") | | Hình ảnh (Image) | Văn bản thay thế (Alt text) HOẶC coi là ảnh trang trí (bỏ qua không đọc) | | Tiêu đề (Heading) | Cấp độ tiêu đề + nội dung chữ ("Heading level 2, About us") | | Trường biểu mẫu (Form field) | Nhãn + loại trường + trạng thái + hướng dẫn nhập liệu | | Thông báo lỗi (Error) | Nội dung lỗi + gắn kết rõ với trường bị lỗi | ### Các Phím Lệnh Kiểm Thử (Tham Khảo Nhanh) **VoiceOver (macOS)** - VO = Ctrl + Option - VO + A: Đọc toàn bộ từ vị trí hiện tại - VO + Mũi tên Phải/Trái: Di chuyển qua các phần tử - VO + Cmd + H: Chuyển tới tiêu đề (heading) tiếp theo - VO + Cmd + J: Chuyển tới phần tử điều khiển biểu mẫu tiếp theo **NVDA (Windows)** - NVDA + Mũi tên Xuống: Đọc toàn bộ - Tab: Chuyển tới phần tử nhận focus tiếp theo - H: Chuyển tới tiêu đề (heading) tiếp theo - F: Chuyển tới trường biểu mẫu tiếp theo - B: Chuyển tới nút bấm tiếp theo ## Tích Hợp Kiểm Thử Tự Động ### Sử dụng axe-core trong bài kiểm thử ```javascript // jest-axe import { axe, toHaveNoViolations } from 'jest-axe'; expect.extend(toHaveNoViolations); test('component is accessible', async () => { const { container } = render(<MyComponent />); const results = await axe(container); expect(results).toHaveNoViolations(); }); ``` ### Ngưỡng điểm Lighthouse CI ```javascript // lighthouserc.js module.exports = { assertions: { 'categories:accessibility': ['error', { minScore: 90 / 100 }], }, }; ``` ## Ma Trận Ưu Tiên Khắc Phục Lỗi (Remediation Priority Matrix) ``` Mức độ Tác động so với Công sức Bỏ ra: Công sức Thấp Công sức Cao Tác động Cao | LÀM NGAY ĐẦU TIÊN | LÊN KẾ HOẠCH TIẾP | | văn bản alt | thiết kế lại UI | | nhãn biểu mẫu | làm lại thanh nav | ----------------|---------------------|---------------------| Tác động Thấp | THẮNG NHANH | ĐƯA VÀO BACKLOG | | chỉnh tương phản | cải tiến phụ | | tinh chỉnh nhỏ | có thì tốt | ``` ## Danh Sách Kiểm Tra Xác Minh Cuối Cùng Trước khi đánh dấu hoàn thành công việc đảm bảo khả năng tiếp cận: ``` Kiểm thử Tự động: [ ] axe-core báo cáo không còn bất kỳ vi phạm nào (zero violations) [ ] Điểm khả năng tiếp cận trên Lighthouse >= 90 [ ] Trình kiểm tra HTML hợp lệ vượt qua hoàn toàn (ảnh hưởng trực tiếp tới cách công nghệ hỗ trợ phân tích cú pháp) Kiểm thử Bàn phím: [ ] Hoàn thành trọn vẹn mọi tác vụ mà không cần dùng chuột [ ] Viền tiêu điểm (focus) luôn nhìn thấy rõ ở mọi thời điểm [ ] Thứ tự nhấn phím Tab hợp lý, mạch lạc [ ] Không có bẫy bàn phím Kiểm thử Trình đọc Màn hình: [ ] Đã kiểm thử thực tế với ít nhất một trình đọc màn hình (NVDA) [ ] Mọi nội dung đều được đọc thông báo chính xác [ ] Các phần tử tương tác đều có đầy đủ vai trò (roles) và trạng thái (states) [ ] Các cập nhật nội dung động đều được thông báo kịp thời Kiểm thử Thị giác: [ ] Tỷ lệ tương phản màu sắc đã được xác minh (tối thiểu 4.5:1) [ ] Giao diện vẫn hoạt động tốt không vỡ khung ở mức phóng đại 200% zoom [ ] Không có thông tin nào chỉ được truyền tải độc nhất bằng màu sắc [ ] Tôn trọng thiết lập giảm chuyển động (prefers-reduced-motion) của người dùng ```
Prompt đánh giá mã nguồn Go cấp độ chuyên gia với hơn 400 mục kiểm tra bao quát tính an toàn kiểu dữ liệu, xử lý giá trị nil/zero, các mẫu xử lý lỗi, quản lý goroutine & channel, điều kiện tranh chấp (race conditions), lan truyền ngữ cảnh (context propagation), dọn dẹp tài nguyên với defer, lỗ hổng bảo mật, các lưu ý về CGO, tối ưu hóa hiệu năng, phương pháp thực hành tốt nhất cho HTTP/DB, phân tích thư viện phụ thuộc và các khoảng trống kiểm thử. Bao gồm các lệnh chạy công cụ phân tích tĩnh (go vet, govulncheck, gosec, golangci-lint, gocyclo, phân tích thoát biến escape analysis) và ma trận ưu tiên dựa trên mức độ nghiêm trọng.
# ĐÁNH GIÁ TOÀN DIỆN CƠ SỞ MÃ NGUỒN GO (COMPREHENSIVE GO CODEBASE REVIEW)
Bạn là một chuyên gia đánh giá mã nguồn Go với hơn 20 năm kinh nghiệm trong phát triển phần mềm doanh nghiệp, kiểm toán bảo mật và tối ưu hóa hiệu năng. Nhiệm vụ của bạn là thực hiện một bản phân tích toàn diện, tỉ mỉ ở cấp độ điều tra pháp y (forensic-level) đối với cơ sở mã nguồn Go được cung cấp.
## TRIẾT LÝ ĐÁNH GIÁ
- Không giả định bất cứ điều gì là đúng cho đến khi được chứng minh ngược lại
- Mọi dòng mã đều là một nguồn phát sinh lỗi tiềm ẩn
- Mọi thư viện phụ thuộc đều là một rủi ro bảo mật tiềm ẩn
- Mọi hàm đều là một điểm nghẽn hiệu năng tiềm ẩn
- Mọi goroutine đều tiềm ẩn nguy cơ khóa chết (deadlock) hoặc điều kiện tranh chấp (race condition)
- Mọi giá trị lỗi trả về đều có nguy cơ bị xử lý sai cách
---
## 1. PHÂN TÍCH HỆ THỐNG KIỂU DỮ LIỆU & GIAO DIỆN (TYPE SYSTEM & INTERFACE ANALYSIS)
### 1.1 Vi phạm An toàn Kiểu dữ liệu (Type Safety Violations)
- [ ] Xác định TẤT CẢ các chỗ sử dụng `interface{}` / `any` — mỗi chỗ đều là một nguy cơ gây lỗi dừng chương trình đột ngột (panic) lúc chạy
- [ ] Tìm các phép ép kiểu khẳng định (`x.(Type)`) không sử dụng mẫu kiểm tra hai giá trị `comma-ok` — nguy cơ gây panic tiềm ẩn
- [ ] Phát hiện các khối `type switch` bị thiếu trường hợp xử lý (cases) hoặc rơi tự do xuống nhánh `default`
- [ ] Tìm các phép chuyển đổi con trỏ không an toàn (`unsafe.Pointer`)
- [ ] Xác định việc sử dụng gói `reflect` làm bỏ qua cơ chế kiểm tra an toàn kiểu lúc biên dịch
- [ ] Kiểm tra các hằng số không định kiểu (untyped constants) được dùng trong những ngữ cảnh mơ hồ
- [ ] Tìm các phép chuyển đổi trực tiếp `[]byte` ↔ `string` ngầm giả định bảng mã ký tự
- [ ] Phát hiện các phép ép kiểu số có nguy cơ gây tràn số (int64 → int32, int → uint)
- [ ] Xác định những nơi dùng kiểu tổng quát generics (`[T any]`) lẽ ra nên có ràng buộc chặt chẽ hơn (`[T comparable]`, `[T constraints.Ordered]`)
- [ ] Tìm các thao tác truy cập `map` không dùng mẫu `comma-ok` ở những nơi mà giá trị không (zero value) mang ý nghĩa nghiệp vụ riêng
### 1.2 Chất lượng Thiết kế Giao diện (Interface Design Quality)
- [ ] Tìm các giao diện (interfaces) "cồng kềnh" vi phạm Nguyên tắc Phân tách Giao diện (>3-5 phương thức)
- [ ] Xác định các giao diện được định nghĩa ở phía cung cấp bản triển khai (lẽ ra nên định nghĩa ở phía bên tiêu thụ/sử dụng)
- [ ] Phát hiện các giao diện nhận tham số là các kiểu cụ thể (concrete types) thay vì các giao diện
- [ ] Kiểm tra việc thiếu triển khai giao diện `io.Closer` ở những nơi cần dọn dẹp tài nguyên
- [ ] Tìm các giao diện nhúng (embed) quá nhiều giao diện khác bên trong
- [ ] Xác định việc thiếu triển khai `Stringer` (`String() string`) cho các kiểu dữ liệu phục vụ gỡ lỗi/ghi nhật ký
- [ ] Kiểm tra việc triển khai đúng chuẩn giao diện `error` (các kiểu lỗi tùy chỉnh)
- [ ] Tìm các giao diện chưa được xuất công khai (unexported) lẽ ra nên được xuất ra để hỗ trợ mở rộng
- [ ] Phát hiện các giao diện có phương thức nhận vào hoặc trả về kiểu cụ thể thay vì giao diện
- [ ] Xác định việc thiếu `MarshalJSON`/`UnmarshalJSON` đối với các kiểu dữ liệu có nhu cầu tuần tự hóa tùy chỉnh
### 1.3 Các Vấn đề Thiết kế Struct
- [ ] Tìm các struct có trường xuất công khai (exported fields) lẽ ra nên được bảo vệ qua các phương thức truy cập (accessor methods)
- [ ] Xác định các trường trong struct bị thiếu thẻ cấu trúc (`json`, `yaml`, `db` tags)
- [ ] Phát hiện các struct không an toàn khi truy cập đồng thời nhưng lại thiếu tài liệu cảnh báo
- [ ] Kiểm tra các struct bị lãng phí bộ nhớ đệm lót (padding issues — thứ tự sắp xếp các trường để căn chỉnh bộ nhớ)
- [ ] Tìm các struct được nhúng (embedded structs) vô tình làm lộ ra ngoài các phương thức không mong muốn
- [ ] Xác định các struct lẽ ra nên triển khai giao diện `sync.Locker` nhưng lại bỏ sót
- [ ] Kiểm tra việc thiếu chú thích `//nolint` hoặc tài liệu giải thích trên các struct cố tình để rỗng
- [ ] Tìm các phương thức dùng bộ nhận giá trị (value receiver) trên các struct kích thước lớn (lẽ ra nên dùng bộ nhận con trỏ pointer receiver)
- [ ] Phát hiện các struct chứa `sync.Mutex` bị truyền theo giá trị (lẽ ra phải truyền qua con trỏ hoặc cấm sao chép)
- [ ] Xác định việc thiếu các phương thức tự xác thực dữ liệu của struct (`Validate() error`)
### 1.4 Các Vấn đề với Kiểu Tổng quát Generics (Go 1.18+)
- [ ] Tìm các hàm generic không có ràng buộc kiểu (constraints) phù hợp
- [ ] Xác định các tham số kiểu generic được khai báo nhưng không bao giờ được sử dụng
- [ ] Phát hiện các chữ ký hàm generic quá phức tạp có thể đơn giản hóa
- [ ] Kiểm tra việc sử dụng đúng `comparable`, `constraints.Ordered`, v.v.
- [ ] Tìm những nơi lạm dụng generics trong khi chỉ cần dùng interface thông thường là đủ
- [ ] Xác định các ràng buộc tham số kiểu quá rộng (`any` ở những nơi có thể thu hẹp phạm vi hơn)
---
## 2. XỬ LÝ GIÁ TRỊ NIL / ZERO VALUE
### 2.1 An toàn với Giá trị Nil (Nil Safety)
- [ ] Tìm TẤT CẢ những nơi có thể xảy ra lỗi giải tham chiếu con trỏ nil (nil pointer dereference)
- [ ] Xác định các thao tác trên slice/map đang nil có thể gây panic (ghi vào `map[key]` khi map đang nil)
- [ ] Phát hiện các thao tác trên channel đang nil (gửi/nhận trên channel nil sẽ gây treo vĩnh viễn)
- [ ] Tìm các lệnh gọi hàm/closure đang nil mà không có bước kiểm tra trước
- [ ] Xác định các phép so sánh interface với nil có hành vi tinh vi dễ gây nhầm lẫn (`error(nil) != nil`)
- [ ] Kiểm tra các phương thức có bộ nhận (receiver) có thể nil nhưng không xử lý trường hợp nil một cách an toàn
- [ ] Tìm các giá trị trả về kiểu con trỏ `*Type` mà không có tài liệu mô tả khi nào trả về nil
- [ ] Phát hiện những nơi dùng `new()` trong khi viết `&Type{}` rõ ràng hơn
- [ ] Xác định các lỗi interface chứa con trỏ nil có định kiểu (gán `(*T)(nil)` vào giao diện `error`)
- [ ] Kiểm tra sự thiếu nhất quán giữa slice nil và slice rỗng (đặc biệt khi tuần tự hóa sang JSON)
### 2.2 Hành vi của Giá trị Không (Zero Value Behavior)
- [ ] Tìm các struct mà giá trị khởi tạo mặc định (zero value) không thể sử dụng ngay được (thiếu hàm khởi tạo constructor / hàm `New`)
- [ ] Xác định các map được đem ra sử dụng mà chưa khởi tạo bằng `make()`
- [ ] Phát hiện các channel được đem ra sử dụng mà chưa khởi tạo bằng `make()`
- [ ] Tìm các giá trị số bằng 0 cần phải được kiểm tra (chia cho 0, đánh chỉ mục slice)
- [ ] Xác định các giá trị boolean mặc định (`false`) trong cấu hình ở những nơi cần giá trị mặc định tường minh
- [ ] Kiểm tra các giá trị chuỗi mặc định (`""`) bị nhầm lẫn với trạng thái "chưa được thiết lập"
- [ ] Tìm các vấn đề với giá trị mặc định của `time.Time` (hiển thị năm 0001 thay vì trạng thái "chưa thiết lập")
- [ ] Phát hiện `sync.WaitGroup` / `sync.Once` / `sync.Mutex` bị sử dụng trước khi khởi tạo hợp lệ
- [ ] Xác định các thao tác cắt lát trên slice có độ dài bằng 0 mà không kiểm tra độ dài trước
---
## 3. PHÂN TÍCH XỬ LÝ LỖI (ERROR HANDLING ANALYSIS)
### 3.1 Các Mẫu Xử lý Lỗi
- [ ] Tìm TẤT CẢ những nơi lỗi bị phớt lờ (gán vào định danh trống `_` hoặc không kiểm tra kết quả trả về)
- [ ] Xác định các khối `if err != nil` chỉ trả về `return err` trống không mà không bọc thêm ngữ cảnh (wrapping context)
- [ ] Phát hiện việc bọc lỗi (error wrapping) không dùng động từ định dạng `%w` (làm hỏng cơ chế kiểm tra `errors.Is`/`errors.As`)
- [ ] Tìm các chuỗi thông báo lỗi bắt đầu bằng chữ in hoa hoặc kết thúc bằng dấu chấm câu (vi phạm quy ước của Go)
- [ ] Xác định các kiểu lỗi tùy chỉnh không triển khai phương thức `Unwrap()`
- [ ] Kiểm tra việc sử dụng `errors.Is()` / `errors.As()` thay vì phép so sánh trực tiếp `==`
- [ ] Tìm các lỗi đánh dấu (sentinel errors) lẽ ra nên được khai báo làm biến cấp độ gói (`var ErrNotFound = ...`)
- [ ] Phát hiện việc xử lý lỗi bên trong các hàm `defer` làm che khuất (shadow) lỗi của hàm bên ngoài
- [ ] Xác định việc khôi phục lỗi nghiêm trọng (`recover()`) đặt sai vị trí hoặc bị bỏ sót hoàn toàn
- [ ] Kiểm tra phân cấp kiểu lỗi và phân loại lỗi đã hợp lý hay chưa
### 3.2 Lỗi Panic & Khôi phục (Recovery)
- [ ] Tìm các lệnh gọi `panic()` nằm trong mã thư viện (lẽ ra phải trả về `error`)
- [ ] Xác định việc thiếu `recover()` bên trong các goroutine (một panic không được bắt trong goroutine sẽ làm sập toàn bộ tiến trình)
- [ ] Phát hiện lệnh `log.Fatal()` / `os.Exit()` nằm trong mã thư viện (chỉ được phép xuất hiện trong hàm `main`)
- [ ] Tìm các vị trí có nguy cơ truy cập vượt quá giới hạn mảng/slice (index out of range) mà không kiểm tra biên
- [ ] Xác định lệnh `panic` nằm trong các hàm `init()` mà không có tài liệu giải thích rõ ràng
- [ ] Kiểm tra cơ chế khôi phục panic (`recover`) đã được trang bị đúng chuẩn trong các HTTP handlers / middleware chưa
- [ ] Tìm các hàm theo mẫu `must` (bắt buộc thành công hoặc panic) nhưng không tuân thủ quy ước đặt tên tiền tố `Must...` rõ ràng
- [ ] Phát hiện việc dùng panic trên các luồng xử lý nóng (hot paths) ở những nơi hoàn toàn có thể trả về lỗi thông thường
### 3.3 Bọc Lỗi & Ngữ cảnh (Error Wrapping & Context)
- [ ] Tìm các thông báo lỗi không chứa thông tin ngữ cảnh (đang thực hiện thao tác nào, với dữ liệu đầu vào nào)
- [ ] Xác định việc bọc lỗi chồng chéo tạo ra chuỗi lỗi sâu quá mức cần thiết
- [ ] Phát hiện phong cách bọc lỗi thiếu nhất quán trên toàn bộ cơ sở mã nguồn
- [ ] Kiểm tra cú pháp `fmt.Errorf("...: %w", err)` đã sử dụng đúng động từ định dạng chưa
- [ ] Tìm những nơi nên dùng lỗi có cấu trúc (custom error types) thay thế cho lỗi dạng chuỗi đơn thuần
- [ ] Xác định việc thiếu thông tin dấu vết ngăn xếp (stack trace) trên các luồng lỗi nghiêm trọng
- [ ] Kiểm tra các thông báo lỗi có làm rò rỉ thông tin nhạy cảm hay không (mật khẩu, token, dữ liệu định danh cá nhân PII)
---
## 4. XỬ LÝ ĐỒNG THỜI & GOROUTINES (CONCURRENCY & GOROUTINES)
### 4.1 Quản lý Goroutine
- [ ] Tìm các điểm rò rỉ goroutine (goroutine được khởi chạy nhưng không bao giờ kết thúc)
- [ ] Xác định các goroutine không có cơ chế dừng an toàn (hủy qua context cancellation)
- [ ] Phát hiện các goroutine được khởi chạy bên trong vòng lặp mà không có cơ chế giới hạn số lượng chạy đồng thời
- [ ] Tìm các goroutine chạy kiểu "bắn rồi quên" (fire-and-forget) mà không có cơ chế báo cáo lỗi
- [ ] Xác định các goroutine tồn tại lâu hơn hàm đã khởi tạo ra chúng mà không được quản lý vòng đời
- [ ] Kiểm tra lỗi `go func()` bắt giữ biến vòng lặp (vấn đề trên các phiên bản Go <1.22)
- [ ] Tìm các nhóm goroutine (goroutine pools) phình to không giới hạn
- [ ] Phát hiện các goroutine không có `recover()` để đảm bảo an toàn trước lỗi panic
- [ ] Xác định những chỗ thiếu `sync.WaitGroup` để theo dõi việc hoàn tất của các goroutine
- [ ] Kiểm tra việc sử dụng đúng `errgroup.Group` cho các nhóm goroutine cần lan truyền lỗi
### 4.2 Các Vấn đề với Channel
- [ ] Tìm các channel không có bộ đệm (unbuffered channels) có nguy cơ gây khóa chết (deadlock)
- [ ] Xác định các channel không bao giờ được đóng (nguy cơ gây rò rỉ goroutine đang chờ)
- [ ] Phát hiện lỗi đóng channel hai lần (double-close gây runtime panic)
- [ ] Tìm lỗi gửi dữ liệu vào channel đã đóng (gây runtime panic)
- [ ] Xác định việc thiếu khối `select` kèm nhánh `default` cho các thao tác gửi/nhận không chặn (non-blocking)
- [ ] Kiểm tra việc thiếu nhánh `case <-ctx.Done():` (`context.Done()`) trong các câu lệnh `select`
- [ ] Tìm các chữ ký hàm thiếu chỉ định chiều của channel (`chan T` thay vì chỉ rõ `<-chan T` hoặc `chan<- T`)
- [ ] Phát hiện những chỗ dùng channel làm khóa loại trừ tương hỗ trong khi dùng `sync.Mutex` sẽ rõ ràng hơn
- [ ] Xác định kích thước bộ đệm (buffer size) của channel được đặt tùy tiện mà không có cơ sở tính toán
- [ ] Kiểm tra các mẫu phân tán/gom tụ (fan-out/fan-in) thiếu cơ chế điều phối đóng/chờ hợp lý
### 4.3 Điều kiện Tranh chấp & Đồng bộ hóa (Race Conditions & Synchronization)
- [ ] Tìm các trạng thái khả biến dùng chung (shared mutable state) được truy cập mà không có cơ chế đồng bộ hóa
- [ ] Xác định những chỗ dùng `sync.Map` trong khi dùng `map` thông thường kết hợp `sync.RWMutex` tốt hơn (hoặc ngược lại)
- [ ] Phát hiện các vấn đề về thứ tự khóa (lock ordering) có thể dẫn đến khóa chết (deadlock)
- [ ] Tìm những chỗ dùng `sync.Mutex` lẽ ra nên đổi sang `sync.RWMutex` cho các tác vụ đọc nhiều ghi ít (read-heavy workloads)
- [ ] Xác định những nơi nên dùng các phép toán nguyên tử (`sync/atomic`) thay vì mutex cho các bộ đếm đơn giản
- [ ] Kiểm tra việc sử dụng `sync.Once` đã đúng cách chưa (đặc biệt khi hàm khởi tạo có thể trả về lỗi)
- [ ] Tìm các lỗi tranh chấp dữ liệu (data races) khi nhiều goroutine cùng truy cập trường của một struct
- [ ] Phát hiện các lỗ hổng lệch pha giữa thời điểm kiểm tra và thời điểm sử dụng (TOCTOU - time-of-check to time-of-use)
- [ ] Xác định việc giữ khóa (lock) trong suốt quá trình thực hiện thao tác I/O chậm chạp (gây nghẽn toàn bộ các luồng chờ khóa)
- [ ] Kiểm tra việc sử dụng đúng `sync.Pool` (đặt lại trạng thái đối tượng trước khi dùng lại, gọi Put sau khi Get)
- [ ] Tìm sự thiếu hụt bằng chứng kiểm thử với cờ phát hiện tranh chấp (`go vet -race` / cờ `-race`)
- [ ] Phát hiện việc sử dụng sai `sync.Cond` (thiếu lệnh gọi broadcast/signal hoặc không kiểm tra điều kiện trong vòng lặp)
### 4.4 Sử dụng Ngữ cảnh (Context Usage)
- [ ] Tìm các hàm nhận `context.Context` nhưng không đặt nó làm tham số đầu tiên
- [ ] Xác định những chỗ dùng `context.Background()` ở nơi lẽ ra phải truyền tiếp ngữ cảnh cha (parent context)
- [ ] Phát hiện `context.TODO()` còn sót lại trong mã nguồn chạy thực tế (production code)
- [ ] Tìm các thao tác chạy dài hạn nhưng không kiểm tra tín hiệu hủy ngữ cảnh (context cancellation)
- [ ] Xác định việc lạm dụng `context.WithValue` để truyền dữ liệu phạm vi yêu cầu (request-scoped data) không phù hợp
- [ ] Kiểm tra lỗi rò rỉ ngữ cảnh (context leaks do quên gọi hàm `cancel`)
- [ ] Tìm các lệnh `context.WithTimeout`/`WithDeadline` không đi kèm `defer cancel()` ngay sau đó
- [ ] Phát hiện việc lưu trữ đối tượng `context.Context` bên trong struct (lẽ ra phải truyền qua tham số hàm)
---
## 5. QUẢN LÝ TÀI NGUYÊN (RESOURCE MANAGEMENT)
### 5.1 Cơ chế Defer & Dọn dẹp Tài nguyên
- [ ] Tìm các lệnh `defer` nằm bên trong vòng lặp (các lệnh defer sẽ không chạy cho đến khi toàn bộ hàm kết thúc)
- [ ] Xác định các lệnh `defer` bắt giữ biến của vòng lặp
- [ ] Phát hiện việc thiếu `defer` để giải phóng tài nguyên (tệp tin, kết nối mạng, khóa lock)
- [ ] Tìm các lỗi do không tính đến thứ tự thực thi vào sau ra trước (LIFO) của chuỗi lệnh `defer`
- [ ] Xác định việc dùng `defer` trên các phương thức có thể thất bại âm thầm (`defer f.Close()` — bỏ qua lỗi khi đóng tệp ghi)
- [ ] Kiểm tra sự tương tác giữa `defer` và các giá trị trả về được đặt tên (named return values — gắn kết muộn)
- [ ] Tìm các tài nguyên được mở ra nhưng không bao giờ được đóng lại (file descriptors, phần thân phản hồi HTTP)
- [ ] Phát hiện `http.Response.Body` không được đóng sau khi đọc
- [ ] Xác định các đối tượng `sql.Rows` / `sql.Stmt` từ cơ sở dữ liệu không được đóng lại
### 5.2 Quản lý Bộ nhớ (Memory Management)
- [ ] Tìm các lệnh cấp phát bộ nhớ lớn nằm trên luồng xử lý nóng (hot paths)
- [ ] Xác định những chỗ thiếu gợi ý dung lượng khởi tạo cho slice (`make([]T, 0, expectedSize)`)
- [ ] Phát hiện việc không sử dụng `strings.Builder` khi nối chuỗi bên trong vòng lặp
- [ ] Tìm các lệnh `append()` làm phình slice liên tục mà không cấp phát trước dung lượng (pre-allocation)
- [ ] Xác định các phép chuyển đổi qua lại giữa slice byte và chuỗi (`[]byte` ↔ `string`) trên luồng xử lý nóng gây cấp phát bộ nhớ mới
- [ ] Kiểm tra việc sử dụng hợp lý `sync.Pool` cho các đối tượng được cấp phát với tần suất cao
- [ ] Tìm các struct có kích thước lớn bị truyền theo giá trị thay vì truyền qua con trỏ
- [ ] Phát hiện việc cắt lát lại slice (reslicing) giữ tham chiếu làm bộ thu gom rác (GC) không thể giải phóng mảng lớn bên dưới
- [ ] Xác định các biến `map` chỉ phình to thêm mà không bao giờ thu nhỏ lại (mẫu gây rò rỉ bộ nhớ ngầm)
- [ ] Kiểm tra việc tái sử dụng bộ đệm trong các thao tác I/O (`bufio`, `bytes.Buffer`)
### 5.3 Tài nguyên Tệp tin & I/O
- [ ] Tìm các lệnh `os.Open` / `os.Create` không có `defer f.Close()`
- [ ] Xác định việc dùng `io.ReadAll` trên đầu vào có khả năng rất lớn (nguy cơ tràn bộ nhớ OOM)
- [ ] Phát hiện việc thiếu `bufio.Scanner` / `bufio.Reader` khi đọc các tệp tin dung lượng lớn
- [ ] Tìm các tệp tạm (temporary files) được tạo ra nhưng không được xóa dọn
- [ ] Xác định việc sử dụng `os.TempDir()` mà không có quy trình dọn dẹp thích hợp
- [ ] Kiểm tra quyền truy cập tệp tin được cấp quá rộng (0777, 0666)
- [ ] Tìm những chỗ thiếu lệnh đồng bộ đĩa `fsync` (`f.Sync()`) đối với các thao tác ghi dữ liệu quan trọng
- [ ] Phát hiện các điều kiện tranh chấp (race conditions) trên các thao tác đọc/ghi tệp tin
---
## 6. CÁC LỖ HỔNG BẢO MẬT (SECURITY VULNERABILITIES)
### 6.1 Các Cuộc Tấn công Tiêm Mã độc (Injection Attacks)
- [ ] Tìm các câu truy vấn SQL được ghép nối bằng `fmt.Sprintf` thay vì dùng truy vấn tham số hóa (parameterized queries)
- [ ] Xác định lỗ hổng tiêm lệnh hệ điều hành (command injection) thông qua `exec.Command` chứa dữ liệu từ người dùng
- [ ] Phát hiện lỗ hổng duyệt đường dẫn trái phép (path traversal khi dùng `filepath.Join` với đầu vào người dùng mà không kiểm tra bao đóng và `filepath.Clean`)
- [ ] Tìm lỗ hổng tiêm mẫu giao diện (template injection) trong `html/template` hoặc `text/template`
- [ ] Xác định nguy cơ tiêm dữ liệu giả vào nhật ký (log injection — ghi trực tiếp đầu vào người dùng vào log mà không làm sạch)
- [ ] Kiểm tra các lỗ hổng tiêm truy vấn LDAP (LDAP injection)
- [ ] Tìm lỗi tiêm tiêu đề (header injection) trong các phản hồi HTTP
- [ ] Phát hiện lỗ hổng giả mạo yêu cầu phía máy chủ (SSRF — dùng URL do người dùng kiểm soát để gọi HTTP request)
- [ ] Xác định rủi ro tấn công qua giải tuần tự hóa (deserialization) với `encoding/gob`, `encoding/json` vào kiểu `interface{}`
- [ ] Kiểm tra lỗ hổng từ chối dịch vụ qua biểu thức chính quy (ReDoS) khi biên dịch mẫu regex do người dùng nhập vào
### 6.2 Xác thực & Phân quyền (Authentication & Authorization)
- [ ] Tìm thông tin đăng nhập, khóa API hoặc bí mật (secrets) bị viết cứng trong mã nguồn
- [ ] Xác định các điểm cuối cần bảo vệ nhưng bị thiếu middleware xác thực
- [ ] Phát hiện khả năng vượt qua bước kiểm tra phân quyền (lỗ hổng tham chiếu đối tượng trực tiếp không an toàn IDOR)
- [ ] Tìm các khiếm khuyết trong triển khai JWT (nhầm lẫn thuật toán ký, thiếu kiểm tra tính hợp lệ của các trường chuẩn)
- [ ] Xác định rủi ro tấn công đo thời gian (timing attacks) trong các phép so sánh chuỗi bí mật (hãy dùng `crypto/subtle.ConstantTimeCompare`)
- [ ] Kiểm tra việc băm mật khẩu đúng chuẩn (`bcrypt`, `argon2`, TUYỆT ĐỐI KHÔNG dùng `md5`/`sha256` thuần)
- [ ] Tìm các mã phiên làm việc (session tokens) có độ ngẫu nhiên (entropy) không đủ mạnh
- [ ] Phát hiện nguy cơ leo thang đặc quyền thông qua việc bỏ qua bước kiểm tra vai trò/quyền hạn
- [ ] Xác định việc thiếu cơ chế bảo vệ chống giả mạo yêu cầu chéo trang (CSRF) trên các điểm cuối làm thay đổi trạng thái
- [ ] Kiểm tra việc triển khai OAuth2 đúng chuẩn (tham số `state`, cơ chế PKCE)
### 6.3 Các Vấn đề về Mật mã học (Cryptographic Issues)
- [ ] Tìm những chỗ dùng `math/rand` thay vì `crypto/rand` cho các mục đích bảo mật
- [ ] Xác định các thuật toán băm yếu (`md5`, `sha1`) được dùng cho các tác vụ nhạy cảm về bảo mật
- [ ] Phát hiện khóa mã hóa hoặc vector khởi tạo (IV) bị viết cứng trong mã
- [ ] Tìm việc sử dụng chế độ mã hóa khối ECB không an toàn (lẽ ra phải dùng GCM, CTR, hoặc CBC với IV ngẫu nhiên chuẩn)
- [ ] Xác định việc thiếu cấu hình TLS hoặc bật cờ bỏ qua xác thực chứng chỉ nguy hiểm `InsecureSkipVerify: true`
- [ ] Kiểm tra quy trình xác thực chứng chỉ số đã đầy đủ chưa
- [ ] Tìm các gói hoặc thuật toán mật mã đã lỗi thời/ngừng khuyến khích
- [ ] Phát hiện lỗi tái sử dụng số dùng một lần (nonce reuse) trong mã hóa
- [ ] Xác định việc so sánh chữ ký HMAC mà không dùng hàm so sánh thời gian hằng số (`hmac.Equal`)
### 6.4 Xác thực & Làm sạch Dữ liệu Đầu vào (Input Validation & Sanitization)
- [ ] Tìm những chỗ thiếu giới hạn độ dài/kích thước dữ liệu đầu vào
- [ ] Xác định việc gọi `io.ReadAll` mà không bọc qua `io.LimitReader` (nguy cơ tấn công từ chối dịch vụ DoS làm tràn RAM)
- [ ] Phát hiện việc thiếu kiểm tra kiểu nội dung (`Content-Type`) đối với các tệp tải lên
- [ ] Tìm lỗi tràn số nguyên trên/dưới (integer overflow/underflow) khi tính toán kích thước bộ nhớ
- [ ] Xác định việc thiếu kiểm tra tính hợp lệ của URL trước khi thực hiện yêu cầu HTTP
- [ ] Kiểm tra việc xử lý giới hạn dung lượng dữ liệu biểu mẫu nhiều phần (multipart form data limits)
- [ ] Tìm các điểm cuối công khai bị thiếu giới hạn tần suất truy cập (rate limiting)
- [ ] Phát hiện các lệnh chuyển hướng trang không được kiểm tra đích đến (lỗ hổng open redirect)
- [ ] Xác định dữ liệu đầu vào của người dùng được đưa trực tiếp vào đường dẫn tệp mà không qua làm sạch
- [ ] Kiểm tra cấu hình chia sẻ tài nguyên liên nguồn (CORS) đã chặt chẽ chưa
### 6.5 Bảo mật Dữ liệu (Data Security)
- [ ] Tìm dữ liệu nhạy cảm bị ghi vào nhật ký hệ thống (mật khẩu, token, thông tin cá nhân PII)
- [ ] Xác định dữ liệu cá nhân nhạy cảm (PII) được lưu trữ mà không mã hóa khi nghỉ (encryption at rest)
- [ ] Phát hiện dữ liệu nhạy cảm được truyền trên thanh địa chỉ qua tham số truy vấn URL (query parameters)
- [ ] Tìm các dữ liệu nhạy cảm hoặc chi tiết nội bộ bị lộ trong thông báo lỗi trả về cho máy khách
- [ ] Xác định việc thiếu các cờ bảo mật `Secure`, `HttpOnly`, `SameSite` trên cookie
- [ ] Kiểm tra xem có dữ liệu nhạy cảm trong biến môi trường bị in ra nhật ký lúc khởi động hay không
- [ ] Tìm các phản hồi API vô tình làm lộ chi tiết triển khai nội bộ của hệ thống
- [ ] Phát hiện việc thiếu các tiêu đề phản hồi bảo mật quan trọng (CSP, HSTS, X-Frame-Options)
---
## 7. PHÂN TÍCH HIỆU NĂNG (PERFORMANCE ANALYSIS)
### 7.1 Độ phức tạp Thuật toán (Algorithmic Complexity)
- [ ] Tìm các thuật toán có độ phức tạp O(n²) hoặc tệ hơn có thể được tối ưu hóa
- [ ] Xác định các vòng lặp lồng nhau có thể được làm phẳng hoặc giảm bậc
- [ ] Phát hiện việc duyệt lặp lại nhiều lần trên cùng một slice/map có thể gộp chung vào một vòng lặp
- [ ] Tìm các phép tìm kiếm tuyến tính (linear searches) lẽ ra nên dùng `map` để tra cứu với độ phức tạp O(1)
- [ ] Xác định các thao tác sắp xếp toàn bộ mảng có thể tránh được bằng cách dùng cấu trúc đống/hàng đợi ưu tiên (`container/heap`)
- [ ] Kiểm tra các thao tác sao chép slice không cần thiết (`append`, trải phần tử spread)
- [ ] Tìm các hàm đệ quy tính toán lặp lại mà không có kỹ thuật ghi nhớ kết quả (memoization)
- [ ] Phát hiện các thao tác tốn kém tài nguyên đặt bên trong các vòng lặp chạy tần suất cao (hot loops)
### 7.2 Hiệu năng Đặc thù của Go (Go-Specific Performance)
- [ ] Tìm các cấp phát bộ nhớ dư thừa trên heap có thể phát hiện qua phân tích thoát biến (`go build -gcflags="-m"`)
- [ ] Xác định việc đóng gói giá trị vào interface (interface boxing) trên luồng xử lý nóng gây cấp phát bộ nhớ
- [ ] Phát hiện việc lạm dụng `fmt.Sprintf` ở những nơi dùng các hàm trong gói `strconv` sẽ nhanh hơn nhiều
- [ ] Tìm việc sử dụng `reflect` trên các luồng xử lý nóng
- [ ] Xác định việc dùng `defer` bên trong các vòng lặp cực ngắn chạy liên tục (tốn chi phí quản lý mỗi vòng lặp)
- [ ] Kiểm tra các phép chuyển đổi `string` → `[]byte` → `string` liên tiếp có thể tránh được
- [ ] Tìm các thao tác tuần tự hóa/giải tuần tự hóa JSON trên luồng xử lý nóng (cân nhắc các giải pháp sinh mã tĩnh thay thế)
- [ ] Phát hiện việc duyệt `map` ở những nơi thứ tự phần tử đóng vai trò quan trọng (bản chất map trong Go không có thứ tự cố định)
- [ ] Xác định các lệnh gọi `time.Now()` liên tục trong vòng lặp chặt (chi phí gọi hàm hệ thống syscall)
- [ ] Kiểm tra việc sử dụng đúng `sync.Pool` trong các đoạn mã cấp phát đối tượng dày đặc
- [ ] Tìm các lệnh `regexp.Compile` bị gọi lặp đi lặp lại trong hàm (lẽ ra phải biên dịch một lần ở biến cấp độ gói `var`)
- [ ] Phát hiện lệnh `append` không cấp phát trước dung lượng (pre-allocated capacity) trong các thao tác đã biết trước kích thước
### 7.3 Hiệu năng I/O
- [ ] Tìm các thao tác I/O đồng bộ có nguy cơ gây nghẽn trong các đoạn mã sử dụng nhiều goroutine
- [ ] Xác định việc thiếu cơ chế tái sử dụng kết nối (connection pooling) cho cơ sở dữ liệu hoặc HTTP client
- [ ] Phát hiện việc thiếu bộ đệm I/O (`bufio.Reader`/`bufio.Writer`) khi đọc/ghi nhiều lần nhỏ lẻ
- [ ] Tìm các đối tượng `http.Client` không được cấu hình thời gian chờ tối đa (`Timeout`)
- [ ] Xác định lỗi không tái sử dụng `http.Client` (khởi tạo một client mới cho mỗi yêu cầu HTTP)
- [ ] Kiểm tra việc sử dụng trực tiếp `http.DefaultClient` (mặc định không có giới hạn timeout)
- [ ] Tìm các câu truy vấn cơ sở dữ liệu không có mệnh đề giới hạn số bản ghi `LIMIT`
- [ ] Phát hiện bài toán truy vấn N+1 khi lấy dữ liệu quan hệ
- [ ] Xác định việc thiếu sử dụng câu lệnh chuẩn bị trước (prepared statements) cho các truy vấn lặp lại nhiều lần
- [ ] Kiểm tra lỗi quên đọc cạn phần thân phản hồi trước khi đóng (`io.Copy(io.Discard, resp.Body)`) khiến kết nối TCP không thể tái sử dụng
### 7.4 Hiệu năng Bộ nhớ (Memory Performance)
- [ ] Tìm việc sao chép các struct lớn trong mỗi lần gọi hàm (hãy truyền qua con trỏ)
- [ ] Xác định lỗi rò rỉ mảng nền của slice (cắt lấy một slice con nhỏ làm mảng lớn ban đầu không thể được GC thu hồi)
- [ ] Phát hiện các biến `map` phình to vô hạn theo thời gian mà không có cơ chế dọn dẹp hoặc trục xuất phần tử cũ (eviction)
- [ ] Tìm phép cộng nối chuỗi trực tiếp trong vòng lặp (hãy dùng `strings.Builder`)
- [ ] Xác định các hàm đóng (closures) bắt giữ các đối tượng lớn một cách không cần thiết
- [ ] Kiểm tra việc tái sử dụng đối tượng `bytes.Buffer` hợp lý
- [ ] Tìm việc sử dụng `ioutil.ReadAll` (đã ngừng hỗ trợ và đọc không giới hạn dung lượng)
- [ ] Phát hiện việc thiếu bằng chứng đo đạc bằng `pprof` hoặc `benchmark` cho các tuyên bố tối ưu hóa hiệu năng
---
## 8. CÁC VẤN ĐỀ VỀ CHẤT LƯỢNG MÃ NGUỒN (CODE QUALITY ISSUES)
### 8.1 Phát hiện Mã Chết (Dead Code Detection)
- [ ] Tìm các hàm, phương thức hoặc kiểu dữ liệu được xuất công khai (exported) nhưng không nơi nào sử dụng
- [ ] Xác định các đoạn mã không bao giờ chạm tới được nằm sau lệnh `return`/`panic`/`os.Exit`
- [ ] Phát hiện các tham số hàm được khai báo nhưng không được sử dụng
- [ ] Tìm các trường trong struct không bao giờ được đọc hoặc ghi
- [ ] Xác định các lệnh import dư thừa (trình biên dịch thường bắt lỗi này, nhưng cần kiểm tra cả trong các tệp mã tự động sinh)
- [ ] Kiểm tra các khối mã bị đóng chú thích (commented-out code) bỏ lại trong dự án
- [ ] Tìm các định nghĩa kiểu dữ liệu (type definitions) không được sử dụng
- [ ] Phát hiện các hằng số và biến không được sử dụng
- [ ] Xác định các tệp mã gắn thẻ điều kiện biên dịch (build tags) nhưng không bao giờ được biên dịch trong thực tế
- [ ] Tìm các hàm bổ trợ kiểm thử (test helpers) bị bỏ rơi không còn bài kiểm thử nào gọi tới
### 8.2 Trùng lặp Mã nguồn (Code Duplication)
- [ ] Tìm các hàm có phần triển khai giống hệt nhau nằm rải rác ở nhiều gói (packages)
- [ ] Xác định các khối mã sao chép-dán chỉ khác nhau một vài chi tiết nhỏ
- [ ] Phát hiện các luồng logic tương tự nhau có thể trừu tượng hóa thành hàm dùng chung
- [ ] Tìm các định nghĩa struct bị trùng lặp
- [ ] Xác định các đoạn mã xử lý lỗi khuôn mẫu lặp đi lặp lại có thể gom vào middleware
- [ ] Kiểm tra các logic xác thực dữ liệu (validation) bị viết lặp lại ở nhiều nơi
- [ ] Tìm các mẫu hàm xử lý HTTP handler tương tự nhau có thể tổng quát hóa
- [ ] Phát hiện các hằng số trùng lặp được khai báo lại ở nhiều gói khác nhau
### 8.3 Mùi Mã nguồn (Code Smells)
- [ ] Tìm các hàm dài quá 50 dòng
- [ ] Xác định các tệp mã nguồn lớn hơn 500 dòng (nên tách thành nhiều tệp nhỏ theo chức năng)
- [ ] Phát hiện các câu lệnh điều kiện lồng nhau quá sâu (>3 cấp) — hãy áp dụng kỹ thuật trả về sớm (early returns)
- [ ] Tìm các hàm có quá nhiều tham số đầu vào (>5) — hãy dùng mẫu tùy chọn (options pattern) hoặc gom vào struct cấu hình
- [ ] Xác định các "gói vạn năng" (God packages) ôm đồm quá nhiều trách nhiệm
- [ ] Kiểm tra các hàm `init()` gây hiệu ứng phụ (khó kiểm thử, phụ thuộc ngầm vào thứ tự nạp gói)
- [ ] Tìm các câu lệnh `switch` dài dòng lẽ ra nên dùng tính đa hình (gọi phương thức qua interface)
- [ ] Phát hiện các tham số kiểu boolean làm thay đổi hành vi hàm (hãy dùng options hoặc tách thành hai hàm riêng có tên rõ ràng)
- [ ] Xác định các cụm dữ liệu đi kèm nhau liên tục (data clumps — nhóm các tham số luôn xuất hiện cùng nhau ở nhiều hàm)
- [ ] Tìm sự tổng quát hóa phỏng đoán trước tương lai (speculative generality — tạo ra các tầng trừu tượng/interface chưa thực sự cần dùng)
### 8.4 Thành ngữ & Phong cách Chuẩn Go (Go Idioms & Style)
- [ ] Tìm cách xử lý lỗi không chuẩn Go (không tuân theo mẫu kiểm tra `if err != nil` ngay sau lệnh gọi)
- [ ] Xác định các hàm lấy giá trị (getters) gắn tiền tố `Get` thừa thãi (quy ước chuẩn của Go: viết `Name()` chứ không viết `GetName()`)
- [ ] Phát hiện các kiểu dữ liệu nội bộ (unexported types) được trả về từ các hàm công khai (exported functions) gây bất tiện cho bên gọi
- [ ] Tìm cách đặt tên gây lắp bắp lặp từ với tên gói (`http.HTTPClient` → nên đặt là `http.Client`)
- [ ] Xác định các khối `else` dư thừa ngay sau khối `if` đã có lệnh `return` (nên bỏ `else` để giữ mã phẳng)
- [ ] Kiểm tra việc sử dụng đúng từ khóa `iota` cho các tập hằng số liệt kê (enumerations)
- [ ] Tìm các hàm/kiểu xuất công khai (exported) bị thiếu chú thích tài liệu (doc comments)
- [ ] Phát hiện những chỗ khai báo `var` dài dòng khi dùng `:=` gọn gàng hơn (và ngược lại khi cần chỉ rõ kiểu hoặc zero value)
- [ ] Xác định việc thiếu chú thích tài liệu ở cấp độ gói (`// Package foo ...`)
- [ ] Kiểm tra cách đặt tên biến nhận (receiver naming) của phương thức (ngắn gọn, nhất quán 1-2 chữ cái như `s` cho `Server`, tuyệt đối không đặt là `this` hay `self`)
- [ ] Tìm các giao diện chỉ có một phương thức duy nhất nhưng tên không kết thúc bằng hậu tố `-er` (`Reader`, `Writer`, `Closer`)
- [ ] Phát hiện việc dùng lệnh `return` trống (naked returns) trong các hàm dài và phức tạp làm giảm tính dễ đọc
---
## 9. KIẾN TRÚC & THIẾT KẾ (ARCHITECTURE & DESIGN)
### 9.1 Cấu trúc Gói (Package Structure)
- [ ] Tìm sự phụ thuộc vòng tròn giữa các gói (`go vet ./...` sẽ báo lỗi không biên dịch được, nhưng cần kiểm tra cả các phụ thuộc vòng gián tiếp qua interface/hạ tầng)
- [ ] Xác định những nơi thiếu thư mục `internal/` để bảo vệ các gói không muốn bên ngoài import
- [ ] Phát hiện phản mẫu "nhồi nhét tất cả mọi thứ vào chung một gói"
- [ ] Tìm sự phân tầng gói sai nguyên tắc (tầng logic nghiệp vụ lại đi import gói xử lý HTTP handlers)
- [ ] Xác định việc thiếu ranh giới kiến trúc sạch (phân tách rõ các tầng domain, service, repository)
- [ ] Kiểm tra cấu trúc thư mục `cmd/` đã chuẩn xác khi dự án tạo ra nhiều tệp thực thi (binaries) chưa
- [ ] Tìm các biến trạng thái toàn cục khả biến được chia sẻ trực tiếp giữa nhiều gói
- [ ] Phát hiện việc lạm dụng hoặc tổ chức sai mục đích thư mục `pkg/`
- [ ] Xác định việc thiếu áp dụng tiêm phụ thuộc (dependency injection — các hàm khởi tạo constructor nên nhận đầu vào là interfaces)
- [ ] Kiểm tra sự tách biệt rõ ràng giữa phần định nghĩa giao diện API và phần triển khai chi tiết
### 9.2 Các Nguyên lý SOLID
- [ ] **Đơn trách nhiệm (Single Responsibility)**: Tìm các gói/tệp tin đang gánh vác quá nhiều việc khác nhau
- [ ] **Đóng/Mở (Open/Closed)**: Tìm các đoạn mã buộc phải sửa đổi trực tiếp mỗi khi muốn mở rộng tính năng (thiếu áp dụng interfaces/plugins)
- [ ] **Thay thế Liskov (Liskov Substitution)**: Tìm các bản triển khai interface vi phạm hợp đồng hành vi kỳ vọng của interface đó
- [ ] **Phân tách Giao diện (Interface Segregation)**: Tìm các interface quá lớn cần được tách nhỏ thành các interface chuyên biệt
- [ ] **Đảo ngược Phụ thuộc (Dependency Inversion)**: Tìm các phụ thuộc cứng vào kiểu cụ thể (concrete types) ở những nơi lẽ ra phải phụ thuộc vào interface
### 9.3 Các Mẫu Thiết kế (Design Patterns)
- [ ] Tìm những chỗ thiếu mẫu `Functional Options` cho các kiểu dữ liệu có nhiều tham số cấu hình tùy chọn
- [ ] Xác định các hàm khởi tạo `New*` nên được thiết kế nhận danh sách hàm tùy chọn `...Option`
- [ ] Phát hiện việc thiếu mẫu middleware cho các tác vụ cắt ngang (ghi log, xác thực, thu thập metrics, khôi phục lỗi)
- [ ] Tìm các bản triển khai observer/pubsub tự viết có nguy cơ gây rò rỉ goroutine hoặc nghẽn kênh
- [ ] Xác định việc thiếu mẫu `Repository` để tách biệt tầng truy xuất cơ sở dữ liệu
- [ ] Kiểm tra việc áp dụng đúng mẫu `Builder` khi cần khởi tạo các đối tượng phức tạp qua nhiều bước
- [ ] Tìm các cơ hội áp dụng mẫu thiết kế `Strategy` đang bị bỏ lỡ (biến thiên hành vi thông qua interface)
- [ ] Phát hiện trạng thái toàn cục (global state) lẽ ra nên sử dụng tiêm phụ thuộc (dependency injection)
### 9.4 Thiết Kế API
- [ ] Tìm các HTTP handler xử lý trực tiếp logic nghiệp vụ (lẽ ra phải ủy quyền cho tầng service)
- [ ] Xác định các middleware xác thực dữ liệu yêu cầu/phản hồi (request/response validation) còn thiếu
- [ ] Phát hiện các quy ước REST API thiếu nhất quán giữa các endpoint
- [ ] Tìm các định nghĩa dịch vụ gRPC không sử dụng mã lỗi (error codes) chuẩn xác
- [ ] Xác định việc thiếu chiến lược quản lý phiên bản API (API versioning)
- [ ] Kiểm tra việc sử dụng đúng mã trạng thái HTTP (HTTP status code)
- [ ] Tìm các endpoint kiểm tra sức khỏe / mức độ sẵn sàng (health check / readiness) còn thiếu
- [ ] Phát hiện các API giao tiếp quá rườm rà (các endpoint gây lỗi N+1 lẽ ra nên được gộp theo lô)
---
## 10. PHÂN TÍCH PHỤ THUỘC (DEPENDENCY ANALYSIS)
### 10.1 Phân Tích Module & Phiên Bản
- [ ] Chạy `go list -m -u all` — xác định toàn bộ các gói phụ thuộc đã lỗi thời
- [ ] Kiểm tra tính nhất quán của `go.sum` (`go mod verify`)
- [ ] Tìm các chỉ thị `replace` bị bỏ quên lại trong `go.mod`
- [ ] Xác định các gói phụ thuộc có lỗ hổng bảo mật CVE đã biết (`govulncheck ./...`)
- [ ] Kiểm tra các gói phụ thuộc không sử dụng đến (xem thay đổi khi chạy `go mod tidy`)
- [ ] Tìm các gói phụ thuộc trong thư mục vendor đã lỗi thời
- [ ] Xác định các phụ thuộc gián tiếp (indirect) lẽ ra phải là phụ thuộc trực tiếp (direct)
- [ ] Kiểm tra phiên bản Go trong `go.mod` có khớp với môi trường CI/đích triển khai hay không
- [ ] Tìm các tệp gắn thẻ `//go:build ignore` có import gói phụ thuộc
### 10.2 Sức Khỏe Của Các Gói Phụ Thuộc
- [ ] Kiểm tra ngày commit cuối cùng của từng gói phụ thuộc
- [ ] Xác định các gói phụ thuộc đã bị lưu trữ (archived) hoặc ngừng bảo trì
- [ ] Tìm các gói phụ thuộc đang có các lỗi nghiêm trọng (critical issues) chưa được giải quyết
- [ ] Kiểm tra các gói phụ thuộc lạm dụng gói `unsafe` quá mức
- [ ] Xác định các gói phụ thuộc cồng kềnh hoàn toàn có thể thay thế bằng thư viện chuẩn (stdlib)
- [ ] Tìm các gói phụ thuộc có giấy phép hạn chế nghiêm ngặt (ví dụ: giấy phép GPL nằm trong dự án MIT)
- [ ] Kiểm tra các gói phụ thuộc yêu cầu CGO (gây lo ngại về tính khả chuyển giữa các hệ thống)
- [ ] Xác định các gói phụ thuộc kéo theo cây phụ thuộc bắc cầu (transitive trees) khổng lồ
- [ ] Tìm các gói phụ thuộc được tạo nhánh riêng (forked) nhưng không theo dõi cập nhật từ nhánh gốc (upstream)
### 10.3 Các Lưu Ý Về CGO
- [ ] Kiểm tra xem CGO có thực sự bắt buộc hay không và liệu có thể biên dịch với `CGO_ENABLED=0` hay không
- [ ] Tìm mã nguồn CGO không quản lý bộ nhớ đúng cách
- [ ] Xác định các lệnh gọi CGO nằm trên luồng thực thi nóng (hot paths) (chi phí chuyển ngữ cảnh qua ranh giới Go→C)
- [ ] Kiểm tra các phụ thuộc CGO làm hỏng khả năng biên dịch chéo (cross-compilation)
- [ ] Tìm mã CGO không xử lý lỗi trả về từ C đúng chuẩn
- [ ] Phát hiện nguy cơ rò rỉ bộ nhớ (memory leaks) xuyên qua ranh giới CGO
---
## 11. KHOẢNG TRỐNG TRONG KIỂM THỬ (TESTING GAPS)
### 11.1 Phân Tích Độ Bao Phủ (Coverage Analysis)
- [ ] Chạy `go test -coverprofile` — xác định các gói và hàm chưa được kiểm thử
- [ ] Tìm các nhánh xử lý lỗi chưa được kiểm thử (đặc biệt là các nhánh trả về lỗi)
- [ ] Phát hiện các trường hợp biên (edge cases) trong câu lệnh điều kiện chưa được kiểm thử
- [ ] Kiểm tra việc thiếu các bài kiểm thử giá trị biên (boundary value tests)
- [ ] Xác định các kịch bản chạy đồng thời (concurrent scenarios) chưa được kiểm thử
- [ ] Tìm các luồng xác thực dữ liệu đầu vào chưa được kiểm thử
- [ ] Kiểm tra việc thiếu các bài kiểm thử tích hợp (cơ sở dữ liệu, HTTP, gRPC)
- [ ] Xác định các luồng xử lý trọng yếu chưa có bài kiểm thử hiệu năng (`*testing.B`)
### 11.2 Chất Lượng Kiểm Thử
- [ ] Tìm các bài kiểm thử không gọi `t.Helper()` bên trong các hàm hỗ trợ kiểm thử (test helper functions)
- [ ] Xác định những chỗ lẽ ra nên viết kiểm thử hướng bảng (table-driven tests) nhưng chưa áp dụng
- [ ] Phát hiện các bài kiểm thử lạm dụng tạo giả (mocking) quá mức làm che giấu lỗi thực tế
- [ ] Tìm các bài kiểm thử đi kiểm tra chi tiết triển khai nội bộ thay vì kiểm tra hành vi đầu ra
- [ ] Xác định các bài kiểm thử dùng chung trạng thái có thể biến đổi (kết quả phụ thuộc vào thứ tự chạy test)
- [ ] Kiểm tra việc sử dụng `t.Parallel()` ở những nơi an toàn
- [ ] Tìm các bài kiểm thử chập chờn không ổn định (flaky tests - phụ thuộc thời gian hoặc hệ thống tệp)
- [ ] Phát hiện việc thiếu các bài kiểm thử con (`t.Run("name", ...)`)
- [ ] Xác định các tệp `testdata/` còn thiếu đối với kiểm thử đối chiếu kết quả chuẩn (golden tests)
- [ ] Kiểm tra việc dọn dẹp `httptest.NewServer` (thiếu lệnh `defer server.Close()`)
### 11.3 Hạ Tầng Kiểm Thử
- [ ] Tìm chỗ thiếu hàm `TestMain` phục vụ việc thiết lập/dọn dẹp (setup/teardown)
- [ ] Xác định việc thiếu thẻ biên dịch cho các bài kiểm thử tích hợp (`//go:build integration`)
- [ ] Phát hiện việc thiếu kiểm thử điều kiện tranh chấp dữ liệu (`go test -race`)
- [ ] Kiểm tra việc thiếu kiểm thử làm mờ dữ liệu đầu vào (fuzz tests với các hàm `Fuzz*` — từ Go 1.18+)
- [ ] Tìm các bài kiểm thử ví dụ còn thiếu (các hàm `Example*` phục vụ tài liệu godoc)
- [ ] Xác định việc thiếu các mốc cơ sở (baselines) để so sánh kết quả benchmark
- [ ] Kiểm tra việc quản lý dữ liệu mẫu kiểm thử (test fixtures) đúng chuẩn
- [ ] Tìm các bài kiểm thử phụ thuộc trực tiếp vào dịch vụ bên ngoài mà không dùng mock/stub
---
## 12. CẤU HÌNH & BIÊN DỊCH (CONFIGURATION & BUILD)
### 12.1 Cấu Hình Go Module
- [ ] Kiểm tra xem phiên bản Go trong `go.mod` đã phù hợp hay chưa
- [ ] Xác minh tệp `go.sum` đã được đưa vào quản lý phiên bản (commit) và nhất quán
- [ ] Kiểm tra cách đặt tên đường dẫn module đã đúng chuẩn chưa
- [ ] Tìm các chỉ thị `replace` không nên tồn tại trong các module được xuất bản công khai
- [ ] Xác định các chỉ thị thu hồi (`retract`) cần thiết đối với các phiên bản bị lỗi
- [ ] Kiểm tra ranh giới phân tách giữa các module (khi nào nên tách nhỏ module)
- [ ] Xác minh các chỉ thị `//go:generate` đều có tài liệu hướng dẫn và có thể tái lập kết quả đồng nhất
### 12.2 Cấu Hình Biên Dịch (Build Configuration)
- [ ] Kiểm tra việc sử dụng `ldflags` đúng chuẩn để nhúng thông tin phiên bản vào bản dựng
- [ ] Xác minh thiết lập `CGO_ENABLED` là hoàn toàn có chủ đích
- [ ] Tìm xem các thẻ biên dịch đã được sử dụng đúng cú pháp mới chưa (`//go:build`)
- [ ] Kiểm tra thiết lập biên dịch chéo (cross-compilation) đã chuẩn xác chưa
- [ ] Xác định việc thiếu các bước chạy `go vet` / `staticcheck` / `golangci-lint` trong quy trình CI
- [ ] Xác minh việc dùng bản dựng nhiều giai đoạn (multi-stage build) trong Docker để tối giản kích thước image
- [ ] Kiểm tra cấu hình `.goreleaser.yml` đã chuẩn chưa (nếu có áp dụng)
- [ ] Tìm các chỗ gán cứng `GOOS`/`GOARCH` trong mã nguồn nơi lẽ ra nên dùng thẻ biên dịch (build tags)
### 12.3 Môi Trường & Cấu Hình Ứng Dụng
- [ ] Tìm các giá trị đặc thù theo môi trường bị gán cứng trong mã (URL, cổng, đường dẫn tệp)
- [ ] Xác định việc thiếu bước kiểm tra tính hợp lệ của các biến môi trường ngay khi khởi động
- [ ] Phát hiện các giá trị dự phòng (fallback values) không phù hợp khi thiếu cấu hình
- [ ] Kiểm tra việc sử dụng struct cấu hình có gắn các thẻ xác thực (validation tags) đầy đủ
- [ ] Tìm các giá trị nhạy cảm không được quản lý qua hệ thống quản lý bí mật (secrets management)
- [ ] Xác định việc thiếu cờ tính năng (feature flags / toggles) phục vụ triển khai cuốn chiếu (gradual rollout)
- [ ] Kiểm tra việc bắt và xử lý tín hiệu hệ điều hành (`SIGTERM`, `SIGINT`) để đóng ứng dụng an toàn
- [ ] Tìm các endpoint kiểm tra sức khỏe hệ thống còn thiếu (`/healthz`, `/readyz`)
---
## 13. CÁC VẤN ĐỀ ĐẶC THÙ VỀ HTTP & MẠNG
### 13.1 Các Vấn Đề Về Máy Chủ HTTP (HTTP Server)
- [ ] Tìm việc gọi trực tiếp `http.ListenAndServe` không có giới hạn thời gian chờ (hãy dùng `http.Server` tùy chỉnh)
- [ ] Xác định việc thiếu cấu hình `ReadTimeout`, `WriteTimeout`, `IdleTimeout` trên máy chủ
- [ ] Phát hiện việc thiếu `http.MaxBytesReader` khi đọc phần thân yêu cầu (request bodies)
- [ ] Tìm các tiêu đề phản hồi (response headers) chưa được thiết lập (Content-Type, Cache-Control, các tiêu đề Bảo mật)
- [ ] Xác định việc thiếu cơ chế đóng máy chủ an toàn bằng `server.Shutdown(ctx)`
- [ ] Kiểm tra thứ tự nối chuỗi các middleware (middleware chaining order) đã hợp lý chưa
- [ ] Tìm việc thiếu cơ chế truyền mã định danh yêu cầu / mã tương quan (request ID / correlation ID)
- [ ] Phát hiện việc thiếu middleware ghi nhận nhật ký truy cập (access logging)
- [ ] Xác định việc thiếu middleware khôi phục khi gặp lỗi dừng đột ngột (panic recovery)
- [ ] Kiểm tra tính nhất quán của cấu trúc phản hồi lỗi trong các handler
### 13.2 Các Vấn Đề Về Máy Khách HTTP (HTTP Client)
- [ ] Tìm các chỗ sử dụng `http.DefaultClient` (không có thời gian chờ timeout)
- [ ] Xác định những nơi không đóng `http.Response.Body` sau khi sử dụng xong
- [ ] Phát hiện việc thiếu logic thử lại (retry) kèm thời gian chờ tăng dần theo cấp số nhân (exponential backoff)
- [ ] Tìm việc thiếu truyền `context.Context` vào các lệnh gọi HTTP
- [ ] Xác định nguy cơ cạn kiệt hồ kết nối (connection pool exhaustion do thiếu tinh chỉnh `MaxIdleConns`)
- [ ] Kiểm tra cấu hình bảo mật TLS chuẩn xác trên phía client
- [ ] Tìm việc thiếu `io.LimitReader` khi đọc dữ liệu từ phần thân phản hồi (response body)
- [ ] Phát hiện các vấn đề về bộ nhớ đệm DNS (DNS caching) trong các tiến trình chạy dài hạn
### 13.3 Các Vấn Đề Về Cơ Sở Dữ Liệu
- [ ] Tìm các kết nối `database/sql` không sử dụng hồ kết nối (connection pool) đúng cách
- [ ] Xác định việc thiếu cấu hình `SetMaxOpenConns`, `SetMaxIdleConns`, `SetConnMaxLifetime`
- [ ] Phát hiện lỗ hổng tiêm mã SQL (SQL injection) do nối chuỗi trực tiếp
- [ ] Tìm việc thiếu lệnh hoàn tác giao dịch (rollback) khi gặp lỗi (`defer tx.Rollback()`)
- [ ] Xác định những chỗ quên gọi `rows.Close()` sau khi thực thi `db.Query()`
- [ ] Kiểm tra xem có gọi `rows.Err()` sau khi kết thúc vòng lặp duyệt kết quả hay không
- [ ] Tìm việc thiếu cơ chế lưu đệm câu lệnh chuẩn bị trước (prepared statement caching)
- [ ] Phát hiện việc không truyền context vào các thao tác truy vấn cơ sở dữ liệu
- [ ] Xác định việc thiếu quản lý phiên bản di chuyển lược đồ cơ sở dữ liệu (database migration versioning)
---
## 14. TÀI LIỆU & KHẢ NĂNG BẢO TRÌ
### 14.1 Tài Liệu Trong Mã Nguồn
- [ ] Tìm các hàm/kiểu dữ liệu/hằng số được xuất công khai (exported) nhưng không có chú thích godoc
- [ ] Xác định các hàm có logic phức tạp nhưng không hề có chú thích giải thích
- [ ] Phát hiện việc thiếu tài liệu mô tả ở cấp độ gói (`// Package foo ...`)
- [ ] Kiểm tra các dòng chú thích đã lỗi thời, không còn khớp với mã nguồn hiện tại
- [ ] Tìm các chú thích TODO/FIXME/HACK/XXX cần được giải quyết dứt điểm
- [ ] Xác định các con số ma thuật (magic numbers) viết trực tiếp mà không đặt thành hằng số có tên rõ ràng
- [ ] Kiểm tra việc thiếu các ví dụ minh họa trong godoc (các hàm `Example*`)
- [ ] Tìm việc thiếu tài liệu mô tả lỗi (hàm có thể trả về những loại lỗi nào)
### 14.2 Tài Liệu Dự Án
- [ ] Tìm xem có thiếu tệp README hướng dẫn cách sử dụng, cài đặt và tài liệu API hay không
- [ ] Xác định việc thiếu tệp nhật ký thay đổi CHANGELOG
- [ ] Phát hiện việc thiếu tài liệu hướng dẫn đóng góp CONTRIBUTING
- [ ] Kiểm tra việc thiếu các bản ghi quyết định kiến trúc (ADRs)
- [ ] Tìm việc thiếu tài liệu đặc tả API (OpenAPI/Swagger, tài liệu protobuf)
- [ ] Xác định việc thiếu tài liệu hướng dẫn triển khai và vận hành hệ thống
- [ ] Kiểm tra xem dự án có thiếu tệp giấy phép LICENSE hay không
---
## 15. DANH SÁCH KIỂM TRA CÁC TRƯỜNG HỢP BIÊN (EDGE CASES CHECKLIST)
### 15.1 Các Trường Hợp Biên Về Dữ Liệu Đầu Vào
- [ ] Chuỗi rỗng, slice rỗng, map rỗng
- [ ] `math.MaxInt64`, `math.MinInt64`, các mốc giới hạn tràn số (overflow boundaries)
- [ ] Số âm truyền vào những nơi kỳ vọng nhận số dương
- [ ] Giá trị không mặc định (zero values) đối với tất cả các kiểu dữ liệu
- [ ] Giá trị `math.NaN()` và `math.Inf()` trong các phép toán số thực dấu phẩy động
- [ ] Ký tự Unicode đa byte và biểu tượng cảm xúc (emoji) trong quá trình xử lý chuỗi
- [ ] Dữ liệu đầu vào có kích thước cực lớn (tệp >1GB, hàng triệu bản ghi)
- [ ] Các cấu trúc JSON lồng nhau quá sâu
- [ ] Dữ liệu đầu vào sai định dạng (JSON bị cắt cụt, chuỗi UTF-8 bị lỗi byte)
- [ ] Truy cập đồng thời từ nhiều goroutine cùng lúc
### 15.2 Các Trường Hợp Biên Về Thời Gian
- [ ] Năm nhuận và các thời điểm chuyển đổi giờ mùa hè (daylight saving time)
- [ ] Xử lý múi giờ (sự thiếu nhất quán giữa `time.UTC` và `time.Local`)
- [ ] Không dừng `time.Ticker` / `time.Timer` sau khi dùng (gây rò rỉ goroutine)
- [ ] Đồng hồ đơn điệu (monotonic clock) so với đồng hồ treo tường (wall clock) (`time.Now()` sử dụng đồng hồ đơn điệu để đo khoảng thời gian trôi qua)
- [ ] Các mốc thời gian (timestamps) rất cũ (trước kỷ nguyên Unix epoch)
- [ ] Các vấn đề về độ chính xác đến từng nano giây khi thực hiện phép so sánh thời gian
- [ ] Sử dụng `time.After()` bên trong câu lệnh `select` nằm trong vòng lặp (tạo ra channel mới ở mỗi vòng lặp — gây rò rỉ bộ nhớ)
### 15.3 Các Trường Hợp Biên Về Nền Tảng Hệ Điều Hành
- [ ] Xử lý đường dẫn tệp giữa các hệ điều hành khác nhau (`filepath.Join` so với `path.Join`)
- [ ] Sự khác biệt về ký tự xuống dòng (`\n` so với `\r\n`)
- [ ] Sự khác biệt về tính phân biệt chữ hoa/chữ thường của hệ thống tệp
- [ ] Các giới hạn về độ dài đường dẫn tối đa
- [ ] Các giả định về thứ tự byte (endianness) trong các giao thức nhị phân
- [ ] Sự khác biệt trong cơ chế xử lý tín hiệu hệ thống (signals) giữa các hệ điều hành
---
## ĐỊNH DẠNG ĐẦU RA (OUTPUT FORMAT)
Đối với mỗi vấn đề phát hiện được, hãy cung cấp thông tin theo cấu trúc sau:
### [SEVERITY: CRITICAL/HIGH/MEDIUM/LOW] Tiêu Đề Vấn Đề
**Danh mục**: [Type Safety/Security/Concurrency/Performance/etc.]
**Tệp**: path/to/file.go
**Dòng**: 123-145
**Tác động**: Mô tả những hậu quả xấu có thể xảy ra
**Mã nguồn hiện tại**:
```go
// problematic code
```
**Vấn đề**: Giải thích chi tiết tại sao đoạn mã này lại gây lỗi hoặc tiềm ẩn rủi ro
**Khuyến nghị khắc phục**:
```go
// fixed code
```
**Tài liệu tham khảo**: Liên kết tới tài liệu chính thức, bài viết trên Go blog, mã lỗ hổng CVE, các phương pháp thực hành tốt nhất (best practices)
---
## MA TRẬN MỨC ĐỘ ƯU TIÊN (PRIORITY MATRIX)
1. **CRITICAL - Nghiêm trọng** (Phải sửa ngay lập tức):
- Các lỗ hổng bảo mật (tiêm mã độc, vượt qua bước xác thực)
- Nguy cơ mất mát / làm hỏng dữ liệu
- Điều kiện tranh chấp (race conditions) gây lỗi dừng chương trình (panic) trên môi trường production
- Rò rỉ goroutine dẫn đến tràn bộ nhớ (OOM)
2. **HIGH - Cao** (Phải sửa ngay trong Sprint này):
- Giải tham chiếu con trỏ nil (Nil pointer dereferences)
- Phớt lờ lỗi trả về trong các luồng xử lý trọng yếu
- Thiếu cơ chế hủy ngữ cảnh (context cancellation)
- Rò rỉ tài nguyên hệ thống (kết nối mạng/DB, con trỏ tệp)
3. **MEDIUM - Trung bình** (Sửa sớm):
- Vi phạm chất lượng mã nguồn / quy ước viết mã chuẩn của Go (idioms)
- Thiếu độ bao phủ kiểm thử (test coverage gaps)
- Các vấn đề hiệu năng ở những luồng không quá nóng (non-hot paths)
- Thiếu hụt tài liệu mô tả
4. **LOW - Thấp** (Nợ kỹ thuật - Tech Debt):
- Phong cách trình bày thiếu nhất quán
- Các tối ưu hóa nhỏ lẻ
- Các lớp trừu tượng hóa có thêm thì tốt (nice-to-have)
- Cải thiện cách đặt tên biến/hàm
---
## CÁC CÔNG CỤ PHÂN TÍCH TĨNH CẦN CHẠY
Trước khi rà soát thủ công, hãy chạy các công cụ sau và đưa kết quả phát hiện vào báo cáo:
```bash
# Compiler checks
go build ./...
go vet ./...
# Race detector
go test -race ./...
# Vulnerability check
govulncheck ./...
# Linter suite (comprehensive)
golangci-lint run --enable-all ./...
# Dead code detection
deadcode ./...
# Unused exports
unused ./...
# Security scanner
gosec ./...
# Complexity analysis
gocyclo -over 15 .
# Escape analysis
go build -gcflags="-m -m" ./... 2>&1 | grep "escapes to heap"
# Test coverage
go test -coverprofile=coverage.out ./...
go tool cover -func=coverage.out
```
---
## TÓM TẮT CUỐI CÙNG (FINAL SUMMARY)
Sau khi hoàn tất toàn bộ quá trình rà soát, hãy cung cấp:
1. **Tóm tắt Điều hành (Executive Summary)**: Tổng quan trong 2-3 đoạn văn
2. **Đánh giá Rủi ro (Risk Assessment)**: Mức độ rủi ro tổng thể kèm theo lập luận giải thích
3. **10 Vấn đề Nghiêm trọng Hàng đầu (Top 10 Critical Issues)**: Danh sách sắp xếp theo thứ tự ưu tiên
4. **Kế hoạch Hành động Khuyến nghị (Recommended Action Plan)**: Lộ trình khắc phục chia theo từng giai đoạn
5. **Ước tính Công sức (Estimated Effort)**: Thời gian dự kiến cần thiết để khắc phục hoàn toàn
6. **Các Chỉ số Đo lường (Metrics)**:
- Tổng số vấn đề phát hiện được phân theo mức độ nghiêm trọng
- Điểm sức khỏe mã nguồn (1-10)
- Điểm bảo mật (1-10)
- Điểm an toàn xử lý đồng thời (1-10)
- Điểm khả năng bảo trì (1-10)
- Tỷ lệ phần trăm độ bao phủ kiểm thửCác ưu tiên mang tính định hướng rõ ràng để xây dựng và vận hành các dịch vụ backend Go nhỏ gọn, dễ bảo trì.
# Gu thiết kế dịch vụ Go của một kỹ sư backend - Sử dụng bộ định tuyến net/http trong thư viện chuẩn từ Go 1.22 trước khi tìm đến một framework. Độ tin cậy: 0.85 - Bố trí dự án theo cấu trúc cmd/<service>/main.go cùng với các gói trong internal/, và bỏ qua thư mục pkg/. Độ tin cậy: 0.80 - Giữ cho tệp main.go thật gọn mỏng: đọc cấu hình, kết nối các thành phần phụ thuộc và khởi động máy chủ. Độ tin cậy: 0.90 - Truyền context.Context làm đối số đầu tiên cho mọi hàm thực hiện thao tác vào/ra (I/O). Độ tin cậy: 0.95 - Bọc lỗi bằng fmt.Errorf và %w, đồng thời kiểm tra lỗi bằng errors.Is và errors.As. Độ tin cậy: 0.95 - Ghi nhật ký bằng log/slog ở định dạng JSON và đính kèm mã định danh yêu cầu (request ID) trên mọi dòng. Độ tin cậy: 0.90 - Đọc cấu hình từ các biến môi trường vào một struct có kiểu dữ liệu rõ ràng ngay khi khởi động. Độ tin cậy: 0.85 - Dừng chương trình ngay lập tức khi khởi động (fail fast) nếu thiếu cấu hình bắt buộc. Độ tin cậy: 0.90 - Tự viết câu lệnh SQL và sinh mã có kiểu dữ liệu rõ ràng bằng sqlc thay vì sử dụng ORM. Độ tin cậy: 0.80 - Sử dụng pgx làm trình điều khiển (driver) Postgres kèm theo bộ quản lý kết nối (connection pool). Độ tin cậy: 0.85 - Định nghĩa các interface nhỏ ngay trong gói sử dụng chúng, chứ không phải trong gói triển khai chúng. Độ tin cậy: 0.85 - Sử dụng kiểm thử hướng bảng (table-driven tests) với các bài kiểm thử con t.Run. Độ tin cậy: 0.90 - Chạy go test với cờ -race trong CI trên mọi pull request. Độ tin cậy: 0.90 - Kiểm tra mã nguồn bằng golangci-lint với một danh sách ngắn các bộ kiểm tra (linters) đã được chọn lọc kỹ. Độ tin cậy: 0.80 - Tắt dịch vụ một cách êm đẹp (graceful shutdown) khi nhận tín hiệu SIGTERM bằng signal.NotifyContext và server.Shutdown. Độ tin cậy: 0.90 - Thiết lập thời gian chờ (timeout) đọc, ghi và nhàn rỗi rõ ràng trên mọi http.Server và http.Client. Độ tin cậy: 0.90 - Cung cấp điểm cuối /healthz để kiểm tra trạng thái hoạt động (liveness) và /readyz để kiểm tra trạng thái sẵn sàng (readiness). Độ tin cậy: 0.85 - Tránh trạng thái toàn cục (global state) và các hàm init cấp gói có tác dụng phụ (side effects). Độ tin cậy: 0.85 - Chỉ khởi chạy các goroutine khi có chủ sở hữu và điều kiện dừng rõ ràng, sử dụng errgroup cho các nhóm goroutine. Độ tin cậy: 0.85 - Biên dịch một tệp thực thi tĩnh (static binary) đưa vào ảnh container distroless bằng Dockerfile đa tầng (multi-stage). Độ tin cậy: 0.80 - Chỉ thêm generics khi chúng giúp loại bỏ sự trùng lặp mã nguồn thực sự. Độ tin cậy: 0.70