Skip to content

Đạo văn mã nguồn trong đồ án CNTT: JPlag, MOSS phát hiện thế nào?

Đạo văn mã nguồn (code plagiarism) là hành vi sao chép logic chương trình của người khác vào đồ án mà không ghi công, và hai công cụ phát hiện phổ biến nhất — JPlag và MOSS — không so khớp văn bản như phần mềm chống đạo văn thông thường, mà phân tích cấu trúc cú pháp của code sau khi bóc tách tên biến, comment và định dạng. Vì vậy đổi tên biến hay viết lại thụt lề gần như vô nghĩa để qua mặt, nhưng dùng chung một khung dự án (boilerplate) hợp pháp đôi khi vẫn bị hai công cụ này gắn cờ nếu không khai báo đúng cách.

Cập nhật: tháng 9/2026 — Biên soạn bởi đội ngũ Kiểm Tra Tài Liệu, Metis JSC

Đạo văn mã nguồn khác đạo văn văn bản ở đâu?

Đạo văn mã nguồn khác đạo văn văn bản ở đơn vị đối chiếu: văn bản so khớp theo câu hoặc cụm từ, còn code so khớp theo cấu trúc lệnh và luồng điều khiển (control flow), bất kể tên biến hay comment có giống nhau hay không.

Đạo văn mã nguồn là việc tái sử dụng logic, cấu trúc thuật toán hoặc toàn bộ khối chương trình của người khác trong bài nộp học thuật mà không ghi công, được phát hiện qua công cụ phân tích cú pháp chuyên biệt thay vì công cụ đối chiếu văn bản.

Bài cơ chế hoạt động của hệ thống kiểm tra đạo văn, trùng lặp đã giải thích các công cụ như Kiểm Tra Tài Liệu tách văn bản thành câu rồi đối chiếu full-text search với kho dữ liệu Internet. Cách này vô hiệu với code, vì một đoạn chương trình đổi tên biến x thành soLuong hoặc thêm 20 dòng comment vẫn là cùng một thuật toán về bản chất — so khớp theo câu chữ sẽ bỏ sót gần như toàn bộ trường hợp sao chép có sửa đổi bề mặt.

Ví dụ minh họa: một sinh viên đồ án tốt nghiệp lấy nguyên thuật toán sắp xếp từ bài giải mẫu trên mạng, đổi toàn bộ tên biến sang tiếng Việt có dấu (tongTien, danhSachSanPham) và viết lại comment bằng lời riêng. Kiểm tra trùng lặp văn bản báo cáo thuyết minh có thể qua, nhưng công cụ đối chiếu mã nguồn vẫn phát hiện vì cấu trúc lệnh, thứ tự vòng lặp và luồng điều kiện giữ nguyên.

JPlag phát hiện đạo văn mã nguồn bằng cơ chế nào?

JPlag phát hiện đạo văn bằng cách chuyển code thành chuỗi token (đơn vị cú pháp như "khai báo biến", "vòng lặp for", "gọi hàm") rồi áp dụng thuật toán Greedy String Tiling để tìm đoạn khớp dài nhất giữa hai chuỗi token.

Greedy String Tiling, do Michael Wise công bố năm 1993, là thuật toán so khớp chuỗi ưu tiên tìm các đoạn khớp liên tục dài nhất trước, sau đó mới xử lý các đoạn ngắn hơn còn lại — cho phép phát hiện cả trường hợp đoạn code bị đảo vị trí (transposition) mà vẫn giữ nguyên logic bên trong.

Quy trình 3 bước của JPlag: (1) parser đọc mã nguồn theo ngôn ngữ lập trình cụ thể (Java, C, C++, Python, Kotlin, Scheme...) và sinh ra chuỗi token, loại bỏ hoàn toàn tên biến, tên hàm tự đặt và comment; (2) Greedy String Tiling so khớp từng cặp bài nộp, tìm các "tile" — đoạn token liên tục trùng khớp; (3) tính điểm tương đồng bằng hệ số Dice dựa trên tỷ lệ token được phủ bởi các tile tìm được.

JPlag khởi đầu là dự án sinh viên của Guido Malpohl tại Đại học Karlsruhe (nay là Karlsruhe Institute of Technology — KIT), Đức, năm 1996, dưới sự hướng dẫn của GS. Walter Tichy. Đến năm 2005, Emeric Kwemou và Moritz Kroll mở rộng công cụ thành dịch vụ web, giúp giảng viên tải nhiều bài nộp lên cùng lúc thay vì chạy dòng lệnh riêng lẻ. Hiện JPlag là mã nguồn mở, công khai trên GitHub, miễn phí sử dụng cho mục đích giáo dục.

MOSS phát hiện đạo văn mã nguồn bằng cơ chế nào?

MOSS (Measure of Software Similarity) phát hiện đạo văn bằng cách chia code thành các đoạn k-gram (chuỗi k token liên tiếp), băm (hash) từng đoạn, rồi chỉ giữ lại một tập con "vân tay" (fingerprint) đại diện theo thuật toán winnowing thay vì lưu toàn bộ hash.

Thuật toán winnowing, công bố bởi Saul Schleimer, Daniel Wilkerson và Alex Aiken tại hội nghị SIGMOD 2003 (ACM), là thuật toán fingerprinting cục bộ (local algorithm) được chứng minh có hiệu suất phát hiện sao chép nằm trong phạm vi 33% so với giới hạn lý thuyết tối ưu, đồng thời giảm đáng kể khối lượng dữ liệu cần lưu trữ so với băm toàn bộ văn bản.

MOSS do Alex Aiken phát triển tại Đại học Stanford từ năm 1994, ban đầu phục vụ chấm bài lập trình trong các lớp khoa học máy tính của chính ông. Khác JPlag, MOSS không có bản cài đặt độc lập công khai — giảng viên gửi thư mục bài nộp qua một script Perl kết nối đến máy chủ Stanford, nhận lại báo cáo dạng trang HTML liệt kê các cặp bài có độ tương đồng cao nhất, sắp xếp giảm dần. Vì vận hành tập trung tại Stanford, MOSS yêu cầu đăng ký email học thuật (.edu hoặc tương đương) để được cấp quyền sử dụng.

So sánh JPlag và MOSS

Hai công cụ giải quyết cùng bài toán nhưng khác nhau ở cách triển khai, nơi lưu trữ dữ liệu và phạm vi ngôn ngữ hỗ trợ — yếu tố quyết định công cụ nào phù hợp với một khoa CNTT cụ thể.

Tiêu chíJPlagMOSS
Thuật toán lõiGreedy String Tiling (Wise, 1993)Winnowing k-gram fingerprinting (Schleimer, Wilkerson, Aiken, 2003)
Nơi phát triểnĐại học Karlsruhe/KIT, Đức (1996)Đại học Stanford, Mỹ (1994)
Cách triển khaiMã nguồn mở, chạy cục bộ hoặc tự host web serviceGửi bài qua script, xử lý tập trung trên máy chủ Stanford
Dữ liệu bài nộpKhông rời khỏi máy của người chạy (nếu chạy cục bộ)Tải lên máy chủ bên thứ ba (Stanford)
Chi phíMiễn phí, không giới hạnMiễn phí cho mục đích giáo dục, cần đăng ký email học thuật
Ngôn ngữ hỗ trợJava, C/C++, Python, C#, Kotlin, Scheme và nhiều ngôn ngữ khácC, C++, Java, Python, JavaScript và một số ngôn ngữ khác

Khác biệt về nơi xử lý dữ liệu đáng lưu ý với đồ án có yếu tố bảo mật (ví dụ hợp tác với doanh nghiệp, dữ liệu độc quyền): JPlag chạy cục bộ giữ toàn bộ mã nguồn trong nội bộ trường, còn MOSS bắt buộc gửi code lên máy chủ bên ngoài Việt Nam.

Đổi tên biến, thêm comment có qua mặt được JPlag và MOSS không?

Không. Cả hai công cụ đều loại bỏ tên biến, tên hàm tự đặt và comment ngay ở bước tiền xử lý (tokenization), nên các thủ thuật ngụy trang bề mặt này không ảnh hưởng đến điểm tương đồng.

Ba thủ thuật sinh viên thường thử và mức độ hiệu quả thực tế:

  • Đổi tên biến, tên hàm: không hiệu quả — cả hai công cụ token hóa code thành các loại cú pháp trừu tượng (ví dụ "định danh biến"), không quan tâm tên cụ thể là gì.
  • Thêm/xóa comment, đổi định dạng thụt lề: không hiệu quả — comment và whitespace bị loại bỏ hoàn toàn trước khi so khớp, vì đây là thông tin không ảnh hưởng đến hành vi chương trình.
  • Đảo thứ tự các hàm không phụ thuộc nhau, chèn thêm biến thừa không dùng đến: hiệu quả một phần — Greedy String Tiling vẫn phát hiện được các đoạn khớp bị đảo vị trí (đây chính là lý do thuật toán này ra đời), nhưng chèn quá nhiều mã thừa (dead code) có thể làm giảm điểm tương đồng phần trăm dù logic gốc vẫn bị phát hiện ở mức đoạn.

Nghiên cứu gần đây về khả năng dùng AI tạo sinh để obfuscate (ngụy trang) code nhằm né tránh JPlag cho thấy các công cụ AI như ChatGPT có thể viết lại code theo phong cách hoàn toàn khác trong khi giữ nguyên hành vi, đặt ra thách thức mới cho cả JPlag lẫn MOSS — nhưng đây là hướng tấn công phức tạp hơn nhiều so với đổi tên biến thủ công, đòi hỏi hiểu rõ toàn bộ logic để paraphrase đúng nghĩa, tương tự cách paraphrase văn bản không đúng chuẩn vẫn có thể bị nhận diện nếu cấu trúc lập luận giữ nguyên.

Vì sao dùng chung boilerplate có thể bị flag oan?

Dùng chung một khung dự án (boilerplate), thư viện chuẩn hoặc code mẫu do giảng viên cấp sẵn (skeleton code) có thể khiến JPlag hoặc MOSS báo điểm tương đồng cao, vì thuật toán so khớp không tự phân biệt "code được phép dùng chung" với "code sao chép trái phép".

Tình huống phổ biến nhất: một lớp học phần được giảng viên phát sẵn file khung (class rỗng, hàm main() mẫu, cấu trúc thư mục chuẩn) để tất cả sinh viên viết tiếp lên đó. Vì phần khung giống hệt nhau ở mọi bài nộp, điểm tương đồng giữa các cặp bài trong lớp có thể lên rất cao dù phần logic tự viết hoàn toàn khác nhau.

Cách xử lý đúng: cả JPlag và MOSS đều hỗ trợ khai báo trước một "base code" (mã nguồn nền) — thư mục chứa phần khung dùng chung — để công cụ loại trừ phần này ra khỏi phép so khớp, chỉ tính điểm tương đồng trên phần code sinh viên tự viết thêm. Giảng viên phụ trách chấm cần chủ động khai báo bước này; nếu không, kết quả tương đồng cao giữa cả lớp là hiện tượng kỹ thuật bình thường, không phải bằng chứng đạo văn hàng loạt.

Tương tự, việc trích dẫn mã nguồn, GitHub repository trong đồ án CNTT đúng chuẩn khi fork một boilerplate công khai không tự động miễn trừ khỏi việc bị JPlag/MOSS gắn cờ nếu một sinh viên khác trong cùng khoa vô tình dùng đúng repository đó — trích dẫn giải quyết vấn đề học thuật, không giải quyết vấn đề kỹ thuật của thuật toán so khớp.

Sai lầm thường gặp của sinh viên CNTT Việt Nam

Ba tình huống dưới đây lặp lại nhiều nhất khi rà soát đồ án, bài tập lớn ngành CNTT:

  • Tưởng đổi tên biến sang tiếng Việt có dấu là an toàn. Một sinh viên chép nguyên thuật toán Dijkstra từ mã nguồn tham khảo, đổi distance thành khoangCach, visited thành daTham, nộp bài tự tin vì "không giống về mặt chữ". JPlag vẫn phát hiện độ tương đồng trên 90% vì tokenization loại bỏ hoàn toàn tên định danh trước khi so khớp.
  • Không biết rằng bài tập có khung code giáo viên cấp sẵn vẫn cần khai báo base code. Một lớp 40 sinh viên cùng làm bài tập lớn trên một file khung do giảng viên phát, tất cả bị hệ thống báo tương đồng cao đồng loạt vì giảng viên quên loại trừ phần khung dùng chung — không phải lỗi của sinh viên, nhưng gây hoang mang không cần thiết nếu không hiểu cơ chế.
  • Nghĩ rằng kiểm tra trùng lặp văn bản báo cáo (như Kiểm Tra Tài Liệu) đã bao phủ luôn phần code. Sinh viên viết lại toàn bộ phần thuyết minh bằng lời riêng, đạt tỷ lệ trùng lặp văn bản thấp, nhưng phần mã nguồn nộp kèm — nếu khoa dùng thêm JPlag hoặc MOSS để đối chiếu độc lập — vẫn có thể bị phát hiện sao chép logic dù báo cáo hoàn toàn "sạch" về mặt câu chữ.

Quy trình 4 bước tự kiểm tra trước khi nộp đồ án có code

Áp dụng cho mọi đồ án, bài tập lớn hoặc khóa luận ngành CNTT có nộp kèm mã nguồn:

  1. Liệt kê mọi đoạn code không tự viết từ đầu — kể cả đoạn tham khảo rồi viết lại theo logic tương tự, không chỉ đoạn copy-paste nguyên văn.
  2. Trích dẫn đầy đủ theo chuẩn học thuật cho các nguồn đã liệt kê, tham khảo quy tắc trong bài trích dẫn mã nguồn, GitHub repository.
  3. Xác nhận với giảng viên xem khoa có dùng JPlag/MOSS đối chiếu mã nguồn không, và nếu bài tập có khung code chung, đề nghị giảng viên khai báo base code trước khi chấm để tránh tương đồng giả.
  4. Giữ lại lịch sử phát triển làm bằng chứng — commit Git theo từng bước nhỏ, không commit gộp một lần trước hạn nộp, tương tự khuyến nghị trong bài đạo văn bài tập nhóm — đây là bằng chứng mạnh nhất nếu cần giải trình.

Checklist áp dụng ngay trước khi nộp:

  • [ ] Đã liệt kê toàn bộ đoạn code tham khảo, kể cả đoạn đã viết lại theo logic tương tự
  • [ ] Đã trích dẫn nguồn đầy đủ trong báo cáo và comment trực tiếp trong file code
  • [ ] Đã hỏi giảng viên xem khoa có đối chiếu mã nguồn bằng JPlag/MOSS không
  • [ ] Nếu bài tập dùng khung code chung, đã xác nhận giảng viên loại trừ phần khung khỏi phép so khớp
  • [ ] Có lịch sử commit Git chi tiết, không commit gộp một lần duy nhất trước hạn nộp

Nếu đã nộp và bị nghi ngờ, quy trình giải trình với hội đồng áp dụng tương tự trường hợp đạo văn văn bản — xem chi tiết từng bước trong bài bị nghi đạo văn: quy trình giải trình với hội đồng, trong đó bằng chứng lịch sử commit đóng vai trò tương đương bằng chứng bản thảo viết tay với đạo văn văn bản truyền thống.

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

JPlag và MOSS có phát hiện được nếu dịch code sang ngôn ngữ lập trình khác không?

Không, ở cấu hình mặc định. Cả hai công cụ token hóa theo cú pháp của một ngôn ngữ lập trình cụ thể được khai báo trước khi chạy, nên bản Java và bản Python của cùng một thuật toán được xử lý bằng hai lượt so khớp riêng biệt, không tự động đối chiếu chéo ngôn ngữ.

Kiểm Tra Tài Liệu có phát hiện được đạo văn mã nguồn không?

Không trực tiếp. Kiểm Tra Tài Liệu đối chiếu văn bản trong báo cáo, thuyết minh theo đơn vị câu văn — không phân tích cấu trúc cú pháp mã nguồn chương trình. Phát hiện đạo văn mã nguồn cần công cụ chuyên biệt như JPlag hoặc MOSS, một số khoa CNTT có thể yêu cầu nộp kèm mã nguồn để đối chiếu riêng ngoài báo cáo.

Nộp đồ án chỉ kèm file báo cáo PDF, không nộp code, có an toàn hơn không?

Không hẳn. Nhiều khoa CNTT tại Việt Nam yêu cầu nộp kèm toàn bộ mã nguồn (không chỉ báo cáo) chính vì lý do đối chiếu độc lập, và hội đồng phản biện có quyền yêu cầu demo trực tiếp — không nộp code không có nghĩa hội đồng không kiểm tra được, chỉ khiến việc phát hiện chuyển sang hình thức hỏi đáp trực tiếp khi bảo vệ.

Base code là gì và vì sao cần khai báo?

Base code là thư mục chứa phần khung dùng chung (skeleton code) mà giảng viên phát cho cả lớp trước khi làm bài tập. Khai báo base code cho JPlag hoặc MOSS giúp công cụ loại trừ phần khung này khỏi phép so khớp, chỉ tính điểm tương đồng trên phần sinh viên tự viết thêm — nếu không khai báo, cả lớp có thể bị báo tương đồng cao giả tạo.

Dùng ChatGPT hoặc GitHub Copilot viết code có bị JPlag/MOSS phát hiện là đạo văn không?

Không theo nghĩa đối chiếu với một tác giả cụ thể, vì AI tạo sinh không phải một bài nộp có sẵn trong tập dữ liệu so khớp. Tuy nhiên nếu nhiều sinh viên cùng dùng một prompt tương tự và AI trả về logic gần giống nhau, các bài đó vẫn có thể bị JPlag/MOSS báo tương đồng cao lẫn nhau — vấn đề khi đó chuyển thành minh bạch trong việc ghi chú sử dụng AI, tương tự nguyên tắc nêu trong bài dùng ChatGPT viết luận văn đúng cách.

Có nên tự chạy JPlag để kiểm tra trước khi nộp đồ án không?

Nên, nếu đồ án có nhiều đoạn code tham khảo từ nguồn bên ngoài. JPlag mã nguồn mở, miễn phí, chạy được cục bộ trên máy cá nhân mà không cần gửi code lên máy chủ bên thứ ba — phù hợp để sinh viên tự đối chiếu bài của mình với các nguồn tham khảo đã dùng trước khi nộp chính thức.

Tóm tắt

  • Đạo văn mã nguồn so khớp theo cấu trúc cú pháp (token hóa), không so khớp theo câu chữ như đạo văn văn bản — đây là lý do cần công cụ chuyên biệt như JPlag, MOSS thay vì phần mềm kiểm tra trùng lặp thông thường.
  • JPlag (Guido Malpohl, Đại học Karlsruhe, 1996) dùng thuật toán Greedy String Tiling (Michael Wise, 1993), mã nguồn mở, chạy cục bộ.
  • MOSS (Alex Aiken, Stanford, 1994) dùng thuật toán winnowing (Schleimer, Wilkerson, Aiken, SIGMOD 2003), xử lý tập trung trên máy chủ Stanford.
  • Đổi tên biến, thêm comment không qua mặt được cả hai công cụ vì bước tokenization loại bỏ thông tin này trước khi so khớp.
  • Dùng chung boilerplate hoặc khung code giáo viên cấp có thể bị flag oan nếu giảng viên không khai báo "base code" để loại trừ khỏi phép so khớp.
  • Kiểm tra trùng lặp văn bản (như Kiểm Tra Tài Liệu) không thay thế được công cụ đối chiếu mã nguồn chuyên biệt như JPlag, MOSS.

Nguồn tham khảo: Prechelt, Malpohl, Philippsen — "Finding Plagiarisms among a Set of Programs with JPlag" (JUCS, Đại học Karlsruhe, khởi đầu dự án 1996); Wise, M. — thuật toán Greedy String Tiling (1993); Schleimer, Wilkerson, Aiken — "Winnowing: Local Algorithms for Document Fingerprinting" (ACM SIGMOD 2003); MOSS — Alex Aiken, Stanford University (từ 1994).


Biên soạn bởi đội ngũ Kiểm Tra Tài Liệu, Metis JSC — phần mềm kiểm tra đạo văn, trùng lặp cho sinh viên, giảng viên và các đơn vị đào tạo tại Việt Nam.

Bài viết liên quan

Cập nhật gần nhất:

Đăng ký nhận tư vấn kiểm tra đạo văn

Để lại thông tin, đội ngũ Kiểm Tra Tài Liệu sẽ liên hệ tư vấn giải pháp kiểm tra trùng lặp, đạo văn phù hợp cho bạn hoặc đơn vị của bạn.

Hoặc liên hệ nhanh qua Messenger, Zalo hoặc Hotline 0566.685.688.