กฎต่าง ๆ ของวิศวกรรมซอฟต์แวร์
(lawsofsoftwareengineering.com)- คอลเลกชันที่รวบรวมหลักการและแพตเทิร์น 56 ข้อที่ส่งผลต่อระบบซอฟต์แวร์ ทีม และการตัดสินใจไว้ในที่เดียว ครอบคลุมตั้งแต่การบริหารทีมไปจนถึงสถาปัตยกรรม คุณภาพ การออกแบบ และการตัดสินใจ
- กฎที่เกี่ยวกับทีม เช่น กฎของ Conway, กฎของ Brooks, และจำนวนของ Dunbar ชี้ว่าโครงสร้างองค์กรส่งผลโดยตรงต่อการออกแบบระบบและผลิตภาพ
- ในด้านสถาปัตยกรรม มีการสรุปข้อจำกัดและหลักการที่ต้องคำนึงถึงเมื่อออกแบบระบบซับซ้อน เช่น กฎของ Hyrum, ทฤษฎีบท CAP, และกฎของ Gall
- กฎที่เกี่ยวกับคุณภาพกล่าวถึง หนี้ทางเทคนิค, Testing Pyramid, กฎของ Kernighan และความยากลำบากในโลกจริงของการรักษาคุณภาพโค้ดและการดีบัก
- ในด้านการตัดสินใจ ครอบคลุมทั้ง Dunning-Kruger effect, ความผิดพลาดจากต้นทุนจม, และหลักการพาเรโต ซึ่งเป็นอคติทางความคิดและเกณฑ์การตัดสินที่มักเกิดขึ้นระหว่างกระบวนการพัฒนา
ทีม (Teams)
1. กฎของ Conway (Conway's Law)
องค์กรจะออกแบบระบบที่สะท้อนโครงสร้างการสื่อสารของตนเอง
- สถาปัตยกรรมซอฟต์แวร์มีแนวโน้มจะเป็นไปตามโครงสร้างการสื่อสารขององค์กรที่สร้างมันขึ้นมาโดยธรรมชาติ
- หากทีมถูกแบ่งเป็น 3 ทีม ระบบก็มักมีแนวโน้มถูกแบ่งเป็น 3 โมดูลใหญ่เช่นกัน
- ยังมีการนำไปใช้ในทางกลับกันในรูปแบบ "Inverse Conway Maneuver" ซึ่งเป็นแนวทางปรับโครงสร้างทีมก่อนให้สอดคล้องกับสถาปัตยกรรมที่ต้องการ
- เมื่อนำไมโครเซอร์วิสมาใช้ การทำให้ขอบเขตของทีมและขอบเขตของบริการสอดคล้องกันจะมีประสิทธิภาพ
2. กฎของ Brooks (Brooks's Law)
การเพิ่มคนเข้าไปในโครงการซอฟต์แวร์ที่ล่าช้า จะยิ่งทำให้ล่าช้ามากขึ้น
- เมื่อมีคนใหม่เข้าร่วม สมาชิกเดิมในทีมต้องใช้เวลากับการสอนและการประสานงาน ทำให้ผลิตภาพโดยรวมลดลงชั่วคราว
- เมื่อจำนวนสมาชิกเพิ่มขึ้น เส้นทางการสื่อสารจะเพิ่มขึ้นแบบทวีคูณ (เมื่อมี n คน จะมี n(n-1)/2 เส้นทาง)
- Frederick Brooks เสนอหลักการนี้ในหนังสือ The Mythical Man-Month ปี 1975 จากประสบการณ์ในโครงการ IBM OS/360
- สามารถอธิบายเชิงปริมาณได้ด้วยกฎของ Little (L = λ × W): เมื่อเพิ่มคน WIP (งานระหว่างทำ) จะเพิ่มขึ้น แต่ throughput กลับทรงตัว ส่งผลให้ lead time เพิ่มขึ้นแทน
- ทางแก้ไม่ใช่การเพิ่มคน แต่คือการปรับขอบเขตงานหรือเปลี่ยนกำหนดการ
3. จำนวนของ Dunbar (Dunbar's Number)
ขีดจำกัดด้านการรับรู้ของความสัมพันธ์ที่คนคนหนึ่งสามารถรักษาไว้อย่างมั่นคงได้อยู่ที่ประมาณ 150 คน
- ตัวเลขนี้มาจากการที่ Robin Dunbar พบความสัมพันธ์ระหว่างขนาดสมองของไพรเมตกับขนาดของกลุ่มสังคม
- โครงสร้างลำดับชั้นทางสังคมของ Dunbar: ~5 คน (ความสัมพันธ์ใกล้ชิด), ~15 คน (ผู้ร่วมงานที่ไว้ใจได้), ~50 คน (ความสัมพันธ์ทางงานที่ใกล้ชิด), ~150 คน (ความเชื่อมโยงทางสังคมที่มั่นคง)
- เมื่อองค์กรวิศวกรรมมีขนาดเกิน 150 คน การสื่อสารแบบไม่เป็นทางการจะถึงขีดจำกัด จึงจำเป็นต้องมีลำดับชั้นและกระบวนการที่เป็นทางการ
- "Two-Pizza Team" ของ Amazon (5~10 คน) สะท้อนให้เห็นว่าแม้อยู่ภายใน 150 คน การทำงานร่วมกันจริงมักเกิดขึ้นในหน่วยที่เล็กกว่านั้น
4. ผลของ Ringelmann (The Ringelmann Effect)
ยิ่งขนาดของกลุ่มใหญ่ขึ้น ผลิตภาพรายบุคคลยิ่งลดลง
- เป็นปรากฏการณ์ "social loafing" ที่เมื่อสมาชิกในกลุ่มมากขึ้น ระดับการมีส่วนร่วมของแต่ละคนจะลดลง
- ในทีมซอฟต์แวร์เช่นกัน เมื่อทีมใหญ่ขึ้น ความรับผิดชอบรายบุคคลจะเจือจางลง และต้นทุนในการประสานงานจะเพิ่มขึ้น
- อธิบายได้ว่าทำไมทีมขนาดเล็กจึงมักสร้างผลงานต่อคนได้สูงกว่า
5. กฎของ Price (Price's Law)
จำนวนคนที่เท่ากับรากที่สองของจำนวนผู้เข้าร่วมทั้งหมด จะทำงานไปถึง 50% ของงานทั้งหมด
- ในองค์กรที่มี 100 คน จะมีประมาณ10 คนที่รับผิดชอบงานครึ่งหนึ่งของทั้งหมด
- ยิ่งองค์กรใหญ่ขึ้น ก็ยิ่งพึ่งพาคนผลงานสูงเพียงส่วนน้อยมากขึ้น
- อธิบายได้ว่าทำไมเมื่อขยายทีมแล้ว ผลิตภาพจึงไม่ได้เพิ่มขึ้นแบบเส้นตรง
6. กฎของ Putt (Putt's Law)
คนที่เข้าใจเทคโนโลยีจะไม่ได้เป็นผู้บริหาร และคนที่เป็นผู้บริหารจะไม่เข้าใจเทคโนโลยี
- เป็นถ้อยคำเชิงเสียดสีที่สะท้อนช่องว่างระหว่างบทบาทการบริหารกับความเชี่ยวชาญทางเทคนิคในองค์กรเทคโนโลยี
- เมื่อต้องออกแบบโครงสร้างผู้นำทางเทคนิค จำเป็นต้องตระหนักถึงช่องว่างนี้และเตรียมกลไกมาชดเชย
7. หลักการ Peter (Peter Principle)
ในองค์กร พนักงานทุกคนมีแนวโน้มจะได้รับการเลื่อนตำแหน่งไปจนถึงระดับที่ตนเองไร้ความสามารถ
- เป็นรูปแบบที่คนซึ่งมีความสามารถในบทบาทหนึ่งได้รับการเลื่อนตำแหน่ง จนกลายเป็นไร้ความสามารถในบทบาทใหม่
- สะท้อนความจริงที่ว่านักพัฒนาที่เก่งไม่ได้หมายความว่าจะเป็นผู้จัดการที่ดีเสมอไป
- ชี้ให้เห็นความจำเป็นของระบบ dual ladder ที่แยกสาย IC (Individual Contributor) ออกจากสายบริหาร
8. Bus Factor
จำนวนขั้นต่ำของสมาชิกทีมที่หากหายไป จะทำให้โครงการตกอยู่ในความเสี่ยงร้ายแรง
- หาก Bus Factor เท่ากับ 1 แปลว่ามีจุดล้มเหลวเพียงจุดเดียว (Single Point of Failure)
- การแบ่งปันความรู้, pair programming, และการจัดทำเอกสาร เป็นสิ่งสำคัญในการเพิ่ม Bus Factor
- code review และ cross-training คือวิธีเชิงปฏิบัติที่ช่วยปรับปรุง Bus Factor
9. หลักการ Dilbert (Dilbert Principle)
บริษัทมีแนวโน้มจะเลื่อนพนักงานที่ไร้ความสามารถไปเป็นผู้จัดการ เพื่อจำกัดความเสียหาย
- เป็นข้อสังเกตเชิงเสียดสีที่ Scott Adams เสนอขึ้น และเป็นรูปแบบหนึ่งของหลักการ Peter
- สะท้อนปรากฏการณ์เชิงย้อนแย้งในองค์กรที่มองว่าตำแหน่งผู้บริหารเป็นที่ที่สร้างความเสียหายต่องานปฏิบัติน้อยที่สุด
การวางแผน (Planning)
10. การปรับให้เหมาะสมเร็วเกินไป / หลักการเพิ่มประสิทธิภาพของ Knuth (Premature Optimization)
การปรับให้เหมาะสมเร็วเกินไปคือรากเหง้าของความชั่วร้ายทั้งปวง
- Donald Knuth เสนอไว้ในบทความปี 1974 ว่า: "ในประมาณ 97% ของกรณี ประสิทธิภาพเล็กน้อยนั้นควรถูกมองข้าม"
- เนื่องจากโค้ดประมาณ20% ใช้เวลาในการรันถึง 80% การไปเพิ่มประสิทธิภาพให้โค้ดอีก 80% ที่เหลือจึงเป็นความสูญเปล่า
- ลำดับที่ถูกต้องคือ: ทำให้มันใช้งานได้ก่อน → ทำให้มันถูกต้อง → แล้วค่อยทำให้มันเร็วเมื่อจำเป็น
- โค้ดที่ถูกปรับให้เหมาะสมแล้วมักซับซ้อนขึ้น จึงควรทำหลังจากตรวจสอบคอขวดที่แท้จริงผ่านการ profiling แล้วเท่านั้น
11. กฎของ Parkinson (Parkinson's Law)
งานจะขยายตัวจนเต็มเวลาที่ถูกกำหนดให้มันเสมอ
- หากเดดไลน์คือ 2 สัปดาห์ งานก็จะยืดไป 2 สัปดาห์ หากเป็น 4 สัปดาห์ งานก็จะยืดไป 4 สัปดาห์
- อธิบายว่าทำไมในโครงการซอฟต์แวร์ การกำหนดmilestone ที่สั้นและชัดเจนจึงสำคัญ
- Agile แบบอิงสปรินต์เป็นวิธีรับมือกับกฎนี้ในทางปฏิบัติ
12. กฎ 90-90 (The Ninety-Ninety Rule)
90% แรกของโค้ดใช้เวลา 90% ของเวลาพัฒนา และ 10% ที่เหลือก็ใช้เวลาอีก 90% เช่นกัน
- เตือนว่าส่วน 10% สุดท้ายของโครงการซอฟต์แวร์ (edge case, การเก็บรายละเอียด, การแก้บั๊ก) มักใช้เวลานานกว่าที่คาดมาก
- คำว่า "เกือบเสร็จแล้ว" ในความเป็นจริงอาจหมายถึงเพียงจุดกึ่งกลางของทั้งกำหนดการ
13. กฎของ Hofstadter (Hofstadter's Law)
ไม่ว่าคุณจะคำนึงถึงกฎของ Hofstadter แล้วก็ตาม มันก็ยังใช้เวลานานกว่าที่คาดเสมอ
- เป็นกฎที่มีโครงสร้างแบบอ้างอิงตนเองเชิงเวียนกลับ สะท้อนความยากโดยเนื้อแท้ของการประเมินระยะเวลาในงานซอฟต์แวร์
- ต่อให้เพิ่ม buffer เข้าไป ก็ยังมักเกิดการเกินกำหนดอยู่ดี
- Douglas Hofstadter กล่าวถึงกฎนี้ในหนังสือ Gödel, Escher, Bach ปี 1979
14. กฎของ Goodhart (Goodhart's Law)
เมื่อดัชนีชี้วัดกลายเป็นเป้าหมาย มันจะไม่ใช่ดัชนีชี้วัดที่ดีอีกต่อไป
- ตัวอย่างคลาสสิกคือเมื่อกำหนด code coverage เป็น KPI ก็จะเกิดการผลิตเทสต์ที่ไม่มีความหมายจำนวนมาก
- หากวัดผลิตภาพด้วยจำนวนบรรทัดโค้ด (LOC) ก็จะได้โค้ดที่ยืดยาวโดยไม่จำเป็น
- ควรมุ่งไปที่การบรรลุคุณค่าที่แท้จริง ไม่ใช่การทำให้ตัวชี้วัดดูดี
15. กฎของ Gilb (Gilb's Law)
หากจำเป็นต้องวัดผล การวัดไม่ว่าจะด้วยวิธีใดย่อมดีกว่าไม่วัดเลย
- แม้จะวัดได้ไม่สมบูรณ์แบบ แต่การวัดแบบคร่าว ๆ ก็ยังมีประโยชน์กว่าการไม่วัดเลยเสมอ
- ใช้ได้กับเรื่องที่วัดเชิงปริมาณได้ยาก เช่น คุณภาพซอฟต์แวร์ หรือความพึงพอใจของผู้ใช้
สถาปัตยกรรม (Architecture)
16. กฎของ Hyrum (Hyrum's Law)
หากมีผู้ใช้ API มากพอ จะต้องมีใครบางคนพึ่งพาพฤติกรรมทุกอย่างของระบบที่สังเกตได้
- ไม่เพียงแต่สเปก API อย่างเป็นทางการเท่านั้น แต่พฤติกรรมที่ไม่เป็นทางการอย่าง จังหวะเวลา รูปแบบข้อความ error และลำดับการจัดเรียง ก็กลายเป็นสิ่งที่ระบบอื่นพึ่งพาด้วย
- กรณีที่ Microsoft Windows ยังคงพฤติกรรมแบบเวอร์ชันเก่าไว้ เพื่อให้แอปของบุคคลที่สามที่พึ่งพา พฤติกรรมที่ไม่ได้มีการจัดทำเอกสารและบั๊ก ในอดีตยังคงใช้งานร่วมกันได้
- Google's Hyrum Wright สังเกตจากประสบการณ์การเปลี่ยนแปลงไลบรารีภายใน Google ราวปี 2011-2012
- เพื่อนร่วมงาน Titus Winters ตั้งชื่อว่า "Hyrum's Law" (บรรจุอยู่ใน Software Engineering at Google)
- ข้อตกลงที่แท้จริงไม่ใช่ API อย่างเป็นทางการ แต่คือพฤติกรรมทั้งหมดที่สังเกตได้จริง
17. กฎของ Gall (Gall's Law)
ระบบที่ซับซ้อนซึ่งทำงานได้ ต้องวิวัฒน์มาจากระบบที่เรียบง่ายซึ่งทำงานได้เสมอ
- หากออกแบบระบบที่ซับซ้อนตั้งแต่แรก จะมีตัวแปรที่ยังไม่ผ่านการพิสูจน์และไม่รู้แน่ชัดมากเกินไป ทำให้มีโอกาสล้มเหลวสูง
- เป็นรากฐานทางทฤษฎีของแนวทาง MVP(Minimum Viable Product)
- กรณีที่ Facebook เริ่มจากระบบโปรไฟล์อย่างง่ายสำหรับนักศึกษา Harvard ในปี 2004 แล้วค่อย ๆ ขยายอย่างเป็นลำดับ
- แม้แต่การเปลี่ยนไปใช้ไมโครเซอร์วิส การ เริ่มจาก monolith แล้วค่อย ๆ แยกออก ก็ได้เปรียบกว่า
- John Gall นำเสนอไว้ในหนังสือ Systemantics ปี 1975 (กลายเป็นหนังสือคัลต์คลาสสิกหลังถูกสำนักพิมพ์ปฏิเสธ 30 แห่งก่อนตีพิมพ์)
18. กฎของ abstraction ที่รั่วไหล (The Law of Leaky Abstractions)
abstraction ที่ไม่ใช่เรื่องพื้น ๆ ทุกแบบย่อมมีการรั่วไหลในระดับหนึ่ง
- ตัวอย่างคลาสสิกคือ ORM ที่ซ่อน SQL ไว้ แต่เมื่อมีปัญหาด้านประสิทธิภาพ ก็ต้องกลับไปตรวจสอบ query ที่ถูกสร้างขึ้นอยู่ดี
- garbage collection ของ Java/Python ก็เป็น abstraction เช่นกัน แต่พฤติกรรมภายในอย่างการหยุดชั่วคราวของ GC ก็ส่งผลต่อประสิทธิภาพได้
- บทเรียนไม่ใช่ว่า abstraction เป็นสิ่งไม่ดี แต่คือควร เตรียมพร้อมเมื่อ abstraction พังหรือใช้ไม่ได้ดังที่คาด
- Joel Spolsky อธิบายไว้ในบล็อกโพสต์ปี 2002 พร้อมตัวอย่างอย่าง TCP และ virtual memory
- เชื่อมโยงในเชิงบริบทกับคำกล่าวของ George Box ที่ว่า "โมเดลทั้งหมดล้วนผิด แต่บางโมเดลก็มีประโยชน์"
19. กฎของ Tesler / กฎการอนุรักษ์ความซับซ้อน (Tesler's Law)
ทุกแอปพลิเคชันมีความซับซ้อนเฉพาะตัวที่กำจัดทิ้งไม่ได้ ย้ายที่ได้อย่างเดียวแต่ลบออกไม่ได้
- คำถามหลักคือ: ใครจะเป็นผู้รับภาระความซับซ้อน (ผู้ใช้ vs ระบบ)
- Calendly ให้ระบบดูดซับความซับซ้อนของการนัดหมาย ส่วนอีเมลเธรดกลับผลักภาระนั้นไปให้ผู้ใช้
- การออกแบบที่ดีคือการย้ายความซับซ้อน ออกจากประสบการณ์ผู้ใช้เข้าไปอยู่ภายในระบบ
- Larry Tesler วางหลักนี้ไว้ในช่วงทศวรรษ 1980 ระหว่างทำงานกับ Apple Lisa และ GUI ยุคแรก
20. ทฤษฎีบท CAP (CAP Theorem)
ระบบกระจายไม่สามารถรับประกันได้พร้อมกันทั้ง Consistency (C), Availability (A) และ Partition Tolerance (P) ครบทั้งสามข้อ ได้เพียงสองข้อเท่านั้น
- network partition เป็นสิ่งที่หลีกเลี่ยงไม่ได้ในโลกจริง ดังนั้นทางเลือกเชิงปฏิบัติคือ Consistency vs Availability
- ระบบแบบ CP (เช่น MongoDB): เมื่อเกิด partition จะบล็อกการเขียนเพื่อคงการซิงก์ของ replica ทั้งหมด
- ระบบแบบ AP (เช่น Cassandra, DNS): ยังคงตอบสนองคำขอระหว่างเกิด partition ได้ โดยยอมให้ replica ไม่สอดคล้องกันชั่วคราว
- Eric Brewer เสนอไว้ในปี 2000 ในบริบทของเว็บเซอร์วิส และ Gilbert & Lynch พิสูจน์อย่างเป็นทางการในปี 2002
21. ผลของระบบที่สอง (Second-System Effect)
หลังระบบเล็ก ๆ ที่ประสบความสำเร็จ มักตามมาด้วยระบบรุ่นถัดไปที่ถูกออกแบบเกินความจำเป็นและพองตัวเกินไป
- เป็นรูปแบบที่เมื่อประสบความสำเร็จกับระบบแรกแล้ว ทีมจะมั่นใจมากขึ้นจน ใส่ทุกไอเดียลงไป ในระบบที่สอง
- สาเหตุหลักคือ feature creep และ over-generalization
- Frederick Brooks ระบุไว้ใน The Mythical Man-Month
22. ความเข้าใจผิดของการประมวลผลแบบกระจาย (Fallacies of Distributed Computing)
8 สมมติฐานที่ผิดพลาดซึ่งคนที่ออกแบบระบบกระจายครั้งแรกมักเชื่อกัน
- ความเข้าใจผิด 8 ข้อคือ (1) เครือข่ายเชื่อถือได้ (2) latency เป็นศูนย์ (3) bandwidth ไม่มีที่สิ้นสุด (4) เครือข่ายปลอดภัย (5) topology ไม่เปลี่ยนแปลง (6) มีผู้ดูแลเพียงคนเดียว (7) ค่าใช้จ่ายในการส่งข้อมูลเป็นศูนย์ (8) เครือข่ายมีความสม่ำเสมอเหมือนกันทั้งหมด
- หากออกแบบบนสมมติฐานเหล่านี้ ใน production จะเกิด เหตุขัดข้องและปัญหาด้านประสิทธิภาพที่ไม่คาดคิด
23. กฎของผลลัพธ์ที่ไม่ได้ตั้งใจ (Law of Unintended Consequences)
เมื่อเปลี่ยนแปลงระบบที่ซับซ้อน ต้องคาดไว้เสมอว่าจะมีผลลัพธ์ที่ไม่คาดคิดเกิดขึ้น
- เมื่อเปลี่ยนคอมโพเนนต์หนึ่งของระบบ ผลข้างเคียงอาจเกิดขึ้นใน จุดที่คาดไม่ถึง
- เป็นหลักการที่สนับสนุนความจำเป็นของ chaos engineering และการทดสอบอย่างครอบคลุม
24. กฎของ Zawinski (Zawinski's Law)
ทุกโปรแกรมพยายามขยายตัวไปเรื่อย ๆ จนสามารถอ่านเมลได้
- เป็นการเสียดสีปรากฏการณ์ feature bloat ที่เมื่อซอฟต์แวร์ประสบความสำเร็จ ก็มักพยายามเพิ่มฟังก์ชันมากขึ้นเรื่อย ๆ
- Jamie Zawinski (นักพัฒนายุคแรกของ Netscape) เป็นผู้สังเกต
- เป็นคำเตือนถึงแนวโน้มที่เครื่องมือเรียบง่ายจะพยายามกลายเป็นแพลตฟอร์มสารพัดประโยชน์เมื่อเวลาผ่านไป
คุณภาพ (Quality)
25. กฎลูกเสือ (The Boy Scout Rule)
จงทิ้งโค้ดไว้ให้อยู่ในสภาพที่ดีกว่าตอนที่พบมัน
- แก่นสำคัญไม่ใช่การรีแฟกเตอร์ครั้งใหญ่ แต่คือ การปรับปรุงอย่างต่อเนื่องและค่อยเป็นค่อยไป
- เช่น แก้ชื่อฟังก์ชันที่ชวนสับสน ลบโค้ดซ้ำ เพิ่มเทสต์ที่ขาดหายไป คือการทำ การปรับปรุงเล็ก ๆ ทุกครั้ง ให้เป็นนิสัย
- Robert C. Martin (Uncle Bob) นำมาปรับใช้กับการพัฒนาซอฟต์แวร์ใน Clean Code (2008)
- หลักการของวิศวกร Google ที่ว่า "If you touch it, you own it" — ถ้าคุณแก้โค้ด คุณก็ต้องรับผิดชอบต่อคุณภาพของมันด้วย
- การทำตามกฎนี้ช่วยป้องกัน Broken Windows effect และป้องกันการสะสมของ technical debt
26. กฎของ Murphy (Murphy's Law)
สิ่งใดก็ตามที่ผิดพลาดได้ มันย่อมผิดพลาด
- เป็นพื้นฐานของ defensive programming, การจัดการข้อยกเว้น และการออกแบบเพื่อรองรับความขัดข้อง
- ในซอฟต์แวร์ควรออกแบบ error handling และ fallback ด้วยท่าทีว่า "ข้อผิดพลาดใดก็ตามที่อาจเกิดขึ้นได้ ย่อมเกิดขึ้นแน่"
27. กฎของ Postel / หลักความทนทาน (Postel's Law)
จงเข้มงวดกับสิ่งที่ตนเองส่งออก และยืดหยุ่นกับสิ่งที่รับเข้ามาจากผู้อื่น
- ในการออกแบบ API หลักการนี้คือ output ต้องปฏิบัติตามสเปกอย่างเคร่งครัด ขณะที่ input ควรยอมรับรูปแบบที่หลากหลายได้อย่างยืดหยุ่น
- Jon Postel วางหลักความทนทาน (Robustness Principle) นี้ระหว่างการออกแบบโปรโตคอล TCP/IP
- เป็นแนวทางเชิงปฏิบัติที่ช่วยเพิ่มการทำงานร่วมกันระหว่างระบบ
28. ทฤษฎีกระจกแตก (Broken Windows Theory)
อย่าปล่อยให้การออกแบบที่แย่ การตัดสินใจที่ผิด หรือโค้ดคุณภาพต่ำค้างคาอยู่
- หากปล่อย "กระจกแตก" บานหนึ่งไว้ (โค้ดแย่หนึ่งจุด) ก็จะก่อให้เกิด การเสื่อมถอยของคุณภาพเพิ่มเติม
- ถ้าคอมเมนต์ TODO, โค้ดตาย, และคำเตือนที่ยังไม่แก้สะสมอยู่ในโค้ดเบส โค้ดใหม่ก็มักถูกเขียนออกมาในมาตรฐานที่ต่ำลงตามไปด้วย
- วัฒนธรรมที่สำคัญคือ ต่อให้เป็นปัญหาเล็กน้อยก็ต้องแก้ทันทีที่พบ
29. หนี้ทางเทคนิค (Technical Debt)
ทุกปัจจัยที่ทำให้ความเร็วในการพัฒนาซอฟต์แวร์ช้าลง
- Ward Cunningham ใช้คำนี้ครั้งแรกใน OOPSLA ปี 1992 ในฐานะอุปมาเชิงการเงิน: การเลือกทางลัดในโค้ดคือ การยืมเวลาจากอนาคต
- เงินต้น (ต้นทุนในการแก้ไข) + ดอกเบี้ย (การลดลงของผลิตภาพอย่างต่อเนื่องจากโค้ดที่รกและยุ่งเหยิง)
- หนี้ทางเทคนิคที่ตั้งใจสร้างขึ้นบางครั้งก็สมเหตุสมผล (เช่น timing ในการออกสู่ตลาด, การทำ prototyping) แต่จำเป็นต้องมี แผนชำระคืน
- ตัวอย่างคลาสสิกคือการข้าม automated testing: release อาจสำเร็จ แต่ทุกครั้งที่แก้ไขหลังจากนั้นจะเกิดบั๊กที่ไม่คาดคิด
- วิธีแก้: รีแฟกเตอร์ เพิ่มเทสต์ที่ขาด ปรับปรุงการออกแบบ
30. กฎของ Linus (Linus's Law)
หากมีผู้ตรวจสอบมากพอ บั๊กทุกตัวก็จะถูกพบได้ง่าย
- เป็นหลักการแกนกลางของการพัฒนาโอเพนซอร์ส: เมื่อมี สายตาจำนวนมาก ช่วยกันตรวจโค้ด บั๊กก็จะกลายเป็นเรื่องเล็ก
- Eric Raymond ตั้งชื่อตาม Linus Torvalds ใน The Cathedral and the Bazaar
- สนับสนุนความสำคัญของวัฒนธรรม code review
31. กฎของ Kernighan (Kernighan's Law)
การดีบักยากกว่าการเขียนโค้ดตั้งแต่แรกถึงสองเท่า
- ดังนั้น ถ้าเขียนโค้ดให้ฉลาดเกินไป ก็จะไม่ฉลาดพอเวลาต้องดีบักมัน
- นี่คือเหตุผลว่าทำไมจึงควรเขียนโค้ดที่เรียบง่ายและอ่านง่าย
- Brian Kernighan นำเสนอไว้ใน The Elements of Programming Style
32. พีระมิดการทดสอบ (Testing Pyramid)
โปรเจกต์ควรมี unit test ที่รวดเร็วจำนวนมาก มี integration test น้อยกว่า และมี UI test เพียงเล็กน้อย
- Unit test (ฐานล่าง): เร็ว ต้นทุนต่ำ และควรเขียนมากที่สุด
- Integration test (ชั้นกลาง): ตรวจสอบการทำงานร่วมกันระหว่างคอมโพเนนต์
- UI/E2E test (ชั้นบน): ช้าและพังง่าย จึงควรมีให้น้อยที่สุด
- Mike Cohn แนะนำโมเดลกลยุทธ์การทดสอบนี้ไว้ใน Succeeding with Agile
33. พาราด็อกซ์ยาฆ่าแมลง (Pesticide Paradox)
หากรันการทดสอบเดิมซ้ำ ๆ ประสิทธิผลของมันจะลดลงเมื่อเวลาผ่านไป
- บั๊กที่การทดสอบเดิมจับได้ถูกจับไปหมดแล้ว จึงต้องเพิ่ม test case ใหม่ อย่างต่อเนื่อง
- การทบทวนและอัปเดตชุดทดสอบเป็นประจำเป็นสิ่งจำเป็น
34. กฎการวิวัฒนาการของซอฟต์แวร์ของ Lehman (Lehman's Laws of Software Evolution)
ซอฟต์แวร์ที่สะท้อนโลกความจริงย่อมต้องวิวัฒนาการ และการวิวัฒนาการนั้นมีข้อจำกัดที่คาดการณ์ได้
- ซอฟต์แวร์ประเภท E-type (ที่สะท้อนโลกความจริง) จำเป็นต้องมีการเปลี่ยนแปลงอย่างต่อเนื่องเพื่อให้ยังใช้งานได้
- ทุกครั้งที่เปลี่ยนแปลง ความซับซ้อนจะเพิ่มขึ้น และหากไม่บริหารจัดการอย่างจริงจัง คุณภาพจะลดลง
35. กฎของ Sturgeon (Sturgeon's Law)
90% ของทุกสิ่งนั้นไร้ประโยชน์
- Theodore Sturgeon เสนอแนวคิดนี้เพื่อตอบโต้คำวิจารณ์วรรณกรรมไซไฟ
- ใช้ได้กับซอฟต์แวร์เช่นกัน: ในบรรดาโค้ด เครื่องมือ และเฟรมเวิร์กส่วนใหญ่ สิ่งที่ยอดเยี่ยมจริง ๆ มีอยู่เพียงส่วนน้อย
- จึงควรรักษามาตรฐานคุณภาพที่สูง และโฟกัสกับ 10% ที่มีคุณค่า
สเกล (Scale)
36. กฎของ Amdahl (Amdahl's Law)
การเพิ่มความเร็วจากการประมวลผลแบบขนานถูกจำกัดด้วยสัดส่วนของงานที่ไม่สามารถทำแบบขนานได้
- หาก 5% ของโปรแกรมต้องทำแบบลำดับ ไม่ว่าจะเพิ่มโปรเซสเซอร์มากแค่ไหน ความเร็วสูงสุดตามทฤษฎีก็ได้เพียง 20 เท่า
- การตระหนักถึงข้อจำกัดของการทำงานแบบขนานและลด คอขวดแบบลำดับ จะมีประสิทธิภาพมากกว่า
- Gene Amdahl เสนอแนวคิดนี้ในปี 1967
37. กฎของ Gustafson (Gustafson's Law)
เราสามารถเพิ่มความเร็วอย่างมีนัยสำคัญในการประมวลผลแบบขนานได้ด้วยการเพิ่มขนาดของปัญหา
- เป็น มุมมองเสริม ต่อกฎของ Amdahl: สำหรับปัญหาที่ขยายขนาดได้ แทนที่จะเป็นปัญหาคงที่ การเพิ่มโปรเซสเซอร์ย่อมได้ผล
- ในงานอย่างการประมวลผลบิ๊กดาต้าและการจำลองทางวิทยาศาสตร์ ทรัพยากรที่มากขึ้นช่วยแก้ ปัญหาที่ใหญ่ขึ้น ได้
38. กฎของ Metcalfe (Metcalfe's Law)
มูลค่าของเครือข่ายแปรผันตามกำลังสองของจำนวนผู้ใช้
- ถ้ามีผู้ใช้ 10 คน มูลค่าจะเพิ่มเป็น 100 หน่วย และถ้ามี 100 คน จะเพิ่มเป็น 10,000 หน่วย
- เป็นพื้นฐานเชิงทฤษฎีของ network effect ในโซเชียลเน็ตเวิร์ก เมสเซนเจอร์ และมาร์เก็ตเพลส
- Robert Metcalfe เสนอแนวคิดนี้เพื่ออธิบายมูลค่าของเทคโนโลยี Ethernet
การออกแบบ (Design)
39. หลักการ DRY (Don't Repeat Yourself)
องค์ความรู้ทุกอย่างควรมีรูปแบบการแสดงออกที่เป็นหนึ่งเดียว ชัดเจน และเป็นแหล่งอ้างอิงหลักเพียงแห่งเดียว
- ไม่ได้หมายถึงแค่โค้ดซ้ำ แต่รวมถึง ความรู้ ตรรกะ และข้อมูลที่ซ้ำกัน ด้วย
- ความซ้ำซ้อนทำให้ต้องแก้หลายจุดพร้อมกันเมื่อมีการเปลี่ยนแปลง จึงเป็นสาเหตุของ บั๊กและความไม่สอดคล้องกัน
- Andy Hunt และ Dave Thomas วางหลักการนี้ไว้ใน The Pragmatic Programmer
40. หลักการ KISS (Keep It Simple, Stupid)
การออกแบบและระบบควรเรียบง่ายให้มากที่สุดเท่าที่จะทำได้
- ความซับซ้อนเพิ่มต้นทุนในการทำความเข้าใจ การบำรุงรักษา และการดีบัก
- วิธีแก้ที่เรียบง่าย มักมีประสิทธิภาพกว่าในกรณีส่วนใหญ่ และยังมีโอกาสเกิดข้อบกพร่องต่ำกว่า
- มีที่มาจากหลักการออกแบบที่กองทัพเรือสหรัฐฯ เสนอในทศวรรษ 1960
41. หลักการ SOLID (SOLID Principles)
แนวทางสำคัญ 5 ข้อเพื่อยกระดับการออกแบบซอฟต์แวร์
- S — หลักการความรับผิดชอบเดียว (Single Responsibility): คลาสควรเปลี่ยนแปลงด้วยเหตุผลเดียวเท่านั้น
- O — หลักการเปิด-ปิด (Open-Closed): ควรเปิดให้ขยายได้ แต่ปิดไม่ให้แก้ไข
- L — หลักการแทนที่ของ Liskov: ชนิดย่อยต้องสามารถแทนที่ชนิดแม่ได้
- I — หลักการแยกอินเทอร์เฟซ: ไคลเอนต์ไม่ควรพึ่งพาอินเทอร์เฟซที่ตนไม่ได้ใช้
- D — หลักการผกผันการพึ่งพา: โมดูลระดับบนไม่ควรพึ่งพาโมดูลระดับล่าง แต่ควรพึ่งพา abstraction
- Robert C. Martin วางหลักการนี้ และ Michael Feathers เป็นผู้ตั้งชื่อย่อว่า SOLID
42. กฎของ Demeter (Law of Demeter)
อ็อบเจ็กต์ควรโต้ตอบเฉพาะกับเพื่อนโดยตรงของตน และควรหลีกเลี่ยงการสื่อสารโดยตรงกับอ็อบเจ็กต์แปลกหน้า
- เป็นหลักการที่บอกว่าควรหลีกเลี่ยง การเรียกแบบ chain เช่น
a.getB().getC().doSomething() - ช่วยลด coupling และเสริม encapsulation ทำให้ขอบเขตผลกระทบจากการเปลี่ยนแปลงแคบลง
- มีอีกชื่อว่า "หลักการแห่งความรู้น้อยที่สุด"
43. หลักการทำให้ประหลาดใจน้อยที่สุด (Principle of Least Astonishment)
ซอฟต์แวร์และอินเทอร์เฟซควรทำงานในแบบที่สร้างความประหลาดใจให้น้อยที่สุดแก่ผู้ใช้และนักพัฒนาคนอื่น
- ฟังก์ชัน API และ UI ควรมี พฤติกรรมที่คาดเดาได้ ตามชื่อและคอนเวนชัน
- ถ้าฟังก์ชัน
delete()แท้จริงแล้วแค่ archive ไว้ ก็จะทำให้เกิดความประหลาดใจ → เป็นข้อบกพร่องด้านการออกแบบ - พฤติกรรมที่ไม่เป็นธรรมชาติต่อการคาดเดาจะนำไปสู่บั๊กและความผิดพลาดของผู้ใช้
44. YAGNI (You Aren't Gonna Need It)
อย่าเพิ่มฟีเจอร์จนกว่าจะจำเป็นต้องใช้
- เป็นหลักการสำคัญของ Extreme Programming (XP) ที่ Ron Jeffries เสนอในช่วงปลายทศวรรษ 1990
- หากเขียนโค้ดเพียงเพราะคิดว่า "อนาคตอาจต้องใช้" จะก่อให้เกิด การออกแบบเกินความจำเป็น และภาระในการบำรุงรักษา
- การปฏิบัติตาม YAGNI ต้องอาศัย ความมั่นใจ ในการรีแฟกเตอร์ (เช่น test coverage ที่ดี, CI)
- ถ้าตอนนี้ต้องการแค่การ export JSON ก็ให้ทำเฉพาะ JSON ส่วน XML/YAML ค่อยเพิ่มเมื่อมีความต้องการ
การตัดสินใจ (Decisions)
45. ผลกระทบ Dunning-Kruger (Dunning-Kruger Effect)
ยิ่งรู้น้อยเกี่ยวกับเรื่องใด ก็มักยิ่งมีความมั่นใจมากขึ้นเกี่ยวกับเรื่องนั้น
- เช่น นักพัฒนามือใหม่อาจประเมินความยากของระบบซับซ้อนต่ำเกินไป ขณะที่ผู้เชี่ยวชาญกลับถ่อมตัวกับความรู้ของตนมากกว่า
- การเพิ่ม ความแม่นยำในการตระหนักรู้ตนเอง ผ่าน code review การมีเมนเทอร์ และการเรียนรู้อย่างต่อเนื่องเป็นสิ่งสำคัญ
46. มีดโกนของ Hanlon (Hanlon's Razor)
อย่าอธิบายสิ่งที่อธิบายได้ด้วยความเขลา หรือความประมาท ว่าเกิดจากเจตนาร้าย
- ก่อนจะตีความโค้ดแย่ ๆ หรือการตัดสินใจผิดพลาดของเพื่อนร่วมงานว่าเป็นการขัดขวางโดยเจตนา ควรพิจารณา ความไม่รู้ ความผิดพลาด และเวลาที่ไม่พอ ก่อน
- เป็นฐานของความไว้วางใจและการสื่อสารเชิงสร้างสรรค์ในทีม
47. มีดโกนของ Occam (Occam's Razor)
คำอธิบายที่เรียบง่ายที่สุดมักเป็นคำอธิบายที่ถูกต้องที่สุด
- เวลาแก้บั๊ก ควรตรวจสอบ ความเป็นไปได้ที่ง่ายที่สุด ก่อนสาเหตุที่ซับซ้อน
- ในการออกแบบสถาปัตยกรรมก็ควรสำรวจวิธีแก้ที่เรียบง่ายก่อนเพิ่มชั้น abstraction ที่ไม่จำเป็น
48. ความผิดพลาดจากต้นทุนจม (Sunk Cost Fallacy)
แนวโน้มที่จะคงการตัดสินใจที่ขาดทุนไว้ต่อไป เพียงเพราะได้ลงทุนเวลาและพลังงานไปแล้ว
- แม้ฟีเจอร์ที่พัฒนามา 6 เดือนจะมาผิดทาง ก็อาจ ทิ้งไม่ลงเพราะเสียดายเวลาที่ลงทุนไป
- การตัดสินใจที่ถูกต้องควรอิงจาก คุณค่าในอนาคต ไม่ใช่การลงทุนในอดีต
49. แผนที่ไม่ใช่อาณาเขตจริง (The Map Is Not the Territory)
แบบจำลองหรือการแทนความเป็นจริง ไม่ใช่ความเป็นจริงนั้นเอง
- UML diagram เอกสารสถาปัตยกรรม และ data model เป็นเพียง ภาพประมาณของความจริง เท่านั้น
- อย่าเชื่อแบบจำลองแบบงมงาย แต่ควรสังเกตการทำงานของระบบจริงและอัปเดตแบบจำลองตามนั้น
50. อคติยืนยันความเชื่อ (Confirmation Bias)
แนวโน้มที่จะชอบข้อมูลที่สนับสนุนความเชื่อหรือไอเดียเดิมของตน
- เป็นกับดักของการคัดเลือกเฉพาะข้อมูลที่เข้าข้าง tech stack หรือการตัดสินใจด้านการออกแบบที่ตนเลือก
- การ มองหาหลักฐานที่ขัดแย้งอย่างจริงจัง และเปิดรับมุมมองที่หลากหลาย คือหัวใจของการตัดสินใจอย่างสมดุล
51. Hype Cycle และกฎของ Amara (The Hype Cycle & Amara's Law)
มีแนวโน้มที่จะประเมินผลกระทบระยะสั้นของเทคโนโลยีสูงเกินไป และประเมินผลกระทบระยะยาวต่ำเกินไป
- Hype Cycle ของ Gartner: การจุดกระแสเทคโนโลยี → จุดสูงสุดของความคาดหวังที่เกินจริง → หุบเขาแห่งความผิดหวัง → ทางชันแห่งความกระจ่าง → ระยะที่เสถียรของผลิตภาพ
- เมื่อนำเทคโนโลยีใหม่ ๆ (เช่น blockchain, AI) มาใช้ ควรหลีกเลี่ยงการถูกกระแสความร้อนแรงระยะสั้นพัดพา และประเมิน ความเป็นประโยชน์ใช้สอยในระยะยาว
52. Lindy Effect
ยิ่งสิ่งใดถูกใช้งานมาเป็นเวลานาน ก็ยิ่งมีแนวโน้มว่าจะถูกใช้งานต่อไปในอนาคต
- เทคโนโลยีที่ ถูกใช้งานมาหลายทศวรรษ อย่าง UNIX, SQL และภาษา C มีแนวโน้มสูงที่จะคงอยู่ต่อไปอีกนาน
- เป็นเหตุผลเชิงทฤษฎีสำหรับการเลือกใช้เทคโนโลยีที่ผ่านการพิสูจน์แล้วแทนเฟรมเวิร์กใหม่ ๆ
- Nassim Nicholas Taleb ทำให้แนวคิดนี้เป็นที่แพร่หลายใน Antifragile
53. การคิดแบบปฐมหลักการ (First Principles Thinking)
วิธีคิดที่แยกปัญหาซับซ้อนออกเป็นองค์ประกอบพื้นฐานที่สุด แล้วสร้างขึ้นใหม่จากจุดนั้น
- ตัดทิ้งแนวปฏิบัติและสมมติฐานเดิม ๆ แล้วเริ่มจาก ความจริงระดับรากฐาน เพื่อหาทางแก้ปัญหา
- เป็นที่รู้จักจากกรณีที่ Elon Musk นำไปใช้เพื่อลดต้นทุนจรวดของ SpaceX
- ในการออกแบบระบบที่ซับซ้อน ควรระวังแนวคิดแบบ "ก็ทำกันแบบนี้มาแต่เดิม"
54. การคิดแบบย้อนกลับ (Inversion)
วิธีแก้ปัญหาด้วยการสมมติผลลัพธ์ตรงข้าม แล้วอนุมานย้อนกลับ
- แทนที่จะคิดว่า "จะทำอย่างไรถึงจะสำเร็จ" ให้คิดก่อนว่า "จะทำอย่างไรถึงจะล้มเหลว" เพื่อระบุปัจจัยเสี่ยง
- เป็นพื้นฐานเชิงทฤษฎีของการวิเคราะห์ Failure Mode Analysis และ Pre-mortem
- เป็น mental model ที่ Charlie Munger ใช้บ่อย
55. หลักการพาเรโต / กฎ 80/20 (Pareto Principle)
80% ของปัญหาเกิดจาก 20% ของสาเหตุ
- บั๊กทั้งหมด 80% มัก กระจุกตัวอยู่ในโค้ด 20%
- การทุ่มทรัพยากรไปที่ 20% ที่มีผลกระทบมากที่สุด เป็นกลยุทธ์จัดสรรทรัพยากรที่มีประสิทธิภาพ
- มีที่มาจากหลักการที่ Vilfredo Pareto สังเกตจากการกระจายการถือครองที่ดินในอิตาลี
56. กฎของ Cunningham (Cunningham's Law)
วิธีที่ดีที่สุดในการได้คำตอบที่ถูกต้องบนอินเทอร์เน็ต ไม่ใช่การตั้งคำถาม แต่คือการโพสต์คำตอบที่ผิด
- ผู้คนมักมีส่วนร่วมอย่างกระตือรือร้นกับการ แก้ไขข้อมูลที่ผิด มากกว่าการตอบคำถาม
- เป็นกฎที่ตั้งชื่อตาม Ward Cunningham (ผู้คิดค้น Wiki) แต่จริง ๆ แล้ว Steven McGeady เป็นผู้ตั้งชื่อนี้
- เป็นข้อคิดที่นำไปใช้ได้กับการทำเอกสารหรือการแบ่งปันความรู้ในชุมชนโอเพนซอร์ส
2 ความคิดเห็น
ความคิดเห็นใน Hacker News
ฉันเกลียดวลี "การปรับแต่งประสิทธิภาพเร็วเกินไป คือรากเหง้าของความชั่วร้ายทั้งปวง" เป็นพิเศษ ประโยคนี้มาจากบริบทของปี 1974 ซึ่งมีสมมติฐานต่างจากปัจจุบัน ตอนนั้นการ optimize ใกล้เคียงกับการเขียน assembly และนับจำนวน cycle แต่ทุกวันนี้ประสิทธิภาพส่วนใหญ่เป็นปัญหาของ การเลือกสถาปัตยกรรม จึงต้องคิดตั้งแต่ต้น คำแนะนำให้ใช้ profiling เพื่อจับบั๊กด้านประสิทธิภาพอย่าง O(n²) ที่เกิดขึ้นโดยไม่ตั้งใจยังคงใช้ได้ แต่พอค่าใช้จ่ายของ abstraction กลายเป็นคอขวดแล้ว ก็มักลงเอยด้วยการแปะ cache กับ parallelism เพิ่มเข้าไป จนระบบซับซ้อนขึ้นและช้าลงกว่าเดิม ตอนนี้ฉันมองว่าการ optimize ช้าเกินไปก็แย่พอๆ กับการ optimize เร็วเกินไป หรืออาจแย่กว่าเสียอีก
ฉันเสียดายที่ไม่มี Curly's Law ตัวแปรควรมี ความหมายเดียว เท่านั้น ไม่ควรเก็บค่าจากคนละโดเมนตามสถานการณ์ หรือทำหน้าที่สองอย่างพร้อมกัน อุปมาแบบ "เป็นทั้งน้ำยาเคลือบพื้นและท็อปปิงของหวาน" นี่ตรงมาก
ฉันรู้สึกว่าพอรวบรวม "กฎ" ของซอฟต์แวร์พวกนี้ไว้ด้วยกัน มันมี ความขัดแย้งภายใน กันมากเกินไป สุดท้ายเลยหยิบประโยคไหนมาก็ได้เพื่อสนับสนุนสิ่งที่ตัวเองอยากพูด เรื่องที่ยากจริงคือการรู้ว่าเมื่อไรควรละเมิดกฎข้อไหน และทำไมถึงต้องละเมิดมัน
ถ้าจะพูดเล่นเรื่องกฎวิศวกรรมซอฟต์แวร์ฉบับปี 2026 ฉันว่าเว็บทุกแห่งจะถูก vibe coding ด้วย Claude Opus ผลคือพื้นหลังจะออกโทนครีมคล้าย Anthropic ฟอนต์กับน้ำหนักตัวอักษรจะถูกผสมกันเกินเหตุเหมือนคนเพิ่งหัดออกแบบเรียนรู้เรื่อง typography มาใหม่ๆ จะมี card UI ล้นไปหมด และชอบทำกรอบสีมนๆ แค่ด้านเดียวของการ์ดเป็นแพตเทิร์นซ้ำๆ
ฉันคิดว่าควรใส่ Boyd's Law of Iteration ด้วย เวลารับมือกับความซับซ้อน หลายครั้ง การวนซ้ำอย่างรวดเร็ว ให้ผลดีกว่าการวิเคราะห์เชิงลึกเสียอีก และยิ่งน่าประทับใจเมื่อคิดว่า Boyd คือคนที่สร้าง OODA loop
ฉันคิดว่าในบรรดาคอมเมนต์ที่ถูกลบ มี เมตากฎที่ดีที่สุด สำหรับบทความนี้อยู่ ข้อความนั้นคือ "กฎวิศวกรรมซอฟต์แวร์ทุกข้อจะถูกเข้าใจผิดทันที และถูกนำไปใช้อย่างไม่วิพากษ์วิจารณ์ในแบบที่ผู้เขียนต้นฉบับต้องช็อก" พอเห็นพฤติกรรมของ LLM ที่ขาดบริบทสำคัญ ก็ยิ่งเข้าใจว่าทำไม สุดท้ายแล้วการบีบอัดภูมิปัญญาและประสบการณ์หลายสิบปีให้เหลือเป็น คำคมบรรทัดเดียว มันมีขีดจำกัด
ถ้าจะ vibe coding เว็บไซต์ที่เป็นแค่ "รายการกฎวิศวกรรมซอฟต์แวร์" ทั้งเว็บ ฉันก็อยากถามว่าการไม่ทำเป็นหน้า Wikipedia ไปเลยนั้นมันผิดกฎข้อไหน
ฉันหวังว่าเรื่องแบบนี้จะเป็น ความรู้พื้นฐาน ถึงขั้นเป็นข้อกำหนดในการสมัครงานเลย เพราะมันดูเป็นสิ่งที่ทุกคนควรรู้
ถึงจะไม่ใช่กฎเฉพาะของซอฟต์แวร์ ฉันก็มักสอน Chesterton's Fence ให้เด็กฝึกงานกับพนักงานใหม่ก่อนเป็นอย่างแรก
ฉันรู้สึกว่า กฎการอนุรักษ์ความซับซ้อนของ Tesler ให้ภาพเข้าใจได้ทันทีจากตัวประโยคเอง มันบอกว่าแอปพลิเคชันทุกตัวมีความซับซ้อนประจำตัวที่เอาออกไม่ได้ มีได้แค่ย้ายที่เท่านั้น แต่พออ่านคำอธิบายต่อ มันกลับเหมือนย่อเหลือแค่คำแนะนำธรรมดาว่าอย่าทำให้ผู้ใช้ลำบากเกินไป ซึ่งทำให้ความน่าสนใจลดลงหน่อย ผู้ใช้ก็ยังต้องเผชิญกับความซับซ้อนในระดับที่จำเป็นอยู่ดี และถ้าลดแบบไม่คิดก็อาจกลายเป็นของเล่นที่ยืดหยุ่นน้อย ดังนั้นเวลาฉัน refactor ฉันจึงเห็นว่าการจำไว้ว่าพอทำให้ส่วนหนึ่งง่ายลง อีกส่วนหนึ่งอาจซับซ้อนขึ้นนั้นมีประโยชน์กว่า
ถ้า vibe coding มันก็ดีอยู่ในตอนนี้ แต่สุดท้ายก็ดูเหมือนว่าจะย้อนกลับมาส่งผลกรรมกับเรา...