แนะนำวิธีเขียนโค๊ดให้ยอดเยี่ยม

ปัจจุบันกับงานประจำที่ทำอยู่นั้นผมทำงานกับโค๊ดที่… ก็ไม่ได้ถือว่าเป็นโค๊ดที่ดีอะไร แต่ก็ไม่ถึงกับเข้าขั้นเลวร้าย แต่ที่ผ่านมาก็เห็นโค๊ดเห่ย ๆ ผ่านตามาเยอะมาก แล้วก็โค๊ดที่สวย ๆ ก็เห็นมาบ้างเหมือนกัน 

วันนี้เลยอยากจะแชร์สิ่งที่พอจะรู้เกี่ยวกับการเขียนโปรแกรมยังไงให้ยอดเยี่ยม … ฟังดูเป็นการยกหางตัวเองเหมือนกัน เอาเป็นว่านี่คือสิ่งที่โค๊ดที่ผมมองว่าเจ๋งมาก ๆ เนี่ยมีครับ 

1. ทำงานได้ถูกต้อง

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

โค๊ดที่ทำงานได้ถูกต้องนั้นไม่ใช่แค่มีผลลัพท์ที่ถูกต้อง แต่ต้องมีพฤติกรรมที่ถูกต้องอีกด้วย เช่น

  • ถ้าใช้เนทเวิร์ค ก็ต้องตัดการเขื่อมต่อให้เรียบร้อย 
  • ถ้าอ่านไฟล์ ก็ต้องปิดไฟล์
  • จัดการเรื่อง error/exception ให้ถูกต้องอย่างเหมาะสม
  • ไม่มีการรั่วไหลของหน่วยความจำ

เป็นต้น

โค๊ดที่มีพฤติกรรมไม่ถูกต้องจะทำให้เกิดปัญหาในภายหลัง และมักจะเป็นปัญหาที่เข้าขั้นแก้ไขไม่ได้ครับ 

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

2. อ่านได้ง่าย

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

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

ที่จริงมีหนังสือที่พูดถึงเรื่องนี้โดยเฉพาะด้วยครับ เล่มที่อยากแนะนำให้ลองอ่านดูคือ Clean Code: A Handbook of Agile Software Craftmanship โดย Robert C. Martin

สิ่งที่ผมยกให้เป็นนรกบนดินเลยก็คือฐานข้อมูล คือ ผมมักจะพบว่าคนออกแบบ schema ของฐานข้อมูลมักจะมักง่ายโดยการกำหนดชื่อตารางและ/หรือชื่อฟิลด์ด้วยชื่อที่เป็นการย่อจากคำเต็ม ๆ ด้วยเหตุผลว่าเวลาเขียน Query แล้วชื่อยาว ๆ มันเขียนลำบาก แต่เชื่อเถอะเวลาเขียนจริง ๆ ก็ต้องมานั่งเดาอีกว่าคำนี้มันย่อว่าอะไร เสียเวลาครับ ผมเคยหาฟิลด์ที่เก็บค่าไอดีของ Shareholder Group อยู่เกือบชม.กว่าจะรู้ว่ามันย่อว่า ShGroup … แล้ว Sh มันคืออะไร ???

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

3. คอมไพล์ได้เร็ว

เรื่องนี้เป็นเรื่องค่อนข้างเฉพาะไปทางภาษาเก่า ๆ ที่มักจะมีปัญหาเรื่องการคอมไพล์โค๊ดใช้เวลานานอย่าง C++ ที่ผมทำงานด้วย

ผมเคยเจอคลาสนึงที่ อัดทุกอย่างลงไปใน header file แล้ว implementation file มีแค่ static variable คลาสนี้ดันเป็นหนึ่งในคลาสชุดหลักที่ใช้มันแทบทุกไฟล์ในโปรเจค ทุกไฟล์ include ไฟล์นี้ทั้งทางตรงและทางอ้อม ดังนั้นพอผมแก้ไฟล์นี้ปุ๊บสิ่งที่ตามมาคือผมต้องรอมันคอมไพล์ 1 ชม.เต็ม ๆ พอแก้อีกนิดนึงก็ต้องรออีก … มันรบกวนเวลานอนของผมมากครับ …

คลาสที่ว่านี้เนี่ย คนเขียนเขาให้ความเห็นว่า คลาสนี้ถูกใช้ในทุกไฟล์ ดังนั้นเขาจึงพยายามทำทุกอย่างเพื่อให้มันเร็วขึ้น อย่างการใส่ลงไปใน header file นั้นเป็นเทคนิคที่เรียกว่าการทำ inline ซึ่งถ้าเป็นโค๊ดสั้น ๆ แต่ใช้บ่อย ๆ จะทำให้โปแกรมเร็วขึ้นสัก … 0.05% ได้มั้ง แต่ในกรณีที่ผมเจอนั้นคลาสนี้มีขนาดถึง 100-150 บรรทัด ซึ่งคอมไพล์เลอร์นั้นพอเจอไฟล์ใหญ่ขนาดนี้ก็ไม่ทำ inline แล้วครับ ดังนั้นไอ้ 0.05% เนี่ยก็เสียไปฟรี ๆ แถมการยัดโค๊ดอีก 100-150 บรรทัดในโปรเจคที่มีโค๊ดอยู่ประมาณพันไฟล์นั้นก็ทำให้โค๊ดเบสใหญ่ขึ้นถึง 100,000-150,000 บรรทัดโดยไม่จำเป็น ทำให้คอมไพล์ช้าลงไปอีก

อย่าหวังถึงอะไรเล็ก ๆ น้อย ๆ ในช่วงรันไทม์ แล้วเอาคอมไพล์ไทม์ที่ยาวมาก ๆ ไปแลกแบบนี้ ไม่คุ้มครับ

4. มีสมรรถนะดี

Performance เป็นปัจจัยท้าย ๆ ที่ผมให้ความสำคัญ แต่มือใหม่มักจะเอาเรื่องนี้มาแข่งกัน ก็เป็นเรื่องสนุกในบรรดานักวิทยาศาสตร์ทั้งหลาย แต่กับคนที่ทำซอฟต์แวร์ธุรกิจแล้ว Performance นั้นเป็นเรื่องสำคัญรองๆ ลงมาครับ เพราะว่าถ้า Performance ไม่ดีจริง ๆ เรายังสามารถเอาฮาร์ดแวร์อัดลงไปได้ และจริง ๆ เราก็อยู่ในยุคที่ซอฟต์แวร์นั้นตามหลังฮาร์ดแวร์อยู่ไกลมากอยู่แล้วครับ

แน่นอนว่าก็ยังมีซอฟต์แวร์หลายประเภทที่ Performance เป็นเรื่องสำคัญ อย่างเกม หรือโปรแกรม Real-Time ทั้งหลาย แต่ก็อย่าให้ความสำคัญกับมันมากจนละเลยเรื่องอื่นไปครับ ไม่เช่นนั้นถ้าเจอปัญหาภายหลังเราอาจจะแก้ไขอะไรไม่ได้เลยก็ได้

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

ในโอกาสต่อไปจะพูดถึงเทคนิคที่จะเอามาช่วยให้เขียนโปรแกรมโดยคำนึงถึง 4 หัวข้อนี้ได้ในโอกาสต่อไปครับ

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

This site uses Akismet to reduce spam. Learn how your comment data is processed.