+1

Agentic Coding & Spec-Driven Development: Khi AI không chỉ code mà còn phải tuân thủ luật chơi

“AI không sai — chỉ là bạn chưa đặt ra luật cho nó.” (Câu nói mà mình phải lặp lại không dưới 20 lần khi chạy PoC agentic coding cho một dự án backend gần đây.)

Khi bước sang kỷ nguyên Agentic AI và Spec-Driven Development, việc “kêu AI generate code” không còn thú vị nữa. Cái khó giờ nằm ở: Làm sao để AI viết code như một kỹ sư giỏi — đúng convention, đúng chuẩn security, scalable và không tốn quá nhiều tài nguyên.

Trong bài này, mình sẽ chia sẻ một số kinh nghiệm thực tế khi áp dụng agentic coding và spec-driven development, những vấn đề thường gặp, cũng như cách tiếp cận để xử lý chúng.

1. Agentic Coding là gì? Vì sao không chỉ là “auto code”?

Ảnh minh họa. Nguồn: Internet

Agentic Coding ≠ việc AI chỉ generate code

Agentic Coding không đơn giản là “AI generate code”. Đây là một mô hình mà trong đó:

  • AI được giao nhiệm vụ tổng thể, thay vì chỉ nhận yêu cầu “viết đoạn code này, đoạn code kia”.

  • AI biết lập kế hoạch (planning), tự quyết định thứ tự và cách thực hiện task.

  • AI có khả năng phát hiện lỗi, refactor, test và tối ưu code.

  • AI có thể hỏi lại khi gặp mơ hồ, phân tách task thành các bước nhỏ, và cải thiện kết quả từng bước dựa trên thông tin trung gian.

Nếu so sánh:

Prompt → Code chỉ là kiểu “AI trợ lý copywriter”.

Agentic AI → Analyze → Spec → Code → Test → Improve → Deliver mới thực sự là coding agent.

2. Spec-Driven Development: Spec là nguồn sự thật, mọi code phải theo đó

Spec-Driven Developement (SDD) nghĩa là: Mọi thứ trong Spec-Driven Development đều xuất phát từ spec — có thể là spec kỹ thuật như OpenAPI, GraphQL, JSON Schema, hoặc spec mô tả giao diện, user story chi tiết, và các requirement khác. Đây là ‘nguồn sự thật’ để mọi code và tính năng được phát triển theo đúng hướng. AI generate code hoàn toàn dựa trên spec đó

Khi spec thay đổi, code thay đổi tương ứng

Không còn chuyện backend viết theo cách A, frontend hiểu sang cách B. Chúng ta có thể sử dụng tool: spec-kit

  • spec-kit — công cụ tạo spec + generate code “có kỷ luật”
  • spec-kit cho phép viết spec ở mức high-level
  • Tự generate types, validation, API handlers, document
  • Kết hợp LLM để tự hoàn thiện những phần lặp lại

Nhưng quan trọng nhất:

  • Spec là vi bằng.
  • Code phải tuân thủ spec.
  • AI chỉ là người thực thi.

3. Luồng tạo sản phẩm kết hợp Agentic AI + Spec-Driven Development — và những vấn đề chắc chắn gặp

Dưới đây là flow thực tế mà team mình triển khai cho một dự án service nhỏ:

[Spec] → [Plan] → [AI Agent phân rã task] → [Generate Code] → [Generate Tests] → [Run Tests] → [Fix] → [Check Performance/Security] → [Refactor] → [PR]

Về lý thuyết, luồng này rất mượt: AI biết lập kế hoạch, phân rã task, generate code, viết test, review, tối ưu và tạo PR. Nhưng trong thực tế, không phải lúc nào mọi thứ cũng hoàn hảo: AI có thể bỏ sót rules, output chưa consistent, hoặc cần dev can thiệp để fix performance, security, hoặc style.

❌ Vấn đề 1: AI không tuân thủ rules, structure

Ví dụ: Quy định dùng eslint@flat, import theo alias, strict TS, nhưng AI cứ cố nhét code kiểu CommonJS hoặc khai báo lung tung.

Giải pháp: Build file rules.md hoặc project_structure.md. Cho AI nạp vào mỗi lần generate. Bắt AI tự review code mình theo rules

Ví dụ:

## Folder structure rules
- src/modules/<feature>/controller.ts
- src/modules/<feature>/service.ts
- src/modules/<feature>/repository.ts

## Code style rules
- Must use TypeScript strict mode
- Must use async/await (no .then())
- Must not use any
- Use Zod for input validation

❌ Vấn đề 2: AI sinh code “vừa đủ chạy”, không nghĩ đến performance & scalability

Một trong những vấn đề thường gặp khi để AI sinh code là hiệu năng. AI đôi khi chỉ tập trung làm sao cho code chạy đúng, nhưng không nghĩ đến tối ưu:

  • Query database nhiều lần trong một vòng lặp
  • Không batch các thao tác cùng loại
  • Không cache dữ liệu read-heavy
  • Không nhận ra pattern N+1 khi truy xuất quan hệ

Để AI có tư duy performance, mình thường áp dụng prompt template trước khi generate code:

If the code contains repeated DB calls, loops calling external services, or N+1 patterns, you must propose an optimization first.

Checklist before coding:
- [ ] Batch processing where possible
- [ ] Avoid N+1 pattern
- [ ] Use caching if read-heavy
- [ ] Preload relations
- [ ] Single DB transaction if logical

Với prompt này, AI sẽ tự kiểm tra và đề xuất cải thiện trước khi sinh code. Ví dụ, nếu phát hiện N+1 pattern, AI có thể trả lời:

“I detect an N+1 pattern. I will use findMany({ include: ... }) instead.”

Cách làm này giúp giữ performance ngay từ bước generate code, thay vì phải fix lại sau khi code đã chạy.

❌ Vấn đề 3: Security không đồng nhất

Một vấn đề cực kỳ nhạy cảm khi để AI sinh code là bảo mật. Nếu không kiểm soát, code AI tạo ra thường gặp các lỗi kinh điển như:

  • XSS: không escape đầu vào, dẫn đến injection trên front-end
  • SQL Injection: query trực tiếp mà không validate hoặc dùng prepared statement
  • JWT: decode sai cách, không verify, dẫn đến lỗ hổng auth
  • Logging: xuất dữ liệu nhạy cảm ra logs, rủi ro rò rỉ thông tin

Để hạn chế, mình thường áp dụng một security checklist rõ ràng, AI sẽ tuân thủ khi generate code:

Security requirements:
- Every public API must validate input using Zod + sanitize
- Never return raw database models
- Mask sensitive fields in logs
- Queries must use prepared statements
- JWT must be verified, not decoded only

4. Cách áp dụng Agentic + Spec-Driven trong dự án thực tế

4.1. Bắt đầu bằng việc xây conventions, structure, ... rõ ràng

Code convention không phải để dev làm đẹp, mà để AI biết:

“Luật chơi ở dự án này là gì?”

Gồm 5 nhóm:

  • Code style
  • Folder structure
  • Validation & error handling
  • Security rules
  • Performance guidelines

4.2. Luôn bắt AI tạo Spec trước khi viết code

Ví dụ: Tạo spec API với spec-kit/OpenAPI

Input:

“Màn hình user muốn xem danh sách article, hỗ trợ filter theo tag, pagination.”

AI output spec:

GET /articles:
  query:
    page: number
    pageSize: number
    tag: string?
  responses:
    200:
      items:
        - id: string
          title: string
          tag: string
          createdAt: string

4.3. Tách “AI reviewer” và “AI coder”

Điều cực kỳ hiệu quả:

  • Agent 1: Code Generator
  • Agent 2: Code Reviewer (lint + security + performance)
  • Agent 3: Tester

Khi tách ra:

  • Code sạch hơn
  • Dễ audit hơn
  • Dễ kiểm soát hơn

4.4. Cho AI viết test trước (TDD)

Test được generate từ spec:

it("should return 200 with list of articles", async () => {
  const res = await request(app).get("/articles?page=1&pageSize=10");
  expect(res.status).toBe(200);
  expect(Array.isArray(res.body.items)).toBe(true);
});

AI cực kỳ mạnh ở phần này → cứ khai thác triệt để.

Tổng kết: AI chỉ giỏi khi bạn dạy nó luật chơi

Agentic coding và Spec-Driven Development có thể nâng năng suất lên đáng kể, nhưng không phải AI tự giỏi. Để tận dụng tốt, cần nhớ:

  • Luật chơi (rules) phải rõ ràng, AI mới sinh code chuẩn
  • Spec là nguồn sự thật duy nhất, mọi quyết định đều dựa trên đó
  • Pipeline kiểm tra performance và security là không thể thiếu
  • Chia AI thành nhiều agent là cách giúp kiểm soát và mở rộng dự án
  • Dự án lớn càng phải dựa vào spec-driven để giữ consistency

Cuối cùng, AI sẽ trở thành:

Một kỹ sư junior luôn chăm chỉ và biết nghe lời. Muốn nó “như senior”, bạn phải dạy luật thật rõ và kiểm tra nghiêm ngặt.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí