Free rant on Inheritance is evil

Disclaimer: บล็อกนี้ผมปล่อยไปตามหัวตัวเอง เขียนแบบไม่สนใจความต่อเนื่องหรือประเด็นอะไรทั้งสิ้น

ทำไมผมชอบพูดว่า Inheritance is evil

ถ้าพูดถึง Code reuse strategy แล้วเนี่ย ตอนนี้เรารู้แล้วว่าปกติ Composition มักจะครอบคลุม Common use case ได้มากกว่า

ปัญหาจริงๆ ผมว่ามันเกิดจากตัวภาษา OOP ที่เป็นที่นิยมทั้งหลาย (Java, C#) มันทำให้ Inheritance สามารถทำสำเร็จได้อย่างง่ายดายแค่เพียง Keyword เดียวคือ “ : BaseClass” ในขณะที่ถ้าเราจะทำ Composition เราต้อง…. เยอะอ่ะ อย่างน้อยก็ 3–4 บรรทัดขึ้น จนตอนหลังเรามี Annotation/Attribute ค่อยดีขึ้นหน่อย

จริงๆ นี่ผมว่าเป็นปัญหาที่การออกแบบภาษานะ คือ โดยทั่วไปดีไซน์ที่ดีมันต้องมีทางเลือกให้เราก็ใช่ แต่ทางกลับกันมันต้องทำให้ทำสิ่งที่มักจะถูกได้ง่ายกว่าสิ่งที่มักจะผิด

ถ้าลองไปดู express.js คุณแค่ app.use(‘middleware’) จบจ๊ะ Composition ได้ 7 ตัวอักษร พอมันดีไซน์แบบนี้ ผมก็ไม่เคยเห็นใครจะกระแดะพยายาม Inherit หรือ Monkey patch express โดยไม่ลองทำ Middleware ก่อนนะ

ในทางกลับกัน แม้แต่ผมเองตอนเขียน MVC ใหม่ๆ ก็ยังแก้ไข Controller ด้วย Inheritance เลย ตอนหลังพึ่งมาเห็นว่าเห้ยวิธีที่ดีกว่าคือ Attribute/Annotation ไม่ใช่ Inherit มา แล้วก็มาพังตอน Update version MVC Framework ยังงี้

โอเค ผมก็เคยโง่ แต่พอย์ตคือภาษามันเหนี่ยวนำให้ Initial though ไปทางนั้น ดีไซน์มันเป็นแบบนั้น

สิ่งที่หนักขึ้นคือไปเจอ Standard library มันล่อ Inheritance tree ไป 8 ชั้น จะมาบอกว่า “Inheritance เยอะๆ ไม่ดีนะ” ผมก็โดนตอกกลับไปดิว่า “พี่เป็นใครวะ ขนาด Microsoft/Oracle เขายังทำมา 8–10 ชั้น พี่เป็นใครมาบอกว่ามันไม่ดี”

คือ ในใจจะบอกว่า Microsoft ก็ไม่ได้ฉลาดขนาดนั้น เขาก็ทำพลาดแล้วก็มาบ่นทีหลังว่าไม่น่าทำยังงี้เลย เหมือนเราๆ นี่แหละนาย เหมือนที่โปรแกรมเมอร์แทบทุกคนบ่นโค้ดที่เขียนเมื่อ 3 ปีที่แล้วเสมอนี่แหละนาย โปรแกรมเมอร์ Google, Microsoft, Facebook, etc. ก็บ่นแบบเดียวกันนี่แหละนาย ก็คนเหมือนกัน

แต่โอเค พอภาษามันออกแบบมาทำให้มันทำง่ายจนเป็นสิ่งแรกที่เราคิดขึ้นมาเสมอเวลาจะ Reuse code บวกกับ Stdlib ก็ชวนให้คิดว่านี่คือ Practice ที่ดี การจะมาบอกว่า Practice นี่มันไม่ได้ดีเสมอไป ใจเย็นๆ นะเว้ย มันก็ต้องออกแรงเยอะหน่อย ก็เลยย้ำข้อความนี้บ่อยๆ ว่า ก่อน Inheritance คิดดีๆ คิดดีๆ มันใช้แค่ 7 ตัวอักษรในภาษา Java, C# มันเป็นกับดักใหญ่มากที่ตกลงไปง่ายมากๆ

ผมเคลมว่าตรงนี้ Design ของตัวภาษามันเหนี่ยวนำให้ทำในสิ่งที่ปกติไม่ควรทำได้ง่ายกว่าสิ่งที่ปกติควรทำ

Rant ที่จะบ่นคือ อย่าไปเชื่อมากว่าเพียงเพราะ Java มันออกแบบมายังงี้ C# มันออกแบบมายังงี้ เขาต้องคิดมาดีแล้ว ไม่ๆๆๆ มันก็คนเหมือนกับเรานี่แหละ ออกแบบพลาดได้เหมือนกับเรานี่แหละ แล้วก็ติด Technical debt จะรื้อภาษาใหม่ก็กระทบเยอะไป จนต้องทนๆ กันไปก่อน เหมือนเรานี่แหละ

โปรแกรมเมอร์ไม่ว่าที่ไหนเทพมาจากไหน ก็เจอปัญหาแบบนี้แหละคร้าบ ไม่มีใครเทพหลุดพ้นปัญหานี้ไปได้ ดีไซน์ทีเดียวคิดดีๆ เวิร์คไป 20 ปีไม่มีจริง Linus Torvalds ก็เจอปัญหาแบบนี้คร้าบ Let alone just a Google/Facebook/Microsoft Engineer

(นี่คือเหตุผลนึงที่ LISP มันน่าทึ่งมาก มันเป็นไม่กี่อย่างที่ผมมองว่า เห้ย อยู่ได้นานมากๆ)

จะหลุดจากหล่มนี้ได้ต้องลองเขียนหลายภาษาอ่ะ แล้วก็คิดใน Term ที่มองไปที่ผลลัพธ์เป็นหลัก ว่า “เราออกแบบกันเนี่ยสุดท้ายเราจะได้ทำงานง่ายขึ้น”

จึงเป็นที่มาของอีก Rant คือ คนที่หมกมุ่นกับ Software architect ผมเจอน้อยคนจริงๆ นะ ที่หมกมุ่นกับผลลัพธ์ว่าอยากให้โปรแกรมเมอร์สบายขึ้น Maintain โค้ดได้ง่ายขึ้น (แล้วคนที่ Mindset แบบนี้มักจะเป็น Architect ที่เก่ง) มักจะหมกมุ่นกับ Practice มากกว่า ว่าต้องทำแบบนั้นสิ แบบนี้สิ ต้อง Microservice สิ ต้อง XXX สิ

แล้วปัญหามัน Snowball หนักขึ้นเมื่อ Architect ที่หมกมุ่นกับ Best practice ไปสร้าง Mentality แบบ Us versus Them แบบที่ให้ความรู้สึกว่าข้าเป็นคนทำให้ชีวิตเอ็งลำบากเองเจ้าพวก Noob ไม่อ่านหนังสือ

ถ้าเราตีความว่า Software architect คือ การทำให้โค้ดดูแลง่ายขึ้น คนในทีมทำงานสบายขึ้นแล้วล่ะก็ การสร้างบรรยากาศ Us versus them คือ Exact opposite of what are you supposed to do แบบสุดๆ นะจ๊ะ

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.