ทำให้โค้ดที่สร้างโดยเครื่องมือง่ายต่อการดูแล: กฎสถาปัตยกรรมเรียบง่าย
เรียนรู้วิธีทำให้โค้ดที่สร้างโดยเครื่องมือคงทนด้วยกฎสถาปัตยกรรมเรียบง่าย: ขอบเขตโฟลเดอร์ที่ชัดเจน การตั้งชื่อนิ่งสม่ำเสมอ และค่าเริ่มต้นที่เรียบง่ายเพื่อลดงานแก้ไขในอนาคต

ทำไมการดูแลโค้ดที่สร้างโดยเครื่องมือง่ายยากกว่าเดิม
โค้ดที่สร้างโดยเครื่องมือเปลี่ยนงานประจำวันของทีม คุณไม่ได้สร้างฟีเจอร์อย่างเดียว แต่ยังต้องควบคุมระบบที่อาจสร้างไฟล์จำนวนมากได้เร็ว ความเร็วมาพร้อมความเสี่ยง: ความไม่สอดคล้องเล็กน้อยจะทวีคูณอย่างรวดเร็ว
ผลลัพธ์ที่สร้างมักดูโอเคเมื่อมองแยกชิ้น แต่ค่าใช้จ่ายจะปรากฏเมื่อทำการเปลี่ยนครั้งที่สองหรือสาม: คุณอาจบอกไม่ได้ว่าส่วนนี้ควรอยู่ที่ไหน แก้พฤติกรรมเหมือนกันในสองที่ หรือหลีกเลี่ยงการแก้ไฟล์เพราะไม่แน่ใจว่าจะกระทบอะไรบ้าง
โครงสร้างที่ “ฉลาด” มักแพงเพราะคาดเดายาก รูปแบบกำหนดเอง กลเม็ดลับ และนามธรรมหนา ๆ อาจสมเหตุสมผลในวันแรก แต่ในสัปดาห์ที่หก การเปลี่ยนถัดไปจะช้าเพราะต้องเรียนรู้ทริกก่อนจะอัปเดตได้อย่างปลอดภัย กับการสร้างด้วย AI ความฉลาดแบบนั้นยังสับสนรุ่นต่อไป ทำให้เกิดตรรกะซ้ำซ้อนหรือลำดับชั้นใหม่ๆ
สถาปัตยกรรมเรียบง่ายตรงกันข้าม: ขอบเขตชัดเจน ชื่อชัดเจน และค่าเริ่มต้นที่ชัดเจน ไม่ได้หมายถึงความสมบูรณ์แบบ แต่หมายถึงการเลือกโครงร่างที่เพื่อนร่วมงานที่เหนื่อยล้า (หรือคุณในอนาคต) เข้าใจได้ใน 30 วินาที
เป้าหมายง่ายๆ: ทำให้การเปลี่ยนครั้งถัดไปทำได้ง่าย ไม่ใช่ดูดีน่าประทับใจ นั่นมักหมายถึงที่เดียวชัดเจนสำหรับแต่ละประเภทของโค้ด (UI, API, ข้อมูล, ยูทิลิตี้ที่ใช้ร่วมกัน) ชื่อที่คาดเดาได้ตรงกับสิ่งที่ไฟล์ทำน้อยที่สุด “เวทมนตร์” เช่น การต่อสายอัตโนมัติ ตัวแปรระดับโลกที่ซ่อนอยู่ หรือ metaprogramming ควรถูกลดให้เหลือน้อยที่สุด
ตัวอย่าง: ถ้าคุณให้ Koder.ai เพิ่ม “เชิญทีม” คุณอยากให้มันวาง UI ในพื้นที่ UI เพิ่ม route API หนึ่งตัวในพื้นที่ API และเก็บข้อมูลการเชิญในชั้นข้อมูล โดยไม่ประดิษฐ์โฟลเดอร์หรือรูปแบบใหม่สำหรับฟีเจอร์นั้น ความสม่ำเสมอแบบเรียบง่ายนี้คือสิ่งที่ทำให้การแก้ไขในอนาคตถูกและง่าย
กฎสถาปัตยกรรมเรียบง่าย
โค้ดที่สร้างจะมีต้นทุนสูงเมื่อให้คุณทำสิ่งเดียวกันได้หลายทาง กฎสถาปัตยกรรมเรียบง่ายคือ: ทำให้การเปลี่ยนครั้งถัดไปคาดเดาได้ แม้ว่างานสร้างครั้งแรกอาจดูไม่ฉลาด
คุณควรตอบคำถามต่อไปนี้ได้อย่างรวดเร็ว:
- ฟีเจอร์นี้อยู่ที่ไหน?
- ฉันวางไฟล์ใหม่ที่ไหน?
- ฉันควรตั้งชื่อไฟล์อย่างไร?
- เส้นทางที่เรียบง่ายที่สุดจาก UI ถึงข้อมูลคืออะไร?
กฎ
เลือกโครงสร้างเรียบง่ายแบบหนึ่งแล้วยึดให้ทั่ว เมื่อเครื่องมือ (หรือเพื่อนร่วมงาน) เสนอรูปแบบพิเศษ คำตอบเริ่มต้นคือ “ไม่” เว้นแต่มันจะลดความเจ็บปวดได้จริง
ตัวอย่างค่าเริ่มต้นเชิงปฏิบัติที่ยืนระยะได้:
- หนึ่งความรับผิดชอบต่อโฟลเดอร์และต่อไฟล์ ถ้าไฟล์มีเหตุผลเปลี่ยนสองอย่าง ให้แยกมันออก
- ความคาดเดาได้ชนะความยืดหยุ่น สิ่งเหมือนกันต้องไปที่เดียวกันเสมอ
- เลือกแนวทางมาตรฐานของสแตกคุณมากกว่าการสร้างมินิ-เฟรมเวิร์กของตัวเอง
- ทำเส้นทางปกติให้ชัดเจน ผู้ร่วมงานใหม่ควรเดาตำแหน่งถูกโดยไม่ต้องถาม
- ปฏิเสธ “เวทมนตร์” หลีกเลี่ยงพฤติกรรมที่ซ่อนอยู่ เทคนิคที่พึ่งการสะท้อนมาก ๆ และนามธรรมที่ฉลาดเกินไป
แบบทดสอบความคิดสั้นๆ
จินตนาการว่ามีนักพัฒนาคนใหม่เปิดรีโปของคุณและต้องเพิ่มปุ่ม “ยกเลิกการสมัครสมาชิก” เขาไม่ควรต้องเรียนรู้สถาปัตยกรรมแบบกำหนดเองก่อน เขาควรพบพื้นที่ฟีเจอร์ที่ชัดเจน คอมโพเนนต์ UI ที่ชัดเจน ตำแหน่ง client API เดียว และเส้นทางเข้าถึงข้อมูลเดียว
กฎนี้ใช้ได้ดีเป็นพิเศษกับเครื่องมือสร้างตามบรรยากาศอย่าง Koder.ai: คุณสามารถสร้างได้เร็ว แต่ต้องชี้นำผลลัพธ์ให้ลงในขอบเขตเรียบง่ายเดิมทุกครั้ง
ขอบเขตโฟลเดอร์เรียบง่ายที่เติบโตได้
โค้ดที่สร้างมักเติบโตเร็วที่สุด วิธีปลอดภัยที่สุดที่จะรักษาความสามารถในการดูแลคือแผนที่โฟลเดอร์เรียบง่ายที่ใครๆ ก็เดาได้ว่าการเปลี่ยนอยู่ที่ไหน
เค้าโครงระดับบนขนาดเล็กที่เหมาะกับเว็บแอปหลายชนิด:
app/จอหน้าจอ การกำหนดเส้นทาง และสถานะระดับเพจcomponents/ชิ้น UI ที่นำกลับมาใช้ได้features/โฟลเดอร์ละฟีเจอร์ (billing, projects, settings)api/โค้ด client API และ helper สำหรับการร้องขอserver/ตัวจัดการ backend, บริการ, และกฎทางธุรกิจ
สิ่งนี้ทำให้ขอบเขตชัดเจน: UI อยู่ใน app/ และ components/ การเรียก API อยู่ใน api/ และตรรกะ backend อยู่ใน server/
การเข้าถึงข้อมูลก็ควรเป็นเรื่องเรียบง่าย เก็บคำสั่ง SQL และโค้ด repository ไว้ใกล้ backend ไม่ใช่กระจายอยู่ในไฟล์ UI ในการตั้งค่า Go + PostgreSQL กฎง่ายๆ คือ: HTTP handlers เรียก services, services เรียก repositories, repositories คุยกับฐานข้อมูล
ประเภทและยูทิลิตี้ที่ใช้ร่วมกันควรมีที่ชัดเจน แต่เก็บให้เล็ก ใส่ types ข้ามตัดใน types/ (DTOs, enums, อินเทอร์เฟซที่ใช้ร่วมกัน) และ helper เล็กๆ ใน utils/ (format วันที่, validators ง่ายๆ) หาก utils/ เริ่มเหมือนแอปที่สอง โค้ดนั้นน่าจะอยู่ในโฟลเดอร์ฟีเจอร์แทน
สร้างขึ้นโดยเครื่องมือ vs เขียนด้วยมือ
ปฏิบัติต่อโฟลเดอร์ที่สร้างได้เหมือนทดแทนได้
- วางผลลัพธ์ที่สร้างไว้ใน
generated/(หรือgen/) และหลีกเลี่ยงการแก้ไขโดยตรง - เก็บตรรกะที่กำหนดเองใน
features/หรือserver/เพื่อการสร้างใหม่จะไม่เขียนทับ - หากต้องแพตช์พฤติกรรมที่สร้างขึ้น ให้ห่อมันไว้ (ไฟล์ adapter) แทนการแก้ต้นฉบับ
ตัวอย่าง: ถ้า Koder.ai สร้าง API client เก็บมันไว้ใต้ generated/api/ แล้วเขียน wrapper บางๆ ใน api/ เพื่อเพิ่ม retry, logging หรือข้อความผิดพลาดที่ชัดเจนโดยไม่แตะไฟล์ที่สร้าง
หลักการตั้งชื่อที่ป้องกันความสับสน
โค้ดที่สร้างได้ง่ายและสะสมอย่างรวดเร็ว การตั้งชื่อคือสิ่งที่ทำให้มันอ่านได้หลังจากผ่านไปเดือนหนึ่ง
เลือกสไตล์การตั้งชื่อแบบหนึ่งแล้วอย่าผสม:
- โฟลเดอร์และไฟล์:
kebab-case(user-profile-card.tsx,billing-settings) - คอมโพเนนต์ React:
PascalCase(UserProfileCard) - ฟังก์ชันและตัวแปร:
camelCase(getUserProfile) - ค่าคงที่:
SCREAMING_SNAKE_CASE(MAX_RETRY_COUNT)
ตั้งชื่อตามบทบาท ไม่ใช่วิธีที่มันทำงานวันนี้ user-repository.ts คือบทบาท postgres-user-repository.ts คือรายละเอียดการใช้งานที่อาจเปลี่ยนได้ ใช้คำต่อท้าย implementation ก็ต่อเมื่อคุณมีหลาย implementation จริงๆ
หลีกเลี่ยงลิ้นชักขยะอย่าง misc, helpers, หรือ utils ยักษ์ หากฟังก์ชันถูกใช้แค่ฟีเจอร์เดียว ให้เก็บไว้ใกล้ฟีเจอร์นั้น หากใช้ร่วมกัน ให้ชื่อตั้งตามความสามารถ (date-format.ts, money-format.ts, id-generator.ts) และเก็บโมดูลให้เล็ก
ข้อตกลงที่ทำให้การนำทางเร็ว
เมื่อ routes, handlers, และ components ตามแบบแผน คุณจะหาสิ่งที่ต้องการได้โดยไม่ต้องค้นหา:
- Routes:
routes/users.tsกับ path อย่าง/users/:userId - Handlers (HTTP):
handlers/users.get.ts,handlers/users.update.ts - Services (กฎธุรกิจ):
services/user-profile-service.ts - Data access:
repositories/user-repository.ts - UI components:
components/user/UserProfileCard.tsx
ถ้าคุณใช้ Koder.ai (หรือ generator ใดๆ) ใส่กฎพวกนี้ใน prompt และยึดให้คงที่ระหว่างการแก้ไข จุดสำคัญคือความคาดเดาได้: ถ้าคุณเดาชื่อไฟล์ได้ การเปลี่ยนในอนาคตก็ถูกลง
ค่าเริ่มต้นไม่ซับซ้อน (กฎง่ายๆ)
โค้ดที่สร้างอาจดูน่าประทับใจในวันแรกแต่เจ็บปวดในวันถัดไป เลือกค่าเริ่มต้นที่ทำให้โค้ดชัดเจน แม้จะซ้ำบ้าง
เริ่มจากลดเวทมนตร์ เลิก dynamic loading, เทคนิคที่พึ่งการสะท้อน, และ auto-wiring เว้นแต่มีความจำเป็น ฟีเจอร์เหล่านี้ซ่อนแหล่งที่มาของสิ่งต่างๆ ทำให้การดีบักและรีแฟคเตอร์ช้าลง
เลือกการนำเข้าแบบชัดเจนและพึ่งพาชัดเจน ถ้าไฟล์ต้องใช้บางอย่าง ให้ import โดยตรง หากโมดูลต้องการการเชื่อมต่อ ให้ทำในที่เดียวที่มองเห็นได้ (เช่นไฟล์ composition เดียว) ผู้อ่านไม่ควรเดาว่าอะไรทำงานก่อน
เก็บการกำหนดค่าธรรมดาและรวมศูนย์ วาง environment variables, feature flags, และการตั้งค่าระดับแอปไว้ในโมดูลเดียวที่ใช้รูปแบบการตั้งชื่อเดียว อย่ากระจาย config ไปตามไฟล์สุ่มเพราะดูสะดวก
กฎง่ายๆ ที่ช่วยให้ทีมสอดคล้อง:
- เลือกแบบชัดเจนเหนือแบบนิ่งนัย (imports, routing, DI, ผลข้างเคียง)
- ถ้ามันประหยัด 10 บรรทัดแต่เพิ่มแนวคิดใหม่ ให้ข้ามมัน
- เก็บหนึ่งวิธีในการทำสิ่งเดียว (เครื่องมือ logging เดียว โมดูล config เดียว)
- เลือก data flow ที่เรียบง่ายเหนือ observers หรือ event chain ที่ซ่อนอยู่
- เมื่อดีบัก ให้ลองลบโค้ดฉลาดๆ ก่อน
การจัดการข้อผิดพลาดคือที่ที่ความฉลาดทำร้ายมากที่สุด เลือก pattern เดียวแล้วใช้ให้ทั่ว: คืนค่า error แบบมีโครงสร้างจากชั้นข้อมูล, แมปเป็น HTTP responses ในที่เดียว และแปลเป็นข้อความสำหรับผู้ใช้ที่ขอบ UI อย่าโยน error ถึงสามประเภทในไฟล์ต่างกัน
ถ้าคุณสร้างแอปด้วย Koder.ai ให้ขอค่าเริ่มต้นเหล่านี้ตั้งแต่แรก: การเชื่อมโมดูลแบบชัดเจน, config รวมศูนย์, และ pattern ข้อผิดพลาดแบบเดียว
ขอบเขตระหว่าง UI, API, และข้อมูล
เส้นแบ่งชัดเจนระหว่าง UI, API, และข้อมูลช่วยกักการเปลี่ยนให้อยู่ในที่เดียว ข้อบั๊กที่ลึกลับส่วนใหญ่เกิดเมื่อชั้นหนึ่งเริ่มทำงานของอีกชั้น
UI: แสดงสถานะ รับข้อมูลจากผู้ใช้
ถือว่า UI (มักเป็น React) เป็นที่แสดงหน้าจอและจัดการสถานะเฉพาะ UI: แท็บที่เปิด ข้อผิดพลาดของฟอร์ม สปินเนอร์โหลด และการจัดการ input พื้นฐาน
เก็บสถานะของเซิร์ฟเวอร์แยกออก: รายการที่ดึงมา โปรไฟล์แคช และสิ่งที่ต้องตรงกับ backend เมื่อคอมโพเนนต์ UI เริ่มคำนวณยอด รวมกฎตรวจสอบที่ซับซ้อน หรือกำหนดสิทธิ์ ตรรกะจะกระจายไปทั่วหน้าจอและแก้ไขยาก
API: รูปร่างข้อมูลบางและเสถียร
เก็บชั้น API ให้คาดเดาได้ มันควรแปลง HTTP requests เป็นการเรียกโค้ดธุรกิจ แล้วแปลงผลลัพธ์กลับเป็นรูปแบบ request/response ที่เสถียร หลีกเลี่ยงการส่งโมเดลฐานข้อมูลตรงๆ ทางเครือข่าย รูปแบบตอบกลับที่เสถียรช่วยให้รีแฟคเตอร์ภายในได้โดยไม่ทำลาย UI
เส้นทางง่ายๆ ที่ใช้ได้ดี:
- UI เรียก client API ด้วย request/response ที่มี type
- API handlers ตรวจสอบ input และเรียก service method
- Services ถือกฎธุรกิจและ workflow
- Repositories ซ่อนคำสั่งฐานข้อมูลไว้หลังเมธอดเล็ก ๆ
ข้อมูล: ซ่อนคำสั่งหลัง repository
วาง SQL (หรือ ORM logic) หลัง boundary ของ repository เพื่อที่ส่วนอื่นของแอปจะไม่ “รู้” ว่าข้อมูลถูกเก็บอย่างไร ใน Go + PostgreSQL นั่นมักหมายถึง repositories เช่น UserRepo หรือ InvoiceRepo ที่มีเมธอดเล็ก ๆ ชัดเจน (GetByID, ListByAccount, Save)
ตัวอย่างชัดเจน: การเพิ่ม discount codes UI แสดงช่องและปรับราคา API รับ code และคืน {total, discount} Service ตัดสินใจว่าโค้ดถูกต้องอย่างไรและส่วนลดซ้อนกันได้ไหม Repository ดึงและบันทึกแถวที่ต้องการ
ขั้นตอนทีละข้อ: ตั้งค่าโค้ดที่สร้างให้ดูแลได้
แอปที่สร้างได้อาจดู “เสร็จ” เร็ว แต่โครงสร้างคือสิ่งที่ทำให้การเปลี่ยนถูกลงในอนาคต ตัดสินกฎเรียบง่ายก่อน แล้วสร้างโค้ดพอให้พิสูจน์แนวทาง
กระบวนการตั้งค่าที่ปฏิบัติได้
เริ่มด้วยการวางแผนสั้น ๆ หากคุณใช้ Koder.ai, โหมด Planning เป็นที่ที่ดีในการเขียนแผนที่โฟลเดอร์และกฎการตั้งชื่อก่อนจะสร้างอะไร
แล้วทำตามลำดับนี้:
- กำหนดแผนที่และกฎเป็นลายลักษณ์อักษร เลือกขอบเขต (เช่น:
ui/,api/,data/,features/) และกฎการตั้งชื่อไม่กี่ข้อ - สร้างหนึ่ง vertical slice บาง ๆ เลือกฟีเจอร์เล็กที่แตะ UI, API, และ storage เช่น “สร้าง contact” เป้าหมายคือต้นทางถึงปลายทาง ไม่ใช่ความสมบูรณ์
- รีแฟคเตอร์ทันทีให้ตรงกับขอบเขต ย้ายโค้ดเข้าโฟลเดอร์ที่วางแผน เปลี่ยนชื่อไฟล์ที่ไม่ชัดเจน และลบของซ้ำ แยกฟังก์ชันที่ “ทำทุกอย่าง” ออกเป็น UI, handler, และ data access
- เพิ่มฟีเจอร์ที่สองเพื่อทดสอบรูปแบบ เลือกสิ่งที่คล้ายกัน เช่น “รายการ contacts” ถ้าคุณรู้สึกถูกบังคับให้ละเมิดกฎ ขอบเขตอาจยังไม่ถูกต้อง
- ล็อกข้อตกลงให้เร็ว เพิ่ม
CONVENTIONS.mdสั้น ๆ และถือเป็นสัญญา เมื่อรีโปโตขึ้น การเปลี่ยนชื่อและโครงสร้างจะมีค่าใช้จ่ายสูง
การตรวจสอบความเป็นจริง: ถ้าคนใหม่เดาไม่ออกว่าจะวาง “แก้ไข contact” ที่ไหนโดยไม่ถาม แปลว่าสถาปัตยกรรมยังไม่เรียบพอ
ตัวอย่างสถานการณ์: เพิ่มฟีเจอร์โดยไม่ทำให้ยุ่ง
จินตนาการ CRM ง่าย: หน้าแสดงรายการ contacts และฟอร์มแก้ไข contact คุณสร้างเวอร์ชันแรกเร็ว แล้วสัปดาห์ถัดไปต้องเพิ่ม “แท็ก” ให้ contact
ถือแอปเป็นสามกล่องเรียบง่าย: UI, API, ข้อมูล แต่ละกล่องมีขอบเขตชัดเจนและชื่อชัดเจน ทำให้การเปลี่ยน “แท็ก” เล็กลง
เค้าโครงสะอาดอาจเป็นแบบนี้:
web/src/pages/ContactsPage.tsxและweb/src/components/ContactForm.tsxserver/internal/http/contacts_handlers.goserver/internal/service/contacts_service.goserver/internal/repo/contacts_repo.goserver/migrations/
ตอนนี้ “แท็ก” จะคาดเดาได้: ปรับ schema (ตาราง contact_tags ใหม่หรือคอลัมน์ tags) แล้วแตะทีละชั้น: repo อ่าน/เขียนแท็ก, service ตรวจสอบ, handler เปิดเผยฟิลด์, UI แสดงและแก้ไขมัน อย่าแอบใส่ SQL ใน handlers หรือโยนกฎธุรกิจเข้าไปในคอมโพเนนต์ React
สำหรับการทดสอบและ fixtures เก็บให้เล็กและใกล้โค้ด:
server/internal/service/contacts_service_test.goสำหรับกฎเช่น “ชื่อตั้งแท็กต้องไม่ซ้ำในแต่ละ contact”server/internal/repo/testdata/สำหรับ fixtures ขั้นพื้นฐานweb/src/components/__tests__/ContactForm.test.tsxสำหรับพฤติกรรมฟอร์ม
ถ้าคุณสร้างสิ่งนี้ด้วย Koder.ai กฎเดิมยังใช้อีกหลังการส่งออก: เก็บโฟลเดอร์เรียบง่าย เก็บชื่อตรงไปตรงมา แล้วการแก้ไขจะไม่กลายเป็นงานโบราณคดี
ความผิดพลาดทั่วไปที่ทำให้การเปลี่ยนแพงขึ้น
โค้ดที่สร้างอาจดูสะอาดในวันแรกแต่มีต้นทุนสูงต่อมา บ่อยครั้งสาเหตุไม่ใช่ “โค้ดแย่” แต่เป็นความไม่สอดคล้อง
นิสัยที่แพงคือปล่อยให้ generator ประดิษฐ์โครงสร้างต่างกันทุกครั้ง ฟีเจอร์ลงด้วยโฟลเดอร์ของตัวเอง สไตล์การตั้งชื่อ และ helper ของตัวเอง สุดท้ายคุณมีสามวิธีทำสิ่งเดียว เลือกรูปแบบหนึ่ง เขียนมันลง และพิจารณารูปแบบใหม่เป็นการเปลี่ยนใจ ไม่ใช่ค่าเริ่มต้น
กับดักอีกอันคือผสมชั้นกัน เมื่อคอมโพเนนต์ UI คุยกับฐานข้อมูล หรือ handler สร้าง SQL การเปลี่ยนเล็ก ๆ กลายเป็นการแก้ข้ามทั้งแอป เก็บขอบเขต: UI เรียก API, API เรียก service, service เรียก data access
การใช้ abstraction ทั่วไปเกินไปในช่วงแรกก็มีค่าใช้จ่าย BaseService หรือเฟรมเวิร์ก Repository ดูดีแต่เป็นการคาดเดา เมื่อความจริงเปลี่ยน คุณจะสู้กับเฟรมเวิร์กของตัวเองแทนที่จะส่งของ
การเปลี่ยนชื่อและย้ายไฟล์บ่อยๆ ก็เป็นหนี้เงียบ ถ้าไฟล์ย้ายทุกสัปดาห์ คนจะไม่เชื่อโครงสร้างอีกต่อไปและการแก้ไขด่วนจะลงในที่สุ่ม สร้างแผนที่แล้วรีแฟคเตอร์เป็นช่วงๆ
สุดท้าย ระวังโค้ด "แพลตฟอร์ม" ที่ไม่มีผู้ใช้จริง ไลบรารีร่วมและเครื่องมือภายในจ่ายกลับเมื่อคุณมีความต้องการซ้ำจริงๆ จนกว่าจะถึงตอนนั้น เก็บค่าเริ่มต้นตรงไปตรงมาดีกว่า
เช็คลิสต์สั้นก่อนปล่อย
ถ้าคนใหม่เปิดรีโป เขาควรตอบคำถามเดียวได้เร็ว: “ฉันควรเพิ่มสิ่งนี้ที่ไหน?”
การทดสอบนำทาง 2 นาที
มอบโปรเจกต์ให้เพื่อนร่วมงาน (หรือคุณในอนาคต) แล้วขอให้เขาเพิ่มฟีเจอร์เล็กๆ เช่น “เพิ่มฟิลด์ในแบบสมัครสมาชิก” ถ้าเขาหาไม่ได้เร็ว โครงสร้างยังทำงานไม่ดีพอ
ตรวจสอบสามบ้านที่ชัดเจน:
- การเปลี่ยน UI อยู่ในที่เดียวที่ชัดเจน
- routes/handlers ของ API หาได้ง่ายจาก UI
- แบบข้อมูลและการเปลี่ยนฐานข้อมูลมีตำแหน่งชัดเจน
กฎที่ควรบังคับในการรีวิว
- UI, API, และข้อมูล แต่ละอย่างมีบ้านของตัวเอง และข้อยกเว้นควรน้อย
- ชื่ออ่านเหมือนป้าย ไม่ใช่ปริศนา
- การละชั้นควรถูกแจ้งเตือน (เช่น UI เข้าถึงฐานข้อมูลโดยตรง)
- คำลัดฉลาดๆ ถูกปฏิเสธตามค่าเริ่มต้น
ถ้าแพลตฟอร์มของคุณรองรับ ให้เก็บเส้นทางย้อนกลับ Snapshot และ rollback มีประโยชน์พิเศษเมื่อทดลองโครงสร้างและต้องการทางกลับอย่างปลอดภัย
ขั้นตอนถัดไป: ทำให้เรียบง่ายไว้ แล้วประหยัดต่อ
ความสามารถในการดูแลดีขึ้นเร็วสุดเมื่อคุณเลิกถกเถียงเรื่องสไตล์และเริ่มตัดสินใจไม่กี่เรื่องที่ยึดถือ
เขียนชุดข้อกำหนดสั้นๆ ที่ลดความลังเลในแต่ละวัน: ไฟล์ไปที่ไหน ตั้งชื่ออย่างไร และจัดการข้อผิดพลาดกับ config อย่างไร เก็บสั้นพอที่อ่านได้ในหนึ่งนาที
แล้วทำ cleanup ครั้งเดียวให้เข้ากับกฎเหล่านั้นและหยุดย้ายซ้ำทุกสัปดาห์ การจัดระเบียบบ่อยทำให้การเปลี่ยนครั้งถัดไปช้าลง แม้โค้ดจะดูดีขึ้น
ถ้าคุณสร้างด้วย Koder.ai (koder.ai) การบันทึกข้อกำหนดเหล่านี้เป็น prompt เริ่มต้นจะช่วยให้การสร้างใหม่แต่ละครั้งลงในโครงสร้างเดียวกัน เครื่องมือสามารถไปได้เร็ว แต่ขอบเขตเรียบง่ายคือสิ่งที่ทำให้โค้ดเปลี่ยนได้ง่ายขึ้น
คำถามที่พบบ่อย
“สถาปัตยกรรมเรียบง่าย” หมายถึงอะไรสำหรับโค้ดที่สร้างขึ้น?
ใช้ผังโฟลเดอร์แบบเรียบง่าย ชื่อที่สื่อความตรงตัว และเส้นทางเดียวจาก UI ไปยัง API และข้อมูล เป้าหมายคือให้ใครก็ตามวางการเปลี่ยนแปลงไว้ถูกที่ได้ โดยไม่ต้องเรียนรู้รูปแบบเฉพาะก่อน
เหตุใดโค้ดที่ AI สร้างจึงดูแลรักษายากกว่า?
โค้ดที่สร้างขึ้นเพิ่มไฟล์ได้อย่างรวดเร็ว ความไม่สอดคล้องเล็กน้อยจึงแพร่กระจายได้ไว โครงสร้างที่คาดเดาได้ช่วยไม่ให้การแก้ไขครั้งที่สองและสามกลายเป็นการค้นหาลอจิกซ้ำซ้อนและโฟลเดอร์ที่ไม่คุ้นเคย
เว็บแอปที่สร้างขึ้นควรใช้โฟลเดอร์ใดบ้าง?
จุดเริ่มต้นที่ใช้งานได้จริงคือ app/ สำหรับหน้าจอและการกำหนดเส้นทาง components/ สำหรับ UI ที่นำกลับมาใช้ได้ features/ สำหรับโค้ดเฉพาะฟีเจอร์ api/ สำหรับคำขอจากไคลเอนต์ และ server/ สำหรับลอจิกแบ็กเอนด์ รักษาขอบเขตแบบเดียวกันไว้สำหรับทุกฟีเจอร์
ฉันควรตั้งชื่อไฟล์และโค้ดที่สร้างขึ้นอย่างไร?
ใช้รูปแบบเดียวอย่างสม่ำเสมอ: kebab-case สำหรับไฟล์และโฟลเดอร์ PascalCase สำหรับคอมโพเนนต์ React camelCase สำหรับฟังก์ชัน และ SCREAMING_SNAKE_CASE สำหรับค่าคงที่ ตั้งชื่อไฟล์ตามหน้าที่ เช่น user-repository.ts หรือ money-format.ts
ฉันจะแยกโค้ด UI, API และฐานข้อมูลอย่างไร?
ให้โค้ด UI มุ่งที่การแสดงผลและการรับข้อมูล ให้ตัวจัดการ API ตรวจสอบคำขอและส่งคืนการตอบกลับที่คงที่ วางกฎทางธุรกิจไว้ในบริการ และเก็บคำสั่ง SQL หรือการเรียก ORM ไว้ในรีโพซิทอรี แต่ละชั้นควรเรียกชั้นถัดไปแทนที่จะทำงานของชั้นนั้นเอง
ฉันควรแก้ไขไฟล์ที่สร้างขึ้นโดยตรงหรือไม่?
เก็บผลลัพธ์ที่สร้างขึ้นไว้ในโฟลเดอร์เฉพาะ เช่น generated/ หรือ gen/ และหลีกเลี่ยงการแก้ไขโดยตรง เขียน wrapper หรือ adapter ที่กำหนดเองไว้นอกโฟลเดอร์นั้น เพื่อให้สร้างโค้ดใหม่ได้โดยไม่สูญเสียการเปลี่ยนแปลงของคุณ
ฉันควรหลีกเลี่ยงรูปแบบ “ฉลาดเกินไป” แบบใดบ้าง?
หลีกเลี่ยง global ที่ซ่อนอยู่ การเชื่อมต่ออัตโนมัติ การโหลดแบบไดนามิก และ abstraction ที่เพิ่มแนวคิดใหม่เพียงเพื่อประหยัดไม่กี่บรรทัด เลือกใช้ import โดยตรง การตั้งค่าที่รวมศูนย์ และการตั้งค่าโมดูลที่มองเห็นได้
ฉันจะตั้งค่าโปรเจกต์ที่สร้างขึ้นให้ดูแลรักษาง่ายได้อย่างไร?
เริ่มจากฟีเจอร์ขนาดเล็กที่ทำงานครบทุกส่วน เช่น การสร้างรายชื่อติดต่อ สร้างโค้ดให้ฟีเจอร์นั้น ย้ายส่วนที่ไม่ชัดเจนไปยังโฟลเดอร์ที่วางแผนไว้ ลบส่วนซ้ำซ้อน แล้วสร้างฟีเจอร์ที่คล้ายกันอีกหนึ่งฟีเจอร์เพื่อดูว่าโครงสร้างยังดูเป็นธรรมชาติหรือไม่
ฉันจะรักษาความสม่ำเสมอของผลลัพธ์จาก Koder.ai ได้อย่างไร?
กำหนดกฎให้ตัวสร้างอย่างชัดเจนก่อนการเปลี่ยนแปลงแต่ละครั้ง: ผังโฟลเดอร์ รูปแบบการตั้งชื่อ ขอบเขตของแต่ละชั้น และรูปแบบการจัดการข้อผิดพลาด สำหรับ Koder.ai คุณสามารถบันทึกกฎเหล่านี้ไว้ในพรอมต์การวางแผน เพื่อให้งานใหม่ทำตามโครงสร้างเดียวกัน
ฉันจะตรวจสอบได้อย่างไรว่าโปรเจกต์ของฉันแก้ไขเปลี่ยนแปลงได้ง่าย?
ขอให้ใครสักคนเพิ่มการเปลี่ยนแปลงเล็ก ๆ เช่น ฟิลด์สมัครใช้งาน โดยไม่ให้คำแนะนำ หากพวกเขาหา UI ตัวจัดการ API บริการ และตำแหน่งข้อมูลได้อย่างรวดเร็ว โปรเจกต์นั้นก็ทำงานต่อได้ง่าย หากไม่ใช่ ให้ทำผังให้ง่ายขึ้นก่อนที่โปรเจกต์จะขยายใหญ่กว่านี้