พูดถึงมรดก เราก็จะคิดถึงเรื่องทรัพย์สินเงินทองที่ตกมาเป็นของเราเมื่อยามที่บุพการีของเรา (หรืออาจจะเป็นใครสักคน) ได้จากโลกนี้ไป แน่นอนว่ามรดกเป็นสิ่งที่เราไม่ได้ต้องการ เพราะการสูญเสียบุคคลอันเป็นที่รักนั้นเป็นเรื่องใหญ่ ถูกต้องไหมครับ ?
นิยามของ Legacy Code
คำว่า Legacy Code หรือที่ผมแปลไทยมาเป็นคำว่าโค๊ดมรดกนั้น ก็เป็นสิ่งที่โปรแกรมเมอร์อย่างเรา ๆ นั้นไม่พึงปราถนาเหมือนกัน ถ้าเราแปลกันตรง ๆ ตัวคำว่า Legacy Code นั้นก็คือโค๊ดโบราณที่ตกทอดกันมาตั้งแต่โปรแกรมเมอร์ในยุคอดีตมารุ่นต่อรุ่น จนมาถึงตัวเรา
ถามว่าอะไรที่มันตกทอดมาสู่เรานอกจากโค๊ดชุดนี้แล้ว ? …. คำตอบง่าย ๆ ก็คือ ภาระ ครับ โค๊ดชุดนี้ในตอนเริ่มต้นนั้นมันก็เป็นโค๊ดเล็ก ๆ นั่นแหละ แต่ว่าพอเขียนไป พัฒนาไป แก้บั๊กไป ยิ่งทำก็ยิ่งบวม บวมไปเรื่อย … พอตาคนเขียนมันได้ดิบได้ดีไปแล้วเขาก็ … ลาออกไปครับ 555 แล้วเราก็มาสืบทอดรับตำแหน่งแทนเขา ก็ได้ไอ้โค๊ดบวมๆ ที่มีแต่คนที่ออกไปแล้วนั้นแหละรู้เรื่อง … กลายเป็นซวยเรา รับภาระมาเต็ม ๆ เลย
ความหมายอีกอย่างของ Legacy Code ก็คือโค๊ดเก่า ๆ ที่ยากที่จะแก้ ยากที่จะทำความเข้าใจ โค๊ดที่คุณอ่านไปก็วัดขนาดฟักไป อะไรทำนองนี้ล่ะครับ
ผมว่าทุกคนคงเคยก่นด่าในใจ (และแอบหวังว่าให้ใครได้ยิน) ถึงภาระที่คุณโปรแกรมเมอร์คนเก่าได้ทิ้งเอาไว้ให้เรา โอย มันเขียนอะไรลงไปฟระะะะ ….
นิยามปัจจุบันของ Legacy Code
ในหนังสือชื่อ Working Effectively With Legacy Code นั้น คุณ Micheal Feather นั้นให้นิยามคำว่า Legacy Code เอาไว้ง่าย ๆ ว่า Code Without Tests หรือ โค๊ดที่ไม่มีตัวทดสอบ
หลายคนอ่านแค่ภาษาอังกฤษก็คงคิด โค๊ดที่ไม่ได้ทดสอบมันจะใช้งานได้อย่างไร ?
คืองี้ครับ Test ในที่นี้ไม่ได้หมายถึง การทดสอบ แต่มันหมายถึงโปรแกรมที่เอาไว้ใช้ทดสอบโค๊ด ที่บอกว่าโค๊ดที่ไม่มีตัวทดสอบนั้นคือ Legacy Code เป็นเพราะว่าคนที่รู้วิธีทดสอบโค๊ดนั้นก็มีแค่คนเขียนคนเดียว
คงมีคำถามจากหลาย ๆ คนในลักษณะนี้
ก็ทดสอบจาก Requirement ก็ได้นี่ ?
- ในความเป็นจริง Requirement ของโปรแกรมนั้นแทบจะไม่ได้ถูกดูแลรักษา ในขณะที่โปรแกรมนั้นถูกแก้ไปเรื่อย ๆ แต่คนที่จะมาแก้ Requirement ของโค๊ดชุดนั้นเนี้ยแทบจะไม่มี โดยเฉพาะจากฝั่งคนแก้บั๊กด้วยแล้วยิ่งน้อยเข้าไปใหญ่
- ดังนั้น Requirement เป็นเอกสารที่แทบจะใช้งานจริงไม่ได้ครับ
ดูจากโค๊ดก็ได้นี่นาว่ามันควรจะทดสอบอย่างไร ?
- การอ่านโค๊ดเพื่อดูว่าโปรแกรมควรจะทำงานอะไรอย่างไรนั้นทำให้เราเข้าใจว่าปัจจุบันมันทำงานอย่างไร แต่ไม่ได้สื่อถึงความคาดหมายว่าโปรแกรมนั้นควรจะทำอะไร ดังนั้นเราจึงไม่มีทางรู้ว่าควรจะทดสอบอย่างไร
ถามคนที่เคยเขียนก็ได้ ?
- ในความเป็นจริงอีกเช่นกัน โปรแกรมเมอร์ที่เคยเขียนโค๊ดชุดนั้นจะไม่มีทางรู้อีกเช่นกันว่าในปัจจุบันโค๊ดมันควรจะเป็นอย่างไร เขาจะรู้แค่ Requirement ของโปรแกรมชุดนั้นเมื่อในอดีต แต่ในปัจจุบันมันอาจจะถูกแก้มาเป็นสิบ ๆ revision แล้ว ทำให้ความรู้ของคนเขียนในอดีตนั้นถือว่าตกยุคไปแล้ว ใช้ไม่ได้อีก
ผมว่าสามข้อนี้ก็น่าจะพอแล้วมั้งว่าทำไมตัวทดสอบถึงเป็นสิ่งจำเป็น
อ้อ ตัวทดสอบที่ผมว่า หมายถึงชุด Automated Test ที่สามารถเอาไว้ใช้ทดสอบโปรแกรมนั่นล่ะครับ
ทำไม Test ถึงทำให้โค๊ดนั้นไม่เป็น Legacy Code
เพราะว่าการมีโปรแกรมทดสอบนั้นทำให้เรามี requirement ที่ดูแลรักษาได้ง่ายเอาไว้อ่านเวลาต้องแก้โปรแกรม และเราก็ใช้โปรแกรมทดสอบนั้น ๆ ในการทดสอบโปรแกรมเพื่อดูว่าโปรแกรมทำงานถูกต้องหลังจากที่แก้ได้นั่นเอง
ดังนั้นโปรแกรมเมอร์จึงสามารถแก้ไขโปรแกรมได้โดยไม่ต้องกังวลว่าพอแก้แล้วจะทำให้โปรแกรมทำงานผิด requirement หรือเปล่า เพราะสามารถอ่านเพื่อทำความเข้าใจและใช้มันในการยืนยันได้ตลอดเวลา
นอกจากนี้โปรแกรมเทสต์ยังดูแลรักษาได้ง่าย และสามารถค้นหาได้ง่าย เพราะว่ามันก็เป็นแค่โปรแกรมธรรมดา เอาขึ้น Version Control System ได้ตามปรกติได้เลย
Test ในฐานะ Requirement
ตัวทดสอบโปรแกรมสามารถใช้เป็น Requirement ของโปรแกรมได้ เพราะมันระบุสิ่งที่คาดหวังจากโปรแกรมนั้นเอาไว้ ถ้าโปรแกรมทดสอบนั้นถูกเขียนขึ้นอย่างเรียบง่าย โปรแกรมเมอร์ที่ทำงานกับมันจะสามารถทำความเข้าใจกับโปรแกรมทดสอบได้โดยไม่ใช้เวลามากมายอะไรครับ
ยิ่งกว่านั้นในหลาย ๆ ภาษา ทางฝั่งธุรกิจก็จะสามารถทำความเข้าใจ (หรือถึงขั้นเข้ามาร่วมในการพัฒนาโปรแกรมทดสอบ) ได้ด้วย เพราะว่ามันเข้าใจได้ง่ายนั่นเอง
Test ในฐานะ Program Test
แน่นอนว่าโปรแกรมทดสอบก็ต้องมีเอาไว้ทดสอบโปรแกรม การใช้โปรแกรมทดสอบนั้นก็เพื่อใช้ยืนยันว่าโปรแกรมทำงานได้ถูกต้องตาม Requirement หรือเปล่า
วิธีแก้ปัญหา Legacy Code
วิธีแก้ปัญหานี้เป็นเรื่องยากถึงยากมาก เพราะวิธีแก้ปัญหานั้นก็เพียงแค่การเขียนโปรแกรมทดสอบกำกับโค๊ดชุดที่เรามี ซึ่งสำหรับโปรแกรมที่พัฒนามานานและมีฐานโค๊ดขนาดใหญ่นั้นแทบจะเป็นไปไม่ได้เลยที่จะเขียนโปรแกรมทดสอบที่ถูกต้องสำหรับทุก ๆ ฟังก์ชั่นของโปรแกรม
แต่ถ้าอยากทำก็อ่านหนังสือเล่มข้างบนนั่นล่ะครับ เป็นหนังสือที่เกี่ยวกับการแก้ปัญหา Legacy Code โดยเฉพาะ
โปรแกรมเมอร์ C++ และผู้นิยมดนตรี
One thought on “Legacy Code — โค๊ดมรดก”