ข้าม​ไป​ยัง​เนื้อหา

Wirth's Law

ซอฟต์แวร์​ช้า​ลง​เร็ว​กว่า​ที่​ฮาร์ดแวร์​เร็ว​ขึ้น

Wirth’s Law ตั้ง​ชื่อ​ตาม Niklaus Wirth นัก​วิทยาการ​คอมพิวเตอร์​ชาว​สวิส​ผู้​ออกแบบ​ภาษา Pascal, Modula-2 และ​ระบบ​ปฏิบัติการ Oberon เขา​เขียน​ถึง​ข้อสังเกต​นี้​ไว้​ใน​บทความ​ชื่อ “A Plea for Lean Software” ตี​พิมพ์​ใน​วารสาร Computer ของ IEEE เมื่อ​เดือน​กุมภาพันธ์ ค.ศ. 1995 โดย​กล่าว​ว่า “software is getting slower more rapidly than hardware becomes faster” — ซอฟต์แวร์​ช้า​ลง​เร็ว​กว่า​ที่​ฮาร์ดแวร์​เร็ว​ขึ้น

ที่​น่า​สนใจ​คือ Wirth เอง​ไม่​ได้​อ้าง​ว่า​ตัวเอง​เป็น​ผู้​คิด​คำ​นี้​ขึ้น​มา​ก่อน เขา​ให้​เครดิต​กับ Martin Reiser ผู้​เขียน​คำนำ​ของ​หนังสือ​เกี่ยว​กับ​ระบบ Oberon ที่​เคย​เขียน​ไว้​ว่า “software manages to outgrow hardware in size and sluggishness” (ซอฟต์แวร์​มี​ขนาด​ใหญ่​ขึ้น​และ​อืด​ขึ้น​เร็ว​กว่า​ฮาร์ดแวร์​ที่​มัน​วิ่ง​อยู่) ตัว​ปรากฏการณ์​นี้​ถูก​สังเกต​เห็น​ตั้งแต่​ราว​ปี 1987 แล้ว ก่อน​ที่ Wirth จะ​นำ​มา​เขียน​ขยาย​ความ​ให้​เป็น​ที่​รู้จัก​ใน​วง​กว้าง

หลักการ​นี้​จับ​คู่​กับ Moore’s Law ใน​ลักษณะ​ตรง​ข้าม​กัน​พอดี — Moore’s Law บอกว่า​พลัง​ประมวล​ผล​ต่อ​ต้นทุน​เพิ่ม​ขึ้น​เป็น​เท่าตัว​ทุก ๆ ราว 18-24 เดือน ส่วน Wirth’s Law บอกว่า​ไม่​ว่า​ฮาร์ดแวร์​จะ​เร็ว​ขึ้น​แค่​ไหน ซอฟต์แวร์​ก็​มัก​จะ “กิน” ความเร็ว​ที่​เพิ่ม​มา​นั้น​จน​หมด และ​มัก​จะ​กิน​มากกว่าด้วย​ซ้ำ ทำให้​ผู้​ใช้​ปลายทาง​แทบ​ไม่รู้สึก​ว่า​เครื่อง​เร็ว​ขึ้น​เลย​ใน​การ​ใช้งาน​จริง ปรากฏการณ์​นี้​มีชื่อ​เรียก​ทั่วไป​ว่า software bloat (ซอฟต์แวร์​อืด​ฉุย)

Wirth ชี้​ว่า​ปัจจัย​สำคัญ​สอง​อย่าง​ที่​ทำให้​เกิด software bloat คือ

  1. ฮาร์ดแวร์​ที่​ดี​ขึ้น​เรื่อย ๆ เปิด​ทาง​ให้​ทำ​แบบ​นั้น​ได้ — เมื่อ RAM, CPU และ storage ราคา​ถูก​ลง​และ​แรง​ขึ้น นัก​พัฒนา​ก็​ไม่มี​แรง​กดดัน​ให้​ต้อง​เขียน code ให้​ประหยัด​ทรัพยากร​เหมือน​ยุค 1970 ที่​หน่วย​ความ​จำ​มี​จำกัด​จน​ต้อง​คิด​ทุก byte
  2. ผู้​ใช้​แยกแยะ​ไม่​ออกว่า​อะไร​จำเป็น​กับ​อะไร​แค่ “น่า​มี” — Wirth เขียน​ไว้​ตรง ๆ ว่า​คน​มัก​เข้าใจ​ผิด​ว่า​ความ​ซับซ้อน​คือ​ความ​ซับซ้อน​ที่​ซับซ้อน (“customers have trouble distinguishing between essential features and those that are just nice to have”) ทำให้ feature ที่​ไม่​จำเป็น​ถูก​เพิ่ม​เข้า​มา​เรื่อย ๆ โดย​ไม่มี​ใคร​อยาก​ตัด​ออก

ผลลัพธ์​คือ layer ของ abstraction ซ้อน​ทับ​กัน​หลาย​ชั้น — framework บน framework, VM บน VM, ชั้น interop เพื่อ​รองรับ​หลาย platform/หลาย​รูปแบบ file — แต่ละ​ชั้น​ดู​สม​เหตุ​สม​ผล​ใน​ตัว​มัน​เอง แต่​เมื่อ​รวม​กัน​แล้วกลับ​กิน​ทรัพยากร​มากกว่าที่​ควร Wirth เอง​พิสูจน์​ว่า​มัน​ไม่​จำเป็น​ต้อง​เป็น​แบบ​นี้ ด้วย​การนำ​ทีม​พัฒนา​ระบบ​ปฏิบัติการ Oberon (1986-1989) ที่​ทั้ง​ระบบ compiler และ OS มี​ขนาด​เล็ก​กว่า​ซอฟต์แวร์​ร่วมสมัย​มาก แต่​ยัง​ทำงาน​ได้​ครบถ้วน

สิ่ง​ที่​ควร​เข้าใจ​ให้​ชัด​คือ Wirth’s Law ไม่ใช่​กฎ​ฟิสิกส์​หรือ​ทฤษฎี​ที่​พิสูจน์​ได้​ทาง​คณิตศาสตร์ (ต่าง​จาก Moore’s Law ที่​อย่าง​น้อย​ยัง​อิง​กับ​ข้อมูล​การ​ผลิต semiconductor) มัน​เป็น adage หรือ​ข้อสังเกต​เชิง​ประสบการณ์ (empirical observation) ที่​สะท้อน​แรง​จูงใจ​ของ​องค์กร​และ​พฤติกรรม​ของ​ทีม​พัฒนา​มากกว่า​จะ​เป็น​กฎเกณฑ์​ตายตัว — แต่​ก็​เป็น​ข้อสังเกต​ที่​ถูก​ยืนยัน​ซ้ำ​แล้ว​ซ้ำ​เล่า​ใน​รอบ​สามสิบ​ปี​ที่​ผ่าน​มา จน​มี​คน​ตั้ง​ชื่อ​แปรผัน​ของ​มัน​หลาย​แบบ เช่น Gates’s Law (“the speed of software halves every 18 months” — ความเร็ว​ของ​ซอฟต์แวร์​เชิง​พาณิชย์​ลด​ลง​ครึ่ง​หนึ่ง​ทุก 18 เดือน อ้าง​ถึง Bill Gates แม้​ไม่มี​หลักฐาน​ว่า​เขา​พูด​จริง), May’s Law (ตั้ง​ชื่อ​ตาม David May ว่า​ประสิทธิภาพ​ซอฟต์แวร์​ลด​ลง​ครึ่ง​หนึ่ง​ทุก 18 เดือน​เช่น​กัน เป็นการ​หักล้าง Moore’s Law พอ​ดิบ​พอดี), Page’s Law (Larry Page แห่ง Google พูด​ถึง​แนวคิด​เดียวกัน​ซ้ำ​ใน​ปี 2009), และ​วลี​ติดตลก​ที่​ว่า “What Andy giveth, Bill taketh away” ซึ่ง​พาดพิง​ถึง Andy Grove แห่ง Intel ผู้​ทำให้​ชิป​เร็ว​ขึ้น กับ Bill Gates แห่ง Microsoft ผู้​ที่​ระบบ​ปฏิบัติการ​รุ่น​ใหม่ ๆ มัก​ต้องการ​ทรัพยากร​มาก​ขึ้น​ตาม​ไป​ด้วย

graph LR
    A[Hardware เร็วขึ้นตาม Moore Law] --> B[ทีมมีทรัพยากรเหลือเฟือ]
    B --> C[เพิ่ม feature และ abstraction layers]
    C --> D[Software ใช้ทรัพยากรมากขึ้น]
    D --> E[ผู้ใช้รู้สึกว่าเครื่องไม่ได้เร็วขึ้นเลย]
    E --> A

วงจร​นี้​อธิบาย​ว่า​ทำไม​คอมพิวเตอร์​และ​มือถือ​ยุค​ปัจจุบัน​แรง​กว่า​ยุค 1990 นับ​พัน​เท่า แต่​การ​เปิด​โปรแกรม​พื้นฐาน​อย่าง text editor หรือ chat app ก็​ยัง​ใช้​เวลา​หลาย​วินาที — ส่วน​ต่าง​ของ​ความเร็ว​ถูก “กิน” ไป​โดย layer ที่​เพิ่ม​ขึ้น​ตลอด​ทาง

  • วิวัฒนาการ​ของ Windows — ความ​ต้องการ​ฮาร์ดแวร์​ขั้น​ต่ำ​ของ Windows เพิ่ม​ขึ้น​แบบ​ก้าว​กระโดด​ทุก​เจ​เนอ​เรชัน จาก Windows 95 ที่​ต้องการ​เพียง CPU 25 MHz และ RAM 4 MB ไป​จนถึง Windows 11 ที่​ต้องการ CPU 1 GHz แบบ 64-bit dual-core และ RAM อย่าง​น้อย 4 GB — ทั้ง​ที่​งาน​พื้นฐาน​ที่​ผู้​ใช้​ทำ (พิมพ์​เอกสาร, เปิด​เว็บ, ฟัง​เพลง) ไม่​ได้​ซับซ้อน​ขึ้น​ใน​สัดส่วน​เดียวกัน​เลย
  • iTunes — เริ่มต้น​เป็น​แค่​โปรแกรม​เล่น​เพลง แต่​ค่อย ๆ ถูก​เสริม​ด้วย​ระบบ​ร้าน​ค้า, sync อุปกรณ์, podcast, และ feature โฆษณา จน​กลาย​เป็น platform e-commerce ขนาด​ใหญ่​ที่​กิน​ทรัพยากร​มากกว่า​หน้าที่​หลัก​ของ​มัน​หลาย​เท่า
  • WeChat — จาก app แชท​ขนาด​เพียง 2 MB ใน​ยุค​แรก ขยาย​กลาย​เป็น “super-app” ขนาด​กว่า 750 MB ที่​รวม​ทั้ง​ระบบ​ชำระ​เงิน เกม มินิ​โปรแกรม และ​บริการ​อื่น ๆ นับ​ร้อย
  • เบราว์เซอร์​สมัย​ใหม่ — หน้าต่าง​เบราว์เซอร์​เดียว​ใน​ปัจจุบัน​อาจ​ใช้ RAM หลัก​ร้อย MB ต่อ​แท็บ ซึ่ง​ใกล้​เคียง​หรือ​มากกว่า​พื้นที่​หน่วย​ความ​จำ​ทั้ง​ระบบ​ของ Oberon System (1987) ที่​ทำงาน​ได้​ครบ​เป็น OS สมบูรณ์​แบบ​ทั้ง​เครื่อง
  • Facebook Messenger ในปี 2016 ยอมรับ​ตรง ๆ ว่า app บวม​เกิน​ไป​หลัง​จาก​เพิ่ม​เกม บอต และ feature แบบ Snapchat เข้า​มา​เรื่อย ๆ จน​ต้อง​ประกาศ​แผน “ลด​น้ำหนัก” app ใน​เวลา​ต่อ​มา

ตัวอย่าง​เหล่า​นี้​ล้วน​สะท้อน​รูปแบบ​เดียวกัน คือ hardware headroom ที่​ควร​ทำให้​ผู้​ใช้ได้​ประสบการณ์​ที่​เร็ว​ขึ้น กลับ​ถูก​ใช้​ไป​กับ feature ที่​สะสม​พอกพูน​ขึ้น​ที​ละ​น้อย​จน​แทบ​ไม่​เหลือ​ส่วน​ต่าง​ให้​ผู้​ใช้​สัมผัส​ได้

  • อย่า​สร้าง​สิ่ง​ที่​ยัง​ไม่​ต้องการ — ยึด​หลัก YAGNI อย่าง​จริงจัง ทุก feature ที่​เพิ่ม​เข้าไป​คือ surface area ที่​ต้อง​ดูแล ทดสอบ และ​มัน​มัก​จะ​แบก dependency, abstraction layer และ configuration ตาม​มา​ด้วย​เสมอ แม้​จะ​ยัง​ไม่มี​ใคร​ใช้งาน​จริง
  • เรียบ​ง่าย​ไว้​ก่อน​เสมอKeep It Simple ไม่ใช่​แค่​คำขวัญ​สวย​หรู แต่​เป็น​วินัย​ที่​ต้อง​เลือก​ใช้​อย่าง​ตั้งใจ เพราะ​ความ​ซับซ้อน​สะสม​ที​ละ​นิด​โดย​ไม่มี​ใคร​ตัดสิน​ใจ “เพิ่ม​ความ​ซับซ้อน” อย่าง​ชัดเจน​สัก​ครั้ง​เดียว — มัน​คืบ​คลาน​เข้า​มา​ที​ละ commit
  • ระวัง feature creep — feature ที่​ขอ​เพิ่ม​ที​ละ​อย่าง​ดูเหมือน​ไม่มี​อะไร​มาก แต่​สะสม​ไป​เรื่อย ๆ จน​กลาย​เป็น​ภาระ ทีม​ควร​มี​กระบวนการ​ทบทวน​และ “ตัด​ทิ้ง” feature ที่​ไม่​คุ้ม​ค่า​เป็น​ระยะ ไม่ใช่​แค่​เพิ่ม​อย่าง​เดียว
  • วัด​ประสิทธิภาพ​จริง อย่า​พึ่ง​แต่​ฮาร์ดแวร์​ที่​แรง​ขึ้น — อย่า​ปล่อย​ให้ hardware upgrade กลบ​ปัญหา​ด้าน performance ของ code ไว้ ทีม​ที่​ดี​ควร​ตั้ง budget ด้าน memory/CPU/startup time ให้​ระบบ และ​เฝ้า​ระวัง​ไม่​ให้​มัน​ไหล​ลื่น​ขึ้น​เรื่อย ๆ โดย​ไม่มี​ใคร​สังเกต
  • ทีม​ใหญ่​ไม่​ได้​แปล​ว่า​ดี​กว่า — ปรากฏการณ์​เดียว​กับ software bloat เกิด​กับ​องค์กร​ได้​เหมือน​กัน ทีม​วิศวกร​ที่​ขยาย​ใหญ่​โต​เกิน​จำเป็น​มัก​เคลื่อน​ตัว​ช้า​ลง​และ​สร้าง​ความ​ซับซ้อน​เชิง​กระบวนการ​โดย​ไม่​จำเป็น เหมือน​ที่ Wirth เคย​เตือน​ว่า​ระบบ​ซับซ้อน​ไม่​จำเป็น​ต้อง​อาศัย​กองทัพ​นัก​ออกแบบ​และ​โปรแกรมเมอร์​เสมอ​ไป
  • ทบทวน​เป็น​ระยะ​ว่า​อะไร​คือ “จำเป็น” จริง ๆ — เมื่อ​ทีม​เติบโต feature ก็​มัก​สะสม​โดย​ไม่มี​ใคร​กล้า​ตัด การ​จัดสรร​เวลา​ให้​ทีม refactor และ​ตัด​สิ่ง​ที่​ไม่​จำเป็น​ออก​เป็น​ระยะ คือ​วิธี​ต้านทาน Wirth’s Law ใน​ระยะ​ยาว