August 1st, 2010 | |
Posted in design
นี่เป็นส่วนหนึ่งในหัวข้อของ Software’s Primary Technical Imperative: Managing Complexity
แปลมาจาก หนังสือ Code Complete #2
Importance of Managing Complexity
ความสำคัญของการจัดการความซับซ้อน
เมื่อรายงานผลสำรวจถึงสาเหตความผิดพลาดของ software-project พวกเขาไม่ค่อยจะระบุว่า ความผิดพลาดทางเทคนิคเป็นสาเหตุของความผิดพลาดใน project
การที่ Project fail มักมีสาเหตุมาจาก
- poor requirements
- poor planning
- poor management
ถ้า project จะ fail ในต้นเหตทางเทคนิค ก็มักจะมีสาเหตุมาจาก uncontrolled complexity หรือ การไม่ควบคุมความซับซ้อนที่จะเกิด เพราะ software มีการเติบโตในทางซับซ้อนได้ตลอดเวลาในแบบที่ไม่มีใครคาดคิด เมื่อถึงจุดหนึ่งถ้าหากโปรเจ็คมีความซับซ้อนแบบที่ไม่มีใครเข้าใจมันอย่าง แท้จริง ผลกระทบที่ตามมาจากการแก้ไขโค้ดที่หนึ่งส่งผลกระทบถึงในส่วนอื่นๆตามมา progress หรือความคืบหน้าของงานจะช้าลงหรือชะงักไปในที่สุด
….There are two ways of constructing a software design:
one way is to make it so simple that there are obviously no deficiencies, and
the other is to make it so complicated that there are no obvious deficiencies — C. A. R. Hoare
อาจกล่าวได้ว่า Managing Complexity เป็นหัวข้อที่สำคัญที่สุดหัวข้อหนึ่งในทาง technical ของ software development.
Dijkstra (1972) ชี้ให้เห็นว่าไม่มีกะโหลกของมนุษย์คนไหนใหญ่พอที่จะบรรจุ โปรแกรมคอมพิวเตอร์สมัยใหม่ได้:ซึ่งหมายความว่าเราในฐานะ software developers ไม่ควรพยายามที่จะอัดโปรแกรมทั้งโปรแกรมเข้าไว้ในหัวเราในคราวเดียว
; เราควรจัดระบบโปรแกรมให้อยู่ในรูปแบบที่ง่ายต่อการ “focus” เมื่อใดที่เราต้องการได้, นั่นคือการลดขนาดของโปรแกรมของเราที่ลงถึงขนาดที่เราคิดเมื่อใดก็ตาม เราอาจลองคิดเล่นๆเหมือนเราเล่นกลเลี้ยงบอลในอากาศ ยิ่งเราเลี้ยงบอลมากโอกาสที่จะทำบอลหล่นยิ่งสูง บอลแต่ละลูกที่เราทำหล่นก็นำไปสู่การออกแบบที่ผิดพลาด หรือ coding error
อาการ ที่บ่งบอกว่าเรากำลังจมอยู่ในความซับซ้อนก็คือเมื่อเราพบว่าตัวเองกำลังดื้อ ดึงที่จะ implement method ที่ไม่เกี่ยวเนื่องกัน, อย่างน้อยก็ในสายตาคนนอก. มันก็เหมือนกับรถของคนที่ขาดความรู้ทางเครื่องยนต์เสีย แต่พยายามใส่น้ำลงในแบตเตอรี่และทำความสะอาดที่เขี่ยบุหรี่ — P. J. Plauger
ในระดับของ Software-architecture, ความซับซ้อนของปัญหาจะลดลงเนื่องจากการ แบ่งระบบออกเป็น subsystems. ลองเปรียบเทียบว่า เราใช้เวลาทำงานง่ายๆในชิ้นส่วนเล็กๆหลายๆส่วน กับ แก้ปัญหาของชิ้นส่วนชิ้นโตส่วนเดียว แบบไหนดีกว่ากัน? เป้าหมายของทุกๆการออกแบบระบบ software คือการแตกปัญหาที่ซับซ้อนออกเป็นส่วนย่อยๆเพื่อการแก้ปัญหาที่ง่ายขึ้น ยิ่ง subsystems มีอิสระต่อกันมากเท่าไหร่ มันจะปลอดภัยในการfocusส่วนนั้นๆมากขึ้น
การกำหนดช่วงเวลาให้สั้นช่วยให้ลดภาระทางด้านจิตใจ(mental workload). เขียนโปรแกรมใน term ของ problem domain มากกว่าที่จะเขียนใน term ของรายละเอียดใน low-level implementaion (พุ่งเป้าไปที่ปัญหามากกว่าจะมองลึกลงไปในรายละเอียดการimplement) และทำงานกับ “highest level of abstration” คือมองจากผลลัพธ์ภายนอกสุด จะลดภาระของสมองเราได้มาก
ผลสำเร็จของ programmer คือความสามารถที่มนุษย์คนหนึ่ง(programmer) ทำได้เพื่อให้โค้ดของเขา ง่ายต่อการเข้าใจ ต่อตัวเขาเองและคนอ่าน และทำให้มี error น้อยที่สุด
How to Attack Complexity
Project ที่มีการ take cost สูง design ไม่มีประสิทธิภาพ มักมาจาก 3 ปัจจัย
- การมี solution ที่ซับซ้อนเกินไปเพื่อแก้ปัญหาเล็กๆ
- การมี solution ที่ง่าย และไม่เหมาะสมกับปัญหาที่ซับซ้อน
- ความไม่เหมาะสม กับการมี solutionซับซ้อน ที่มีต่อปัญหาที่ซับซ้อน
Dijkstra กล่าวว่า software สมัยใหม่นั้นมีความซับซ้อนโดยตัวมันเองอยู่แล้ว และไม่ว่าเราจะพยายามเท่าไหร่ในที่สุดเราก็ต้องเจอกับความซับซ้อนในระดับใด ระดับหนึ่งกับปัญหาที่มีในโลกแห่งความเป็นจริง
คำแนะนำในการจัดการกับความซับซ้อน
-ย่อขนาดของ ความซับซ้อนให้และแตกงานที่เป็นประเภท Essential Complexity ให้เหมาะสมกับคนที่จะสามารถแก้ปัญหาได้ในช่วงเวลาที่เหมาะสม
-จำกัดงานที่เป็นประเภท Accidental Complexity ให้น้อยที่สุด
หาก เราระรึกไว้เสมอว่า การจัดการกับความซับซ้อนมีความสำคัญไม่ยิ่งหย่อนไปกว่ากระบวนการทางเทคนิค ของ software การออกแบบที่ตามมาย่อมออกมาตรงไปตรงมาไม่ซับซ้อนเกินไป
Tags:
design