บล็อกโพสต์ล่าสุดได้จุดประกายการถกเถียงอย่างดุเดือดเกี่ยวกับหนึ่งในปัญหาที่ยืดเยื้อที่สุดในการเขียนโปรแกรม นั่นคือการถกเถียงเรื่องการจัดรูปแบบโค้ด ผู้เขียนได้ย้อนนึกถึงสิ่งที่อาจารย์วิทยาการคอมพิวเตอร์เคยกล่าวไว้ว่า ปัญหานี้ได้รับการแก้ไขไปแล้วเมื่อหลายสิบปีก่อนโดยใช้ระบบที่เรียกว่า DIANA ซึ่งเก็บโค้ดในรูปแบบของการแสดงผลระดับกลางแทนที่จะเป็นข้อความธรรมดา
การตอบสนองจากชุมชนนักเขียนโปรแกรมเผยให้เห็นความแตกแยกอย่างลึกซึ้งเกี่ยวกับการที่จะติดตามแนวทางแก้ไขดังกล่าวว่าคุ้มค่าหรือเพียงแค่สร้างปัญหามากกว่าการแก้ปัญหา
คุณสมบัติของระบบ DIANA (ทศวรรษ 1980)
- เก็บโค้ดในรูปแบบ intermediate representation แทนที่จะเป็น plain text
- ให้นักพัฒนาแต่ละคนสามารถปรับแต่งรูปแบบการแสดงผลตามความชอบส่วนตัวได้
- รองรับการคอมไพล์แบบเพิ่มเติม (incremental compilation) และการปรับโครงสร้างโค้ดที่รวดเร็ว
- ใช้งานใน workstation Rational R1000 สำหรับการพัฒนา Ada
- อนุญาตให้แก้ไข AST โดยตรง (projectional editing)
ข้อได้เปรียบของข้อความธรรมดายังคงเป็นจุดแข็ง
นักพัฒนาหลายคนโต้แย้งว่าการหันไปใช้รูปแบบอื่นที่ไม่ใช่ข้อความธรรมดาจะทำลายเครื่องมือพื้นฐานที่ทำให้การพัฒนาซอฟต์แวร์สมัยใหม่ทำงานได้ ปรัชญา Unix ของเครื่องมือที่ใช้ข้อความเป็นฐานและสามารถประกอบกันได้ เช่น grep, diff และ sed ได้พิสูจน์ความทนทานอย่างน่าทึ่ง เครื่องมือเหล่านี้ทำงานได้ในทุกแพลตฟอร์มและทุกภาษาโปรแกรมมิ่ง สร้างรากฐานสากลที่นักพัฒนาพึ่งพาในชีวิตประจำวัน
ความกังวลคือรูปแบบเฉพาะทางจะล็อคทีมให้ติดอยู่กับ IDE หรือ toolchain เฉพาะ ลดความยืดหยุ่นและทำให้งานง่ายๆ กลายเป็นเรื่องซับซ้อนมากขึ้น นักพัฒนาคนหนึ่งชี้ให้เห็นว่าแม้คุณจะสามารถค้นหาในการแสดงผลระดับกลางได้ คุณก็ยังต้องใช้ formatter ย้อนกลับเพียงเพื่อให้รู้ว่าจะค้นหาอะไร ซึ่งทำลายจุดประสงค์โดยสิ้นเชิง
ข้อโต้แย้งต่อการจัดเก็บโค้ดแบบ IR
- ทำลายความเข้ากันได้กับเครื่องมือ Unix สากล (grep, diff, sed)
- ต้องการเครื่องมือเฉพาะทางและการผูกมัดกับ IDE
- เพิ่มความซับซ้อนโดยได้ประโยชน์เพียงเล็กน้อย
- การควบคุมเวอร์ชันและการจัดการ patch กลายเป็นเรื่องยากขึ้น
- ข้อความธรรมดายังคงเป็นรูปแบบที่พกพาได้และเข้าถึงได้มากที่สุด
ปัญหา Bikeshedding ยังคงอยู่
แม้จะมีความท้าทายทางเทคนิค แต่ความหงุดหงิดกับการถกเถียงเรื่องการจัดรูปแบบยังคงเป็นเรื่องจริง ชุมชนยอมรับอย่างกว้างขวางว่าการโต้เถียงเกี่ยวกับสไตล์โค้ดมักเป็น bikeshedding ที่ไม่เกิดประโยชน์ - การมุ่งเน้นไปที่รายละเอียดเล็กน้อยในขณะที่เพิกเฉยต่องานที่สำคัญกว่า
ผมยุ่งกับการทำ software engineering จริงๆ จนไม่มีเวลาไปสนใจว่าทุกอย่างจะไปอยู่ตรงไหนกันแน่ - ผมรับประกันได้ว่าหลังจากหนึ่งสัปดาห์ คุณจะชินกับรูปแบบใดก็ตามที่ทีมของคุณตัดสินใจใช้
ภาษาโปรแกรมสมัยใหม่อย่าง Go ได้พยายามแก้ปัญหานี้โดยการตัดสินใจเรื่องการจัดรูปแบบในระดับ syntax และจัดหา formatter ที่มีความเห็นชัดเจนอย่าง gofmt แม้ไม่ใช่ทุกคนจะชอบตัวเลือกเฉพาะ แต่นักพัฒนาส่วนใหญ่ชื่นชมที่มีการตัดสินใจให้แล้ว
โซลูชันการจัดรูปแบบโค้ดสมัยใหม่
- Go: gofmt ให้การจัดรูปแบบที่มีความเห็นเฉพาะตัวและเป็นมาตรฐานสากล
- Python: Black formatter ขจัดตัวเลือกการจัดรูปแบบส่วนใหญ่
- JavaScript: Prettier และ ESLint configs ทำให้สไตล์เป็นมาตรฐาน
- Unison: เก็บเฉพาะ AST คล้ายกับแนวทาง DIANA
- Chrome DevTools: การทำให้โค้ดที่ถูกย่อขนาดสวยงามตามต้องการ
ความกังวลเรื่องการเข้าถึงและการพิมพ์
การถกเถียงไม่ได้เป็นเพียงเรื่องความชอบส่วนตัว นักพัฒนาบางคนหยิบยกความกังวลเรื่องการเข้าถึง โดยสังเกตว่าตัวเลือกการจัดรูปแบบบางอย่างสามารถส่งผลกระทบต่อความสามารถในการอ่านสำหรับคนที่มีความต้องการแตกต่างกันได้จริง คนอื่นๆ โต้แย้งว่าการจัดรูปแบบโค้ดมีจุดประสงค์ทางการพิมพ์ ช่วยสื่อสารความหมายและโครงสร้างที่เครื่องมืออัตโนมัติอาจพลาดไป
สิ่งนี้เพิ่มความซับซ้อนให้กับแนวคิดที่ว่าการจัดรูปแบบทั้งหมดเป็นเพียงความชอบส่วนตัวที่สามารถแยกออกไปได้
การทดลองสมัยใหม่และแนวทางแก้ไขบางส่วน
นักพัฒนาหลายคนกล่าวถึงว่าชิ้นส่วนของวิสัยทัศน์นี้มีอยู่แล้ว Chrome DevTools สามารถทำให้ JavaScript ที่ถูก minify ดูสวยงามได้ทันที ทีมบางทีมใช้ Git hooks เพื่อใช้กฎการจัดรูปแบบที่แตกต่างกันในเครื่องท้องถิ่นเทียบกับระยะไกล ภาษาโปรแกรม Unison จริงๆ แล้วเก็บเฉพาะ abstract syntax tree คล้ายกับแนวทาง DIANA
อย่างไรก็ตาม สิ่งเหล่านี้ยังคงเป็นแนวทางแก้ไขเฉพาะกลุ่มมากกว่าการนำมาใช้อย่างแพร่หลาย ซึ่งบ่งบอกว่าอุปสรรคในทางปฏิบัติยังคงมีนัยสำคัญ
การถกเถียงนี้เน้นย้ำถึงความตึงเครียดพื้นฐานในการพัฒนาซอฟต์แวร์ระหว่างความงดงามของแนวทางแก้ไขเชิงทฤษฎีกับความเป็นจริงที่ยุ่งเหยิงของการทำงานกับเครื่องมือและขั้นตอนการทำงานที่มีอยู่ แม้ว่าระบบ DIANA ในยุค 1980 จะแก้ปัญหาสงครามการจัดรูปแบบสำหรับผู้ใช้ แต่วิวัฒนาการที่ขึ้นอยู่กับเส้นทางของเครื่องมือพัฒนาสมัยใหม่ทำให้แนวทางที่คล้ายกันมีความท้าทายในการนำไปใช้ในปัจจุบัน
หมายเหตุ: DIANA (Descriptive Intermediate Attributed Notation for Ada) เป็นการแสดงผลระดับกลางที่มีโครงสร้างแบบต้นไม้ที่ใช้ในสภาพแวดล้อมการพัฒนา Ada โดยเฉพาะอย่างยิ่งระบบ Rational R1000