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

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

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

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 หัวข้อนี้ได้ในโอกาสต่อไปครับ

มาใช้ Blogger กัน

โพสต์นี้เป็นการโฆษณาให้ Google นะครับ 🙂

คงมีหลาย ๆ คนที่อยากจะมีเว็บไซต์ส่วนตัว หรือทำธุรกิจบนเว็บไซต์ด้วยการขายเนื้อหาบางอย่าง (เช่น ขายการ์ตูน หรือขายบทความ โดยรับรายได้เป็นโฆษณา) บางคนเลือกใช้วิธีการเช่าโฮสต์เป็นของตัวเอง แต่ช้าก่อนวันนี้จะมาแนะนำอีกทางเลือกหนึ่ง

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

เมื่อเปรียบเทียบกับการใช้โฮสต์ของตัวเองจะพบว่า Blogger มีจุดเด่นที่เหนือกว่า ดังนี้

  1. ค่าใช้จ่ายต่ำกว่ามาก เพราะจ่ายเฉพาะค่าโดเมน เมื่อเทียบกับโฮสต์ติ้งแล้วจะต้องจ่ายค่าเช่าโฮสต์ต่างหากอีกสองพันกว่าบาทต่อปี
  2. ไม่มีค่าใช้จ่ายในด้านการดูแลรักษา ซอฟท์แวร์อัพเดตตลอดเวลาฟรี ไม่มีดาวน์ไทม์ ไม่ต้องมานั่งกังวลในเรื่องของความปลอดภัย ทั้งหมดถูกดูแลโดย Google
  3. เว็บไซต์รันอยู่บนระบบเมฆของ Google ซึ่งมี Server อยู่ทั่วโลก สามารถเข้าถึงได้เร็วจากทั่วทุกมุมโลก ถ้าเราเช่า Hosting จะเจอปัญหาว่าเข้าถึงจากต่างประเทศได้ช้า หรือเข้าถึงจากภายในประเทสได้ช้า
  4. ระบบ Editor ของตัวบล๊อกนั้นถึงจะไม่มีฟีเจอร์ประหลาดมากมาย แต่ก็ใช้งานได้ดี การอัพโหลดรูปหรือวิดีโอทำได้ง่ายมาก โดยจะเชื่อมโยงกับ Google Drive และ YouTube

ข้อเสียก็มีบ้างเช่นกัน

  1. จำกัดอยู่ที่ระบบบล็อกอย่างเดียว
  2.  มีข้อจำกัดในด้านความยืดหยุ่นของตัวซอฟต์แวร์บ้างถ้าเทียบกับการโฮสต์ระบบบล็อกเอง แต่ฟีเจอร์พื้นฐานก็ใช้งานได้เพียงพออยู่แล้ว

มีบล็อกเกอร์บ้านเราหลายคนที่ใช้ Blogger อยู่ เช่น คุณขจร แฟนพันธุ์แท้สตีฟจ๊อป หรือ นินคุง เป็นต้น

ผมพบว่า Blogger นั้นทำ SEO ให้เราในระดับหนึ่ง เช่น เมื่อพบลองค้นหาคำว่า Continuous Integration จากเว็บภาษาไทย ด้วย Google ก็พบว่า หน้าที่ผมเขียนเรื่องนี้เมื่อประมาณอาทิตย์ที่แล้วนั้นอยู่ในอันดับที่ 2 (ทั้ง ๆ ที่คนเขียนเองก็ไม่ค่อยรู้เรื่องนี้นี่นะ 555) (อันนี้ขึ้นอยู่กับคนเปิดด้วยนะครับ) ทุกวันนี้ผมมีเพจวิวประมาณวันละ 100-150 ครั้ง ผมเปิดเว็บนี้มาแล้วครึ่งปีมีเพจวิวรวมกว่าหนึ่งหมื่นสองพันครั้งครับ นี่ขนาดว่าเว็บผมค่อนข้างเฉพาะทาง อ่านยาก คอมเม้นท์ก็ยากนะเนี่ย

สำหรับเรื่องของรายได้นั้น เราสามารถเลือกที่จะติดโฆษณาของ Google เองที่มีชื่อว่า AdSense หรือจะติดป้ายโฆษณาจากเอเจนซี่เจ้าอื่นก็ได้ หรือจะติดมันทั้งสองเจ้าก็ได้ (ต้องดูรายละเอียดดี ๆ ด้วยครับ) ดังนั้นไม่มีข้อจำกัดตรงนี้ ที่สำคัญอีกอย่างก็คือเราจะไม่ติดโฆษณาเลยก็ได้ บน Blogger โดยปริยายแล้วนั้นจะไม่มีการติดโฆษณาใด ๆ ทั้งสิ้นครับ

สุดท้ายแล้วก็ขึ้นอยู่กับคุณแล้วล่ะว่าอยากจะทำเว็บไซต์กับ Blogger หรือเปล่า

Meaning of Tears ความหมายของน้ำตา

ตอนที่อยู่ที่โทรอนโท มีอยู่เพลงนึงที่ได้ฟังแล้วชอบมาก เพลงนี้ชื่อว่า Meaning of Tears ของ Chemistry

มันอาจจะเป็นเพราะในอากาศหนาว ๆ แบบนั้น เพลงแนวนี้มันฟังแล้วเพราะขึ้นด้วยกระมัง ?

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

ที่อยากจะพูดถึงจริง ๆ เป็นชื่อเพลง …

Meaning of Tears ถ้าแปลตรงตัวเป็นภาษาไทย ก็คงหมายความว่า “ความหมายของน้ำตา” น้ำตามันมีความหมายว่าอย่างไร ?

เวลาเราดีใจ เราก็ร้องไห้
เวลาเราเสียใจ เราก็ร้องไห้
เวลาเราสนุก เราหัวเราะ ก็ร้องไห้
เวลาเรากำลังเครียด กำลังกดดัน ก็ร้องไห้

ไม่ว่าเราจะมีความรู้สึกแบบไหน เมื่อถึงจุดจุดหนึ่ง เราก็ร้องไห้

แล้วมันมีความหมายว่าอะไร ?

… นั่นสินะ บางทีน้ำตามันอาจจะไม่มีความหมายก็ได้

หรือไม่ก็คงเป็นว่าเรายังไม่รู้ว่าความหมายของมันคืออะไร

ก่อนจากขอทิ้งท้ายด้วยเนื้อเพลงของเพลงข้างบนหน่อยก็แล้วกัน

懐かしい君の面影 留守電の声 あの日のままで
部屋中香るラベンダー 消える事なく残ったまま
窮屈に並んだままの おろしたての小さな靴
いつもキミが観てたドラマ 独りでずっと 録り続けて待ってたけど

喜ばすのが下手な僕は むきになってばかりで
好きな花でも飾って置けば 少しだけでも思い伝えられたのに

古ぼけて捨てられたままの玩具のようにただ目を閉じて
失って気付いた儚さ 渇き果てて錆び付いた涙

寒空に落ちる夕陽 君が押した ドアのチャイム
ソファーに置かれた鍵と 壁にもたれる見慣れた赤いコート

冬空に浮かぶ星眺め語り尽くした恋物語
閉ざされた空白の時間 そっと胸にしまい込む強さ

忘れかけてたぬくもり
痛み癒えて眠る 君の頬にそっと手をそえた 消えてしまわぬように
どんな夢見てるのだろう? 隣に横たわり朝を迎えよう

古ぼけて捨てられたままの玩具のような日々が遺した
また二人出逢えた喜び 零れ落ちる明日への涙
満たされた涙

หวังว่าในสักวันหนึ่งผมอาจจะมีโอกาสที่จะได้พบน้ำตาแห่งความสุข อย่างที่เพลงนี้เขียนไว้ในตอนท้ายก็ได้