เมื่อ “Rewrite” เอาไม่อยู่: ถึงเวลาที่ซอฟต์แวร์สถาปนิกต้อง “Rework”

Share
เมื่อ “Rewrite” เอาไม่อยู่: ถึงเวลาที่ซอฟต์แวร์สถาปนิกต้อง “Rework”
Photo by Benja Godin on Unsplash

ในฐานะซอฟต์แวร์สถาปนิก เรามักถูกฝึกมาให้มองหาโครงสร้างที่ซ้ำซ้อนเพื่อปรับปรุงมันให้ดีขึ้น วินาทีที่เราเปิดเข้าไปเจอซอร์สโค้ดที่รกรุงรังเหมือนสปาเก็ตตี้ สัญชาตญาณแรกของเราคือการสแกนหา Pattern ความผิดพลาด หรือสิ่งที่เรียกว่า Code Smells จากนั้นเราจะเริ่มลงมือเปิดพิมพ์เขียวเพื่อทำการ “Rewrite” หรือ Refactor โค้ดชุดนั้นให้กลับมาสะอาด ทรงประสิทธิภาพ และอ่านง่ายภายใต้หลักการ Clean Code

กระบวนการกวาดบ้านทาสีใหม่นี้ หากมองผ่านเลนส์ของทฤษฎีคอมพิวเตอร์ระดับคลาสสิก มันดูคล้ายกับกลไกที่เรียกว่า Lambda Calculus (λ-calculus) ของ Alonzo Church ในระบบปิดทุกอย่างถูกขับเคลื่อนด้วยฟังก์ชันและกฎการย่อยรูปที่ตายตัว สิ่งที่เราทำในฐานะนักพัฒนาคือการรันกระบวนการ β-reduction หรือการนำอินพุตเข้าไปแทนที่ตัวแปร แล้วยุบย่อโครงสร้างที่เยิ่นเย้อลงมาเรื่อยๆ จนกว่ามันจะไปถึง Normal Form ซึ่งก็คือสถานะโค้ดที่กระชับและสมบูรณ์ที่สุด โดยที่ พฤติกรรมภายนอกและผลลัพธ์ของระบบยังคงเดิมไม่เปลี่ยนแปลง

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

นี่คือจุดเปลี่ยนผ่านที่น่าเจ็บปวดที่สุดในโลกการทำงานจริง เมื่อเทคโนโลยีเปลี่ยน พฤติกรรมผู้ใช้เปลี่ยน หรือสมมติฐานทางธุรกิจเมื่อหลายปีก่อนมันผิดฝาผิดตัวมาตั้งแต่ต้น ระบบเก่าไม่ได้พังเพราะมันเขียนมาไม่ดี แต่โครงสร้างแกนหลักของมันไม่สามารถตอบโจทย์ความจริงในปัจจุบันได้อีกแล้ว วินาทีนั้น การฝืนนั่งขัดเช็ดถูเสาเข็มที่หักพังเพื่อหวังให้ได้ผลลัพธ์เดิมคือเรื่องเปล่าประโยชน์ การ Rewrite เอาไม่อยู่แล้ว และระบบกำลังต้องการการ “Rework” พลิกแผ่นดินใหม่ทั้งหมด

เมื่อคำว่า Rewrite กลายร่างความแตกต่างที่ทรงพลังที่สุดระหว่างสองระบบนี้คือ อิสรภาพในการกำหนดกฎเกณฑ์ ในขณะที่ Lambda Calculus บังคับให้เราทำตามกฎการยุบรูป แต่ Term Rewriting เปิดโอกาสให้เราสวมบทบาทเป็น Rule Maker หรือผู้สร้างกฎการเปลี่ยนรูปขึ้นมาเอง โดย TRS มองระบบหรือข้อมูลเป็นโครงสร้างต้นไม้ที่มีความสัมพันธ์ซับซ้อน และทำงานผ่านสมการอย่างตรงไปตรงมาคือ

Pattern → Replacement

เมื่อเราสแกนพบ Pattern ฝั่งซ้ายมือที่เป็นตัวแทนของโครงสร้างที่หมดอายุการใช้งานหรือสร้างปัญหาซ้ำซาก แทนที่เราจะแค่ยุบมันให้เล็กลง TRS อนุญาตให้เราเขียนลูกศรชี้ไปทางขวา เพื่อ “รื้อและสลับร่าง” มันให้กลายเป็นสถาปัตยกรรมชุดใหม่ (Replacement) ที่เราดีไซน์ขึ้นมาทดแทนทันที มันคือการเปลี่ยน Logic พลิก Data Flow หรือแม้กระทั่งเปลี่ยนพฤติกรรมระบบเพื่อสลัดข้อจำกัดเดิมทิ้งไปเป็น Rework ขอบเขตของ Lambda Calculus จึงต้องถูกขยายออกไปสู่ทฤษฎีที่ยืดหยุ่นและดุดันกว่า นั่นคือ Term Rewriting System (TRS)

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

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

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

สุดท้ายนี้ การก้าวเข้าไปเผชิญหน้ากับความโกลาหลเพื่อหา Pattern แล้วทำ Rework ไม่ใช่เครื่องหมายของความล้มเหลว แต่มันคือวิวัฒนาการตามธรรมชาติของซอฟต์แวร์และมนุษย์ ถ้าเงื่อนไขทุกอย่างยังคงเดิม หน้าที่ของเราคือการรักษาความสะอาดและทำระบบให้มีประสิทธิภาพ (Rewrite) แต่ถ้าโลกเปลี่ยนไปจนกรอบเดิมกลายเป็นกรงขัง หน้าที่ของเราคือการก้าวขึ้นมาเป็น Rule Maker สร้างกฎข้อใหม่ ทุบสิ่งเก่าเพื่อสลับร่างสู่สิ่งที่ดีกว่าอย่างเด็ดขาด (Rework)

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

หากคุณชอบบทความแนวการเชื่อมโยงปรัชญาเข้ากับการทำงานในโลกยุคใหม่ ฝากกดเลิฟ กดแชร์ และกดติดตามช่องของผมด้วยนะครับ!

Read more

เร็วแค่ไหนก็ไร้ค่า ถ้าไปผิดทาง

เร็วแค่ไหนก็ไร้ค่า ถ้าไปผิดทาง

อีกบทเรียนที่ผมได้จากหนังสือ Slack: Getting Past Burnout, Busywork, and the Myth of Total Efficiency ของ Tom DeMarco คือ ทำไมองค์กรใหญ่ ๆ ถึงยึดมั่นกับ Efficiency กันนัก Efficiency คืออะไร? Efficiency แปลว่า "ประสิทธิภาพ" ยกตัวอย่างเช่น

By Chokchai Phatharamalai
กฎของจั๊วะ

กฎของจั๊วะ

ปีนี้ที่อายุ 44 ผม Reflect ตัวเอง และพบว่าหลักการใช้ชีวิตของผมได้มาจากหนังสือ The Seven Habits of Highly Effective People เยอะมาก ใน Habit ทั้ง 7 นี้จะมีเกร็ดเล็กเกร็ดน้อยที่ผมไปศึกษามา แล้วค่อย ๆ เติมเข้าไปเพื่อทำให้ Habit นั

By Chokchai Phatharamalai
วงจรชีวิตในมุมมอง Existentialism และศิลปะแห่งการล้มเหลวในราคาถูก

วงจรชีวิตในมุมมอง Existentialism และศิลปะแห่งการล้มเหลวในราคาถูก

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

By Santi
วนเวียนแต่ไม่วนลูป: เมื่อชีวิตคือฟังก์ชัน Recursion และการเดินทางสู่พื้นที่ปลอดภัย

วนเวียนแต่ไม่วนลูป: เมื่อชีวิตคือฟังก์ชัน Recursion และการเดินทางสู่พื้นที่ปลอดภัย

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

By Santi