เห็นว่า 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 ตัวอย่างเช่นการอ่านไฟล์ [gist id="4b666dfc648a0a511b4f464c88a3e14b" file="read_file.js"] แต่สำหรับภาษา Go นั้น จะทำงานแบบ sync เป็นปกติ ซึ่งเขียนได้แบบนี้ [gist id="4b666dfc648a0a511b4f464c88a3e14b" file="read_file.go"] แต่เราต้องการให้ทำงานแบบ async นะ ดังนั้นต้องใช้ความพยายามกันหน่อย โดย Go จะมี Go routine และ Channel ให้นะ แต่ต้องรอให้ทำงานจบก่อน ไม่เช่นนั้นจะไม่ได้ค่าอะไรออกมาเลย หรือจะใช้งานพวก errorgroup มาจัดการก็ได้นะ สบายขึ้นเยอะ [gist id="4b666dfc648a0a511b4f464c88a3e14b" file="read_file_async.go"] เพียงเท่านี้ก็จัดการได้ตามที่ต้องการแล้ว ง่ายไหมละ ? ไม่ง่าย ...เรื่องที่ 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 แล้วหรือยัง ? พร้อมไปกับการเรียนรู้ภาษาโปรแกรมใหม่ ๆ