Legacy Code — โค๊ดมรดก

พูดถึงมรดก เราก็จะคิดถึงเรื่องทรัพย์สินเงินทองที่ตกมาเป็นของเราเมื่อยามที่บุพการีของเรา (หรืออาจจะเป็นใครสักคน) ได้จากโลกนี้ไป แน่นอนว่ามรดกเป็นสิ่งที่เราไม่ได้ต้องการ เพราะการสูญเสียบุคคลอันเป็นที่รักนั้นเป็นเรื่องใหญ่ ถูกต้องไหมครับ ?

นิยามของ  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 โดยเฉพาะ

One thought on “Legacy Code — โค๊ดมรดก

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

This site uses Akismet to reduce spam. Learn how your comment data is processed.