นักพัฒนาโปรแกรมถกเถียงว่าสงครามการจัดรูปแบบโค้ดอาจแก้ไขได้ด้วยเทคโนโลยีจากยุค 1980

ทีมชุมชน BigGo
นักพัฒนาโปรแกรมถกเถียงว่าสงครามการจัดรูปแบบโค้ดอาจแก้ไขได้ด้วยเทคโนโลยีจากยุค 1980

บล็อกโพสต์ล่าสุดได้จุดประกายการถกเถียงอย่างดุเดือดเกี่ยวกับหนึ่งในปัญหาที่ยืดเยื้อที่สุดในการเขียนโปรแกรม นั่นคือการถกเถียงเรื่องการจัดรูปแบบโค้ด ผู้เขียนได้ย้อนนึกถึงสิ่งที่อาจารย์วิทยาการคอมพิวเตอร์เคยกล่าวไว้ว่า ปัญหานี้ได้รับการแก้ไขไปแล้วเมื่อหลายสิบปีก่อนโดยใช้ระบบที่เรียกว่า 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

อ้างอิง: Formatting code should be unnecessary