legacy-code
Legacy code มักจะเรียก code ที่ไม่มี test
Legacy code มักจะน่ากลัว
Legacy code มักถูกรังเกียจ
Legacy code มักจะแย่
Legacy code มักจะถูกด่าแบบเสียๆ หายๆ
Legacy code มักจะเป็นส่วนที่มีคุณค่าต่อองค์กร

แต่แปลกนะที่ทุกคนยังคงทนอยู่กับ Legacy code
โดยไม่ทำให้มันดีขึ้นมาเลย !!

หลังจากที่ได้สัมผัสกับ Legacy code มาเราได้เรียนรู้อะไรกับมันบ้าง ?
ใน Legacy code นั้นมันไม่ใช่มีแต่ข้อเสียนะ
แต่ยังไม่ข้อดีอื่นๆ ที่มันได้สอน ฝึกเราทั้ง technical และ ทัศนคติ ดังต่อไปนี้

1. มีวินัยในขอบเขตของงาน

ได้เรียนรู้ว่าการ focus ในงานอย่างใดอย่างหนึ่งเท่านั้น
ทำการเปลี่ยนแปลง code ในเฉพาะส่วนที่ต้องการเท่านั้น
เนื่องจาก บ่อยครั้งมากที่พบว่า code ในส่วนงานนั้นๆ มันไม่ดี
เลยคิดไปว่า น่าจะเขียนใหม่เลยดีกว่า ซึ่งมันต้องดีกว่าแน่นอน
แต่มักจะพบว่า เมื่อทำการเขียน code ชุดใหม่มาแทนที่แล้ว
จะเจอ bug และ ปัญหาต่างๆ มากมาย ทั้งของเดิมที่มีอยู่แล้ว
และของใหม่ที่เพิ่มเข้าไป ทั้งที่รู็ และ ไม่รู้
ส่งผลให้ใช้เวลาในการแก้ไขที่สูงมากๆ

ดังนั้น แทนที่จะทำการเขียน code ชุดใหม่
ก็ให้ทำการปรับปรุง code ให้มันดีขึ้นกว่าเดิม
ทำแบบนี้ไปเรื่อยๆ แล้ว code มันจะดีขึ้นเอง

และอีกอย่างก็คือ ถ้าส่วนไหนมันยังคงทำงานได้เป็นปกติ
ก็ไม่ต้องทำการแก้ไขมันนะ
แต่ถ้ามันเกิดทำงานผิดปกติ นั่นแหละคือส่วนที่คุณต้อง focus
และทำให้มันดีขึ้นกว่าเดิม ไม่ใช่การ rewrite นะ

2. ได้ใช้งานและฝึก Automated testing และ Technical skill อื่นๆ มากมาย

มักจะพบว่า application บางตัวใช้เวลาในการ start ระบบนานมาก
หรือก็มีพวก dependency application/library เยอะมากๆ
โดยมักจะเรียกว่า Legacy application
ที่สำคัญมันยากต่อการทำความเข้าใจอีกด้วย
หันไปถามใคร ก็ไม่มีใครที่รู้ และ เข้าใจมันจริงๆ เลย
เพียงแค่ดูแลมันไปวันๆ ก็จะแย่กันอยู่แล้ว

ดังนั้น ในการที่จะเรียนรู้ และ เข้าใจ Legacy code นั้น
พบว่าต้องเรียนรู้ และ นำพวก Automated testing เข้ามาใช้งานด้วยอย่างแรง
แต่การจะเขียน code เพื่อทดสอบ เช่น เขียน unit test บน Legacy code
มันเป็นสิ่งที่ยากมากๆ เนื่องจากมันทั้งซับซ้อน และ dependency เยอะ

ดังนั้น เราก็ควรที่จะเรียนรู้ technical skill อื่นๆ ด้วย เช่น

  • การ Refactoring code
  • การแยก code ให้สามารถทดสอบได้ง่ายขึ้น (Isolation code)
  • ได้เรียนรู้การ Refactoring to design pattern

แต่ต้องจำไว้ด้วยว่า สิ่งที่เราทำอยู่นั้นมันไม่ perfect หรอกนะ
มันเพียงทำให้ดีขึ้น และ เพียงพอต่อความต้องการในเวลานั้นๆ

3. เรียนรู้การ Maintain ระบบ

Legacy code มันหมายถึงว่าต้องมีช่วงเวลาของการ maintain ที่ยาวนานไร้ที่สิ้นสุด
อาจจะพูดได้ว่ายาวนานกว่าการพัฒนาอีกต่างหาก
โดยสิ่งที่ได้เรียนรู้คือ

  • มันยากตั้งแต่การทดสอบ
  • มันยากตั้งแต่การ deploy
  • มันยากตั้งแต่การหาข้อผิดพลาดจาก bug report ต่างๆ
  • มันยากตั้งแต่การแก้ไข
  • มันยากตั้งแต่การอ่าน log file
  • มันยากตั้งแต่การ monitoring ระบบ

โดยสิ่งต่างๆ เหล่านี้ เราสามารถทำให้มันง่ายขึ้น ดีขึ้นกว่าเดิม
เมื่อเราเพิ่ม feature ใหม่ๆ เข้าไป
และต้องเรียนรู้ที่จะอยู่กับมัน และ ปรับปรุงมันให้ดีขึ้นเรื่อยๆ
ไม่ใช่เพียงแค่ code ที่ดีขึ้นเท่านั้น
แต่ยังรวมถึง opertation ต่างๆ ที่ช่วยให้ง่ายต่อการ maintain อีกด้วย

Development is short.
Long Live Maintain

4. เรียนรู้กับ Change request

เรื่องของการเปลี่ยนแปลงมันเกิดขึ้นอยู่ตลอดเวลา
ซึ่งเราไม่สามารถวางแผนอนาคตได้เลยว่ามันจะเกิดการเปลี่ยนแปลงอะไรขึ้นมาบ้าง

แต่บางคนมักบอกว่า
เราก็เขียน code ในรูปแบบของ plug-in เพื่อให้สามารถขยายระบบได้ง่ายสิ
แต่สิ่งที่พบประจำก็คือ จุดนั้นไม่ค่อยถูกใช้งานเลย
เนื่องจากความต้องการมันหลากหลายท่า และ ลีลาอย่างมาก
ดังนั้นสิ่งที่เราทำไปเผื่อๆ นั้น มันไร้ค่า หรือเป็นขยะมากๆ

ให้ยึดแนวคิดของ YAGNI ( You Aren’t Gonna Need It )
นั่นคือการเขียน code ให้เล็ก และ เรียบง่ายที่สุด
สำหรับการเปลี่ยนแปลงหนึ่ง เพื่อทำให้คนอื่นๆ ในทีม
หรือคนใหม่ๆ ที่เข้ามา สามารถเรียนรู้มันได้ง่ายขึ้น
ลดความซับซ้อน design ขั้นเทพลงไปบ้าง
และให้จำไว้กับคำว่า Just Enough Design มันสำคัญมากๆ

5. สิ่งที่ขาดไม่ได้คือ การ แบ่งปันความรู้

สิ่งที่น่ากลัวสำหรับทีมที่ดูแล Legacy code คือ
ความรู้มักจะอยู๋คู่กับคนใดคนหนึ่งเท่านั้น
ดังนั้น ถ้ามีปัญหาอะไรในส่วนนี้ ต้องคนนั้นแก้ไข
ถ้ามีปัญหาอะไรในส่วนนั้น ต้องคนนี้แก้ไข
ซึ่งนั่นผมมองว่า มันคือปัญหาที่น่ากลัวมากๆ

ดังนั้น การแบ่งปันความรู้กันภายในทีมมันจึงสำคัญมากๆ
ซึ่งสามารถแบ่งปันได้ในหลายรูปแบบ เช่น

  • Pair programming
  • จัด workshop เพื่อให้เป็น session ที่แบ่งปันกัน
  • ทำ Coding dojo กันเป็นประจำ
  • ทำ Retrospective ของทีมในทุกๆ สัปดาห์
  • ทำ code review

ดังนั้นต้องกระจายความรู้ของระบบให้อยู่กับทีม และ องค์กรครับ
ไม่ใช่อยู่กับใครคนใดคนหนึ่ง

โดยสรุปแล้ว

Legacy Code is a great learning opportunity both for technical skills and attitude.

แล้วคุณล่ะ ได้เรียนรู้อะไรจาก Legacy code บ้าง