เห็นว่า NodeJS กำลังร้อนแรง
เลยขอนำเสนอวิธีการเรียนรู้ภาษา Go สำหรับ NodeJS Developer กันหน่อย (เกี่ยวกันไหมนะ ?)
ซึ่งเป็นการเรียนรู้ตามสิ่งที่ชาว NodeJS ต้องรู้และใช้งานเป็นปกติ
แต่มาดูกันว่า ถ้าใช้ภาษา Go ต้องทำอย่างไรบ้าง
น่าจะทำให้เรียนรู้ง่ายขึ้น

ก่อนอื่นต้องเข้าใจก่อนว่า

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

แต่การจะพัฒนาระบบด้วยภาษาใหม่ทั้งหมดเลย
เป็นสิ่งที่น่ากลัวและซับซ้อน วุ่นวายมาก ๆ
อย่าทำเลยนะ ถ้าไม่จำเป็น
แยกเป็นส่วนเล็ก ๆ มาทำจะดีกว่า

จะเอามาเทียบกันตรง ๆ ก็ไม่น่าเหมาะ
เพราะว่าภาษามันสร้างด้วยเป้าหมายที่ต่างกัน
เช่นจะพูดเรื่องของการใช้งาน Memory
แน่นอนว่า Go มันใช้เล็กกว่าแน่ ๆ เพราะว่า มันเกิดมาเพื่อสิ่งนี้
การ deploy ก็เช่นกัน
รวมไปถึงการ run บน Docker ซึ่งมักชอบพูดถึงขนาดของ Image
ซึ่ง Go นั้นไม่ต้องการใช้อะไรเลย ดังนั้น Image ในการ deploy จึงเล็กมาก ๆ

ส่วน NodeJS มี ecosystem ที่ดีมาก ๆ

เขียนด้วยภาษา JavaScript มีชุดเครื่องมือและ library ดี ๆ จำนวนมาก
ก่อให้เกิด productivity สูงมาก ๆ
เพราะว่า เราจะ focus ไปที่ส่วนการแก้ไขปัญหาเชิง business มากกว่า technical

เมื่อพูดถึง NodeJS แล้วน่าจะมี 3 เรื่องหลัก ๆ ที่น่าสนใจคือ

  • การจัดการ dependency ซึ่งจะมี npm กับ yarn
  • การทำงานแบบ asynchronous มีทั้ง async-await, Promise และ callback เป็นต้น
  • การสร้าง RESTful API

มาดูกันว่าในภาษา Go ตอบโจทย์เหล่านี้กันอย่างไรบ้าง ?

เรื่องที่ 1 การจัดการ dependency

สำหรับภาษา Go จะมีตัว default คือ go get
และ Go 1.6 ขึ้นมาสนับสนุน vendor directory แล้ว
ทำให้เราสามารถ copy พวก dependency ต่าง ๆ ที่ download ผ่าน go get มาไว้ใน project ได้
รวมทั้งยังมีเครื่องมืออื่น ๆ จาก community หลายตัวเลยทั้ง

และยังมีให้เลือกอีกมากมาย Package Management Tool for Go

คำถามที่น่าสนใจคือ ใช้ตัวไหนดี
ตอบยากมาก ๆ ประเด็นคือต้องลอง ว่าตัวไหนถูกใจเรา เหมาะสมกับเรา
ยกตัวอย่างเช่นผมก็ใช้แค่ go get และ vendor directory เท่านั้นเอง

แต่ถ้าตัวที่คล้ายกับ npm ใน NodeJS ก็คือ deps นั่นเอง
มีการกำหนด library ที่ต้องใช้งานเหมือนกัน (package.json => toml)
มี lock file เหมือนกัน (package-lock.json => toml)
มีการ download ไว้คล้าย ๆ กันคือ node_modules directory แต่ deps เอาไว้ใน vendor directory

เรื่องที่ 2 การทำงานแบบ asynchronous

เป็นเรื่องธรรมชาติของ NodeJS
ตัวอย่างเช่นการอ่านไฟล์

แต่สำหรับภาษา Go นั้น จะทำงานแบบ sync เป็นปกติ
ซึ่งเขียนได้แบบนี้

แต่เราต้องการให้ทำงานแบบ async นะ
ดังนั้นต้องใช้ความพยายามกันหน่อย
โดย Go จะมี Go routine และ Channel ให้นะ
แต่ต้องรอให้ทำงานจบก่อน ไม่เช่นนั้นจะไม่ได้ค่าอะไรออกมาเลย
หรือจะใช้งานพวก errorgroup มาจัดการก็ได้นะ สบายขึ้นเยอะ

เพียงเท่านี้ก็จัดการได้ตามที่ต้องการแล้ว
ง่ายไหมละ ?
ไม่ง่าย …

เรื่องที่ 3 การสร้าง RESTful API

ใน NodeJS นั้นเรื่องของการสร้าง RESTful API นั้นง่ายมาก ๆ
แถมมี library จำนวนมากทั้ง Express, Koa, Loopback และ Hapi
มาดูใน Go กันบ้าง ว่ามีอะไร ?
เริ่มง่าย ๆ ด้วย net/http + encoding/json package ก็พอ
ยากหน่อยสำหรับผู้เริ่มต้น ด้วยตัวภาษามันใช้ได้เลย
แต่ต้องลงแรงเยอะหน่อย

เมื่อมองไปหา library ใช้งานก็ถือว่าเยอะเลยทั้ง

และอื่น ๆ อีกมากมาย
ลองไปดูผลการทำ benchmark เพิ่มเติมได้ที่ Go HTTP Rounting Benchmark
และหา library ต่าง ๆ จาก Awesome Go

วันนี้เขียน code แล้วหรือยัง ?
พร้อมไปกับการเรียนรู้ภาษาโปรแกรมใหม่ ๆ