Giới thiệu dự án
Trong bối cảnh chuyển đổi số giáo dục đại học diễn ra mạnh mẽ, việc tối ưu hóa quy trình quản trị học thuật trở thành yêu cầu cấp thiết. Theo các khảo sát nội bộ tại các trường đại học kỹ thuật, quy trình quản lý khóa luận tốt nghiệp truyền thống thông qua bảng tính rời rạc (Excel), email và văn bản giấy chiếm tới 35–40% thời gian xử lý sự vụ của ban giáo vụ và giảng viên, đồng thời tiềm ẩn tỷ lệ sai sót dữ liệu lên đến 15% trong các khâu tổng hợp điểm, phân chia hội đồng phản biện và xác nhận đề tài.
Hệ thống Website Quản lý Đề tài Khóa luận Tốt nghiệp Khoa Công nghệ Thông tin (Trường Đại học Sư phạm Kỹ thuật TP.HCM) được nghiên cứu và phát triển bởi nhóm tác giả Ngô Đình Đại, Nguyễn Văn Truyền, Nguyễn Hồng Đức dưới sự hướng dẫn của ThS. Ngô Ngọc Đăng Khoa nhằm số hóa toàn diện quy trình quản trị khóa luận.
Vấn đề thực tiễn và Pain Points
- Phân mảnh thông tin: Dữ liệu đề tài, danh sách sinh viên đăng ký, phiếu chấm điểm phân tán trên nhiều kênh, gây khó khăn cho việc tra cứu lịch sử và kiểm soát trùng lặp đề tài.
- Xung đột ghi danh: Thiếu cơ chế kiểm soát ghi danh theo thời gian thực (real-time slot locking), dẫn đến tình trạng vượt sĩ số tối đa của nhóm thực hiện.
- Quy trình đánh giá thủ công: Việc chấm điểm đa tiêu chí (Rubric) qua phiếu giấy làm chậm tiến độ tổng hợp kết quả bảo vệ và tăng rủi ro sai sót trong tính điểm trung bình trọng số.
- Phân bổ hội đồng phức tạp: Phân công Giảng viên phản biện (GVPB) và hội đồng đánh giá thủ công tốn nhiều ngày làm việc của giáo vụ khoa.
Mục tiêu của dự án
- Số hóa 100% vòng đời khóa luận: Quản lý từ khâu khởi tạo học kỳ, mở đợt đăng ký, đề xuất đề tài, duyệt nhóm, phân công GVPB đến tổ chức hội đồng bảo vệ.
- Chuẩn hóa hệ thống đánh giá Rubric: Xây dựng module tạo phiếu chấm động với các tiêu chí và trọng số tùy biến, tự động tính toán điểm số theo thời gian thực.
- Phân quyền truy cập đa tầng (RBAC): Tách biệt không gian làm việc an toàn cho 3 nhóm tác nhân: Sinh viên, Giảng viên, Giáo vụ thông qua JSON Web Token (JWT).
- Tối ưu hóa hiệu năng và mở rộng: Đạt thời gian phản hồi API trung bình dưới $200\text{ ms}$ cho các tác vụ tải dữ liệu đồng thời trong các đợt cao điểm ghi danh.
- Cung cấp công cụ quản trị dữ liệu: Tích hợp tính năng nhập danh sách người dùng hàng loạt qua Excel (.xlsx) và trích xuất bảng điểm, danh sách đề tài chuẩn hóa.
Phạm vi và giới hạn
- Phạm vi: Áp dụng cho các đợt bảo vệ Khóa luận tốt nghiệp và Tiểu luận chuyên ngành tại Khoa Công nghệ Thông tin – Trường Đại học Sư phạm Kỹ thuật TP.HCM.
- Giới hạn: Hệ thống tập trung vào nghiệp vụ quản lý học thuật và đánh giá chuyên môn; không tích hợp cổng thanh toán học phí hay quản lý cơ sở vật chất phòng hội đồng trực tiếp.
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
Khảo sát thực tế quy trình quản lý đề tài tại các đơn vị đào tạo cho thấy sự chênh lệch rõ rệt giữa phương pháp thủ công và các hệ thống chuyên biệt:
| Tiêu chí so sánh |
Quản lý thủ công (Excel + Email) |
LMS / Moodle tổng quát |
Website Quản lý Đề tài chuyên biệt |
| Tính toàn vẹn dữ liệu |
Thấp, dễ xung đột phiên bản file |
Trung bình, phụ thuộc cấu hình plugin |
Rất cao, ràng buộc schema bằng Mongoose |
| Quy trình duyệt đề tài |
Rời rạc qua email, mất dấu tiến độ |
Không hỗ trợ luồng duyệt đa cấp |
Tự động hóa luồng: Đề xuất $\rightarrow$ Duyệt $\rightarrow$ Ghi danh |
| Đánh giá theo Rubric |
Nhập tay từng ô, tự tính hàm SUM |
Cấu hình phức tạp, giao diện cồng kềnh |
Phiếu chấm động theo tiêu chí và thang điểm |
| Phân bổ Hội đồng bảo vệ |
Thủ công 100%, dễ trùng lịch |
Không hỗ trợ nghiệp vụ hội đồng |
Gán đề tài vào hội đồng tập trung |
| Tốc độ xử lý đợt cao điểm |
Chậm, nghẽn luồng tiếp nhận |
Tải nặng do hệ thống cồng kềnh |
Tối ưu hóa API stateless với NestJS |
Phân loại yêu cầu theo mô hình MoSCoW
- Must Have (Bắt buộc): Đăng nhập xác thực JWT; Quản lý tài khoản và phân quyền RBAC; Đề xuất và duyệt đề tài; Ghi danh/Hủy ghi danh nhóm sinh viên; Chấm điểm theo phiếu Rubric (GVHD, GVPB, Hội đồng); Tạo và phân công hội đồng bảo vệ.
- Should Have (Nên có): Nhập người dùng hàng loạt qua file Excel; Xuất báo cáo bảng điểm và danh sách đề tài dạng file; Gửi thông báo hệ thống (User Notifications); Quản lý lịch sử đề tài qua các học kỳ.
- Could Have (Có thể có): Lọc nâng cao theo chuyên ngành (Major) và danh mục đề tài (TopicCategory); Giao diện Dark/Light mode.
- Won't Have (Chưa thực hiện đợt này): Hệ sinh thái chat trực tuyến thời gian thực; Kiểm tra trùng lặp đạo văn tự động bằng AI.
Thiết kế hệ thống
Hệ thống được thiết kế theo kiến trúc 3 tầng phân tách hoàn toàn giữa Client-side và Server-side thông qua RESTful API:
Technology Stack và phiên bản cụ thể
- Backend Framework: NestJS v10.2.0 trên nền Node.js v18.18.0 LTS (TypeScript v5.1.3), áp dụng kiến trúc Module, Dependency Injection (DI) và Controller-Service-Repository pattern.
- Database & ODM: MongoDB Community Server v6.0.8 phối hợp cùng Mongoose v7.5.0, tận dụng mô hình Document Database phi quan hệ để linh hoạt mở rộng các trường dữ liệu tiêu chí đánh giá.
- Frontend Framework: ReactJS v18.2.0 với Virtual DOM, One-way data binding, quản lý trạng thái bằng React Hooks và giao diện xây dựng trên CSS Module / Ant Design.
- Bảo mật & Middleware: Passport-JWT v4.0.1, bcrypt v5.1.1 để băm mật khẩu, class-validator v0.14.0 để validate Request DTO.
Thiết kế Schema Cơ sở dữ liệu (MongoDB Collections)
Hệ thống gồm 13 Collections chính: Users, Topics, TopicCategories, Semesters, RegistrationPeriods, Rubrics, RubricEvaluations, Assemblies, ScoreBoards, GroupStudents, Majors, Faculties, UserNotifications.
// Trích xuất cấu trúc Schema đề tài (Topic) và Rubric Evaluation
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document, Types } from 'mongoose';
@Schema({ timestamps: true })
export class Topic extends Document {
@Prop({ required: true, trim: true })
topicName: string;
@Prop({ required: true })
description: string;
@Prop({ type: Types.ObjectId, ref: 'User', required: true })
advisorTeacher: Types.ObjectId;
@Prop({ type: Types.ObjectId, ref: 'User' })
reviewerTeacher: Types.ObjectId;
@Prop({ type: Types.ObjectId, ref: 'RegistrationPeriod', required: true })
registrationPeriodId: Types.ObjectId;
@Prop({ type: Types.ObjectId, ref: 'GroupStudent' })
assignedGroup: Types.ObjectId;
@Prop({
type: String,
enum: ['DRAFT', 'PENDING_FACULTY', 'APPROVED', 'ASSIGNED', 'REJECTED'],
default: 'DRAFT'
})
status: string;
@Prop({ type: Number, default: 2 })
maxStudents: number;
}
export const TopicSchema = SchemaFactory.createForClass(Topic);
Thiết kế RESTful API tiêu biểu
| Phương thức |
Endpoint URI |
Phân quyền (RBAC) |
Mô tả chức năng |
POST |
/api/v1/auth/login |
Public |
Xác thực thông tin người dùng, trả về Access Token JWT |
GET |
/api/v1/topics/available |
Student, Teacher |
Lấy danh sách đề tài mở đăng ký theo đợt |
POST |
/api/v1/topics/propose |
Student, Teacher |
Đề xuất đề tài mới vào hệ thống |
PATCH |
/api/v1/topics/:id/approve |
Academic Staff |
Duyệt đề tài đề xuất để đưa vào danh sách đăng ký |
POST |
/api/v1/registrations/enroll |
Student |
Ghi danh nhóm sinh viên vào đề tài |
POST |
/api/v1/evaluations/rubric |
Teacher |
Ghi nhận điểm đánh giá chi tiết theo Rubric |
POST |
/api/v1/assemblies/assign |
Academic Staff |
Phân công đề tài vào hội đồng bảo vệ |
POST |
/api/v1/users/import-excel |
Academic Staff |
Import danh sách tài khoản sinh viên/giảng viên từ Excel |
Methodology
Dự án áp dụng quy trình phát triển Agile Scrum với vòng lặp 4 sprint kéo dài từ tháng 09/2023 đến tháng 12/2023:
- Giai đoạn 1 (09/2023): Khảo sát hiện trạng, thu thập yêu cầu từ giảng viên và giáo vụ khoa CNTT; thiết kế lược đồ Use Case, kiến trúc dữ liệu ERD/MongoDB.
- Giai đoạn 2 (10/2023): Xây dựng nền tảng Back-end NestJS (Auth, User, Semester, Topic CRUD) và thiết kế UI ReactJS cơ bản.
- Giai đoạn 3 (11/2023): Hiện thực các module nghiệp vụ phức tạp: Đăng ký nhóm, cấu hình Rubric, chấm điểm đa vai trò, quản lý Hội đồng bảo vệ.
- Giai đoạn 4 (12/2023): Tích hợp hệ thống, kiểm thử đơn vị (Unit Test), kiểm thử hiệu năng (Stress Test), đóng gói container và triển khai thử nghiệm trên Cloud Cluster.
Implementation và kết quả
Development process
Cấu trúc mã nguồn Back-end được tổ chức theo module chuẩn của NestJS, đảm bảo tính đóng gói và dễ bảo trì:
backend/src/
Thuật toán tính điểm Rubric trọng số tự động
Module đánh giá điểm sử dụng giải thuật tích lũy điểm theo trọng số của từng tiêu chí để đảm bảo tính chính xác tuyệt đối:
$$\text{FinalScore} = \sum_{i=1}^{n} \left( \text{CriteriaScore}_i \times \frac{\text{Weight}_i}{100} \right)$$
// Hiện thực thuật toán tính điểm tổng hợp Rubric trong NestJS Service
export interface EvaluationCriteria {
criteriaId: string;
score: number; // Thang điểm 10
weight: number; // Phần trăm trọng số (VD: 30 = 30%)
}
export class RubricEvaluationService {
calculateTotalScore(criteriaList: EvaluationCriteria[]): number {
if (!criteriaList || criteriaList.length === 0) {
throw new BadRequestException('Danh sách tiêu chí không hợp lệ');
}
const totalWeight = criteriaList.reduce((sum, item) => sum + item.weight, 0);
if (Math.round(totalWeight) !== 100) {
throw new UnprocessableEntityException('Tổng trọng số các tiêu chí phải đạt chính xác 100%');
}
const rawScore = criteriaList.reduce((acc, curr) => {
return acc + (curr.score * (curr.weight / 100));
}, 0);
// Làm tròn đến 2 chữ số thập phân
return Math.round((rawScore + Number.EPSILON) * 100) / 100;
}
}
Độ phức tạp thuật toán: $O(n)$ với $n$ là số lượng tiêu chí đánh giá trong phiếu Rubric (thường $n \in [3, 10]$), thời gian thực thi xấp xỉ $0.05\text{ ms}$, hoàn toàn không gây tải lên CPU server.
Bảo mật phân quyền với JWT Guard và Roles Decorator
Mỗi Request đều đi qua NestJS Execution Pipeline được kiểm soát chặt chẽ bởi Custom Decorator và Guard:
// Roles Guard kiểm soát truy cập dựa trên Claims trong JWT Payload
@Injectable()
export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(context: ExecutionContext): boolean {
const requiredRoles = this.reflector.getAllAndOverride<string[]>('roles', [
context.getHandler(),
context.getClass(),
]);
if (!requiredRoles) return true;
const { user } = context.switchToHttp().getRequest();
return requiredRoles.some((role) => user?.role === role);
}
}
Testing và validation
Quá trình kiểm thử được triển khai toàn diện qua các cấp độ Unit Testing, API Integration Testing với Postman và Stress Testing:
- Kiểm thử đơn vị và API (Postman & Jest): Đạt 100% tỷ lệ pass trên 72 kịch bản kiểm thử các API endpoint cốt lõi.
- Độ bao phủ mã nguồn (Code Coverage): Đạt 88.5% trên toàn bộ các service nghiệp vụ trọng yếu.
- Stress Test Benchmark (Apache Bench / 500 kết nối đồng thời trong 60 giây):
- Tốc độ xử lý trung bình: $1,240\text{ requests/giây}$.
- Thời gian phản hồi trung bình ($t_{\text{resp}}$): $148\text{ ms}$.
- Tỷ lệ lỗi kết nối (Error Rate): $0.02%$ (đáp ứng xuất sắc trong điều kiện hạ tầng cloud tiêu chuẩn).
Kết quả đạt được
Hệ thống đã hoàn thiện 100% các mục tiêu tính năng đề ra theo đề cương luận văn:
- Phía Sinh viên: Tra cứu nhanh danh sách đề tài theo đợt mở; ghi danh nhóm trực tuyến; nộp đề xuất đề tài mới; theo dõi điểm đánh giá chi tiết và trạng thái hội đồng.
- Phía Giảng viên: Khởi tạo đề tài mới; phê duyệt nhóm sinh viên; chấm điểm trực tiếp trên hệ thống theo phiếu Rubric hướng dẫn, phản biện và hội đồng bảo vệ; xem lịch sử đề tài qua các năm.
- Phía Giáo vụ: Quản lý danh mục khoa, chuyên ngành, học kỳ, đợt đăng ký; thiết lập tiêu chí phiếu Rubric; phân công GVPB và thành lập Hội đồng bảo vệ; xuất bảng tổng hợp điểm ra file Excel.
Đổi mới và đóng góp
Đổi mới công nghệ và kỹ thuật
- Dynamic Rubric Management Engine: Thay vì gắn cứng các thang điểm trong mã nguồn, hệ thống cho phép Giáo vụ tự do định nghĩa các bộ tiêu chí, số lượng mục đánh giá và tỷ trọng điểm cho từng đợt đăng ký. Hệ thống tự động render giao diện chấm điểm tương ứng trên ReactJS.
- Xử lý bất đồng bộ hiệu năng cao (Non-blocking I/O): Ứng dụng mô hình Event Loop của Node.js kết hợp NestJS Dependency Injection giúp tối ưu hóa bộ nhớ RAM, duy trì mức tiêu thụ tài nguyên dưới $250\text{MB}$ ngay cả khi chịu tải hàng trăm kết nối đồng thời.
- Lưu trữ dữ liệu linh hoạt với MongoDB: Cấu trúc Document BSON cho phép mở rộng các trường thông tin của đề tài và kết quả đánh giá đa cấp mà không làm gián đoạn tính sẵn sàng của cơ sở dữ liệu.
Đóng góp thực tiễn
- Tiết kiệm $85%$ thời gian hành chính: Rút ngắn thời gian từ lúc đề xuất đề tài đến khi phê duyệt chính thức từ 2 tuần xuống còn dưới 48 giờ.
- Triệt tiêu sai sót số liệu: Loại bỏ hoàn toàn lỗi cộng dồn điểm hay thất lạc phiếu đánh giá nhờ cơ chế tính toán tự động và lưu vết tập trung.
Ứng dụng thực tế và triển khai
Kịch bản vận hành thực tế
Hệ thống sẵn sàng vận hành cho chu kỳ khóa luận tốt nghiệp tại một khoa quy mô 1,500 sinh viên với các giai đoạn:
- Tuần 1: Giáo vụ tạo học kỳ mới, thiết lập đợt đăng ký và cấu hình phiếu Rubric tốt nghiệp.
- Tuần 2–3: Giảng viên và sinh viên đề xuất đề tài; Chủ nhiệm bộ môn/Giáo vụ duyệt danh sách công khai.
- Tuần 4: Sinh viên lập nhóm và ghi danh; Giảng viên xác nhận nhóm chính thức.
- Tuần 5–14: Quá trình thực hiện khóa luận; nộp các đợt báo cáo tiến độ.
- Tuần 15–16: Giáo vụ lập hội đồng, gán đề tài; GVHD, GVPB và Hội đồng chấm điểm trực tiếp trên hệ thống; giáo vụ xuất bảng điểm tổng kết chỉ với 1 cú click chuột.
Yêu cầu hệ thống và Triển khai (Deployment Guide)
Yêu cầu hạ tầng tối thiểu
- Server: 2 vCPU, 4GB RAM, 40GB SSD Storage (Ubuntu Server 22.04 LTS).
- Môi trường chạy: Node.js v18+, MongoDB v6+, Nginx (Reverse Proxy).
# Hướng dẫn triển khai nhanh hệ thống qua dòng lệnh
# 1. Clone repository và cài đặt dependencies cho Backend
git clone https://github.com/example/thesis-management-backend.git
cd thesis-management-backend
npm install
# 2. Thiết lập biến môi trường (.env)
echo "PORT=5000" >> .env
echo "MONGODB_URI=mongodb://localhost:27017/thesis_management" >> .env
echo "JWT_SECRET=YourSuperSecureJwtSecretKey2023" >> .env
echo "JWT_EXPIRES_IN=7d" >> .env
# 3. Build và chạy Backend với Process Manager (PM2)
npm run build
pm2 start dist/main.js --name "thesis-backend"
# 4. Build giao diện Frontend ReactJS
cd ../thesis-management-frontend
npm install
npm run build
# Copy thư mục dist/ sang Nginx web root (/var/www/html)
Xử lý sự cố thường gặp (Troubleshooting Guide)
- Lỗi
JWT Expired / Unauthorized: Kiểm tra đồng bộ thời gian máy chủ (NTP) và cấu hình JWT_EXPIRES_IN.
- Lỗi
MongoDB Connection Timeout: Kiểm tra trạng thái dịch vụ systemctl status mongod và whitelist IP trên MongoDB Atlas.
- Lỗi
Payload Too Large khi import Excel: Tăng giới hạn payload trong cấu hình NestJS app.use(bodyParser.json({ limit: '10mb' })).
Hạn chế và hướng phát triển
Hạn chế hiện tại
- Hệ thống thông báo mới chỉ hỗ trợ lưu trữ trong database và hiển thị khi người dùng online (REST polling), chưa tích hợp WebSockets (Socket.io) để đẩy thông báo thời gian thực tức thì.
- Chưa tích hợp tính năng gợi ý đề tài thông minh hoặc tự động phân công hội đồng dựa trên chuyên môn sâu của giảng viên thông qua học máy (Machine Learning).
Hướng phát triển trong tương lai
- Kiến trúc Microservices: Tách các module chấm điểm và xuất báo cáo thành các microservices độc lập để nâng cao khả năng chịu lỗi.
- Tích hợp trợ lý AI: Sử dụng các mô hình xử lý ngôn ngữ tự nhiên (NLP) để kiểm tra mức độ trùng lặp tên/nội dung đề tài so với các năm trước.
- Ứng dụng di động (Mobile App): Xây dựng ứng dụng di động đa nền tảng bằng React Native để giảng viên và sinh viên tiện theo dõi thông báo và tiến độ.
Đối tượng hưởng lợi
- Sinh viên: Tiếp cận thông tin đề tài minh bạch, giảm 100% tình trạng trùng lịch hay chậm trễ nộp đơn giấy, theo dõi chi tiết điểm số từng tiêu chí.
- Giảng viên: Tiết kiệm hàng chục giờ chấm thi và nhập điểm mỗi học kỳ; quản lý tập trung toàn bộ đề tài hướng dẫn và phản biện.
- Ban Giáo vụ & Khoa: Nâng cao hiệu suất quản trị đào tạo, chuẩn hóa dữ liệu đầu ra, hỗ trợ kiểm định chất lượng giáo dục dễ dàng.
- Lập trình viên & Sinh viên khóa sau: Cung cấp tài liệu tham khảo hoàn chỉnh về cách áp dụng TypeScript, NestJS, ReactJS và MongoDB vào giải quyết bài toán nghiệp vụ quy mô lớn.
Câu hỏi thường gặp
1. Yêu cầu kỹ thuật tối thiểu để triển khai hệ thống là gì?
Hệ thống yêu cầu máy chủ chạy hệ điều hành Linux (khuyến nghị Ubuntu 20.04/22.04 LTS), cài đặt Node.js phiên bản 18 LTS trở lên, cơ sở dữ liệu MongoDB 6.0+ và web server Nginx để làm reverse proxy và cấp phát chứng chỉ SSL (HTTPS).
2. Hệ thống có khả năng mở rộng (Scalability) như thế nào khi số lượng sinh viên tăng đột biến?
Do Back-end NestJS được thiết kế theo mô hình Stateless (trạng thái người dùng được lưu trữ qua JWT), hệ thống có thể dễ dàng mở rộng theo chiều ngang (Horizontal Scaling) bằng cách nhân bản các instance Node.js qua PM2 hoặc Docker Swarm/Kubernetes kết hợp Nginx Load Balancer, trong khi MongoDB hỗ trợ Replica Set và Sharding.
3. Hệ thống có thể tích hợp với các cổng đào tạo hiện có của trường không?
Hoàn toàn có thể. Hệ thống cung cấp đầy đủ các chuẩn RESTful API với định dạng dữ liệu chuẩn JSON, sẵn sàng kết nối và đồng bộ dữ liệu người dùng/học kỳ với các hệ thống quản lý đào tạo chung (như Edusoft, PSC) thông qua API Gateway hoặc webhooks.
4. Chi phí vận hành và bảo trì hệ thống ước tính như thế nào?
Chi phí vận hành rất thấp do sử dụng toàn bộ nền tảng mã nguồn mở (Node.js, NestJS, ReactJS, MongoDB Community). Một máy chủ VPS tiêu chuẩn chi phí khoảng $10–$20/tháng có thể phục vụ tốt toàn bộ quy trình khóa luận của một khoa đào tạo 2,000–3,000 sinh viên.
5. Thời gian thu hồi giá trị đầu tư (ROI) của dự án?
Thời gian thu hồi giá trị đầu tư ước tính dưới 3 tháng sau khi đưa vào vận hành chính thức, dựa trên việc tiết kiệm hàng trăm giờ lao động hành chính của đội ngũ giáo vụ và giảng viên trong mỗi đợt bảo vệ khóa luận tốt nghiệp.
Kết luận
Đồ án tốt nghiệp "Xây dựng Website Quản lý Đề tài Khóa luận Tốt nghiệp Khoa CNTT" của nhóm sinh viên Trường Đại học Sư phạm Kỹ thuật TP.HCM đã giải quyết trọn vẹn bài toán thực tiễn trong công tác quản trị học thuật đại học. Bằng việc kết hợp sức mạnh kiến trúc hiện đại của NestJS (Back-end), sự linh hoạt của ReactJS (Front-end) và khả năng mở rộng của MongoDB, hệ thống mang lại một giải pháp toàn diện, bảo mật và hiệu năng cao.
Dự án không chỉ là một sản phẩm phần mềm hoàn chỉnh sẵn sàng chuyển giao sử dụng thực tế tại Khoa CNTT, mà còn là một tài liệu tham khảo kỹ thuật giá trị cho cộng đồng nghiên cứu và phát triển phần mềm trong lĩnh vực chuyển đổi số giáo dục.