Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
Có một sự thật mà ít sách giáo khoa nói thẳng: lập trình viên dành phần lớn thời gian để tìm và sửa lỗi, không phải để viết code mới. Debug là kỹ năng, và như mọi kỹ năng, nó có phương pháp để học.
Điểm mấu chốt là làm việc theo giả thuyết, không sửa mò. Sửa ngẫu nhiên đến khi hết lỗi thường chỉ che giấu vấn đề.
Cách đơn giản nhất và vẫn rất hiệu quả: chèn lệnh in để xem chương trình đang làm gì.
def tinh_trung_binh(ds):
print("ds =", ds) # kiểm tra đầu vào
tong = sum(ds)
print("tong =", tong)
return tong / len(ds)
print(tinh_trung_binh([])) # ZeroDivisionError: ds rỗngChỉ sau hai dòng in bạn đã thấy danh sách rỗng là thủ phạm. Nhớ xóa các dòng in tạm sau khi sửa xong.
Trình gỡ lỗi (debugger) cho phép tạm dừng chương trình tại một dòng, xem giá trị mọi biến, rồi chạy từng bước:
VS Code, PyCharm, Visual Studio, Chrome DevTools đều có debugger tích hợp. Học dùng nó sớm sẽ tiết kiệm nhiều giờ.
Nếu không biết lỗi nằm ở đâu trong đoạn code dài, hãy chia đôi: kiểm tra kết quả ở giữa. Nếu giá trị giữa đã sai, lỗi nằm ở nửa đầu, ngược lại ở nửa sau. Lặp lại để thu hẹp nhanh. Trong Git, lệnh git bisect áp dụng cùng ý tưởng để tìm commit gây lỗi.
Giải thích code từng dòng cho một con vịt cao su (hoặc một người bạn, hoặc ghi ra giấy). Khi buộc phải nói rõ, bạn thường tự nhận ra chỗ sai trước khi nói hết câu. Cách này rất hiệu quả khi bạn bí.
Tách đoạn gây lỗi thành chương trình nhỏ nhất vẫn còn lỗi. Quá trình rút gọn này thường tự bộc lộ nguyên nhân, và nếu cần hỏi người khác, một ví dụ nhỏ dễ được giúp đỡ hơn nhiều.
Xét hàm sau, được cho là trả về số lớn thứ hai nhưng đôi khi sai:
def lon_thu_hai(ds):
lon, nhi = ds[0], ds[0]
for x in ds:
if x > lon:
nhi = lon
lon = x
elif x > nhi:
nhi = x
return nhi
print(lon_thu_hai([5, 9, 7])) # 7, đúng
print(lon_thu_hai([9, 5, 7])) # 9, sai! mong đợi 7Áp dụng quy trình: tái hiện bằng đầu vào [9, 5, 7]. Thu hẹp: ngay từ đầu lon và nhi đều bằng 9, và 5, 7 đều không lớn hơn nhi = 9. Giả thuyết: khởi tạo nhi sai. Kiểm chứng bằng cách in lon, nhi sau mỗi lượt. Sửa: khởi tạo nhi bằng âm vô cực, và bỏ qua giá trị bằng lon:
def lon_thu_hai(ds):
lon, nhi = float("-inf"), float("-inf")
for x in ds:
if x > lon:
nhi, lon = lon, x
elif lon > x > nhi:
nhi = x
return nhi
print(lon_thu_hai([9, 5, 7])) # 7Sau khi sửa, hãy chạy thêm các trường hợp biên: mảng có hai số bằng nhau, mảng một phần tử. Một bản sửa tốt luôn đi kèm vài ca kiểm thử để lỗi cũ không quay lại.
Debug là điều tra: tái hiện, thu hẹp, đặt giả thuyết, kiểm chứng, sửa. Đừng thấy lỗi là nản; mỗi lỗi bạn tự tìm ra là một bài học nhớ lâu. Hãy bắt đầu bằng thói quen đơn giản nhất: đọc thông báo lỗi thật kỹ và dùng print có chủ đích.
Học xong lý thuyết, hãy thực hành thật nhiều; các bài giảng có bài tập trong khóa học codebem.com sẽ giúp bạn việc đó.
Nguyễn Đình Cường
0 comment