ป้ายกำกับ: Srs

คู่มือการเขียนเอกสาร SRS (Software Requirements Specification): โครงสร้าง มาตรฐาน และตัวอย่างจริงคู่มือการเขียนเอกสาร SRS (Software Requirements Specification): โครงสร้าง มาตรฐาน และตัวอย่างจริง

ในฐานะ Senior Architect การพัฒนาซอฟต์แวร์ไม่ได้เริ่มต้นจากการเขียนโค้ด แต่เริ่มต้นจากการสร้างความเข้าใจร่วมกัน (Shared Understanding) ระหว่างผู้มีส่วนได้ส่วนเสียและทีมเทคนิค เอกสารข้อกำหนดซอฟต์แวร์ (SRS: Software Requirements Specification) จึงไม่ใช่แค่เอกสารทางธุรการ แต่คือ ‘สัญญา’ ทางวิศวกรรมที่สำคัญที่สุดของโครงการ

หาก SRS มีความคลุมเครือ หรือขาดโครงสร้างที่เป็นมาตรฐาน ก็เปรียบเสมือนการพยายาม Query ข้อมูลจากตารางที่ไม่มี Primary Key ที่ชัดเจน ซึ่งจะนำไปสู่ Scope Creep และความล้มเหลวของระบบในท้ายที่สุด บทความนี้คือคู่มือเชิงลึกที่จะพาคุณเจาะลึกถึงองค์ประกอบ โครงสร้างมาตรฐาน และวิธีการจัดการข้อกำหนดด้วยมุมมองระดับสถาปนิก โดยใช้หลักการคิดแบบฐานข้อมูลที่แม่นยำอย่าง PostgreSQL มาเป็นแนวทางในการจัดระเบียบความคิด

โครงสร้าง SRS: การจำแนกประเภทข้อกำหนด (Functional vs. Non-functional)

หัวใจของการเขียน SRS คือการแยกแยะความต้องการออกเป็นสองกลุ่มหลัก ซึ่งเปรียบเสมือนการแบ่งข้อมูลในตารางให้ชัดเจน:

  • Functional Requirements (FR): สิ่งที่ระบบต้องทำได้จริง (The ‘What’). เช่น ระบบต้องอนุญาตให้ผู้ใช้ทำการ Reset Password ได้ผ่านอีเมล นี่คือฟังก์ชันเฉพาะเจาะจงที่สามารถเขียนเป็น Use Case หรือ User Story ได้
  • Non-functional Requirements (NFR): คุณสมบัติเชิงคุณภาพของระบบ (The ‘How Well’). สิ่งเหล่านี้กำหนดขีดจำกัดและมาตรฐาน เช่น ประสิทธิภาพต้องรองรับผู้ใช้งานพร้อมกัน 10,000 คนต่อวินาที (Scalability) หรือข้อมูลทั้งหมดต้องถูกเข้ารหัสตามมาตรฐาน AES-256 (Security)

ในมุมมองของ PostgreSQL เราสามารถใช้โครงสร้างแบบ JSONB เพื่อจัดเก็บ Metadata ของข้อกำหนดแต่ละรายการได้อย่างมีประสิทธิภาพ โดยที่แต่ละ Requirement ID จะเป็น Primary Key ที่ไม่ซ้ำกัน และมีการระบุ Type (FR/NFR) อย่างชัดเจน

การจัดการความสัมพันธ์และลำดับความสำคัญของข้อกำหนดด้วย CTE

ในโครงการขนาดใหญ่ ข้อกำหนดมักมีความเกี่ยวข้องกันอย่างซับซ้อน การเปลี่ยนแปลง Requirement A อาจส่งผลกระทบต่อ Requirement B และ C นี่คือจุดที่เทคนิค Recursive Common Table Expression (CTE) ของ PostgreSQL เข้ามาช่วยจำลองการวิเคราะห์ความสัมพันธ์ของข้อกำหนดได้เป็นอย่างดี

SQL

-- สมมติว่าเรามีตาราง requirements ที่เก็บ ID, คำอธิบาย และ Parent_ID
WITH RECURSIVE requirement_dependency AS (
    SELECT req_id, description, 1 AS level FROM requirements WHERE parent_id IS NULL -- เริ่มต้นจากข้อกำหนดหลัก
    UNION ALL
    SELECT r.req_id, r.description, d.level + 1 
    FROM requirements r JOIN requirement_dependency d ON r.parent_id = d.req_id
)
SELECT * FROM requirement_dependency ORDER BY level;

การใช้ CTE นี้ช่วยให้เราสามารถ ‘Unnest’ (คลี่) ความสัมพันธ์ของข้อกำหนดทั้งหมดออกมาเป็นลำดับชั้น ทำให้ทีมพัฒนาเห็นภาพรวมของการพึ่งพาอาศัยกัน (Dependency Mapping) และทราบว่าหากมีการเปลี่ยนแปลงที่ระดับราก (Root Requirement) จะส่งผลกระทบต่อส่วนใดบ้าง

แนวทางปฏิบัติที่ดีที่สุด: การลดความคลุมเครือและการตรวจสอบ

  1. Atomic Requirements: แต่ละข้อกำหนดต้องเป็นอิสระและสามารถทดสอบได้ด้วยเกณฑ์ที่ชัดเจน (Testable). ห้ามรวมหลายฟังก์ชันไว้ใน Requirement เดียว
  2. Traceability Matrix: ต้องมีการเชื่อมโยงทุกข้อกำหนดกลับไปยัง Business Goal หรือ Use Case ต้นทางเสมอ เพื่อให้มั่นใจว่าไม่มี ‘Feature’ ใดถูกเพิ่มเข้ามาโดยไร้เหตุผล
  3. Acceptance Criteria: ทุก FR ควรมี Acceptance Criteria ที่ระบุเป็นเกณฑ์การยอมรับที่วัดผลได้ (Measurable) เสมือนกับการเขียน Test Case สำหรับแต่ละ Requirement ID

สรุปแล้ว การเขียน SRS ไม่ใช่แค่การรวบรวมรายการฟีเจอร์ แต่คือกระบวนการวิเคราะห์เชิงสถาปัตยกรรมเพื่อสร้าง ‘Schema’ ของระบบให้แข็งแกร่งที่สุด ด้วยการใช้หลักการจัดโครงสร้างข้อมูลที่แม่นยำอย่าง PostgreSQL เราสามารถลดความเสี่ยงของโครงการได้อย่างมีนัยสำคัญ ทำให้ทุกฝ่ายเข้าใจตรงกันตั้งแต่ก้าวแรกของการลงมือปฏิบัติจริง