Haliviq
เทคโนโลยี9 นาที·

ปรับปรุงระบบเก่าโดยไม่ต้องรื้อทำใหม่ทั้งหมด

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

H

ทีม Haliviq

สตูดิโอผลิตภัณฑ์ดิจิทัล กรุงเทพฯ

ปรับปรุงระบบเก่าโดยไม่ต้องรื้อทำใหม่ทั้งหมด

ทำไม big-bang rewrite ถึงเสี่ยง

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

อีกปัญหาคือระหว่างที่ทีมเขียนใหม่ ระบบเดิมยังต้องแก้บั๊กและเพิ่มฟีเจอร์ ทำให้ต้องทำสองที่ ส่วนธุรกิจต้องรอหลายเดือนโดยไม่เห็นผลอะไรเลย และถ้างบหรือความอดทนหมดกลางทาง ก็ไม่เหลืออะไรใช้ได้

แนวทาง strangler: ค่อยๆ ให้ของใหม่เข้ามาแทน

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

วางตัวกลางไว้หน้าระบบ เช่น reverse proxy หรือ API gateway ที่ตัดสินว่า request ไหนไประบบเก่า ไหนไประบบใหม่ เริ่มจากส่วนที่แยกออกง่ายและเห็นผลชัด เช่น หน้าค้นหาสินค้า หรือหน้าสถานะคำสั่งซื้อ ไม่ใช่ส่วนที่ผูกกับทุกอย่างอย่างการคิดราคา

แผนภาพ gateway ที่ส่ง request ไปยังระบบเก่าหรือระบบใหม่ตามส่วนที่ย้ายแล้ว
แผนภาพ gateway ที่ส่ง request ไปยังระบบเก่าหรือระบบใหม่ตามส่วนที่ย้ายแล้ว

หา seam และวางชั้น API

seam คือรอยต่อในระบบที่เปลี่ยนพฤติกรรมได้โดยไม่ต้องแก้โค้ดทั้งก้อน เช่น ขอบเขตระหว่างโมดูล ตาราง ฐานข้อมูลที่แยกกันได้ หรือไฟล์ที่ระบบอื่นอ่านเข้ามา เริ่มจากไล่ดูว่าใครเรียกใคร ข้อมูลไหลจากไหนไปไหน แล้วเลือกจุดที่ตัดได้สะอาดที่สุด

จากนั้นวางชั้น API ครอบระบบเก่า เพื่อให้หน้าจอใหม่ แอปมือถือ หรือระบบอื่นเรียกผ่านชั้นนี้แทนการเข้าฐานข้อมูลตรงๆ ชั้น API จะซ่อนความยุ่งเหยิงด้านหลัง และเปิดทางให้เปลี่ยนด้านหลังภายหลังโดยผู้เรียกไม่ต้องรู้

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

  • ไล่ดูการพึ่งพาระหว่างโมดูลและฐานข้อมูลที่ใช้ร่วมกัน
  • เลือกส่วนแรกที่แยกง่ายและเห็นผลต่อผู้ใช้ชัด
  • เขียนเทสต์บันทึกพฤติกรรมปัจจุบันก่อนเปลี่ยน
  • วางชั้น API หรือ gateway เป็นประตูเดียว

การย้ายข้อมูลอย่างระวัง

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

วิธีที่ปลอดภัยคือให้ระบบเก่ายังเป็นแหล่งข้อมูลหลักไปก่อน ซิงก์ข้อมูลไปที่ระบบใหม่ แล้วเทียบผลลัพธ์ทั้งสองฝั่งจนมั่นใจ จึงสลับให้ระบบใหม่เป็นแหล่งหลัก เมื่อย้ายแล้วควรเก็บระบบเก่าแบบอ่านอย่างเดียวไว้ช่วงหนึ่ง เผื่อต้องย้อนกลับ

การเปลี่ยนที่ย้อนกลับได้ ถูกกว่าการเปลี่ยนที่ต้องถูกต้องตั้งแต่ครั้งแรก

รันระบบเก่าและใหม่คู่กัน

ช่วงที่สองระบบอยู่ด้วยกันคือช่วงที่เสี่ยงที่สุด และมักยาวกว่าที่คาด ใช้ feature flag เปิดฟีเจอร์ใหม่ให้ผู้ใช้กลุ่มเล็กก่อน แล้วค่อยๆ ขยาย ถ้ามีปัญหาก็สลับกลับได้ในไม่กี่นาที โดยไม่ต้อง deploy ใหม่

ควรมี monitoring ที่เทียบสองฝั่ง เช่น ยอดคำสั่งซื้อ จำนวน error เวลาตอบ และกำหนดวันปิดระบบเก่าเป็นเป้าหมายจริง ไม่เช่นนั้นทั้งสองระบบจะอยู่คู่กันไปตลอดและต้นทุนดูแลเพิ่มเป็นสองเท่า

สรุปสั้น ๆ

  • Big-bang rewrite เสี่ยงเพราะกฎธุรกิจที่ซ่อนในโค้ดเก่าหายไปโดยไม่รู้ตัว
  • Strangler approach คือสร้างของใหม่ข้างๆ แล้วย้ายการใช้งานทีละส่วน
  • หา seam และวางชั้น API ก่อน พร้อมเทสต์ที่บันทึกพฤติกรรมเดิม
  • ย้ายข้อมูลโดยซิงก์และเทียบผลก่อนสลับแหล่งข้อมูลหลัก
  • ใช้ feature flag และตั้งวันปิดระบบเก่าให้ชัด

คำถามที่พบบ่อย

ได้ ถ้าระบบเล็กพอ ความต้องการชัด และเทคโนโลยีเดิมหาคนดูแลไม่ได้แล้ว แต่ควรแบ่งเป็นช่วงที่ส่งมอบได้จริงเป็นระยะ แทนการรอส่งครั้งเดียว

เลือกส่วนที่แยกจากส่วนอื่นได้ง่าย เห็นผลต่อผู้ใช้หรือธุรกิจชัด และพลาดแล้วไม่เสียหายมาก เพื่อให้ทีมได้เรียนรู้ก่อนไปแตะส่วนหลักอย่างการคิดราคาหรือบัญชี

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

บริการที่เกี่ยวข้อง

Legacy modernizationStrangler patternAPI layerData migrationRefactoring

มีโปรเจกต์แบบนี้อยู่ในใจไหม

เล่าให้เราฟังว่าตอนนี้อยู่ตรงไหน เดี๋ยวเราแนะนำก้าวแรกที่เหมาะให้ โดยไม่มีข้อผูกมัด

คุยกับเรา