Shipping Assumptions: ความท้าทายระบบโค้ด AI
เจาะลึกวิกฤตการพัฒนาซอฟต์แวร์ด้วย AI เมื่อโค้ดที่สะอาดตาซ่อนข้อสมมติที่มองไม่เห็น และแนวทางแก้ปัญหาด้วย C4 Model, TLA+, และ DST

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- การพัฒนาซอฟต์แวร์ด้วย AI เร่งความเร็วในการสร้างโค้ดจนเกิดช่องว่างระหว่างคอมโพเนนต์
- โค้ดที่ผ่านการคอมไพล์และทดสอบเบื้องต้นอาจซ่อนข้อสมมติและขอบเขตที่ไม่ชัดเจนไว้
- การจัดการความน่าเชื่อถือต้องอาศัยชุดเครื่องมืออย่าง C4 Model, TLA+ และ DST
- มนุษย์ยังคงมีหน้าที่ตรวจสอบความตั้งใจและสร้างโมเดลร่วมกับเครื่องมืออัตโนมัติ
โค้ดดูดี ไม่มีข้อผิดพลาดทางไวยากรณ์ และการทดสอบระดับตื้นผ่านทั้งหมด ทีมงานต่างรู้สึกมั่นใจว่าพวกเขาได้สร้างสิ่งที่ถูกต้องขึ้นมาแล้ว แต่ในไม่ช้า ปัญหาเฉพาะหน้า (Edge Case) ก็ปรากฏขึ้นในระบบจริง
นักพัฒนาซอฟต์แวร์มักมองเรื่องนี้ว่าเป็นกระบวนการทำงานปกติ บั๊กเกิดขึ้นได้ ตั๋วปัญหาถูกส่งเข้ามา และแพตช์ถูกปล่อยออกไป ในขณะที่ทีมประกันคุณภาพ (QA) ถูกตั้งคำถามว่าเหตุใดจึงมองไม่ไม่เห็นข้อผิดพลาดนี้ตั้งแต่แรก แต่ความจริงคือ QA ไม่เคยได้รับโมเดลของระบบ พวกเขาได้รับเพียงชิ้นส่วนของโค้ดที่เต็มไปด้วยข้อสมมติซึ่งพวกเขาต้องมาแกะรอยย้อนหลังเอาเอง
นี่กำลังกลายเป็นรูปแบบความล้มเหลวที่เด่นชัดที่สุดของการพัฒนาซอฟต์แวร์ที่อาศัย AI เราสามารถสร้างโค้ดได้เร็วกว่าที่เราจะเข้าใจระบบที่โค้ดเหล่านั้นสร้างขึ้น อันตรายไม่ได้จำกัดอยู่แค่ฟังก์ชันที่ผิดพลาดหรือข้อผิดพลาดทางไวยากรณ์อีกต่อไป แต่มันซ่อนอยู่ในพื้นที่ระหว่างคอมโพเนนต์ ได้แก่ ขอบเขต, การเปลี่ยนผ่านของสถานะ, โหมดความล้มเหลว และเงื่อนไขคงที่ (Invariants)

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
เราไม่ได้เพียงแค่ส่งมอบโค้ดออกไปใช้งาน แต่เรากำลังส่งมอบข้อสมมติที่เรามองไม่เห็นอีกต่อไป เครื่องมือตรวจจับข้อผิดพลาด (Linter) สามารถบอกเราได้ว่าโค้ดปฏิบัติตามกฎเฉพาะหน้าหรือไม่ การทดสอบสามารถบอกได้ว่าตัวอย่างที่เลือกสรรมาให้ผลลัพธ์ตามที่คาดหวังหรือไม่ แต่ไม่มีเครื่องมือใดบอกได้ว่าระบบต้องรักษาอะไรไว้บ้างเว้นแต่จะมีใครสักคนระบุออกมาก่อน
การพึ่งพา AI ในการเขียนโค้ดช่วยลดต้นทุนและเวลาในการพัฒนาอย่างมหาศาล แต่ในขณะเดียวกันก็สร้างความเสี่ยงเชิงโครงสร้าง เนื่องจาก AI มักสร้างผลลัพธ์ที่ดูสมเหตุสมผลในระดับท้องถิ่น (Local) โดยขาดภาพรวมของสถาปัตยกรรมระบบ การนำเครื่องมือสร้างโมเดลเชิง formal มาใช้จึงเปรียบเสมือนการดึงสติและสร้างเชือกยึดโยงระหว่างความตั้งใจของมนุษย์กับผลลัพธ์ของเครื่องจักร
เงื่อนไขคงที่ (Invariant) คือหนึ่งในคำกล่าวอ้างเหล่านั้น นั่นคือเงื่อนไขที่ต้องเป็นจริงเสมอในทุกสถานะที่ถูกต้องของระบบ ยอดเงินในบัญชีไม่สามารถเปลี่ยนแปลงได้โดยไม่มีธุรกรรมที่สอดคล้องกัน วัตถุที่เป็นส่วนตัวไม่สามารถกลายเป็นสาธารณะได้โดยไม่มีการอนุญาต และการเขียนข้อมูลที่สำเร็จสองครั้งต้องไม่ลบข้อมูลซึ่งกันและกันอย่างเงียบเชเชียบ
เมื่อเงื่อนไขคงเหล่านี้ยังคงซ่อนเร้น โค้ดที่สะอาดตาจึงยังคงประกอบกันเป็นระบบที่ไร้ระเบียบได้ คอมโพเนนต์แต่ละตัวอาจดูสมเหตุสมผลเมื่อมองแยกส่วน ขณะที่ความล้มเหลวรอคอยอยู่ในกระบวนการเปลี่ยนผ่าน การลองใหม่ สภาวะแข่งขน (Race condition) หรือขอบเขตที่ไม่มีใครคิดจะขีดเส้นเอาไว้
นี่คือพื้นที่ที่การพัฒนาด้วย AI กำลังเติมเต็มด้วยโค้ดอย่างรวดเร็ว ไม่มี “ยุคทอง” ที่นักพัฒนาทุกคนเขียนข้อกำหนดอย่างเป็นทางการก่อนที่จะสัมผัสโปรแกรมแก้ไขข้อความ ระบบซอฟต์แวร์ในอดีตก็เต็มไปด้วยข้อสมมติที่ซ่อนอยู่เช่นกัน และความโหยหาอดีตมักจะลบส่วนที่ไม่สะดวกออกไปเสมอ
แต่วิชาชีพซอฟต์แวร์ได้พัฒนาวินัยในการให้เหตุผลที่เหนือกว่าตัวโค้ด ได้แก่ โมเดลสถาปัตยกรรม, เครื่องมือจำกัดสถานะ, ข้อกำหนดอย่างเป็นทางการ, การตรวจสอบโมเดล, การจำลองข้อผิดพลาด และการจำลองแบบกำหนดผลลัพธ์ได้ เรามักจะสงวนสิ่งเหล่านี้ไว้สำหรับระบบที่ความล้มเหลวมีราคาแพงเห็นได้ชัด ส่วนที่เหลือ ความเข้มงวดถูกปฏิบัติราวกับเป็นต้นทุนที่ต้องลดให้เหลือน้อยที่สุด
"C4 maps the system. TLA+ states what must remain true. DST tries to make it false."
Dev.to
C4 Model มอบลำดับชั้นให้ทีมซอฟต์แวร์ใช้ในการมองเห็นระบบ ได้แก่ บริบท (Context), คอนเทนเนอร์ (Containers), คอมโพเนนต์ (Components) และโค้ด (Code) มันทำงานเหมือนแผนที่ที่มีระดับการซูม ตั้งแต่มุมมองกว้างที่สุดที่มองเห็นผู้ใช้และระบบข้างเคียง ไปจนถึงการซูมเข้าไปยังแอปพลิเคชัน คลังข้อมูล และบริการต่างๆ
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น