‹

07 · วิศวกรรมซอฟต์แวร์

07 · ​วิศวกรรม​ซอฟต์แวร์

​ชั้นนี้​คือ​จุด​ที่​โปรแกรม​เลิก​เป็น​ข้อความ​ที่​รัน​ได้ ​และ​กลายเป็น​วัตถุ​ที่​ต้อง​รอด​จาก​การถูก​แก้

​ซอฟต์แวร์​ไม่​มี​ชิ้นส่วน​ที่​เคลื่อนไหว​สัก​ชิ้น ​แล้ว​ทำไม​มัน​ถึง​ผุ (rot)?

​วันที่ 1 ​สิงหาคม 2012 Knight Capital ​บริษัท​เทรด​หุ้น ​ปล่อย​โค้ด​ใหม่​ลง​เซิร์ฟเวอร์​แปด​เครื่อง​ที่​ส่ง​คำสั่ง​ซื้อขาย​ไป​ตลาดหุ้น​นิวยอร์ก ​โค้ด​ไป​ถึง​เจ็ด​เครื่อง ​เครื่อง​ที่​แปด​ยังมี​รูทีน​ชื่อ Power Peg ​ค้าง​อยู่ ​บริษัท​เลิกใช้​มัน​ตั้งแต่​ปี 2003 ​และ​ไม่​เคย​ลบทิ้ง ​โค้ด​ใหม่​หยิบ feature flag ​ตัว​เก่า​มา​ใช้​ซ้ำ ​และ​บน​เครื่อง​นั้น​เครื่อง​เดียว ​มัน​ปลุก​รูทีน​ที่​ตาย​ไป​แล้ว​ให้​ทำงาน​อีกครั้ง ​ใน​เวลา​ราว 45 ​นาที Knight ​ยิง​คำสั่ง​ซื้อขาย​ที่​ไม่​ได้​ตั้งใจ​นับ​ล้าน​รายการ​เข้า​ตลาด ​ขาดทุน 460 ​ล้าน​ดอลลาร์ ​มากกว่า​มูลค่า​ทั้ง​บริษัท ​คำสั่ง​ของ Securities and Exchange Commission ​บันทึก​รายละเอียด​ไว้​อีก​จุด​หนึ่ง ​โค้ด​ที่​หลับใหล​ตัว​นี้​ถูก​แตะ​ครั้งสุดท้าย​ใน​ปี 2005 ​ตอนที่​ฟังก์ชัน​ที่​มัน​พึ่งพา​ถูก​ย้าย​ไป​อยู่​ที่อื่น ​และ​ไม่​มี​ใคร​เทสต์​ซ้ำ​ว่า​สอง​ส่วน​นั้น​ยัง​เข้ากันได้ (SEC Release 34-70694, 2013) Knight ​จ่าย​ค่าปรับ 12 ​ล้าน​ดอลลาร์ ​และ​อยู่​ไม่​ถึง​สิ้นปี​ใน​ฐานะ​บริษัท​อิสระ

​ไม่​มี​บรรทัด​ไหน​ของ Power Peg ​เปลี่ยนไป​เลย​ตลอด​เก้า​ปี ​ความยาก​ทั้งหมด​ของ​ชั้นนี้​อยู่​ตรงนั้น ​ซอฟต์แวร์​ไม่​มี​ตลับ​ลูกปืน​ให้​สึก ​ไม่​มี​โลหะ​ให้​ล้า ​ไม่​มี​ชิ้นส่วน​หลุด​พิกัด​ความคลาดเคลื่อน ​โปรแกรม​ที่​ทิ้ง​ไว้​เฉยๆ ​จะ​คำนวณ​พรุ่งนี้​เหมือน​ที่​คำนวณ​วันนี้​เป๊ะ ​สิ่ง​ที่​ขยับ​คือ​ทุกอย่าง​รอบตัว​มัน — ​ฮาร์ดแวร์​ข้างล่าง ​ไลบรารี​ข้างๆ ​กฎระเบียบ​ข้างบน ​และ​คน​ที่​เคย​เข้าใจ​มัน Meir Lehman ​ตั้งชื่อ​เรื่อง​นี้​ไว้​ใน​ทศวรรษ 1970 ​เป็น​กฎ​ข้อ​แรก​ใน​กฎ​วิวัฒนาการ​ซอฟต์แวร์​ของ​เขา ​โปรแกรม​ที่​ฝัง​อยู่​ใน​โลก​จริง​ต้อง​ถูกปรับ​ตัวต่อเนื่​อง ​ไม่อย่างนั้น​มัน​จะ​ใช้การได้​แย่​ลง​ทีละน้อย ​กฎ​ข้อ​สอง​คือ​หนาม​ที่ซ่อน​อยู่​ท้าย​เรื่อง ​เมื่อ​โปรแกรม​แบบนี้​วิวัฒนาการ​ไป ​ความซับซ้อน​ของ​มัน​เพิ่มขึ้น​เสมอ ​เว้นแต่​จะ​มี​คน​ตั้งใจ​ลงแรง​กด​มัน​เอาไว้ (Lehman, Proc. IEEE 68(9), 1980) ​ผุ ​ไม่​ใช่​การเสื่อม​ของ​ตัว​วัตถุ ​แต่​คือ​พื้น​ใต้เท้า​มัน​เคลื่อน

​ศาสตร์​นี้​จึง​ไม่​ใช่​การศึกษา​เรื่อง​การเขียน​โปรแกรม ​วิศวกร​ของ Google ​สรุปความ​ต่าง​ไว้​ใน​ประโยค​เดียว "​วิศวกรรม​ซอฟต์แวร์​คือ​การเขียน​โปรแกรม​ที่​ถูก​อินทิเกรต​ไป​ตามเวลา" (software engineering is programming integrated over time) (Winters, Manshreck & Wright, 2020) ​การเขียน​โปรแกรม​ผลิต​สิ่ง​ที่ทำงาน​ได้ ​วิศวกรรม​ผลิต​สิ่ง​ที่​ทำให้​กลับมา​ทำงาน​ได้​อีก ​โดย​คนอื่น ​หลัง​พื้น​ใต้เท้า​มัน​เคลื่อน​ไป​แล้ว ​สคริปต์​ที่​รัน​ครั้ง​เดียว​แล้ว​ทิ้ง​ไม่ต้องการ​อะไร​จาก​ชั้นนี้​เลย ​ระบบ​จ่ายเงินเดือน​ที่​ยัง​รัน​อยู่​ใน​ปี 2040 ​ต้องการ​ทุกอย่าง

​สิ่ง​แรก​ที่​ชั้นนี้​ต้อง​ยอมรับ​คือ​ความยาก​บางส่วน​กำจัด​ไม่​ได้ Fred Brooks ​ผู้​เคย​คุม​โครงการ OS/360 ​ของ IBM — ​โครงการ​เขียน​โปรแกรม​ที่​ใหญ่​ที่สุด​ใน​ยุค​นั้น ​และ​เป็นการ​ดิ้นรน​ที่​โด่งดัง — ​แบ่งงาน​ออก​เป็น​สอง​ส่วน ​ส่วน​แรก​คือ​งาน ​เนื้อแท้ (essential) ​หรือ "​การปั้น​แต่ง​โครงสร้าง​เชิง​มโนทัศน์​ที่​ซับซ้อน​ซึ่ง​ประกอบ​กัน​ขึ้น​เป็นตัว​ตน​ซอฟต์แวร์​เชิง​นามธรรม" (the fashioning of the complex conceptual structures that compose the abstract software entity) ​ส่วน​ที่สอง​คือ​งาน ​บังเอิญ (accidental) ​คือ​แรงงาน​ที่​แทน​โครงสร้าง​เหล่านั้น​ด้วย​ภาษา​หนึ่ง​แล้ว​เอา​ขึ้น​เครื่อง​จริง​ให้ได้ (No Silver Bullet, 1986) ​เครื่องมือ​ที่​ดีขึ้น​โจมตี​ความซับซ้อน​โดยบังเอิญ (accidental complexity) ​และ​โจมตี​ได้​ยอดเยี่ยม ​ทุกวันนี้​ไม่​มี​ใคร​สู้​กับ​คอมไพเลอร์​เป็น​อาทิตย์​อีกแล้ว ​แต่​ความซับซ้อน​โดย​เนื้อแท้ (essential complexity) ​คือ​สเปก​ของ​สิ่ง​ที่​งาน​นั้น​ต้อง​ทำ​จริงๆ ​พัน​กัน​ยุ่ง​อยู่​กับ​ทุกอย่าง​อื่น​ที่​มัน​ต้อง​ทำ​ด้วย ​และ​ไม่​มี​สัญกรณ์​ไหน​คลาย​ข้อกำหนด (requirement) ​ที่​พัน​กัน​ให้​กลายเป็น​เรื่อง​ง่าย​ได้ Brooks ​จึง​ทำนาย​ว่า​จะ​ไม่​มี​ความก้าวหน้า​จุด​เดียว​ที่​ทำให้​ดีขึ้น​สิบ​เท่า​ภายใน​สิบ​ปี ​เพราะ​ส่วนที่เหลือ​ไม่​เคย​เป็นเรื่อง​ของ​เครื่องมือ​ตั้งแต่​ต้น

​ความซับซ้อน​กำจัด​ไม่​ได้ ​แต่ ​กัก​ไว้ ​ได้ ​และ​นี่​คือ​ไอเดีย​เชิง​โครงสร้าง​ที่​ยิ่งใหญ่​หนึ่งเดียว​ของ​ศาสตร์​นี้ David Parnas ​ถาม​ว่า​อะไร​ทำให้​การแตก​ระบบ​เป็น​มอดูล (module) ​ดี ​แล้ว​ปฏิเสธ​คำตอบ​ที่​ดู​ชัด​ที่สุด ​คือ​มอดูล​ควร​สะท้อน​ขั้นตอน​ของ​กระบวนการ ​เกณฑ์​ของ​เขา​เป็น​อีก​อย่าง ​มอดูล​แต่ละ​ตัว​ถูก​กำหนด​โดย​การรู้​การตัดสินใจ​เชิง​ออกแบบ​หนึ่ง​อย่าง​ที่​มัน​ซ่อน​ไว้​จาก​มอดูล​อื่น​ทั้งหมด ​อินเทอร์เฟซ​ของ​มัน​ถูก​เลือก​ให้​เปิดเผย​การทำงาน​ภายใน​น้อยที่สุด​เท่าที่​จะ​ทำได้ (Parnas, CACM 15(12), 1972) ​มอดูล​คือ​การเดิมพัน​ว่า​อะไร​จะ​เปลี่ยน ​ซ่อน​การตัดสินใจ​ที่จะ​เปลี่ยน ​การเปลี่ยนแปลง​ก็​อยู่​เฉพาะที่ ​เปิด​มัน​ออกมา ​การเปลี่ยนแปลง​ก็​ลาม​ไป​ทั่ว feature flag ​ของ Knight Capital ​คือ​ความล้มเหลว​แบบนี้​ที่​ปรากฏ​ให้​เห็น​เป๊ะๆ ​ชื่อ​เดียว​ที่​โค้ด​ใหม่​ใช้​ร่วมกับ​โค้ด​ที่​ไม่​มี​ใคร​จำได้ ​การเกาะ​เกี่ยว (coupling) ​ที่​มี​อยู่​จริง​ใน​เครื่อง ​แต่​ไม่​มี​อยู่​ใน​หัว​ใคร

​เครื่องมือ​ที่​ทำให้​การเปลี่ยนแปลง​รอด​ได้​คือ​เทสต์ (test) ​และ​พลัง​ของ​มัน​แคบ​กว่า​ที่​ตา​เห็น​มาก ​ข้อสรุป​ของ Dijkstra ​ตรง​เป๊ะ "​การเทสต์​โปรแกรม​ใช้​แสดง​การมี​อยู่​ของ​บั๊ก​ได้ ​แต่​ไม่​มีทาง​ใช้​แสดงว่า​บั๊ก​ไม่​มี​อยู่​ได้​เลย!" (Program testing can be used to show the presence of bugs, but never to show their absence!) (EWD249) ​ชุด​เทสต์ (test suite) ​ไม่​ได้​พิสูจน์​อะไร​เกี่ยวกับ​ระบบ​ทั้ง​ระบบ​เลย ​สิ่ง​ที่​มัน​ทำ​คือ​แปลง​ความหวัง — ​น่าจะ​ยัง​ทำงาน​ได้​อยู่ — ​ให้​เป็น​ข้อกล่าวอ้าง​ที่​เจาะจง​และ​ตรวจ​ซ้ำ​ได้​ด้วย​กลไก ​ระบบ​ใหญ่​จะ​แก้​ได้มาก​เท่าที่​มัน​แบก​ข้อกล่าวอ้าง​แบบ​นั้น​ไว้ ​ระบบ​ควบคุม​เวอร์ชัน (version control) ​ทำงาน​เดียวกัน​นี้​กับ​ประวัติศาสตร์​แทน​พฤติกรรม ​นับ​จาก Git ​ใน​เดือน​เมษายน 2005 (Torvalds) ​อดีต​ของ​โปรเจกต์​กลายเป็น​วัตถุ​ที่​คิว​รี​ได้ ​และ​คำถาม​ว่า "​ทำไม​บรรทัด​นี้​ถึง​อยู่​ตรงนี้" ​มี​คำตอบ​ที่อยู่​ยืน​กว่า​คนเขียน​มัน

​หลักการ​ข้อ​สุดท้าย​คือ​ข้อ​ที่​คน​ทำงาน​จริง​ค้นพบ​ช้า​ที่สุด Melvin Conway ​เขียน​ไว้​ใน Datamation ​เดือน​เมษายน 1968 ​ว่า "​องค์กร​ใด​ก็ตาม​ที่​ออกแบบ​ระบบ​หนึ่ง … ​จะ​ผลิต​งาน​ออกแบบ​ที่​มี​โครงสร้าง​เป็น​สำเนา​ของ​โครงสร้าง​การสื่อสาร​ใน​องค์กร​นั้น" (Any organization that designs a system … will produce a design whose structure is a copy of the organization's communication structure) (Conway's law) ​สอง​ทีม​ที่​แทบ​ไม่​คุย​กัน​จะ​สร้าง​สอง​ส่วนประกอบ​ที่​มี​อินเทอร์เฟซ​บางเบา ​เปราะ ​และ​สเปก​ไม่​ครบ​คั่น​กลาง ​เพราะ​อินเทอร์เฟซ​นั้น​คือ​แบบ​หล่อ​ที่​ซื่อตรง​ต่อ​บทสนทนา​ของ​พวกเขา​เอง ​สถาปัตยกรรม​จึง​เป็นการ​ตัดสินใจ​เรื่อง​อัตรา​กำลังคน​อยู่​ส่วนหนึ่ง ​และ​การปรับโครงสร้าง​องค์กร​คือ​การเปลี่ยน​งาน​ออกแบบ​แบบ​เงียบๆ

​ศาสตร์​นี้​ตั้งชื่อ​ให้​ตัวเอง​ใน​ปี​เดียวกัน​นั้น ​ที่​การประชุม NATO ณ Garmisch ​เดือน​ตุลาคม 1968 ​คำ​ว่า "software engineering" ​ถูก​เลือก​อย่าง​ตั้งใจ​ให้​ยั่วยุ ​เป็นการ​ยืนยัน​ว่า​งาน​นี้ ​ควร ​ตั้งอยู่​บน​ทฤษฎี​และ​วินัย​แบบ​เดียว​กับ​วิศวกรรม​ที่ตั้ง​ตัว​มา​นาน ​พูด​ใน​วันที่​เห็น​กัน​ชัดๆ ​ว่า​มัน​ยัง​ไม่​เป็น​อย่างนั้น (Naur & Randell, eds., 1969) ​เกือบ​หกสิบ​ปี​ผ่าน​ไป ​ความมุ่งหวัง​ยัง​ทำงานหนัก​กว่า​ความสำเร็จ ​และ​คนใน​วงการ​ที่​ซื่อตรง​ก็​พูด​แบบ​นั้น

​เชื่อมโยง

​ใต้​ชั้นนี้​คือ​บท​ที่ 05 ​และ 06 ​ระบบปฏิบัติการ​กับ​ภาษา​โปรแกรม​ให้​โปรแกรม​ที่​รัน​ถูกต้อง​ได้​หนึ่ง​ครั้ง ​และ​ทุกอย่าง​ใน​บท​นี้​เริ่ม​หลังจากนั้น ​บท​ที่ 02 ​ให้​ความถูกต้อง​กับ​อัลกอริทึม​เดี่ยว​หนึ่ง​ตัว ​บท​นี้​คือ​สิ่ง​ที่เกิด​ขึ้น​เมื่อ​อัลกอริทึม​หมื่น​ตัว​ต้อง​ถูก​แก้​โดย​คน​ที่​ไม่​เคย​เจอ​หน้า​กัน ​เหนือ​ขึ้นไป​และ​ข้างๆ ​บท​ที่ 08, 09 ​และ 10 ​คือ​โดเมน​ที่​วินัย​เหล่านี้​ถูก​ทดสอบ​หนัก​ที่สุด ​เพราะ​ฐานข้อมูล ​เครือข่าย ​หรือ​ระบบ​กระจาย ​หยุด​แล้ว​เขียน​ใหม่​ไม่​ได้ ​บท​ที่ 11 ​คือ​กรณี​ที่​การรั่ว​ไม่​ได้​แพง​อย่าง​เดียว ​แต่​เป็นปฏิปักษ์​ด้วย

​คำถาม​ที่​ยัง​เปิด​อยู่

​ฐาน​หลักฐาน​ของ​ศาสตร์​นี้​เอง​ยัง​บาง​มาก ​ทุกคน​อ้าง​ตัวเลข​ว่า​ต้นทุน​ซอฟต์แวร์​กี่​เปอร์เซ็นต์​เป็นการ​บำรุงรักษา (maintenance) ​แทนที่จะ​เป็นการ​สร้าง​ครั้งแรก ​ตัวเลข​แกว่ง​ตั้งแต่​หกสิบ​ไป​จน​เกิน​เก้า​สิบ​เปอร์เซ็นต์ ​โดย​ไม่​มี​นิยาม​ร่วม​หรือ​หน้าต่าง​การวัด​รองรับ​อยู่​ข้างหลัง ​ศาสตร์​ที่วัด​ข้อกล่าวอ้าง​หลัก​ของ​ตัวเอง​หลวม​ขนาด​นี้​ควร​รู้สึก​ไม่​สบายใจ ​ลึก​ลง​ไป​อีก ​โค้ด​ที่​เครื่อง​ผลิต​ขึ้น​เอง​ขยับ​สัดส่วน​ของ Brooks ​จริง​ไหม ​หรือ​มัน​แค่​ทำให้​ครึ่ง​บังเอิญ​ถูก​ลง ​โดย​ไม่​แตะ​ครึ่ง​เนื้อแท้​ที่​ยัง​พัน​กัน​ยุ่ง​อยู่ — ​และ​ถ้า​การอ่าน​กับ​รีวิว​โค้ด​กลายเป็น​คอขวด ​นั่น​คือ​ชั้น​ใหม่​หรือ​ชั้น​เดิม? ​และ​ถ้า​กฎ​ของ​คอน​เวย์ (Conway's law) ​เป็นจริง ​มัน​ใช้​ย้อนกลับ​ได้​ไหม — ​สร้าง​องค์กร​ที่จะ​ผลิต​สถาปัตยกรรม​แบบ​นั้น​ขึ้น​มา​ก่อน ​แล้ว​จะ​ได้​สถาปัตยกรรม​ที่​ต้องการ​หรือเปล่า?

​อ่าน​ต่อ

บทถัดไป · 9 / 1608 · ฐานข้อมูล
Size
Page
Font

The Tower of Abstractions — An Encyclopedia of the Computing Disciplines

❦
100 · แผนที่201 · ทฤษฎีการคำนวณ302 · อัลกอริทึมและโครงสร้างข้อมูล403 · สารสนเทศและการเข้ารหัส504 · สถาปัตยกรรมคอมพิวเตอร์605 · ระบบปฏิบัติการ706 · ภาษาและคอมไพเลอร์807 · วิศวกรรมซอฟต์แวร์908 · ฐานข้อมูล1009 · เครือข่าย1110 · ระบบกระจาย1211 · ความปลอดภัยและวิทยาการรหัสลับ1312 · ปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง1413 · ปฏิสัมพันธ์มนุษย์–คอมพิวเตอร์ และกราฟิกส์1514 · พรมแดน1699 · ปิดเล่ม — หอคอยเมื่อมองทั้งหลัง