Bài viết Xây dựng hệ thống tự động chấm thực hành môn lập trình trình bày việc xây dựng hệ thống chấm bài thực hành lập trình được xây dựng cho các môn học lập trình cơ bản ở môi trường đại học, nhằm tự động hóa việc đánh giá kết quả học tập của sinh viên.
Trang 1XÂY DỰNG HỆ THỐNG TỰ ĐỘNG CHẤM THỰC HÀNH MÔN LẬP TRÌNH
Trương Xuân Nam1, Nguyễn Thị Phương Dung2
1 Bộ môn Tin học - Kỹ thuật Tính toán, Khoa Công nghệ Thông tin, email: namtx@tlu.edu.vn
2 Bộ môn Công nghệ Phần mềm, Khoa Công nghệ Thông tin
1 GIỚI THIỆU CHUNG
Các hệ thống tự động kiểm tra phần mềm đã
được sử dụng từ lâu trong ngành kỹ thuật phần
mềm với các sản phẩm kiểm thử tự động như
Seledium, TestComplete,… hoặc các hệ thống
đám mây tích hợp trí tuệ nhân tạo cho phép
đánh giá các bản vá phần mềm với hàng triệu
tình huống (test case) khác nhau, được sử dụng
trong các doanh nghiệp phần mềm lớn [1]
Về bản chất, việc chấm tự động bài thi lập
trình của sinh viên cũng là hoạt động kiểm thử
phần mềm, nhưng ở quy mô nhỏ hơn và hướng
đến những khía cạnh đặc thù của giáo dục
Báo cáo này trình bày việc xây dựng hệ
thống chấm bài thực hành lập trình được xây
dựng cho các môn học lập trình cơ bản ở môi
trường đại học, nhằm tự động hóa việc đánh
giá kết quả học tập của sinh viên
2 PHƯƠNG PHÁP NGHIÊN CỨU
2.1 Hiện trạng
Các hệ thống chấm thi tự động có lịch sử
phát triển trên thế giới nhiều năm Từ những
năm 1990 đã có những hệ thống được áp
dụng vào các kỳ thi học sinh giỏi về lập trình,
đó là những kỳ thi đòi hỏi nghiêm ngặt về
chất lượng bài làm và sự công bằng trong
đánh giá kết quả; vì vậy việc chấm bằng máy
giải quyết cơ bản được vấn đề này kèm theo
đó tốc độ chấm máy cũng nhanh hơn tương
đối so với chấm bởi con người Tuy nhiên
việc tự động hóa chỉ dừng ở mức chấm bài
làm, việc phát đề bài, nộp bài, công bố kết
quả vẫn phải thực hiện thủ công
Khoảng 10 năm trở lại đây, cùng với sự phát triển của mạng internet, dịch vụ tính toán từ xa và các kiến trúc tính toán mới; các
hệ thống chấm tự động dần được sử dụng phổ biến trong các khóa lập trình Nổi bật nhất là các hệ thống CMS, Codeforces, HackerRank, CodeWars,… Các hệ thống này đơn giản hóa thêm được các khâu ra đề, phát đề, nộp bài và công bố kết quả; tuy nhiên chưa đảm bảo được các yếu tố chống gian lận trong thi cử Các hệ thống chấm thi tự động cũng được
áp dụng trong đào tạo ở Việt Nam từ những năm 2000 đến nay, nhưng không phổ biến; chủ yếu được dùng trong các kì thi học sinh giỏi hoặc những khóa học đào tạo chuyên môn Ví dụ như khóa học Thuật toán Ứng dụng của Samsung sử dụng SPOJ, hệ thống đào tạo nội bộ của FPT sử dụng CodeLearn
Ở các khối chuyện tin cấp ba, phần mềm Themis được sử dụng tương đối rộng rãi
2.2 Phương pháp đánh giá bài thi
Khi mã nguồn đã được dịch và có thể chạy được, có nhiều phương pháp đánh giá bài thi, Bernard [2] đưa ra 5 kiểu phân loại như sau:
1 Batch: hệ thống so sánh đầu ra của
chương trình với đầu ra theo yêu cầu của người làm đề
2 Communication: hệ thống làm cầu nối
giữa chương trình vào module chấm thi (do người làm đề cung cấp)
3 TwoStep: hệ thống sinh tự động các test
(theo khuôn mẫu) sau đó đối sánh kết quả của chương trình do thí sinh nộp và kết quả do chương trình mẫu (do người làm đề cung cấp)
Trang 24 ZeroSum: hệ thống làm trọng tài giữa
chương trình do thí sinh nộp và một chương
trình đối nghịch do người làm đề cung cấp,
chủ yếu dùng trong các bài toán thuộc lý
thuyết trò chơi
5 Rank: hệ thống đánh giá và xếp hạng
cùng lúc nhiều chương trình do thí sinh nộp
dựa trên các phép đo chuẩn, sử dụng rất rộng
rãi trong các hệ thống học máy
2.3 Tự động sinh và trộn đề thi
Chúng tôi xây dựng một thuật toán (hình
dưới) cải biên từ thuật toán sinh hoán vị ngẫu
nhiên [3] để giải quyết vấn đề này
Hình 1 Thuật toán chọn ngẫu nhiên đề thi
Thuật toán đảm bảo việc lựa chọn m câu
hỏi trong quỹ n câu theo đúng phân bổ xác
suất tổ hợp Việc khởi tạo nhân (seed) của
thuật toán ngẫu nhiên phân bổ đều đảm bảo
kết quả trả về của hàm là nhất quán với mỗi
key xác định Vì vậy một người dùng chỉ cần
một key (chính là mã đề thi)
2.4 Xử lý lỗi trong khi thi
Trong quá trình thực hiện bài làm, thí sinh
có thể gặp lỗi, máy tính bị treo, mất bài thi;
cách xử lý hiệu quả trong tình huống này là
xây dựng cơ chế đồng bộ bài thi giữa máy tính của thí sinh và máy chủ
2.5 Ngăn chặn sai hỏng hệ thống
Có bốn phương pháp thông dụng để giảm thiểu các rủi ro nêu trên:
1 Sandbox: tạo ra một môi trường riêng
biệt để thực thi chương trình Đây là phương pháp an toàn nhất, nhưng chi phí về phần cứng rất cao
2 Guest: thực thi chương trình với các
hạn chế về quyền và tài nguyên
3 Monitor: vừa thực thi chương trình vừa
theo dõi các hoạt động xem có bất thường hay không
4 Checker: duyệt các đoạn mã chương
trình và ngăn chặn các đoạn mã phá hoại
2.6 Ngăn chặn gian lận khi làm bài thi
Các hệ thống chấm thi tự động thường có hai dạng triển khai:
1 Dạng trưc tuyến, chủ yếu sử dụng trong luyện tập
2 Dạng nội bộ, nửa trực tuyến, vẫn thi tại phòng thi có giám thị
Hệ thống trực tuyến do chỉ sử dụng với mục đích luyện tập, nên không đặt ra vấn đề xử lý gian lận (vẫn có nhưng rất hạn chế) Với hệ thống nội bộ, chúng tôi thực hiện một vài phương pháp hỗ trợ giám thị phát hiện gian lận nhưng chỉ ở mức cảnh báo Cụ thể như sau:
- Phát hiện nguồn gốc bất thường của tập tin mã nguồn (thực hiện phía client)
- Phát hiện bất thường trong quá trình làm bài của thí sinh (thực hiện phía client)
- Phát hiện việc trao đổi thông tin qua mạng của thí sinh (thực hiện phía client)
- Phát hiện bài làm có tương đồng cao giữa các thí sinh (thực hiện phía server)
3 KẾT QUẢ NGHIÊN CỨU 3.1 Kiến trúc hệ thống
Hệ thống được phân tách thành ba khối độc lập, giao tiếp với nhau bởi các truy vấn RESTful/API và https
Khối “Judgement Server”: đóng vai trò các server thực hiện việc chấm thi Xây dựng bằng MONO.NET Core có thể mở rộng mềm dẻo (scalability) tùy thuộc vào nhu cầu chấm
Trang 3thi, số lượng server tăng lên nếu kì thi đông
thí sinh và giảm xuống nếu ít thí sinh hơn
Khối “Front-end Server”: đóng vai trò giao
diện quản lý và thông tin đến người sử dụng
Được viết bằng PHP/MySQL Laravel, cho
phép người dùng xem kết quả thi, giáo viên gửi
câu hỏi, đáp án, ra đề thi và thực hiện các công
việc khác của quy trình thi như chấm phúc tra
Hình 2 Kiến trúc hệ thống
Khối “Client”: là các ứng dụng đầu cuối
làm nhiệm vụ giao tiếp với thí sinh Được
xây dựng bằng C#.NET, ứng dụng thực hiện
việc đăng nhập, lấy đề bài, nộp bài và các
công việc xác thực, giám sát thi cử khác
3.2 Lựa chọn phương pháp kiểm soát
Chúng tôi đã thử nghiệm 3 phương pháp
kiểm soát sai hỏng là sandbox, guest và
monitor đối với tập thử nghiệm 5 chương trình
từ đơn giản thuộc các loại chương trình bình
thường, đọc dữ liệu nhiều, ghi dữ liệu nhiều,
đòi hỏi bộ nhớ lớn và đòi hỏi công suất tính
toán lớn Mỗi chương trình thực hiện với 1
triệu test và đo tổng thời gian từ khi bắt đầu
đến khi kết thúc nhằm kiểm tra hiệu năng của
các phương pháp kiểm soát Bảng dưới thể
hiện kết quả thực hiện (theo đơn vị giờ)
Bảng 1 So sánh hiệu suất ba loại kiểm soát
Thông thường 0.29h 0.27h 0.27h
Kết quả thử nghiệm cho thấy phương pháp sandbox có hiệu suất rất thấp, phương pháp monitor có hiệu suất gần như tương đương với guest ở các thử nghiệm ngoại trừ loại chương trình đòi hỏi ghi dữ liệu nhiều
Vì vậy, với hệ thống hiện tại, chúng tôi kết hợp giữa phương pháp Guest và một kĩ thuật
an toàn khác là “full side verification” bao gồm hai bước:
1 Thử thực hiện chương trình của thí sinh ngay tại client và không có bất kỳ biện pháp ngăn chặn sai hỏng nào
2 Đưa bài làm lên server chấm thi và thực hiện trong chế độ Guest
3.3 Triển khai thực tế
Hệ thống đã được triển khai thử nghiệm cho hai môn học, 22 lớp, 214 kỳ thi, hơn
6000 lượt thi và gần 50000 bài thi được nộp (một bài có thể được nộp nhiều lần nếu thí sinh chưa hài lòng với kết quả)
4 KẾT LUẬN
Hệ thống đã chứng minh thiết kế hiện tại đạt được các mục tiêu cốt lõi của một hệ thống đánh giá tự động:
1 Tự động ra đề thi với sự can thiệp tối thiểu của cấp quản lý
2 Chấm thi, đánh giá bài thi của sinh viên hoàn toàn tự động
3 Xử lý được lỗi huống bất thường về thiết bị hoặc phẩn mềm trong quá trình thi
4 Ngăn chặn được các hành vi làm hỏng
kỳ thi một cách vô tình hoặc cố ý
5 TÀI LIỆU THAM KHẢO
[1] Priyadharshini.V, Malathi.A; 2014; Survey
on software testing techniques in cloud computing https://arxiv.org/abs/1402.1925
[2] Bernard B, Matteo B, Stefano M,
Giovanni M, Luca W; 2018; Contest Management System: a distributed system for running and organizing a programming contest https://cms.readthedocs.io
[3] Richard D; 1964; Algorithm 235: Random permutation Communications of the ACM
7 (7): 420