Bối cảnh và vấn đề nghiên cứu

Trong bối cảnh công nghệ thông tin phát triển nhanh chóng, điện thoại thông minh đã trở thành thiết bị phổ biến, thúc đẩy lập trình ứng dụng di động trở thành xu hướng công nghệ chủ đạo. Theo số liệu thống kê của IDC và Statcounter vào năm 2019, nền tảng Android tiếp tục dẫn đầu thị trường hệ điều hành di động toàn cầu, xếp trên iOS và Kaios. Nhờ bản chất mã nguồn mở, khả năng tùy biến cao, tính năng đa dạng và kho ứng dụng đồ sộ, Android trở thành môi trường triển khai phần mềm được ứng dụng rộng rãi trong học thuật và thực tiễn.

Báo cáo thực tập tốt nghiệp với đề tài "Tìm hiểu và triển khai Android Apps trên Google Play" (tên ứng dụng triển khai thực tế là NVH News - Ứng dụng đọc báo trên điện thoại nền tảng Android) được thực hiện bởi hai sinh viên Nguyễn Văn Hảo (MSSV: 1551120082) và Nguyễn Xuân Trường (MSSV: 1551120124), dưới sự hướng dẫn của giảng viên Lê Quốc Tuấn tại Khoa Công nghệ Thông tin, Trường Đại học Giao thông Vận tải TP. Hồ Chí Minh.

Mục tiêu và nhiệm vụ nghiên cứu của đề tài được xác định cụ thể:

  1. Về mặt lý thuyết: Vận dụng kiến thức tích lũy sau bốn năm học đại học chuyên ngành Công nghệ thông tin để tìm hiểu sâu về nền tảng Node.js; phân tích, đánh giá ưu điểm và nhược điểm của Node.js so với các công nghệ máy chủ truyền thống như PHP, ASP.NET; từ đó đúc kết kinh nghiệm lựa chọn giải pháp công nghệ phù hợp với nhu cầu thiết kế hệ thống.
  2. Về mặt thực hành: Xây dựng hoàn chỉnh ứng dụng di động mẫu (App Demo NVH News) trên hệ điều hành Android, kết hợp kiến trúc dịch vụ dữ liệu phía máy chủ (Backend API) và giao diện người dùng.

Đối tượng và phạm vi nghiên cứu:

  • Đối tượng nghiên cứu: Nền tảng Node.js, hệ sinh thái quản lý gói npm, kiến trúc RESTful API xây dựng bằng Express.js, công cụ tạo mẫu Handlebars.js, thư viện React-Native và hệ điều hành Android.
  • Phạm vi thời gian: Đề tài được triển khai và hoàn thành trong thời gian 2 tháng, từ ngày 21/09/2020 đến ngày 21/11/2020.
  • Phạm vi không gian: Nghiên cứu và thực nghiệm tại Khoa Công nghệ Thông tin, Trường Đại học Giao thông Vận tải TP. Hồ Chí Minh.

Cơ sở lý thuyết và phương pháp

Cơ sở lý thuyết của đề tài được xây dựng dựa trên sự tổng hợp các công nghệ phần mềm hiện đại và phân tích đặc tính của các hệ điều hành di động:

Hệ điều hành Ưu điểm Nhược điểm
iOS - Tính bảo mật cao.
- Khả năng tối ưu hóa tốt, hoạt động ổn định.
- Kho ứng dụng đồ sộ, cập nhật nhanh hơn Android.
- Khả năng tùy biến chưa cao.
- Việc trao đổi dữ liệu khó khăn, bất tiện.
Windows Phone - Khả năng đồng bộ, liên kết sử dụng các tài khoản dịch vụ trên Windows tốt.
- Giao diện mượt mà, ổn định.
- Giao diện chỉ gồm các ô vuông, không thay đổi được launcher như Android.
- Kho ứng dụng nghèo nàn so với Android và iOS.
Android - Kho ứng dụng đồ sộ.
- Nhiều tính năng thông minh và hữu ích.
- Khả năng tùy biến cao, dễ sử dụng.
- Tính bảo mật chưa cao.
- Khả năng dọn dẹp rác hạn chế.

Về công nghệ máy chủ và ngôn ngữ lập trình, đề tài nghiên cứu các nền tảng:

  • Môi trường Node.js: Nền tảng thực thi JavaScript mã nguồn mở chạy trên Google V8 JavaScript Engine. Node.js hoạt động theo kiến trúc hướng sự kiện (event-driven) và mô hình vào/ra không chặn (non-blocking I/O API), trong đó tất cả các hàm xử lý đều mang tính chất bất đồng bộ (asynchronous), cho phép tối ưu hóa thông lượng và khả năng mở rộng.
  • Nền tảng JavaScript và ECMAScript: Nghiên cứu các khái niệm nền tảng như phạm vi biến (Global Scope, Local Scope), cơ chế Callback, cùng 10 đặc tả quan trọng của chuẩn ES6/ES7 bao gồm: Default Parameters, Template Literals, Multi-line String, Destructuring Assignment, Enhanced Object Literals, Arrow Function, Promises, Block-Scoped (let/const), Classes và Modules.
  • Công cụ tạo mẫu Handlebars.js: Công cụ biên dịch mẫu phía máy khách và máy chủ mở rộng từ Mustache.js, hoạt động theo cơ chế phi logic (logicless templating) để tách biệt giao diện HTML khỏi mã logic JavaScript.
  • Framework Express.js: Bộ khung nhỏ gọn cung cấp bảng định tuyến (routing), tích hợp các middleware thiết yếu như body-parser (xử lý JSON/text), cookie-parser (phân tích cookie) và multer (xử lý dữ liệu biểu mẫu multipart/form-data).

Phương pháp nghiên cứu được áp dụng:

  • Phương pháp phân tích và tổng hợp tài liệu: Đọc và nghiên cứu tài liệu kỹ thuật chuyên ngành, tài liệu đặc tả chính thức của Node.js, Express.js, React-Native và các số liệu thị trường di động từ IDC, Statcounter.
  • Phương pháp thực nghiệm: Lập trình, cài đặt thử nghiệm mã nguồn trên môi trường thực tế thông qua trình soạn thảo Visual Studio Code và giao diện dòng lệnh (Command Line Interface - CLI); kiểm tra luồng dữ liệu bằng Postman.

Nguồn dữ liệu nghiên cứu: Dữ liệu người dùng dạng JSON (users.json), hệ sinh thái gói mã nguồn mở từ kho lưu trữ npm, và các mô-đun tệp tin cục bộ.

Thiết kế và triển khai

Hệ thống được thiết kế theo mô hình phân tách giữa dịch vụ backend cung cấp RESTful API và ứng dụng di động client.

Nền tảng và công cụ phát triển

  • Môi trường phát triển: Visual Studio Code, Sublime Text, Atom, Webstorm.
  • Môi trường thực thi và kiểm thử: Node.js (cài đặt trên Windows/Linux), NPM CLI, Postman, Postman Collection Runner.
  • Thư viện giao diện di động: React-Native.

Phân tích và thiết kế hệ thống

Hệ thống xác định 3 nhóm tác nhân (Actors) chính:

  • Khách (Guest): Người dùng chưa đăng nhập, có quyền xem trang chủ, xem chi tiết bài viết, gửi biểu mẫu liên hệ, thực hiện đăng ký và đăng nhập.
  • Thành viên (Member): Người dùng đã có tài khoản, được phép cập nhật thông tin cá nhân (profile), quản lý danh sách bài viết đã lưu/đăng tải.
  • Quản trị viên (Admin): Quản trị toàn bộ hệ thống bài viết, danh mục và người dùng.

Hệ thống bao gồm các Use-case chính: Đăng ký thành viên, Đăng nhập, Xem trang chủ, Xem chi tiết bài viết, Liên hệ, Xem thông tin profile, Quản lý bài viết của thành viên, và Quản trị hệ thống của Admin.

Thiết kế các mô-đun lõi và xử lý tệp trong Node.js

Node.js cung cấp tập hợp các mô-đun cốt lõi được biên dịch sẵn:

Tên mô-đun Chức năng mô tả
http Cung cấp các lớp, phương thức và sự kiện để tạo máy chủ HTTP.
url Phân tích cú pháp và xử lý chuỗi URL.
querystring Xử lý các chuỗi truy vấn (query string).
path Xử lý các đường dẫn tệp tin và thư mục.
fs Cung cấp các lớp, phương thức và sự kiện để làm việc với vào/ra tệp tin (File I/O).
util Cung cấp các hàm tiện ích hỗ trợ lập trình viên.

Đối với mô-đun fs, hệ thống triển khai xử lý tệp tin bất đồng bộ với các cờ (flags) đọc/ghi tiêu chuẩn:

Cờ (Flag) Miêu tả hoạt động
r Mở tệp để đọc. Xuất hiện Exception nếu tệp không tồn tại.
r+ Mở tệp để đọc và ghi. Xuất hiện Exception nếu tệp không tồn tại.
rs Mở tệp để đọc trong chế độ đồng bộ.
rs+ Mở tệp để đọc và ghi trong chế độ đồng bộ.
w Mở tệp để ghi. Nếu tệp không tồn tại, tự động tạo mới; nếu tồn tại sẽ ghi đè.
wx Giống w nhưng thất bại nếu tệp đã tồn tại.
w+ Mở tệp để đọc và ghi. Tự tạo tệp mới nếu chưa tồn tại.
wx+ Giống w+ nhưng thất bại nếu tệp đã tồn tại.
a Mở tệp để nối thêm (append). Tạo tệp mới nếu chưa tồn tại.
ax Giống a nhưng thất bại nếu tệp đã tồn tại.
a+ Mở tệp để đọc và nối thêm. Tạo tệp mới nếu chưa tồn tại.
ax+ Giống a+ nhưng thất bại nếu tệp đã tồn tại.

Các phương thức kiểm tra kiểu tệp tin từ lớp fs.Stats bao gồm: isFile(), isDirectory(), isBlockDevice(), isCharacterDevice(), isSymbolicLink(), isFIFO(), isSocket(). Các hàm thao tác tệp gồm: fs.open(), fs.stat(), fs.writeFile(), fs.read(), fs.close(), fs.ftruncate(), fs.unlink(), fs.mkdir(), fs.readdir(), fs.rmdir().

Thiết kế RESTful API

Các điểm cuối dịch vụ quản lý người dùng được xây dựng bằng Express.js:

STT URI Phương thức HTTP Dữ liệu Body Kết quả xử lý
1 /listUsers GET Rỗng Trả về danh sách toàn bộ người dùng từ tệp dữ liệu JSON.
2 /addUser POST Chuỗi JSON Thêm bản ghi người dùng mới vào hệ thống.
3 /deleteUser DELETE Chuỗi JSON Xóa người dùng chỉ định khỏi hệ thống.
4 /:id GET Rỗng Hiển thị thông tin chi tiết của người dùng theo mã định danh.

Kiểm thử hệ thống

Nhóm nghiên cứu tiến hành hai nội dung kiểm thử chính:

  1. Kiểm thử mô hình Callback: Chạy so sánh thực nghiệm tập tin đồng bộ blocking-example.js (dùng fs.readFileSync) và tập tin bất đồng bộ non-blocking-example.js (dùng fs.readFile). Kết quả thực tế cho thấy cơ chế non-blocking không làm nghẽn tiến trình, cho phép các câu lệnh kế tiếp thực thi ngay mà không cần chờ tác vụ đọc tệp hoàn tất.
  2. Kiểm thử API bằng Postman: Kiểm thử từng điểm cuối HTTP request và chạy kiểm thử tự động hàng loạt thông qua công cụ Postman Collection Runner, xác nhận các mã trạng thái phản hồi và cấu trúc dữ liệu JSON trả về chính xác.

Nội dung chính theo từng chương

Chương 1: Giới thiệu về NodeJS

Chương này tổng quan về nguồn gốc và bản chất của Node.js là môi trường chạy JavaScript phía máy chủ dựa trên V8 Engine, hoạt động theo mô hình hướng sự kiện và non-blocking I/O. Nội dung phân tích các ưu điểm khi sinh viên và lập trình viên tiếp cận Node.js: sử dụng chung một ngôn ngữ JavaScript cho cả Frontend và Backend, cài đặt thuận tiện không cần phần mềm máy chủ phụ trợ như Apache hay IIS, cùng hệ sinh thái npm phong phú (các gói Express, Connect, Jade, Mongo/mongojs, Redis, Lodash, Forever). Chương 1 cũng hướng dẫn chi tiết quy trình thiết lập biến môi trường PATH trên các hệ điều hành Linux, Mac OS, FreeBSD, Windows; tổng kết các khái niệm phạm vi biến của JavaScript, 10 tính năng cốt lõi của ES6/ES7, lịch sử tiến hóa ECMAScript từ ES1 đến ES6 (năm 2015), và giới thiệu các công cụ biên soạn mã nguồn (Visual Studio Code, Sublime Text, Webstorm, Atom).

Chương 2: Ứng dụng của NodeJS

Chương 2 trình bày chi tiết cách viết mã nguồn tạo máy chủ HTTP cơ bản và thực thi bằng dòng lệnh. Nội dung đi sâu vào cơ chế quản lý gói npm (cài đặt cục bộ trong thư mục node_modules, cài đặt toàn cục -g, sử dụng tệp package.json, tìm kiếm, xuất bản mô-đun qua npm publish), hệ thống mô-đun tự định nghĩa thông qua từ khóa exports và hàm nạp require(). Chương này dành dung lượng lớn phân tích các mô-đun cốt lõi (http, url, querystring, path, fs, util), quy chuẩn thiết kế API bằng các danh từ định danh tài nguyên (GET, POST, PUT, PATCH, DELETE) và hệ thống 10 phương thức thao tác tệp tin của mô-đun fs. Cuối chương, tác giả giải thích khái niệm Callback thông qua tình huống thực tế và thực nghiệm so sánh chi tiết giữa cơ chế Blocking I/O và Non-Blocking I/O.

Chương 3: Template Engine Handlebars

Chương 3 giới thiệu về Handlebars.js – công cụ tạo khuôn mẫu HTML phía máy khách và máy chủ mở rộng từ ngôn ngữ Mustache. Tác giả phân tích lý do nên ứng dụng Handlebars.js: hỗ trợ tốt cho các ứng dụng có lượt truy cập lớn, thường xuyên cập nhật giao diện thông qua REST API, và đặc biệt là đặc tính "logicless" giúp mã nguồn HTML sạch sẽ, tách rời hoàn toàn khỏi mã logic xử lý. Nội dung giải thích cơ chế hoạt động của Handlebars qua hàm biên dịch Handlebars.compile, cú pháp biểu thức đơn {{ content }}, khối lặp danh sách đối tượng {{#each}}...{{/each}}, và cách thức truyền đối tượng dữ liệu (context) vào mẫu giao diện.

Chương 4: Express.js và API

Chương 4 tập trung vào framework Express.js, làm rõ các tính năng cơ bản như thiết lập middleware trung gian, định nghĩa bảng định tuyến linh hoạt theo phương thức HTTP/URL, và hiển thị phản hồi HTML qua chuỗi mẫu. Tác giả hướng dẫn cài đặt Express cùng các thành phần đi kèm (body-parser, cookie-parser, multer), đồng thời xây dựng một kịch bản hoàn chỉnh tạo các điểm cuối RESTful API thao tác trên tệp dữ liệu users.json (bao gồm các API /listUsers, /addUser, /deleteUser, /:id). Toàn bộ các API được kiểm thử hoạt động bằng công cụ Postman.

Chương 5: React-native

Chương 5 giới thiệu tổng quan về framework React-Native và quy trình thiết lập môi trường phát triển để xây dựng ứng dụng di động đa nền tảng bằng ngôn ngữ JavaScript, tạo nền tảng cho việc lập trình ứng dụng Android ở chương tiếp theo.

Chương 6: Xây dựng App Demo

Chương 6 trình bày quá trình xây dựng ứng dụng đọc báo mẫu "NVH News" trên điện thoại Android. Nội dung bao gồm việc mô tả yêu cầu bài toán, xác định nền tảng công cụ phát triển, xây dựng sơ đồ Use-case tổng thể, thiết lập bảng danh sách 3 nhóm Actor và bảng chi tiết các Use-case. Các giao diện chính của ứng dụng được xây dựng bao gồm: Trang chủ (Hình 7.1), Trang đăng ký thành viên (Hình 7.2), Trang đăng nhập (Hình 7.3), Trang liên hệ (Hình 7.4), Trang xem chi tiết bài viết (Hình 7.5), Thông tin profile thành viên (Hình 7.6), Trang quản trị của Admin (Hình 7.7), Trang quản lý bài viết của thành viên (Hình 7.8) và các chức năng tương tác mở rộng (Hình 7.9).

Chương 7: Kiểm thử và vận hành

Chương 7 tổng kết kết quả thực hiện đề tài sau quá trình kiểm thử chức năng và kiểm thử API bằng Postman Collection Runner. Chương này đúc kết những mục tiêu kỹ thuật đã đạt được và chỉ ra các định hướng phát triển tiếp theo cho sản phẩm.

Kết quả và đóng góp

Kết quả chính của báo cáo thực tập tốt nghiệp:

  • Về mặt lý thuyết và công nghệ: Đã hệ thống hóa kiến trúc bất đồng bộ của Node.js, làm rõ sự khác biệt giữa mô hình Blocking và Non-Blocking qua thực nghiệm; phân tích chi tiết cách thức xây dựng API chuẩn RESTful kết hợp Express.js và cấu trúc tạo mẫu của Handlebars.js.
  • Về mặt sản phẩm: Xây dựng thành công ứng dụng đọc báo di động demo mang tên "NVH News" trên nền tảng Android với 9 phân hệ giao diện chức năng hoàn chỉnh từ trang chủ, đăng nhập, đăng ký, xem bài viết, quản lý trang cá nhân đến trang quản trị của Admin.
  • Về mặt kiểm thử: Hoàn thành bộ kiểm thử API tự động với Postman Collection Runner, xác thực tính ổn định của các yêu cầu đọc, thêm, sửa, xóa dữ liệu qua giao thức HTTP.

Giải pháp và đóng góp kỹ thuật:

  • Đúc kết các tiêu chí lựa chọn công nghệ: Khuyến nghị ứng dụng Node.js cho các hệ thống thời gian thực (Real-time), ứng dụng đơn trang (SPA), hệ thống truy vấn NoSQL và các công cụ dòng lệnh (CLI).
  • Thể hiện tính tối ưu của việc hợp nhất ngôn ngữ lập trình JavaScript trên cả hai tầng Client (React-Native / Web) và Server (Node.js/Express), giúp giảm thiểu chi phí chuyển đổi ngữ cảnh cú pháp trong phát triển phần mềm.

Hạn chế và hướng nghiên cứu tiếp

Hạn chế của đề tài:

  • Hệ thống backend hiện tại đang sử dụng cấu trúc lưu trữ dữ liệu trên tệp JSON phẳng (users.json) kết hợp mô-đun fs, chưa kết nối trực tiếp với các hệ quản trị cơ sở dữ liệu quan hệ (SQL) hoặc phi quan hệ (NoSQL như MongoDB) trong môi trường sản xuất thực tế.
  • Báo cáo tập trung chủ yếu vào việc phát triển ứng dụng di động demo và kiểm thử API cục bộ, chưa tiến hành quy trình phát hành chính thức lên cửa hàng Google Play Store trong phạm vi thời gian 2 tháng thực tập.

Hướng phát triển tiếp theo:

  • Tích hợp các hệ quản trị cơ sở dữ liệu chuyên dụng (MongoDB, MySQL) để tăng cường tính toàn vẹn và bảo mật dữ liệu.
  • Hoàn thiện quy trình ký số ứng dụng (app signing) và triển khai phát hành chính thức gói ứng dụng lên Google Play Store.
  • Tiếp tục nâng cấp các tính năng thông minh và tối ưu hóa hiệu năng giao diện trên ứng dụng di động React-Native.

Giá trị tham khảo

Báo cáo thực tập tốt nghiệp là tài liệu tham khảo phù hợp cho:

  • Sinh viên ngành Công nghệ thông tin và Kỹ thuật phần mềm đang thực hiện đồ án môn học, báo cáo thực tập tốt nghiệp liên quan đến lập trình ứng dụng di động hoặc xây dựng dịch vụ máy chủ bằng JavaScript.
  • Lập trình viên mới tiếp cận hệ sinh thái Node.js: Cung cấp tài liệu tra cứu có hệ thống về bảng các mô-đun cốt lõi, bảng các cờ thao tác tệp tin trong mô-đun fs, quy chuẩn thiết kế RESTful API và phương pháp kiểm thử tự động với Postman.

Câu hỏi thường gặp

1. Cơ chế Non-Blocking I/O trong Node.js được nhóm tác giả chứng minh qua ví dụ nào?
Nhóm tác giả thực hiện so sánh hai phương thức đọc tệp của mô-đun fs: fs.readFileSync (chế độ Blocking, tiến trình bị chặn cho đến khi đọc xong tệp) và fs.readFile (chế độ Non-Blocking, chương trình không bị chặn mà tiếp tục thực thi các dòng lệnh kế tiếp, kết quả đọc tệp được trả về thông qua hàm Callback).

2. Các cờ (flags) chính khi thao tác mở tệp tin trong Node.js có ý nghĩa gì?
Các cờ xác định hành vi truy cập tệp: cờ r dùng để đọc (báo lỗi nếu tệp không tồn tại); cờ w dùng để ghi (tự động tạo tệp mới hoặc ghi đè nếu đã tồn tại); cờ a dùng để nối thêm dữ liệu vào cuối tệp; các biến thể có dấu + (như r+, w+, a+) cho phép kết hợp cả hai thao tác đọc và ghi.

3. Template engine Handlebars.js có đặc điểm gì nổi bật trong kiến trúc phần mềm?
Handlebars.js là công cụ tạo mẫu phi logic (logicless), giúp tách biệt hoàn toàn mã giao diện HTML khỏi các tệp JavaScript xử lý nghiệp vụ. Mẫu giao diện được biên dịch thông qua hàm Handlebars.compile và kết hợp với đối tượng dữ liệu truyền vào để sinh ra chuỗi HTML hoàn chỉnh.

4. Dịch vụ RESTful API quản lý người dùng trong đề tài gồm những điểm cuối nào?
Dịch vụ cung cấp 4 điểm cuối cơ bản: GET /listUsers (lấy danh sách người dùng), POST /addUser (thêm người dùng mới bằng chuỗi JSON), DELETE /deleteUser (xóa người dùng hiện tại), và GET /:id (lấy thông tin chi tiết của người dùng theo mã ID).

5. Ứng dụng di động NVH News bao gồm những nhóm người dùng nào?
Hệ thống phân chia 3 nhóm tác nhân (Actor): Khách (Guest - xem tin tức, đăng ký, đăng nhập), Thành viên (Member - quản lý thông tin profile, quản lý bài viết), và Quản trị viên (Admin - quản trị hệ thống bài viết và người dùng).

Kết luận

Báo cáo thực tập tốt nghiệp của sinh viên Nguyễn Văn Hảo và Nguyễn Xuân Trường đã tổng hợp có hệ thống các kiến thức nền tảng về Node.js, Express.js, Handlebars.js và React-Native. Đề tài đã phân tích thành công cơ chế hướng sự kiện, mô hình vào/ra bất đồng bộ, đồng thời thiết kế và kiểm thử hoàn chỉnh hệ thống RESTful API kết hợp ứng dụng đọc báo NVH News trên nền tảng Android. Công trình phản ánh đầy đủ quy trình nghiên cứu, phân tích thiết kế hệ thống và kiểm thử phần mềm, tạo nguồn tư liệu học thuật và thực hành hữu ích cho sinh viên chuyên ngành Công nghệ thông tin.