← 返回列表

ຊຸດສຳພາດ AI 16: Spec Coding ທີ່ດີຄວນເປັນແນວໃດ?

Spec Coding (ການຂຽນລະຫັດຕາມສະເປັກ) ທີ່ດີ, ຫຼັກການຄືການປ່ຽນ "ຄວາມຄິດທີ່ບໍ່ຊັດເຈນ" ໃຫ້ກາຍເປັນ "ສັນຍາທີ່ຊັດເຈນ, ກວດສອບໄດ້, ແລະ ປະຕິບັດໄດ້". ມັນບໍ່ພຽງແຕ່ຂຽນເອກະສານ, ແຕ່ລະບົບການສື່ສານທີ່ບໍ່ມີຄວາມກຳກວມລະຫວ່າງຄົນ ແລະ AI (ຫຼືລະຫວ່າງຄົນກັບຄົນ). ຂ້າງລຸ່ມນີ້ຂ້ອຍຈະສະເໜີຮູບແບບຂອງ spec ທີ່ດີຈາກ 4 ມຸມມອງຄື: ໂຄງສ້າງເນື້ອໃນຂອງ spec, ຫຼັກການຂຽນ, ຂະບວນການຮ່ວມງານກັບ AI, ການກວດສອບຄຸນນະພາບ.


1. ໂຄງສ້າງມາດຕະຖານຂອງເອກະສານ spec (ຍົກຕົວຢ່າງໂມດູນຟັງຊັນ)

ບົດ ເນື້ອໃນທີ່ຕ້ອງມີ ຕົວຢ່າງ
1. ເປົ້າໝາຍ ແລະ ຂອບເຂດ ອະທິບາຍໃນປະໂຫຍກດຽວວ່າເຮັດຫຍັງ, ກຳນົດວ່າ ບໍ່ເຮັດຫຍັງ “ປະຕິບັດ API ລົງທະບຽນຜູ້ໃຊ້, ບໍ່ລວມການຢືນຢັນອີເມວ”
2. ສັນຍາຮັບ/ສົ່ງ ໂຄງສ້າງຂໍ້ມູນ, ຊະນິດ, ຊ່ອງທີ່ຕ້ອງມີ/ບໍ່ຕ້ອງມີ, ຕົວຢ່າງຄ່າ POST /register ຮ່າງກາຍຮ້ອງຂໍ {email: string, password: string}, ຕອບສະໜອງ 201 ຫຼື 400 ພ້ອມລະຫັດຂໍ້ຜິດພາດ
3. ພຶດຕິກຳ ແລະ ເຫດຜົນ ກົດລະບຽບທຸລະກິດ, ເງື່ອນໄຂຂອບ, ການປ່ຽນສະຖານະ “ຄວາມຍາວລະຫັດຜ່ານ 8-20 ຕົວ, ຢ່າງໜ້ອຍມີຕົວເລກ 1 ຕົວ; ຖ້າອີເມວມີຢູ່ແລ້ວໃຫ້ສົ່ງຄືນ 409
4. ການຈັດການຂໍ້ຜິດພາດ ສະຖານະການຍົກເວັ້ນທີ່ເປັນໄປໄດ້ທັງໝົດ ແລະ ລະຫັດຂໍ້ຜິດພາດ/ຂໍ້ຄວາມທີ່ສອດຄ້ອງ “ການເຊື່ອມຕໍ່ຖານຂໍ້ມູນລົ້ມເຫຼວ → ສົ່ງຄືນ 503, ບໍ່ສະແດງ stack trace”
5. ຄວາມຕ້ອງການທີ່ບໍ່ແມ່ນຟັງຊັນ ປະສິດທິພາບ (ເວລາຕອບສະໜອງ < 200ms), ຄວາມປອດໄພ (parameterized query), ບັນທຶກ, ຄວາມສາມາດໃນການສັງເກດ “SQL ທັງໝົດຕ້ອງໃຊ້ precompiled; ບັນທຶກ email ແຕ່ບໍ່ບັນທຶກ password
6. ກໍລະນີທົດສອບ (ສຳຄັນ) ຢ່າງໜ້ອຍ 3 ການປ້ອນຂໍ້ມູນປົກກະຕິ + 2 ການປ້ອນຂໍ້ມູນຂອບ/ຍົກເວັ້ນ, ໃຫ້ຜົນໄດ້ຮັບທີ່ຄາດຫວັງ ເບິ່ງຕາຕະລາງລຸ່ມນີ້
7. ການອາໄສ ແລະ ຂໍ້ຈຳກັດ ໃຊ້ library ອັນໃດ, ເວີຊັນ, ຕົວແປສະພາບແວດລ້ອມ “Python 3.10+, FastAPI, ຕົວແປສະພາບແວດລ້ອມ DB_URL

ຕົວຢ່າງກໍລະນີທົດສອບ (ຝັງໃນ spec)

ສະຖານະການ ການປ້ອນຂໍ້ມູນ ຜົນໄດ້ຮັບທີ່ຄາດຫວັງ
ລົງທະບຽນປົກກະຕິ email: a@b.com, pwd: Pass1234 201, ຄືນ user_id
ລະຫັດຜ່ານສັ້ນເກີນໄປ pwd: Ab1 400, ລະຫັດຂໍ້ຜິດພາດ WEAK_PASSWORD
ອີເມວມີຢູ່ແລ້ວ ອີເມວດຽວກັນກັບຂ້າງເທິງ 409, ລະຫັດຂໍ້ຜິດພາດ EMAIL_EXISTS

Spec ທີ່ດີຕ້ອງຂຽນກໍລະນີທົດສອບກ່ອນ ເພາະ AI ສາມາດສ້າງ unit test ໂດຍກົງຈາກພວກມັນ, ແລະ ກວດສອບອັດຕະໂນມັດຫຼັງຈາກເຮັດສຳເລັດ.


2. ຫຼັກການຫຼັກໃນການຂຽນ Spec (ຕົວແປຂອງ SMART)

ຫຼັກການ ຄຳອະທິບາຍ ຕົວຢ່າງທີ່ບໍ່ດີ
ຊັດເຈນ (Precise) ໃຊ້ຕົວເລກສະເພາະ, ຊະນິດ, ເງື່ອນໄຂ Boolean; ຫຼີກລ່ຽງ “ເທົ່າທີ່ເປັນໄປໄດ້”, “ໂດຍທົ່ວໄປ” ❌ “ລະຫັດຜ່ານຕ້ອງປອດໄພພໍ” → ✅ “ລະຫັດຜ່ານຢ່າງໜ້ອຍ 8 ຕົວ, ມີຕົວໃຫຍ່, ຕົວນ້ອຍ, ຕົວເລກ”
ກວດສອບໄດ້ (Verifiable) ທຸກຂໍ້ກຳນົດສາມາດຕັດສິນວ່າຜ່ານ ຫຼື ລົ້ມເຫຼວດ້ວຍການທົດສອບອັດຕະໂນມັດ ຫຼື ການກວດສອບດ້ວຍມື ❌ “ລະຫັດຕ້ອງສວຍງາມ” → ✅ “ຟັງຊັນມີ cyclomatic complexity ≤ 10, ບໍ່ມີຕັນລະຫັດຊ້ຳ”
ບໍ່ກຳກວມ (Unambiguous) ຄຳດຽວກັນໃຊ້ຄວາມໝາຍດຽວກັນທົ່ວຂໍ້ຄວາມ; ຖ້າຈຳເປັນໃຫ້ມີ glossary ❌ “ຖ້າຜູ້ໃຊ້ບໍ່ມີ, ສົ່ງຄືນຂໍ້ຜິດພາດ” → ✅ “ຜູ້ໃຊ້ບໍ່ມີ → ສົ່ງຄືນ 404 ພ້ອມ {code: 'USER_NOT_FOUND'}
ສົມບູນ (Complete) ຄຸມທັງສາຍທີ່ມີຄວາມສຸກ, ທຸກສາຍຂໍ້ຜິດພາດ, ຄວາມຕ້ອງການທີ່ບໍ່ແມ່ນຟັງຊັນ ❌ ຂຽນແຕ່ສະຖານະການສຳເລັດ → ✅ ລວມທັງຖານຂໍ້ມູນ timeout, ສິດບໍ່ພຽງພໍ ແລະ ອື່ນໆ
ເປັນອະຕອມ (Atomic) ໜຶ່ງ spec ພຽງອະທິບາຍຈຸດຟັງຊັນທີ່ສາມາດສົ່ງມອບແຍກຕ່າງຫາກໄດ້ (ເພື່ອໃຫ້ AI ເຮັດແລ້ວສຳເລັດ) ❌ ໃຊ້ໜຶ່ງ spec ຂຽນ “ລະບົບຊຳລະເງິນທັງໝົດ” → ✅ ແຍກເປັນ “ສ້າງໃບຊຳລະ”, “ກວດສອບລາຍເຊັນ callback”, “ຄືນເງິນ”

3. ຂະບວນການ Spec Coding ເມື່ອຮ່ວມງານກັບ AI

  1. ຄົນຂຽນ spec (ໂຄງສ້າງຂ້າງເທິງ, ໂດຍສະເພາະຂຽນກໍລະນີທົດສອບ ແລະ ລາຍເຊັນຟັງຊັນ).
  2. ປ້ອນ spec ທັງໝົດໃຫ້ AI (ບໍ່ແມ່ນການສົນທະນາເພີ່ມຄວາມຕ້ອງການ, ຫຼີກລ່ຽງ vibe ປົນ).
  3. AI ສົ່ງອອກລະຫັດ + unit test (AI ຕ້ອງສ້າງ test ທີ່ປະຕິບັດໄດ້ຕາມກໍລະນີທົດສອບໃນ spec).
  4. ດຳເນີນການ test: ຖ້າຜ່ານທັງໝົດ, ກ້າວໄປຂັ້ນຕອນຕໍ່ໄປ; ຖ້າບໍ່ຜ່ານ, ແກ້ໄຂ spec ຫຼື ແກ້ໄຂລະຫັດໂດຍກົງ (ຕອນນີ້ສາມາດເຂົ້າສູ່ວົງຈອນນ້ອຍໄດ້, ແຕ່ຕ້ອງບັນທຶກການປ່ຽນແປງ).
  5. ກວດສອບໂດຍມະນຸດ: ກວດສອບວ່າມີຟັງຊັນນອກ spec ເຂົ້າມາບໍ່ (scope creep), ກວດສອບຄວາມປອດໄພ/ປະສິດທິພາບ.
  6. ເຮັດໃຫ້ຖາວອນ: ສົ່ງເອກະສານ spec ແລະ ລະຫັດສຸດທ້າຍຮ່ວມກັນເຂົ້າ repository, ເປັນເອກະສານຖາວອນ.

ການປະຕິບັດທີ່ສຳຄັນ: Spec ກາຍເປັນລະຫັດ — ໃຊ້ spec.md + test_spec.py, ໂດຍໄຟລ໌ test ມາຈາກຕົວຢ່າງໃນ spec, ດັ່ງນັ້ນເມື່ອແກ້ໄຂລະຫັດພາຍຫຼັງ ພຽງແຕ່ດຳເນີນການ test ກໍ່ສາມາດກວດສອບວ່າ spec ຖືກທຳລາຍຫຼືບໍ່.


4. ຜົນກະທົບຂອງ Spec ທີ່ດີ (ສາມາດໃຊ້ເປັນເກນຮັບຮອງ)

  • ຄວາມແນ່ນອນ: spec ດຽວກັນໃຫ້ກັບ AI ຕ່າງກັນ (ຫຼືຄົນຕ່າງກັນ) ສ້າງຜົນໄດ້ຮັບທີ່ໃກ້ຄຽງກັນ.
  • ການທົດສອບໄດ້: ທັນທີທີ່ຂຽນລະຫັດສຳເລັດ ກໍ່ສາມາດກວດສອບຄວາມຖືກຕ້ອງ 90% ໂດຍອັດຕະໂນມັດ.
  • ການບຳລຸງຮັກສາໄດ້: ຫຼັງ 6 ເດືອນ ຜູ້ໃດກໍ່ສາມາດອ່ານ spec ແລະ ເຂົ້າໃຈເຈດຕະນາການອອກແບບເດີມ.
  • ຕົ້ນທຶນການສື່ສານຕ່ຳ: ໃນທີມງານເວົ້າລົມກັນສະເພາະ spec, ບໍ່ແມ່ນແຖວລະຫັດສະເພາະ.
  • ຄວາມປອດໄພ/ຄຸນນະພາບຖືກສ້າງໃນ: ຂໍ້ກຳນົດດ້ານຄວາມປອດໄພ (ເຊັ່ນ parameterized query) ແລະ ເງື່ອນໄຂຂອບຖືກຂຽນໄວ້ໃນ spec, AI ຕ້ອງປະຕິບັດຕາມ.

5. ຕົວຢ່າງ Spec ທີ່ດີ (ແບບຫຍໍ້ທີ່ສຸດ)

# Spec: API ລົງທະບຽນຜູ້ໃຊ້

## ຂອບເຂດ
- ຮັບ email, password
- ບໍ່ສົ່ງອີເມວຢືນຢັນ, ບໍ່ກວດສອບຄວາມຈິງຂອງອີເມວ

## ສັນຍາ
POST /register
Content-Type: application/json
Request: { "email": string, "password": string }
Response 201: { "user_id": string }
Response 400: { "code": "INVALID_PASSWORD" | "INVALID_EMAIL" }
Response 409: { "code": "EMAIL_ALREADY_EXISTS" }

## ພຶດຕິກຳ
- email ຕ້ອງສອດຄ່ອງກັບຮູບແບບພື້ນຖານ RFC 5322 (a@b.c)
- password: ຄວາມຍາວ 8-20, ຢ່າງໜ້ອຍມີຕົວເລກ 1 ຕົວ ແລະ ຕົວໃຫຍ່ 1 ຕົວ
- ໃຊ້ bcrypt ເຂົ້າລະຫັດເກັບ, ຕົ້ນທຶນເກືອ 10
- ຖ້າກ່ອນເກັບໃນຖານຂໍ້ມູນພົບວ່າ email ມີຢູ່ແລ້ວ → 409

## ກໍລະນີທົດສອບ (ການປ້ອນຂໍ້ມູນ -> ລະຫັດສະຖານະ + ຊ່ອງທີ່ຄາດຫວັງ)
| ປ້ອນ email | password | ຄາດຫວັງ |
|------------|----------|------|
| test@x.com | Pass1234  | 201, user_id ມີຢູ່ |
| test@x.com | pass      | 400, INVALID_PASSWORD |
| bad        | Pass1234  | 400, INVALID_EMAIL |
| (email ທີ່ມີຢູ່ແລ້ວ) | Pass1234 | 409, EMAIL_ALREADY_EXISTS |

## ຄວາມຕ້ອງການທີ່ບໍ່ແມ່ນຟັງຊັນ
- SQL ຕ້ອງໃຊ້ parameterized query (ປ້ອງກັນ injection)
- ບັນທຶກ IP ຕົ້ນກຳເນີດການລົງທະບຽນ, ບໍ່ບັນທຶກ password
- ເວລາຕອບສະໜອງ 95% ຄຳຮ້ອງຂໍ < 100ms (ບໍ່ລວມ bcrypt)

## ການອາໄສ
- Python 3.10+, FastAPI, bcrypt, asyncpg

Spec Coding ທີ່ດີ = ການຂຽນ "ການຕັດສິນໃຈອອກແບບຂອງຄົນ" ໃຫ້ກາຍເປັນ "ກໍລະນີທົດສອບ + ລາຍເຊັນຊະນິດ + ຂໍ້ຈຳກັດພຶດຕິກຳ" ຂອງເຄື່ອງ, ເຮັດໃຫ້ AI ພຽງແຕ່ຮັບຜິດຊອບການຕື່ມການປະຕິບັດ, ແລະ ຄົນຍັງຄວບຄຸມຄຸນນະພາບ ແລະ ທິດທາງຢູ່ສະເໝີ.

评论

暂无已展示的评论。

发表评论(匿名)