วันนี้อ่านเจอเรื่อง complexity ของ software
จะประกอบไปด้วย 2 ชนิดหลัก ๆ คือ
- Essential complexity
- Accidental complexity
เป็นเรื่องที่น่าสนใจ จึงทำการสรุปไว้นิดหน่อย
Essential complexity
เป็นความซับซ้อนที่เกิดขึ้นกับ software เป็นปกติ
ที่ไม่สามารถหลีกเลี่ยง หรือ เอาออกไปได้
เพราะว่า เกิดมาจากการแก้ไขปัญหานั้น ๆ
จะมากหรือน้อยเท่านั้นเอง
Accidental complexity
เป็นความซับซ้อนที่เกิดขึ้นจากการออกแบบ วางแผน พัฒนาและ deploy
จาก delivery team ของ software นั้น ๆ เอง
ซึ่งมักจะไม่ได้เกี่ยวกับการแก้ไขปัญหานั้น ๆ โดยตรงเหมือน
เป็นการปะผุ หรือ แก้ไขอะไรบางอย่าง เพื่อให้ทำอีกอย่างได้
แต่ไม่ได้แก้ไขที่ต้นเหตุ
เป็นรูปแบบของความซับซ้อนที่ควรหลีกเลี่ยงหรือระมัดระวังให้มาก
เพราะว่าผลที่ตามมามันเกินความคาดเดาและยากต่อการหาปัญหาและแก้ไขอีกด้วย
ยกตัวอย่างเช่น
มีต้นไม้ขวางทางสิ่งที่เราทำคือ
สร้างกำแพงรอบต้นไม้
จากนั้นทำทางอ้อมไป หรือว่า เป็นสะพาน หรือ ขุดอุโมงค์ลอดไป
ดังนั้นจึงควรให้ความสำคัญ
ตั้งแต่การออกแบบ การแบ่งหน้าที่รับผิดชอบให้ชัดเจน
รวมทั้งการเริ่มแบบ simple หรือ เรียบง่ายก่อน
อย่าไปท่าเยอะ หรือ pattern เยอะมากมาย
มิฉะนั้นก็จะก่อให้เกิด accidental complexity ขึ้นมาอีก
ชอบรูปนี้ อธิบายได้ชัดเจนมาก ๆ
กลับมาในโลกของการพัฒนา software
เราจะเจอความซับซ้อนใน 2 แบบหลัก ๆ คือ
- ความสามารถในการทำความเข้าใจ การดูแลรักษาแต่ละส่วนของ code/module/component ของระบบ หลังจากที่สร้างมันขึ้นมาแล้ว
- Big-O complexity เป็นความซับซ้อนจาก algorithm ที่ใช้เพื่อแก้ไขปัญหา ว่าเป็นอย่างไร ทั้งความซับซ้อนและความเร็ว
โดยถ้ามองในแง่ของนักพัฒนาแล้ว
ปัญหาที่มักก่อให่เกิดความซับซ้อนโดยเปล่าประโยชน์ ประกอบไปด้วย
- ขาดความรู้ความเข้าใจ ในสิ่งที่ทำ หรือ ในสิ่งที่นำมาใช้ ทั้งเครื่องมือ framework รวมถึงภาษาโปรแกรมที่ใช้
- ขาดการวางแผนที่ดี รวมถึงความเข้าใจในงานที่ทำ ว่าควรจะออกแบบ วางแผน พัฒนา และทดสอบอย่างไร เรื่องของการแบ่งงานก็สำคัญ
- อะไรที่ไม่เข้าใจก็ยังลงมือทำ ยิ่งทำยิ่งซับซ้อน ถึงแม้จะแก้ไขปัญหาได้ก็ตาม บ่อยครั้งนักพัฒนายังตกใจ ว่ามันทำงานได้อย่างไร !!
- บ่อยครั้งพบว่า ถ้าส่วนไหนที่มันทำงานได้ เราจะไม่ไปแก้ไขให้มันดีขึ้น ทั้ง ๆ ที่รู้ว่ามันไม่ดี หรือ มีความซับซ้อน หรือ มีสิ่งที่ไม่รู้อีกเพียบ
เมื่อเวลาผ่านไปเรื่อย ๆ ก็จะเป็นไปตามรูปด้านบนนั่นเอง
ลองดูสิว่า ในระบบงานของเรามีความซับซ้อนแบบไหนบ้าง ?