บทเรียนเพิ่มเติมจาก Fetchmail

ก่อนที่เราจะกลับไปสู่ประเด็นเกี่ยวกับวิศวกรรมซอฟต์แวร์ทั่วไป ยังมีบทเรียนให้ตรึกตรองอีกนิดหน่อยจากประสบการณ์ของ fetchmail โดยเฉพาะ ผู้อ่านที่ไม่มีพื้นฐานทางเทคนิคสามารถข้ามหัวข้อนี้ไปได้

ไวยากรณ์ของแฟ้ม rc (แฟ้มควบคุม) มีคำแทรกที่จะใส่หรือไม่ก็ได้ ซึ่งตัวแจงจะไม่สนใจ ไวยากรณ์ที่คล้ายภาษาอังกฤษที่เกิดจากคำแทรกดังกล่าว ทำให้อ่านง่ายกว่าการใช้คู่ คำหลัก-ค่า ที่สั้นห้วนตามแบบฉบับที่คุณจะได้เมื่อตัดคำแทรกเหล่านั้นออกไป

แนวคิดดังกล่าว เริ่มจากการทดลองอะไรเล่นๆ ตอนดึก หลังจากที่ผมสังเกตว่ารูปแบบการประกาศในแฟ้ม rc ชักจะเริ่มคล้ายประโยคคำสั่งย่อยๆ (นี่เป็นเหตุผลที่ผมเปลี่ยนคำหลัก ``server'' ของ popclient ไปเป็น ``poll'')

ผมรู้สึกว่าการพยายามทำประโยคคำสั่งย่อยๆ ให้คล้ายภาษามนุษย์อาจทำให้มันใช้ง่ายขึ้น ทุกวันนี้ แม้ผมจะอยู่ฝ่ายสนับสนุนค่ายการออกแบบที่ ``ทำให้มันเป็นภาษา'' อย่างที่มี Emacs และ HTML และโปรแกรมจัดการฐานข้อมูลหลายตัวเป็นตัวอย่าง แต่โดยปกติ ผมก็ไม่ได้นิยมไวยากรณ์ที่ ``คล้ายภาษามนุษย์'' มากมายนัก

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

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

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

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

16. ตราบใดที่ภาษาของคุณไม่ได้ซับซ้อนระดับภาษาทูริงสมบูรณ์ การเสริมแต่งไวยากรณ์ก็อาจช่วยคุณได้

อีกบทเรียนหนึ่ง เป็นเรื่องเกี่ยวกับความนิรภัยโดยอาศัยความลึกลับ (security by obscurity) ผู้ใช้ fetchmail บางคนขอให้ผมแก้โปรแกรมให้เก็บรหัสผ่านในรูปที่เข้ารหัสลับในแฟ้ม rc เพื่อไม่ให้ผู้บุกรุกอ่านรหัสผ่านได้ง่ายนัก

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

สิ่งที่จะได้จากการเข้ารหัสลับรหัสผ่านในแฟ้ม .fetchmailrc ก็คือการให้มายาภาพของความนิรภัยต่อผู้ที่ไม่ได้คิดอย่างถี่ถ้วน กฎทั่วไปของเรื่องนี้ก็คือ:

17. ระบบนิรภัยจะมีความนิรภัยเท่ากับความลับที่มันเก็บเท่านั้น พึงระวังความนิรภัยหลอกๆ