วันนี้อ่านเจอเรื่อง 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 รวมถึงภาษาโปรแกรมที่ใช้
  • ขาดการวางแผนที่ดี รวมถึงความเข้าใจในงานที่ทำ ว่าควรจะออกแบบ วางแผน พัฒนา และทดสอบอย่างไร เรื่องของการแบ่งงานก็สำคัญ
  • อะไรที่ไม่เข้าใจก็ยังลงมือทำ ยิ่งทำยิ่งซับซ้อน ถึงแม้จะแก้ไขปัญหาได้ก็ตาม บ่อยครั้งนักพัฒนายังตกใจ ว่ามันทำงานได้อย่างไร !!
  • บ่อยครั้งพบว่า ถ้าส่วนไหนที่มันทำงานได้ เราจะไม่ไปแก้ไขให้มันดีขึ้น ทั้ง ๆ ที่รู้ว่ามันไม่ดี หรือ มีความซับซ้อน หรือ มีสิ่งที่ไม่รู้อีกเพียบ

เมื่อเวลาผ่านไปเรื่อย ๆ ก็จะเป็นไปตามรูปด้านบนนั่นเอง

ลองดูสิว่า ในระบบงานของเรามีความซับซ้อนแบบไหนบ้าง ?