ใครๆก็อยากใช้ซอฟต์แวร์ที่ใช้งานง่ายทั้งนั้น แต่ทำไมเราจึงเห็นซอฟต์แวร์ที่ใช้งานยากและซับซ้อนอยู่ทั่วไป ในยุค digital disruption เราจะพยายามหลีกเลี่ยง UI ที่ใช้งานยาก แต่สุดท้ายความซับซ้อน ก็เกิดขึ้นมาตามธรรมชาติโดยไม่ได้ตั้งใจ ดังนั้น software developers ต้องทำความเข้าใจถึงสาเหตุว่าทำไมความซับซ้อนของซอฟต์แวร์จึงบังเกิด
![](https://i0.wp.com/codingugly.com/wp-content/uploads/2021/05/blockdit-main-complex-feature.png?resize=1024%2C1024&ssl=1)
ทุกอย่างเกิดขึ้นจากความต้องการของ user เมื่อมี feature request เข้ามา การใส่ feature เข้าไปแบบง่ายที่สุด และเป็นธรรมชาติที่สุดคือการเพิ่มเข้าไปแบบดื้อๆ โดยไม่ไปแตะส่วนอื่นๆเลย แล้ว insert component ใหม่นี้เข้าไป ไม่ว่าจะเป็นการเพิ่มปุ่มใหม่ หรือ parameter ที่เพิ่มเข้ามาใน function เมื่อเกิดบ่อยๆซ้ำๆ ความเรียบง่ายของระบบจะหายไป และจะถูกแทนที่ด้วยความซับซ้อน pattern แบบนี้จะพบเห็นได้ทั่วไปใน enterprise software ที่บางครั้ง feature ใหม่ถูกเขียนขึ้นเพื่อ support user กลุ่มหนึ่งโดยเฉพาะ แต่อาจไปเพิ่มภาระให้กับ user อีกกลุ่มที่เหลือ
ทุก feature request จะมี user ที่สนับสนุนอยู่แล้ว user อยากได้และอยากให้มันเกิด แต่ถ้ามองในทางกลับกันความเรียบง่ายของระบบ เหมือนจะไม่มีผู้สนับสนุนเลย เป็น non functional feature ที่มักจะไม่มีใคร request และมักจะแพ้เมื่อมี feature request ใหม่เข้ามา การจะบอกว่าอย่าทำเลย มันจะเพิ่มความซับซ้อนให้ระบบก็พูดได้ยาก เพราะ user ที่เขาสนับสนุนสามารถชี้ให้เห็นประโยชน์ที่เป็นรูปธรรมสำหรับกรณีของเขาได้เสมอ แต่ฝ่ายที่ไม่สนับสนุนมักเถียงเป็นรูปธรรมได้ยากและสุดท้ายจะถูกเพิกเฉย นำไปสู่การเพิ่ม feature เข้าไปอย่างไม่หยุดยั้งและลบความเรียบง่ายของซอฟต์แวร์ไป
![](https://i0.wp.com/codingugly.com/wp-content/uploads/2021/05/1_t4WBxJJKxgK1wvwK53zlvg.png?resize=512%2C377&ssl=1)
การที่จะออกจากวงจรนี้ไม่ใช่เรื่องง่าย เราอาจพูดได้ว่า เราจะปฏิเสธ feature requests ใหม่ทั้งหมดซะ แต่ในที่สุดแล้ว project ที่ทำแบบนั้นจะไม่สามารถตอบสนองความต้องการของ user ได้เลย แนวทางหรือ approach ในการออกจากวงจรนี้คือต้องทำการชั่งน้ำหนักให้มากๆ ต้องใช้เวลาคิดให้มากว่า new feature request จะเพิ่มภาระอะไรบ้างให้กับ user ในขณะที่เราคิดว่ามันจะมีประโยชน์อะไรกับ user ที่อยากได้ และเราควรใช้เวลาคิดให้มากถึง การ design การออกแบบ new feature ให้มี concept ที่เป็นเนื้อเดียวกันกับระบบ คงความเรียบง่ายและวัตถุประสงค์หลักไว้ เหมือนอย่างที่ Fred Brooks พูดไว้ในหนังสือ “The Mythical Man-month” ว่าการ design ต้องมี conceptual integrity ซึ่งจะมาเล่าให้ฟังในภายหลัง หาก feature ใหม่ไม่สามารถทำให้มี concept ที่สอดคล้องกับ integrity ของระบบแล้ว ก็ไม่ต่างจากการ insert component อันนึงเข้าไปดื้อๆโดยไม่คำนึงถึงส่วนอื่นๆ และทุกคนจะต้องรับผิดชอบร่วมกันว่านี่คือการทำให้ซอฟต์แวร์เกิดความซับซ้อนและใช้งานยาก