8 คำถามสัมภาษณ์งานที่ Node.js Developer ‍ทุกคนควรรู้

1. Event Loop คืออะไรและมีความสำคัญอย่างไรสำหรับ Node.js?

Event Loop คือการทำงานของ Node.js สำหรับจัดการกับอีเวนต์ที่ต้องการเวลาในการประมวลผลอย่างมีประสิทธิภาพ โดย Node.js จะมี Event Loop เพื่อตรวจสอบว่ามีอีเวนต์ใดๆ ที่ต้องการการประมวลผลหรือไม่ หากมีอีเวนต์ที่ต้องการประมวลผล จะมีการเรียกใช้ Callback Function เพื่อดำเนินการต่อไป

ความสำคัญของ Event Loop สำหรับ Node.js คือทำให้ Node.js สามารถทำงานได้โดยไม่ Block การทำงานของโปรแกรม และทำให้ Node.js สามารถทำงานแบบ non-blocking I/O ได้ ซึ่งช่วยให้ Node.js มีประสิทธิภาพในการทำงานกับแอปพลิเคชันที่มีการใช้งาน I/O มากๆ โดยที่ไม่ต้องสร้างหลาย Thread พร้อมกันเหมือนกับภาษาอื่นๆ

https://www.youtube.com/watch?v=8aGhZQkoFbQ

2. Single Thread หมายถึงอะไรใน Node.js และมีผลต่อการเขียนโปรแกรมอย่างไร?

Single Thread ใน Node.js หมายถึง Node.js runtime มีเพียง thread เดียวที่ใช้ในการประมวลผล task ต่างๆ ซึ่งจะทำให้ Node.js ไม่สามารถทำงานแบบ parallel processing ได้โดยตรง แต่จะต้องใช้ non-blocking I/O และ event-driven programming ที่ใช้ Event Loop เพื่อจัดการกับ concurrent tasks การใช้ Single Thread นั้นจะช่วยลดความซับซ้อนในการเขียนโปรแกรมและทำให้ง่ายต่อการ maintain แต่จะต้องจัดการ concurrency และการทำงานพร้อมกันของ task ให้เหมาะสมเพื่อประสิทธิภาพการทำงานของโปรแกรม

⚠️ ข้อควรระวัง - อย่าทำงานที่ใช้เวลานานบน Main Thread เพราะ Node.js จะไม่สามารถประมวลผลคำสั่งพร้อมกันได้หลายๆ คำสั่ง แต่จะต้องรอจนกว่าคำสั่งก่อนหน้านั้นจะทำงานเสร็จก่อนถึงจะเริ่มทำงานคำสั่งถัดไปได้

3. ความแตกต่างระหว่าง == กับ === ใน Node.js คืออะไร?

ใน Node.js (และ JavaScript ทั่วไป) == และ === เป็น operators ที่ใช้ในการเปรียบเทียบค่าระหว่างสองตัวแปรหรือค่า โดยที่:

  • == จะทำการเปรียบเทียบค่าของสองตัวแปรหรือค่า และจะแปลง type ของตัวแปรเพื่อให้เหมือนกันก่อนเปรียบเทียบ ถ้าค่าเท่ากันจะ return true แต่ถ้าค่าไม่เท่ากันก็จะ return false
  • === จะทำการเปรียบเทียบค่าและ type ของสองตัวแปรหรือค่า ถ้า type และค่าเท่ากันจะ return true แต่ถ้าไม่เท่ากันก็จะ return false

ตัวอย่าง:


  const a = 10;
  const b = '10';
  console.log(a == b); // true เพราะ == จะแปลง type ของ b เป็น number และ 10 == 10
  console.log(a === b); // false เพราะ type ของ a คือ number และ type ของ b คือ string
 

4. Var, Let, และ Const ใน Node.js แตกต่างกันอย่างไรและใช้งานอย่างไร?

  1. var ใช้สำหรับประกาศตัวแปรแบบ Global หรือ Local Scope โดยไม่มีการจำกัดความเปลี่ยนแปลงค่า ซึ่งทำให้ตัวแปร var สามารถเปลี่ยนค่าได้ตลอดเวลา และสามารถเข้าถึงได้ทั้งจากภายในและภายนอกของฟังก์ชัน
  2. let ใช้สำหรับประกาศตัวแปรใน Local Scope เท่านั้น โดยมีการจำกัดความเปลี่ยนแปลงค่า หมายความว่าตัวแปร let สามารถเปลี่ยนค่าได้ภายใน Local Scope เท่านั้น และไม่สามารถเข้าถึงได้ภายนอกของฟังก์ชัน
  3. const ใช้สำหรับประกาศตัวแปรคงที่ (Constant) โดยมีการจำกัดความเปลี่ยนแปลงค่า หมายความว่าตัวแปร const ไม่สามารถเปลี่ยนค่าได้หลังจากถูกกำหนดค่าแล้ว และมีขอบเขตการเข้าถึงเหมือนกับ let ซึ่งเป็น Local Scope เท่านั้น

หากเป็นไปได้ควรเลือกใช้ const เป็นอันดับแรก และรองมาเป็น let

5. Null กับ Undefined ใน Node.js แตกต่างกันยังไง?

  • Undefined คือค่าที่ถูกกำหนดให้กับตัวแปรที่ไม่มีค่า หรือไม่ได้ถูกกำหนดค่ามาก่อน หรือไม่ได้มีการ return ค่าจากฟังก์ชัน โดยจะถูกกำหนดให้เป็นค่าพื้นฐานของตัวแปรต่าง ๆ ในภาษา JavaScript เช่น ตัวแปรที่ไม่ได้กำหนดค่าจะมีค่าเป็น undefined, ฟังก์ชันที่ไม่ได้ return ค่าจะมีค่าเป็น undefined ฯลฯ
  • Null คือค่าที่ถูกกำหนดให้กับตัวแปรโดยตรงโดยผู้ใช้งาน หมายความว่าค่า null จะถูกใช้เพื่อแสดงว่าตัวแปรนั้นๆ ไม่มีค่าอะไรตั้งแต่เริ่มต้น หรือว่าตัวแปรนั้นได้รับการลบค่าออกไปแล้ว

6. Node.js Framework ที่นิยมในปัจจุบัน

  1. Express.js - เป็น Framework ที่ได้รับความนิยมสูงสุดและใช้งานง่าย ใช้สำหรับสร้าง Web Application ในรูปแบบ MVC (Model-View-Controller)
  2. Koa.js - เป็น Framework ที่ถูกสร้างจากผู้สร้างของ Express.js แต่มีการใช้งาน middleware ในรูปแบบใหม่ที่เรียกว่า "async functions" ซึ่งทำให้การเขียนโค้ดเป็นแบบ non-blocking
  3. Nest.js - เป็น Framework ที่ใช้ TypeScript ในการพัฒนา มีรูปแบบการเขียนโค้ดแบบ MVC และเป็น Framework ที่สามารถใช้กับ Microservice Architecture ได้
  4. Meteor.js - เป็น Framework ที่ใช้สำหรับสร้าง Real-time Web Application โดยมีฟีเจอร์อื่นๆ เช่น Database Integration, User Management, Email Handling ฯลฯ
  5. Hapi.js - เป็น Framework ที่ใช้สำหรับสร้าง Web Application โดยมีฟีเจอร์สำหรับการทำ Routing, Authentication, Caching, Error Handling ฯลฯ
  6. Adonis.js - เป็น Framework ที่ใช้สำหรับสร้าง Web Application แบบ Full-stack โดยมีรูปแบบการเขียนโค้ดแบบ MVC
  7. LoopBack - เป็น Framework ที่ใช้สำหรับสร้าง API Application ที่มีฟีเจอร์ในการ Generate API Documentation และมีไลบรารีสำหรับการเชื่อมต่อกับ Database
  8. Sails.js - เป็น Framework ที่ใช้สำหรับสร้าง Web Application แบบ Full-stack โดยมีรูปแบบการเขียนโค้ดแบบ MVC และมีฟีเจอร์สำหรับการสร้าง API อย่างง่าย และสามารถใช้ Socket.io ในการทำ Real-time Communication ได้

7. Typescript คืออะไรและมีความสำคัญอย่างไรสำหรับ Node.js Developer?

การใช้ Typescript จะช่วยเพิ่มความเป็นระเบียบและมีประสิทธิภาพในการเขียนโค้ด Node.js โดยมีความสำคัญอย่างมากในการจัดการกับข้อผิดพลาดที่อาจเกิดขึ้นในระหว่างการรันโค้ด นอกจากนี้ Typescript ยังช่วยให้เราเขียนโค้ดได้ง่ายขึ้นด้วยการสร้าง interface และ type อีกด้วย

การเปลี่ยนโค้ดจาก JavaScript เป็น Typescript:


// JavaScript
function greet(name) {
  console.log("Hello, " + name + "!");
}
greet("John"); // Output: Hello, John!

// Typescript
function greet(name: string): void {
  console.log("Hello, " + name + "!");
}
greet("John"); // Output: Hello, John!

 

จากตัวอย่าง เราสามารถประกาศ type ของตัวแปรเพื่อช่วยให้โค้ดมีความเป็นระเบียบและตรวจสอบการใช้งานได้อย่างถูกต้อง และเมื่อเปลี่ยนโค้ดจาก JavaScript เป็น Typescript จะได้ประโยชน์จากการตรวจสอบความถูกต้องของโค้ดในช่วง Development ก่อนที่จะเข้าสู่ระหว่างรันโค้ดจริงใน Production.

8. เหตุผลที่ควรเลือกใช้ Node.js สำหรับการพัฒนาโปรแกรมคืออะไร?

  • Node.js ทำให้การพัฒนาเว็บแอปพลิเคชันง่ายขึ้นด้วยตัวจัดการ I/O แบบ non-blocking และ Event Loop ซึ่งทำให้เว็บแอปพลิเคชันตอบสนองได้รวดเร็วและสามารถประมวลผลพร้อมกันได้ โดยต่างจากภาษาอื่นๆ ที่นักพัฒนาต้องทำการจัดการ Thread
  • Node.js ทำงานบน Chrome V8 engine ที่เขียนด้วย C++ ซึ่งทำให้มีประสิทธิภาพสูงและสามารถพัฒนาต่อยอดได้ตลอดเวลา
  • ด้วย Node.js เราสามารถใช้ภาษา JavaScript ในการพัฒนาทั้งฝั่ง frontend และ backend ซึ่งจะทำให้การพัฒนาเร็วขึ้นอย่างมาก
  • Node.js มี Library ที่มากมายให้เราใช้งาน ไม่จำเป็นต้องสร้าง Library ขึ้นมาใหม่ทุกครั้ง