Thử làm lập trình viên trong 20 phút
Bạn là thực tập sinh ở một công ty nhỏ chuyên làm phần mềm sổ điểm cho các trường THPT.
Sáng nay cô Lan, giáo viên chủ nhiệm một lớp 10, gửi thư: phần mềm tính điểm trung bình môn của một học sinh ra 7,2, trong khi cô tính tay được 7,3. Trưởng nhóm giao cho bạn tìm hiểu và sửa.
Bài gồm 6 bước, mỗi bước là một việc lập trình viên làm hằng ngày. Không cần biết lập trình trước; gặp khó thì xem giải thích rồi đi tiếp.
Đọc yêu cầu
Trước khi đọc code, lập trình viên phải hiểu phần mềm cần tính cái gì. Quy định tính điểm (Thông tư 22/2021/TT-BGDĐT, Điều 9):
Điểm trung bình môn học kỳ = (tổng điểm thường xuyên + 2 × điểm giữa kỳ + 3 × điểm cuối kỳ) ÷ (số điểm thường xuyên + 5)
Nhà trường đặt hàng phần mềm yêu cầu thêm: kết quả làm tròn đến một chữ số thập phân, chữ số bỏ đi từ 5 trở lên thì làm tròn lên.
Học sinh An có 4 điểm thường xuyên là 8, 7, 9, 6; điểm giữa kỳ 7; điểm cuối kỳ 8. Điểm trung bình môn học kỳ của An là bao nhiêu?
Trong bài, điểm từng bài là số nguyên cho gọn; thực tế điểm có thể có một chữ số thập phân.
Xem đáp án và giải thích
Đáp án: 7,6
Đúng. Tổng có hệ số là 30 + 2 × 7 + 3 × 8 = 68, chia cho 4 + 5 = 9 được 7,555..., làm tròn thành 7,6. Hiểu đúng yêu cầu là việc đầu tiên: hiểu sai ở đây thì code viết khéo đến đâu cũng ra số sai.
Trong mô tả nghề (QĐ 34/2020): Nghiên cứu, phân tích và đánh giá các yêu cầu đối với ứng dụng phần mềm và hệ điều hành
Đọc code
Đây là hàm tính điểm học kỳ trong phần mềm, viết bằng Python. Dòng cuối gọi hàm với 2 điểm thường xuyên 8 và 9, giữa kỳ 6, cuối kỳ 7.
Khi chạy đoạn code này, máy sẽ in ra gì?
def diem_hoc_ky(thuong_xuyen, giua_ky, cuoi_ky):
tong = sum(thuong_xuyen) + 2 * giua_ky + 3 * cuoi_ky
so_diem = len(thuong_xuyen) + 5
return tong / so_diem
print(diem_hoc_ky([8, 9], 6, 7))
Python dùng dấu chấm cho số thập phân: 7.5 nghĩa là 7,5.
Xem đáp án và giải thích
Máy in ra: 7.142857142857143
Đúng. 17 + 2 × 6 + 3 × 7 = 50, chia 7 ra 7,142857... Python in đủ các chữ số vì hàm chưa làm tròn. Đó cũng là chỗ phần mềm còn thiếu so với yêu cầu ở bước 1.
Trong mô tả nghề (QĐ 34/2020): Tiến hành chạy thử các chương trình và ứng dụng phần mềm để xác nhận tạo ra thông tin mong muốn
Thiết kế từng bước
Một đồng nghiệp viết lại hàm thành nhiều bước nhỏ cho dễ đọc, nhưng các dòng bị xáo trộn.
Bấm lần lượt từng dòng để xếp lại cho đúng thứ tự. Bấm vào dòng đã xếp để gỡ ra.
def diem_hoc_ky(thuong_xuyen, giua_ky, cuoi_ky):
return tong / so_diem
tong = tong + 3 * cuoi_ky
tong = sum(thuong_xuyen)
so_diem = len(thuong_xuyen) + 5
tong = tong + 2 * giua_ky
Thứ tự của bạn
def diem_hoc_ky(thuong_xuyen, giua_ky, cuoi_ky):
Các dòng còn lại
Xem đáp án và giải thích
def diem_hoc_ky(thuong_xuyen, giua_ky, cuoi_ky):
tong = sum(thuong_xuyen)
tong = tong + 2 * giua_ky
tong = tong + 3 * cuoi_ky
so_diem = len(thuong_xuyen) + 5
return tong / so_diem
Đúng. Phải có tong trước rồi mới cộng thêm vào tong; hai dòng cộng đổi chỗ cho nhau vẫn đúng; return phải ở cuối vì Python thoát khỏi hàm ngay tại dòng return.
Sửa lỗi
Quay lại thư của cô Lan. Học sinh có điểm thường xuyên 7, 7, 7; giữa kỳ 8; cuối kỳ 7. Tính tay: (21 + 2 × 8 + 3 × 7) ÷ 8 = 58 ÷ 8 = 7,25, làm tròn thành 7,3. Phần mềm lại ra 7,2.
Đây là hàm phần mềm đang dùng. Bấm vào dòng gây ra lỗi, rồi chọn cách sửa.
def diem_hoc_ky(thuong_xuyen, giua_ky, cuoi_ky):
tong = sum(thuong_xuyen) + 2 * giua_ky + 3 * cuoi_ky
so_diem = len(thuong_xuyen) + 5
return round(tong / so_diem, 1)
Bấm vào dòng gây ra lỗi
Xem đáp án và giải thích
Dòng lỗi: return round(tong / so_diem, 1)
Sửa thành: return int(tong / so_diem * 10 + 0.5) / 10
Đúng. round() của Python không làm tròn kiểu "từ 5 trở lên thì lên": khi giá trị nằm đúng giữa, nó làm tròn về số chẵn gần nhất, nên round(7.25, 1) ra 7.2. Cách nhân 10, cộng 0,5 rồi bỏ phần lẻ cho ra đúng quy tắc của trường. Chúng tôi đã cho máy thử cách này trên toàn bộ 1.947.253 bảng điểm có thể có (2 đến 4 điểm thường xuyên, điểm nguyên): không sai bảng nào.
Trong mô tả nghề (QĐ 34/2020): Sửa phần mềm lỗi, thích ứng với phần cứng mới hoặc nâng cấp giao diện và cải thiện hiệu suất
Viết code
Cô Lan nhờ thêm một việc: tính điểm trung bình môn cả năm. Quy định:
Điểm trung bình môn cả năm = (điểm học kỳ I + 2 × điểm học kỳ II) ÷ 3
Kết quả cũng làm tròn đến một chữ số thập phân như bước 1. Viết hàm diem_ca_nam(hk1, hk2) trả về điểm cả năm, rồi bấm "Chạy thử" để máy chạy các ca thử.
| Điểm HK I, HK II | Mong đợi | Bạn ra | Kết quả |
|---|
Code của bạn in ra (tối đa 20 dòng)
Xem đáp án và giải thích
def diem_ca_nam(hk1, hk2):
tb = (hk1 + 2 * hk2) / 3
return int(tb * 10 + 0.5) / 10
| Điểm HK I, HK II | Điểm cả năm |
|---|---|
| 7,6; 8,3 | 8,1 |
| 8; 6,5 | 7 |
| 5; 9 | 7,7 |
| 9,5; 7,2 | 8 |
| 10; 10 | 10 |
Đúng hết các ca thử. Viết code theo yêu cầu rồi tự chạy thử trước khi giao là việc hằng ngày của lập trình viên.
Trong mô tả nghề (QĐ 34/2020): Viết và duy trì mã chương trình theo hướng dẫn, thông số kỹ thuật đạt tiêu chuẩn chất lượng được công nhận
Kiểm thử
Một lập trình viên khác vừa viết lại hàm tính điểm học kỳ. Cô Lan dạy môn có 3 điểm thường xuyên, đã thử vài bảng điểm và thấy đúng hết. Nhưng code vẫn có lỗi.
Việc của người kiểm thử: nghĩ ra một bảng điểm làm lỗi lộ ra. Nhập bảng điểm rồi bấm "Chạy": máy chạy cả bản đúng lẫn bản có lỗi, nếu hai bản ra khác nhau là bạn đã bắt được lỗi.
Xem đáp án và giải thích
Một bảng điểm làm lộ lỗi: 2 điểm thường xuyên 8, 9; giữa kỳ 7; cuối kỳ 8. Bản đúng ra 7,9, bản có lỗi ra 6,9.
Bắt được lỗi. Bản code viết cứng so_diem = 8, tức là luôn coi như có 3 điểm thường xuyên, nên môn có 2 hoặc 4 điểm bị tính sai. Người kiểm thử giỏi nghĩ tới những trường hợp người viết code không nghĩ tới.
def diem_hoc_ky(thuong_xuyen, giua_ky, cuoi_ky):
tong = sum(thuong_xuyen) + 2 * giua_ky + 3 * cuoi_ky
so_diem = 8
return int(tong / so_diem * 10 + 0.5) / 10
Trong mô tả nghề (QĐ 34/2020): Xây dựng và chỉ đạo các quy trình kiểm tra và xác nhận phần mềm
Việc bạn vừa thử, trong mô tả của nghề
Phần lớn các bước bạn vừa làm là việc có trong mô tả công việc của nhóm nghề phát triển phần mềm (Danh mục nghề nghiệp Việt Nam, QĐ 34/2020). Một ngày làm việc thật còn có họp nhóm, đọc tài liệu, trao đổi với khách hàng; bài này chỉ cho bạn thử phần việc với code, đối chiếu với các nhiệm vụ trong bảng dưới.
| Nhiệm vụ (nguyên văn QĐ 34/2020) | Trong bài |
|---|---|
| Nghiên cứu, phân tích và đánh giá các yêu cầu đối với ứng dụng phần mềm và hệ điều hành | Bước 1: Đọc yêu cầu |
| Tiến hành chạy thử các chương trình và ứng dụng phần mềm để xác nhận tạo ra thông tin mong muốn | Bước 2: Đọc code |
| Sửa phần mềm lỗi, thích ứng với phần cứng mới hoặc nâng cấp giao diện và cải thiện hiệu suất | Bước 4: Sửa lỗi |
| Viết và duy trì mã chương trình theo hướng dẫn, thông số kỹ thuật đạt tiêu chuẩn chất lượng được công nhận | Bước 5: Viết code |
| Xây dựng và chỉ đạo các quy trình kiểm tra và xác nhận phần mềm | Bước 6: Kiểm thử |
Các nghề có công việc này
| Nghề | Lương tháng | Nguồn |
|---|---|---|
| Kỹ sư Backend | 9 - 68 tr | ITviec · 2025 · Khá tin được · khảo sát người đi làm |
| Kỹ sư Fullstack | 15 - 47,5 tr | ITviec · 2025 · Khá tin được · khảo sát người đi làm |
| Lập trình viên Mobile | 11,5 - 54,4 tr | ITviec · 2025 · Khá tin được · khảo sát người đi làm |
Mỗi nghề một mốc lương tiêu biểu. Các mốc khác và cách đo của từng nguồn xem ở trang nghề.