จริงๆ พอเห็นประวัติคนเขียนผ่านๆ มานานแล้ว พอได้จับหนังสือเลยพอรู้ว่าน่าจะเป็นยังไงเลยไม่ได้ซีเรียสอะไร


แต่พอดีได้หนังสือมาจากรุ่นพี่ที่บริษัทมาให้ช่วยรีวิว โดยหนังสือเล่มนี้เขียนเกี่ยวกับ วิธีการเริ่มต้นใช้งาน Node.js สำหรับ “ผู้เริ่มต้น”


ตอนแรกว่าจะไม่รีวิวลง Facebook แต่โอเคเห็นมีหลายคนอยากได้ ก็ลงรีวิวให้ก็ได้


Disclaimer: เนื้อหาที่อ่านเป็นการอ่านแบบผ่านๆ ดังนั้นอาจจะไม่ละเอียดมาก โดยใช้เวลาอ่านประมาณ 2-3 ชั่วโมง


โดยรวม

- หนังสือเล่มใหญ่ดี เป็นกระดาษทั้งเล่ม เคยมีแจกเล่มนี้เป็น E-Book แล้ว


- หนังสือขายเล่มละ 2,500 บาท แต่ลดราคาเหลือ 900 บาท คิดว่าราคาไม่คุ้มค่ากับเนื้อหาเท่าไหร่ สอนถูกๆ ผิดๆ ซะส่วนใหญ่


- เนื้อหาทั้งเล่มเป็นพื้นฐานมากๆ ที่ถ้าใช้เวลา search Google ซักวันนึงก็น่าจะครบหมดแล้ว


- Bad Practice และ Anti Pattern ค่อนข้างเยอะ และเนื้อหากำกวมค่อนข้างมาก ไม่อธิบาย Thought Process ที่จำเป็น


Pros

1. เน้นปฎิบัติมากกว่าหลักการ ตามที่หนังสือเขียนไว้


2. หนังสือเล่มใหญ่ดี เอาสันหนังสือไปทุบเปลือกถั่วน่าจะแตกได้


3. หนังสือเป็นเล่มกระดาษ


Cons

Major Problem

1. First (Impression?) คือ เอา font แนวเดียวกับ Comic Sans มาเขียนหนังสือแนววิชาการ (อย่างน้อย font ก็มีหัว)


2. หนังสือขายเล่มละ 2,500 บาท แต่ลดราคาเหลือ 900 บาท กล้าพูดเลยว่าราคาไม่คุ้มค่ากับเนื้อหา


- เนื้อหาหลักๆ ในเล่มมีแค่


- Download Node,


- npm install,


- basic JavaScript (var, if-else, for, function, ไม่มีพูดถึงว่า Promise คืออะไรด้วยซ้ำ)


- ใช้ Express แค่ get, post (ไม่มีพูดถึง middleware และ หลักการที่จำเป็น)


- module.exports และ require


- pug กับ ejs


- เชื่อม Database แบบพื้นๆ มี MongoDB, MySQL และ Postgres (มี LowDB อีกอัน)


3. มีเนื้อหาผิดค่อนข้างมาก ส่วนใหญ่เนื้อหากำกวม และมี Bad Practice และ Anti Pattern เยอะมาก


- Callback Hell


- ส่ง http 200 ถ้า error


- Http Verb GET บน Path delete


- หัวข้อชื่อ Promise Wrapper แต่ไม่มี Promise ใช้ async-await แทน


- หัวข้อชื่อ Event and Stream แต่ไม่มีอะไรที่เกี่ยวข้องกับ Stream


- หัวข้อ File System อธิบายเป็นเป็น Non Blocking แต่ใช้ sync function และไม่อธิบายข้อแตกต่างกับ fs sync และ async เช่น writeFile และ writeFileSync


4. หนังสือเขียนไว้เองว่า “ไม่เน้นหลักการ แต่เน้นปฎิบัติ” ถ้าอยากได้หลักการก็ไม่ต้องซื้อ ถ้าอยากได้ปฎิบัติ ก็หาบน Internet มี ตัวอย่างดีๆ เยอะกว่าแน่นอน


5. ไม่ได้เขียนบรรณานุกรมและแหล่งอ้างอิงไว้จากที่ไหนเลย


6. ใครเอาให้มือใหม่อ่านจะตีให้ตาย (No offense intent)



Problem

1. หน้าที่ 3 หัวข้อเรื่องจุดเด่นของ Node.js


โดย คำว่า เล็ก, เร็ว, กินทรัพยากรต่ำ เป็นการเปรียบเทียบที่เป็นนามธรรมโดยใช้แหล่งอ้างอิงเป็น ”ประสปการณ์” ในการเปรียบเทียบ (ก่อนหน้าผู้เขียนหนังสือ ใช้ PHP กับ Node เป็นหลัก)


- เปรียบเทียบ | ถ้าเทียบกับภาษา (Environment) อื่นๆ ที่เขียน Backend ได้จริงๆ แล้ว Node ไม่ได้มีความเด่นด้านนี้เลย (เล็ก, เร็ว, กินทรัพยากรต่ำ)


- เล็ก | ด้วยความที่ Node.js เป็น Scripting Language ดังนั้นเวลาใช้ใน Container ยังต้อง Pull ทั้ง Image ของตัว Nodejs มาใช้ทำให้โดยส่วนมากขนาดก็เกิน 1GB สำหรับ 1 Container แล้ว


- เร็ว | Node.js ไม่ได้เด่นเรื่องความเร็ว ถ้าเทียบใน

TechEmpower Benchmark รอบที่ 19

ในหัวข้อ Plaintext แล้ว จะเห็นว่าการส่ง string เปล่าๆ Express อยู่ที่อันดับ 204 และ Fastify อยู่ที่อันดับ 135 ซึ่งความเร็วอยู่ที่ 5% และ 10.7% เทียบจาก Library ที่มีความเร็วสูงสุดในการเปรียบเทียบตามลำดับ แถมมี Error ในการส่งมาด้วย


- กินทรัพยากรต่ำ | Node เป็น Non-blocking IO (Node เขียนให้ ไม่ gc จนกว่าจะทำงานเสร็จ) แถมใช้ V8 Engine (ที่ค่อนข้างได้ยินชื่อมาบ้างว่าติดปัญหาเรื่อง Memory) ถ้าเทียบกับภาษาที่เป็น Programming Language ก็เทียบเรื่อง Resource ไม่ได้อยู่ดี อย่างเช่น Web Server สำหรับ ส่ง text/plain; charset=utf-8 โดยมีคำว่า “Hello World”


- Backend ที่เขียนด้วย Node จะใช้ Memory อยู่ที่ประมาณ 50MB (ทดสอบจาก MacBook Pro 2019, Intel i5 gen 9; Ram 16GB; SSD 512; บน Node.js 14.4.0 โดยใช้ Express 4.17.1; บน Docker Container ผ่าน Node image โดยตรง)


- Backend ที่เขียนด้วย Rust จะใช้ Memory อยู่ที่ประมาณ 2-4MB ทดสอบจาก MacBook Pro 2019, Intel i5 gen 9; Ram 16GB; SSD 512; บน Rust 1.45.2 โดยใช้ Actix Web 3; บน Docker Container ผ่าน Distroless หลังจาก compile เป็น byte code)


- คำว่า non io น่าจะเขียนผิดจาก Non Blocking I/O (Non IO เฉยๆ แปลว่าไม่มี Input Output)


2. หน้าที่ 24 สอนวิธีการประกาศ Function แบบ First Class Function โดยใช้ตัวแปรไปรับชื่อ Function ที่มีชื่ออยู่แล้ว​ (ในทางปฎิบัติแล้วทำได้ แต่ควร Mark ไว้ว่าเป็น Bad Practice)


3. หน้าที่ 26 อธิบาย High Level Overview ของการทำงานใน Node ว่า “ทำงานได้พร้อมกันเหมือน CPU หลาย Core” ไม่ได้อธิบายเรื่อง Non-Blocking I/O และทำไมถึงทำงานได้พร้อมกัน


4. ในหน้าที่ 48 กล่าวถึงเรื่อง File System และการทำงานแบบ Non Blocking I/O แต่ว่าตัวอย่าง code ใช้ทั้ง Synchronous Function เช่น writeFileSync สลับกับ Asynchronous Function เช่น unlinkFile โดยไม่อธิบายเรื่อง Asynchronous Function ใน File System ที่เป็น Non-Blocking I/O จริงๆ ทำให้มือใหม่ที่มาอ่านเข้าใจผิดได้ว่า fs ทั้งหมด เป็น Non-Blocking และไม่มีการอธิบายว่าทำไมต้องมี callback ใน async function


5. หน้าที่ 51 ส ร้ า ง ไ ฟ ล์ ใ น n o d e _ m o d u l e s


- พอเข้าใจได้ว่าต้องการให้เห็นว่า import path สามารถ import module จาก node_modules ได้โดยตรงเลย แต่ไม่มีการเขียนบอกไว้ว่าเป็น Anti pattern ทำให้มือใหม่อาจจะทำแบบผิดๆ ได้


6. ไม่อธิบายว่า npm คืออะไร บอกแค่ว่าให้ copy คำสั่งไปรันแล้วบอกว่าจะลง module ให้


7. หน้าที่ 56 มีการใช้ underscore (Node Module) มาใช้ในตัวอย่าง code สำหรับการ filter แต่จริงๆ แล้ว .filter support ใน Node.js 13 อยู่แล้ว ก็ใช้ .filter แทน underscore เลยก็ได้


- พอเข้าใจได้ว่าต้องการแสดงวิธีการ import module ให้ดู


8. หน้าที่ 62 “ไม่เน้นหลักการ แต่เน้นปฎิบัติ” เลยไม่อธิบายว่าเวลาไหนต้องใช้ pattern ไหน


9. หน้าที่ 62 หัวข้อเรื่อง Event and Stream แต่ไม่มีอะไรที่เกี่ยวข้องกับ Stream เลย


10. หน้า 86 พิมพ์ขาว-ดำ คำสั่ง install module กลืนไปกับสีดำ


11. หน้า 108 ไม่อธิบายว่าทำไมใช้ MongoDB ความแตกต่างระหว่าง SQL และ NoSQL และแยก Database


- ย้อนกลับไปอ่านข้อ 8


12. ไม่อธิบายเรื่อง Arrow Function


13. หน้า 118 การสร้าง MongoDB Connection Client เป็นแบบ Anti Pattern โดยไม่รอให้สร้าง Connection กับ Database เสร็จก่อน แล้วค่อยให้ server ทำงาน แถมไม่มี catch สำหรับในกรณีที่เชื่อมต่อไม่สำเร็จด้วย


14. หน้าที่ 119-120 ใช้ express response.send() ส่ง http 200 กลับมาแต่ ถ้า error แค่ console.log ไว้ เป็น Bad Practice


15. หน้า 129 ใช้ Xampp แต่ไม่อธิบายว่าไม่ควรใช้บน Production


- ส่วนตัวแล้ว เห็นแล้วขัดใจที่ใช้ Xampp คู่กับ Node เฉยๆ


16. หน้า 148 ตัวอย่าง code ที่เชื่อ SQL ถ้า error ให้ส่ง response http 200 กลับมมาเป็น Bad Practice


17. หน้า 165 หัวข้อ Promise Wrapepr แต่ไม่อธิบายว่า Promise คืออะไร ทำอะไรได้ แถมใช้ Async Await แทน Promise ด้วยซ้ำ



Minor Problem

(ตรงนี้บ่นซะส่วนใหญ่)


1. สารบัญมีการสะกดหัวข้อผิด (ในหัวข้อที่ 2 เรื่อง Nodejs Performance)


2. คิดว่า Font ใหญ่ไปหน่อย


3. เลิกเขียนคำว่า “เย้” แทนคำว่า “เย่” เถอะ


4. ปกภาพแตก (เห็นแล้วขัดใจเฉยๆ)


5. ปกหนังสือ Design เหมือนจะ Copy มากจาก

หนังสือของ Rod Johnson

โดยเฉพาะมุมขวาบนที่เขียนว่า  Programmer to Programmer


โดยสรุปแล้ว

ความคิดเห็นส่วนตัวสำหรับหนังสือเล่มนี้คือ


ต่อให้ได้มาฟรีก็ไม่แนะนำให้อ่าน

เอาเวลาไปทำอย่างอื่นดีกว่าเยอะ


เว้นแต่เอาไปทุบเปลือกถั่วเพราะสันหนังสือหนาดี


Edited_1:

หลังจากได้ดูการชี้แจงของผู้เขียนบน

Youtube


จริงๆ แล้วกางเทียบ

Read more