GIẢI ĐÁP THẮC MẮC VỀ NODE JS CÙNG GIÁM ĐỐC KỸ THUẬT APECSOFT

07-01-2020 11:23

Ngày hôm nay, hãy cùng Giám đốc kỹ thuật Apecsoft, anh Trương Hoàng Linh tìm hiểu về Node Js. Node Js là gì? Node Js có những tính năng và ưu nhược điểm gì? Khi học Node Js cần những lưu ý gì? Đọc bài dưới đây để giải đáp những thắc mắc của bạn nhé.

 

Trong hình ảnh có thể có: 1 người "Node.js thực sự tỏa sáng trong việc xây dựng RESTful API (json). Gần như không có ngôn ngữ nào xử lý JSON dễ dàng hơn Javascript, chưa kể các API server thường không phải thực hiện những xử lý nặng nề nhưng lượng concurrent request thì rất cao." - Trương Hoàng Linh - Giám đốc kỹ thuật Apecsoft

 

1. Anh có thể giải đáp cho người đọc hiểu Node Js là gì không?

  • Node.js là một mã nguồn mở, một môi trường cho các máy chủ và ứng dụng mạng.
  • Node.js sử dụng Google V8 JavaScript engine để thực thi mã, và một tỷ lệ lớn các mô-đun cơ bản được viết bằng JavaScript. Các ứng dụng node.js thì được viết bằn JavaScript.
  • Node.js chứa một thư viện built-in cho phép các ứng dụng hoạt động như một Webserver mà không cần phần mềm như Nginx, Apache HTTP Server hoặc IIS.
  • Node.js cung cấp kiến trúc hướng sự kiện (event-driven) và non-blocking I/O API, tối ưu hóa thông lượng của ứng dụng và có khả năng mở rộng cao
  • Mọi hàm trong Node.js là không đồng bộ (asynchronous). Do đó, các tác vụ đều được xử lý và thực thi ở chế độ nền (background processing)

2. Những ứng dụng của Node Js là gì?

  • Xây dựng websocket server (Chat server)
  • Hệ thống Notification (Giống như facebook hayTwitter)
  • Ứng dụng upload file trên client
  • Các máy chủ quảng cáo
  • Các ứng dụng dữ liệu thời gian thực khác.

3. Những ưu điểm và nhược điểm của Node Js là gì?

a. Ưu điểm.

  • Đặc điểm nổi bật của Node.js là nó nhận và xử lý nhiều kết nối chỉ với một single-thread. Điều này giúp hệ thống tốn ít RAM nhất và chạy nhanh nhất khi không phải tạo thread mới cho mỗi truy vấn giống PHP.

Ngoài ra, tận dụng ưu điểm non-blocking I/O của Javascript mà Node.js tận dụng tối đa tài nguyên của server mà không tạo ra độ trễ như PHP

  • JSON APIs

Với cơ chế event-driven, non-blocking I/O(Input/Output) và mô hình kết hợp với Javascript là sự lựa chọn tuyệt vời cho các dịch vụ Webs làm bằng JSON.

  • Ứng dụng trên 1 trang( Single page Application)

Nếu bạn định viết 1 ứng dụng thể hiện trên 1 trang (Gmail?) NodeJS rất phù hợp để làm. Với khả năng xử lý nhiều Request/s đồng thời thời gian phản hồi nhanh. Các ứng dụng bạn định viết không muốn nó tải lại trang, gồm rất nhiều request từ người dùng cần sự hoạt động nhanh để thể hiện sự chuyên nghiệp thì NodeJS sẽ là sự lựa chọn của bạn.

  • Shelling tools unix

NodeJS sẽ tận dụng tối đa Unix để hoạt động. Tức là NodeJS có thể xử lý hàng nghìn Process và trả ra 1 luồng khiến cho hiệu xuất hoạt động đạt mức tối đa nhất và tuyệt vời nhất.

  • Streamming Data (Luồng dữ liệu)

Các web thông thường gửi HTTP request và nhận phản hồi lại (Luồng dữ liệu). Giả xử sẽ cần xử lý 1 luồng giữ liệu cực lớn, NodeJS sẽ xây dựng các Proxy phân vùng các luồng dữ liệu để đảm bảo tối đa hoạt động cho các luồng dữ liệu khác.

  • Ứng dụng Web thời gian thực

Với sự ra đời của các ứng dụng di động & HTML 5 nên Node.js rất hiệu quả khi xây dựng những ứng dụng thời gian thực (real-time applications) như ứng dụng chat, các dịch vụ mạng xã hội như Facebook, Twitter,…                       

b. Nhược  điểm.

  • Ứng dụng nặng tốn tài nguyên

Nếu bạn cần xử lý các ứng dụng tốn tài nguyên CPU như encoding video, convert file, decoding encryption… hoặc các ứng dụng tương tự như vậy thì không nên dùng NodeJS (Lý do: NodeJS được viết bằng C++ & Javascript, nên phải thông qua thêm 1 trình biên dịch của NodeJS sẽ lâu hơn 1 chút ). Trường hợp này bạn hãy viết 1 Addon C++ để tích hợp với NodeJS để tăng hiệu suất tối đa !

  • NodeJS và ngôn ngữ khác

NodeJS, PHP, Ruby, Python .NET …thì việc cuối cùng là phát triển các App Web. NodeJS mới sơ khai như các ngôn ngữ lập trình khác. Vậy nên bạn đừng hi vọng NodeJS sẽ không hơn PHP,Ruby,Python… ở thời điểm này. Nhưng với NodeJS bạn có thể có 1 ứng dụng như mong đợi, điều đó là chắc chắn !

4. Khi nào thì nên sử dụng Node Js?

Node.js rất hấp dẫn. Nhưng khi bạn quyết định bắt tay xây dựng một dự án bằng Node.js, hãy đặt câu hỏi: “Tôi có nên dùng Node.js hay không?”. Và dưới đây là một trong số những câu trả lời cho điều đó.

            Bạn KHÔNG nên sử dụng Node.js khi:

  • Xây dựng các ứng dụng hao tốn tài nguyên:

Bạn đừng mơ mộng đến Node.js khi bạn đang muốn viết một chương trình convert video. Node.js hay bị rơi vào trường hợp thắt cổ chai khi làm việc với những file dung lượng lớn.

  • Một ứng dụng chỉ toàn CRUD:

Node.js không nhanh hơn PHP khi bạn làm các tác vụ mang nặng tính I/O như vậy. Ngoài ra, với sự ổn định lâu dài của các webserver script khác, các tác vụ CRUD của nó đã được tối ưu hóa. Còn Node.js? Nó sẽ lòi ra những API cực cực kỳ ngớ ngẩn.

  • Khi bạn cần sự ổn định trong ứng dụng của bạn:

Chỉ với 4 năm phát triển của mình (2009-2013), version của Node.js đã là 0.10.15 (hiện tại tới thời điểm này là v0.10.35). Mọi API đều có thể thay đổi – một cách không tương thích ngược – hãy thật cẩn thận với những API mà bạn đang dùng, và luôn đặt câu hỏi: “Khi nó thay đổi, nó sẽ ảnh hưởng gì đến dự án của tôi?”

  • Và quan trọng nhất: Bạn chưa hiểu hết về Node.js

Node.js cực kỳ nguy hiểm trong trường hợp này, bạn sẽ rơi vào một thế giới đầy rẫy cạm bẫy, khó khăn. Với phần lớn các API hoạt động theo phương thức non-blocking/async việc không hiểu rõ vấn đề sẽ làm cho việc xuất hiện những error mà thậm chí bạn không biết nó xuất phát từ đâu? Và mệt mỏi hơn nữa: Khi cộng đồng Node.js chưa đủ lớn mạnh, và sẽ ít có sự support từ cộng đồng. Khi mà phần lớn cộng đồng cũng không khá hơn bạn là bao.

Vậy bạn nên dùng Node.js khi nào?

  • Node.js thực sự tỏa sáng trong việc xây dựng RESTful API (json). Gần như không có ngôn ngữ nào xử lý JSON dễ dàng hơn Javascript, chưa kể các API server thường không phải thực hiện những xử lý nặng nề nhưng lượng concurrent request thì rất cao. Mà Node.js thì xử lý non-blocking. Chẳng còn gì thích hợp hơn Node.js trong trường hợp này!
  • Những ứng dụng đòi hỏi các giao thức kết nối khác chứ không phải chỉ có http. Với việc hỗ trợ giao thức tcp, từ nó bạn có thể xây dựng bất kỳ một giao thức custom nào đó một cách dễ dàng.
  • Những ứng dụng thời gian thực: Khỏi phải nói vì Node.js dường như sinh ra để làm việc này!
  • Những website stateful. Node.js xử lý mọi request trên cùng một process giúp cho việc xây dựng các bộ nhớ đệm chưa bao giờ đơn giản đến thế: Hãy lưu nó vào một biến global, và thế là mọi request đều có thể truy cập đến bộ nhớ đệm đó. Caching sẽ không còn quá đau đầu như trước đây, và bạn có thể lưu cũng như chia sẻ trạng thái của một client với các client khác ngay trong ngôn ngữ, chứ bạn không cần thông qua các bộ nhớ ngoài!
  • Quan trọng nhất: Bạn yêu thích và muốn sử dụng nó.

5. Quá trình học Node Js có khó không và bản thân anh đã học như thế nào?

Với những ai từng học lập trình hướng đối tượng thì nó sẽ quả là khá khó chịu với function programing hay đơn giản là kiểu dữ liệu không định kiểu.

Bản thân tiếp cận với Js từ năm 2011 do làm nhiều lập trình phía frontend. Thấy ngôn ngữ javascript khá hay và nó có gì đó khác biệt với các ngôn ngữ khác. Mà Node Js phát triển trên nền Js nên việc tiếp cận nó cũng không có gì nhiều khó khăn. Việc học Node Js thời kỳ 2013 gần như là tự học vì cũng ko có trường lớp nào dạy bạn. Bạn phải tự mày mò nghiên cứu và ứng dụng. Thời kỳ đó mình ứng dụng để làm những phần nhỏ nhỏ như chat, thông báo.

Có một chút khó khăn nho nhỏ: Đó là việc xử lý bất đồng bộ trong Node.js, nhưng cũng đã có thư viện hỗ trợ. Sau này cộng đồng Node.js lớn mạnh và có rất nhiều thư viện hỗ trợ. Đến năm 2016 thì được làm việc với Node.js để khai thác trên data có sẵn của hàng chục triệu người dùng thông qua ứng dụng mạng xã hội quốc gia về giáo dục cho phân khúc từ mầm non đến trung học phổ thông.

6. Cơ hội làm việc của ngành này tại công ty anh như thế nào và ở ngoài xã hội như thế nào theo đánh giá của anh?

Hiện tại công ty đang phát triển nhiều sản phẩm nâng cao trải nghiệm người dùng, phát triển nhiều app nên công ty cũng tuyển liên tục. Nhưng việc tuyển được lập trình viên Node.js kinh nghiệm cũng không phải điều dễ. Lương của lập trình viên Node.js có kinh nghiệm cũng tương đối cao. Lương thấp nhất cho một lập trình viên Node.js có kinh nghiệm cũng không dưới 20 triệu. Nhiều lúc công ty cũng tuyển những bạn có nền tảng về Javascript sau đấy sẽ đào tạo kiến thức và kinh nghiệm về Node.js cho nhân sự mới.

Các công ty bên ngoài cũng tuyển rất nhiều. Vì thời điểm công nghệ 4.0 các sản phẩm hướng đến trí tuệ nhân tạo, tối ưu trải nghiệm người dùng. Các ứng dụng trên di động phát triển mạnh mẽ, Node.js càng trở nên hot hơn bao giờ hết nên việc tuyển dụng các nhân sự có kinh nghiệm về Node.js cũng vô cùng khó khăn. Trong thời gian tới số lượng lập trình viên Node.js sẽ gia tăng hơn vì rất nhiều bạn đã và đang tham gia vào những dự án lập trình phía frontend như angular, vuejs, jeact,…mà những framework này lập trình trên nền tảng kiến thức về Js. Nên khi tiếp cận Node.js sẽ dề dàng hơn rất nhiều.

Khi bạn đã làm việc được với angular, vuejs, jeact phía frontend trên nên tảng Js, phía server bạn dùng Node.js thì sẽ vô cùng thuận lợi khi cả client và server được viết cùng một nền tảng Js. Do vậy việc kế thừa dùng lại giúp dự án của bạn tiết kiệm được rất nhiều thời gian.

7. Anh đã mắc phải sai lầm nào trong quá trình làm việc chưa? Và đã khắc phục nó như thế nào?

- Trước kia vào năm 2012 khi làm dựa án office(sản phẩm cho quản trị doanh nghiệp) trên nền PHP tôi và một bạn nữa nằm trong đội viết core. Tôi và bạn ấy thâu đêm để xây dựng lên một bộ core theo chuẩn MVC, tất cả dựa trên core thuần mà không dựa vào bên thứ 3. Chúng tôi cũng ko dùng thư viện sẵn Jquery và viết riêng môt thư viện dựa trên Javascript thuần để xây dựng các control, ứng dụng Node.js vào trong khi Node.js chưa thịnh hành...Mục đích của chúng tôi là tự động được càng nhiều càng tốt, control đến mọi ngõ ngách của framework nhưng lại khó cho các DEV tiếp cận trong giai đoạn đầu. Chúng tôi đã đập đi, chỉnh sửa để dễ tùy biến nhất, nhưng cũng control được mức độ sâu nhất rồi cũng phải thích ứng với sự thay đổi nhanh nhất.

Từ một sản phẩm năm 2012 - 2014 chỉ có 5 nhân sự và gần như không có khách hàng thì đến nay đã có trên 100 tính năng, trên 1000 khách hàng sử dụng, gần 100.000 tài khoản trả phí

Bài học rút ra ở đây tôi thấy: Chạy theo công nghệ quá cho một sản phẩm chưa chắc đã tốt, nó chỉ tốt khi bạn và những người trong team control thực sự được nó. Lựa chọn đúng và có giới hạn.

- Năm 2017 tôi lại làm một dữ án dữ liệu quốc gia. Dữ liệu lên tới hàng chục triệu bản ghi, chúng tôi dùng một thư viện của bên thứ 3 nhưng chỉ là bản crack team gồm 10 người làm trong 2 năm đang chạy ổn định, hacker dựa vào lỗ hổng của bản crack để tấn công. Nhưng rất may là phía đối tác đã kết nối công ty bảo mật để tìm lỗ hổng của hệ thống. Nếu phía đối thủ tìm ra và đánh thì thực sự nguy hiểm đến sự an nguy của công ty.

Sau vụ này chúng tôi đã không còn tiếc vài nghìn đô để xử lý việc tưởng chừng như vô cùng nhỏ. Nhưng khi bạn làm những dự  án lớn thì một cái nhỏ thôi nó có thể giết chết cả môt hệ thống lớn.

8. 3  bài học nghề nghiệp quan trọng nhất mà anh đúc rút cho bản thân là gì?

  • Yêu sản phẩm mình làm. Đúng Dealine.
  • Đặt ở vị trí người dùng ở góc nhìn đa chiều trong quá trình làm sản phẩm.
  • Để ý các tiểu tiết nhỏ nhưng với khách hàng là vô cùng quan trọng có khi con hơn cả một tính năng lớn.

9. Những kỹ năng nào cần thiết cho một Node Js Developer?

  • It nhất 3 năm kinh nghiệm làm việc với Javascript
  • Hiểu biết về các nền tảng front-end:  Javascript thuần, jquerry. Và các fw front-end như angular, vuejs,...
  • Thành thạo API RESTful và giao tiếp giữa các API
  • Có kiến thức tốt về lập trình không đồng bộ và cách giải quyết các vấn đề của nó.
  • Thành thạo NPM để cài đặt và quản lý các gói js
  • Thành  thạo Express.
  • Có kiến thức về ES6                                                              

10. Anh có thể cho những bạn đang theo học Node Js một số lời khuyên được không?

-  Thời gian đầu bạn nên học thật chắc kiến thức cơ bản của javascript như hằng, biến, mảng, đối tượng, biểu thức, vòng lặp,...

-  Sau đó xây dựng các bài tập và ứng dụng nhỏ dựa trên kiến thức cơ bản trên.

-  Sau đo bạn học và làm với những thứ nâng cao trong javascript như cấu trúc dom, xử lý dom.

-  Rồi tìm kiểu các kiến thức nâng cao như javascript design patterns

-   Hiểu về callback, try catch, cách xử lý chuyên sâu vơi class object trong javascript,...

-   Dựa vào các kiến thức nâng cao để xử lý lại các bài toán cơ bản phía trên.

-   Dựa vào các kiến thức nâng cao để xây dựng các bài toán phức tạp hơn phía client như viết các control multiselect, listcheckbox

table,...trên javascript thuần và các đối tượng html.

-   Tiếp tục học thư viện jquery để biết cách sử dụng nó cũng như học trong lõi của nó để sâu hơn về kiến thức javascript nâng cao

-  Sau đó bạn tiếp tục làm quen và thực hành với một trong các framework phía client: angularjs, vuejs, jeact,...Nhưng bạn cũng

có thể bỏ qua bước này để làm việc với nodejs luôn.

-  Tiếp đến bạn nghiên cứu và làm việc vơi nodejs:

            + Hiểu và làm việc với NPM hoặc Yarn nó là công cụ để quản lý các thư viện lập trình Javascript cho Nodejs được cồng đồng

            lập trình viên tạo ra hàng trăm nghìn những thư viện js giúp cho dự án phát triển nhanh chóng.

            + Làm việc với express framework

            + Làm việc với các thư viện xử lý với database dạng có quan hệ: thư viện mysql, sequelize,...

            + Làm việc với mongoDB(database không có quan hệ) các thư viện như mongoose,...

            + Làm những ứng dụng nhỏ như: chat, thông báo, hoạt động,....

            + Làm việc với các thư viện quan trọng: async, lodash, underscore, bower, moment, grunt, socket.io

            + Upload file, xử lý đơn luồng đa luồng.      

- Bạn nên cố gắng để được tham gia vào những  dự án bigdata nhiều người dùng cùng một lúc có thể dưới vài trò là một thực tập viên để học hỏi kinh nghiệm.

- Bạn cũng có thể tạo ra môi trường để mình thử nghiệm trong quá trình học.

Bài viết cùng chủ đề

1