เมื่อ “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

The Five Ideals

The Five Ideals

จากหนังสือ The Unicorn Project ในนั้นจะมีที่ปรึกษาเก่ง ๆ คนหนึ่งชื่อ Erik เป็นเหมือนเซ็นเซหาตัวยาก เดี๋ยวก็มา เดี๋ยวก็ไป ถ้าโชคดีก็จะเจอเค้าว่าง แล้วเค้าก็จะสอนอะไรที่สำคัญ ๆ แต่ฟังดูล้ำ ๆ และลึกซึ้ง

By Chokchai Phatharamalai
Communication, Reliability and Modern concepts - System Design, Simply Explained

Communication, Reliability and Modern concepts - System Design, Simply Explained

บทความนี้จะอธิบายพื้นฐานของ System Design โดยต่อยอดจากตัวอย่าง Gym Application เพื่อให้เห็นภาพว่า เมื่อระบบเริ่มเติบโตและถูกแยกออกเป็นหลาย Service แต่ละ Service จะสื่อสารและทำงานร่วมกันอย่างไร งานแบบไหนควรสื่อสารแบบ Synchronous งานแบบไหนควรประมวลผลแบบ Asynchronous รวมถึงอธิบาย Concept พื้นฐานต่าง ๆ ที่ควรรู้ เช่น API

By Boonsong Srithong
Race condition

Race condition

ผมกำลังอ่านหนังสือ The Unicorn Project ซึ่งเป็นนิยายเกี่ยวกับ developer สาวคนหนึ่งที่ใช้ชีวิตในองค์กรท่ามกลางกระแส digital disruption อ่านแล้วสนุกมาก เป็นเรื่องที่ตื่นเต้น และหลาย ๆ dynamic ที่เกิดขึ้นก็คล้ายกับที่ผมพบเจอในบริษัทซอฟต์แวร์ เลยทำให้

By Chokchai Phatharamalai
Distributed Systems Concepts - System Design, Simply Explained

Distributed Systems Concepts - System Design, Simply Explained

ในช่วงแรก Product เราสามารถออกแบบระบบให้อยู่ใน Server และ Database เดียวกันได้ แต่เมื่อระบบโตขึ้น มีผู้ใช้งานเพิ่มขึ้น ข้อมูลเยอะขึ้น ระบบเริ่มทำงานช้าลดเรื่อยๆ สิ่งที่หนีไม่ได้คือการ Decomposition Service ไปเป็น Distributed System เช่น Member Service, Booking Service, Payment

By Boonsong Srithong