เขียนใหม่ดีกว่า (ซะที่ไหนเล่า!)

ผมได้ยินประโยคทำนองนี้มานับครั้งไม่ถ้วน โค้ดนี้มันเก่า เป็น legacy หมดทางเยียวยาแล้ว เขียนใหม่กันเถอะ ส่วนตัวผมมองว่า เป็นความคิดที่ผิดขนาดที่เรียกว่า สิ้นชาติส้ินแผ่นดินไปหลายครั้งหลายหนแล้ว ทำไมน่ะหรือครับ?

ในตอนต้นของการสร้างโปรดักต์สักตัวหนึ่ง ก็จะมี budget เงินลงทุนมาก้อนหนึ่ง ที่ Product manager หรือถ้าสมัยนี้ก็คือ Product Owner จะได้มาจาก ฝ่ายบริหาร หรือ investor ซึ่งเขาก็จะมีช่วงเวลา honey moon นานพอสมควร ด้วยความที่เป็นการสร้างของที่ไม่เคยใครทำก่อน (ก็แน่ล่ะ ถ้ามีคนทำแล้วจะไปขายแข่งได้อย่างไร มันต้องแตกต่างกับของที่มีอยู่เดิมสิ) ทุกอย่างก็เลยองผิดลองถูกกันสักพักหนึ่ง ซึ่ง กำหนดการ launch ก็งวดเข้ามาเรื่อยๆ สุดท้าย เมื่อความกดดันหนักเข้า ก็มีการ shortcut หลายอย่างเพื่อให้สามารถส่งมอบได้ทันกำหนด ซึ่งทุกอย่างก็ผ่านไปได้ด้วยดี

ความโชคดีก็มาพร้อมกับความโชคร้าย โปรดักต์ไปได้สวยกว่าที่คิด ลูกค้าชอบมันมาก และก็มี demand มากตามไปด้วย พวกเขาขอให้เพิ่มนั่นเพิ่มนี่ ในเวลาที่ค่อนข้างจำกัดเพราะ ธุรกิจต้องเดินไปข้างหน้า จะมาคอยท่านักไม่ได้ โค้ดที่เคย shortcut ไว้และคิดว่า จะแก้ทีหลัง ก็หมักหมม ไม่ได้แก้เสียที แถมโค้ดใหม่ที่เข้าไปก็ปนเปอิลุงตุงนังกันไปหมด ผ่านไปหลายปี เปลี่ยนทีมงานกนไปหลายรุ่น ก็มาถึงจุดสำคัญที่ทุกคนลงความเห็นว่า หมดทางเยียวยาเสียแล้ว มันเป็น legacy code สมบูรณ์แบบ เราต้องเขียนใหม่หมด ด้วยเทคโนโลยีล่าสุดเท่านั้น จึงจะพัฒนาต่อไปได้ ต่อรองกันไปสักพัก ในที่สุดฝ่ายบริหารก็ ทำใจได้ เพราะเงินอยู๋ตรงหน้า จะทิ้งไปก็น่าเสียดาย จึงเจียด budget มาให้จำนวนหนึ่ง เพื่อ เขียนใหม่ ซึ่งเนื่องจากเป็นโปรดักต์เก่า ที่อยู่ในช่วงกลาง ของ product life cycle แล้ว เงินที่ได้มา ถ้าเทียบกับ ครั้งแรกของการสร้าง ก็ถือว่า น้อยกว่ากันมากๆ ก็ถือว่า ก็แค่สร้างใหม่ให้ทำงานได้เหมือนเดิมแค่นั้น ไม่ได้บุกเบิกอะไรใหม่ น่าจะจำกัดงบได้ แต่ความเป็นจริง ก็คือ ระบบเก่าก็ยังต้องพัฒนาต่อเนื่อง หยุดไม่ได้ ระบบใหม่ ก็ต้องเขียนตามให้ทัน ในเวลาจำกัด และงบเพียงแค่อาจจะหนึ่งในสิบ ของงบที่ใช้สร้างระบบเก่า แถมยังใช้คนทำชุดใหม่ทั้งหมดด้วย จะหาอะไรก็ต้องงมหาในโค้ดเก่า ที่บอกว่า maintain ต่อไม่ไหวแล้วนั่นแหละ สุดท้าย budget ก็หมดลง และระบบใหม่ที่พยายามสร้างก็ทำงานได้แย่ไม่ต่างจากระบบเดิม บางครั้งแย่กว่าด้วยซ้ำ

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

สิ่งที่ผมแนะนำเวลาเจอกับ legacy code ที่ maintain ลำบากคือ อย่างเขียนใหม่หมด แต่ให้ค่อยๆ ทำการ แก้ไขเปลี่ยนแปลงโค้ดทีละน้อย ให้ค่อยๆ วิวัฒน์ไป เหมือนกับการที่ สัตว์เลื้อยคลานเปลี่ยนไปเป็นสัตว์ปีกอย่างนั้น คือ สร้าง layer ใหม่ ขึ้นมาครอบ layer เก่าไว้ แล้วสร้าง connector เป็นเหมือน middleware คอยเปลี่ยน คำสั่งเก่าให้เป็นของใหม่ไปทีละน้อย อันไหนเป็นของใหม่ ทั้งดุ้นก็ สร้างด้วย technology ใหม่ ถ้าอันไหน เป็นของเก่า ก็เรียก ผ่าน connector เพื่อให้ reverse compatible กล่าวคือ โค้ดเก่าโค้ดใหม่อยู่ร่วมกันใน code base เดียวกัน โปรเจ็คหนึ่งที่ผมเคยทำ เป็นโปรดักต์ที่มีอายุยาวนานถึงกว่า 15 ปี มีโค้ดแบบนี้ อยู๋ถึง 5 ชั้นด้วย กัน กล่าวคือ มีการปฏิวัติโครงสร้างการเขียน ไปแล้ว ห้าครั้ง ซึ่งโค้ดบางส่วนยังใช้โครงสร้างแบบ version 1 อยู่เลย ด้วยซ้ำ และค่อยๆ วิวัฒน์ จนโค้ดชุดนี้หายไปจนหมดในที่สุด

Advertisements

ใส่ความเห็น

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s