Bài viết được dịch và có tinh chỉnh dựa theo tựa “A Gentler Introduction to Programming”.

Debugging

Khi bạn bắt đầu thử nghiệm hay cố gắng giải quyết các vấn đề thực tế thông qua việc viết mã, bạn sẽ sớm nhận ra rằng sẽ có những khoảnh khắc khi chương trình của bạn bị gián đoạn, ngừng chạy.
Thường thì là do lỗi hoặc ngoại lệ trong thời gian thực thi. Việc tìm lỗi và loại bỏ nó khỏi mã của chúng ta được gọi là debugging. Bạn có thể tăng được kĩ năng sửa lỗi khi bạn cố gắng vượt qua nó nhiều hơn. Chúng ta không chỉ tìm các lỗi có trong mã của chính chúng ta mà còn có thể giúp người khác khắc phục lỗi trong mã của họ.
Để bắt đầu, chúng ta cần phải xác định các lỗi phổ biến có khả năng xuất hiện trong mã nguồn của chúng ta.

Lỗi cú pháp — Syntactic Error

Các lỗi này sẽ không cho phép mã nguồn của bạn được biên dịch/thông dịch. Chúng được phát hiện tại thời gian biên dịch hoặc trong quá trình thông dichj mã nguồn của bạn. Chúng cũng có thể được phát hiện dễ dàng bởi các linter. Chúng ta sẽ tìm hiểu thêm một chút về linter sau.
Chúng chủ yếu xảy ra khi bạn không tuân theo cấu trúc cú pháp của ngôn ngữ mà bạn đang học. Ví dụ là thiếu một dấu ngoặc đơn trong một phương trình.

Lỗi ngữ nghĩa — Semantic Error

Các lỗi ngữ nghĩa còn được gọi là các lỗi logic là dạng lỗi phức tạp nhất trong các lỗi. Chúng không thể dễ dàng được phát hiện. Dấu hiệu cho thấy có lỗi ngữ nghĩa là khi chương trình chạy thành công nhưng không tạo ra kết quả mong muốn.
Xem xét ví dụ sau:
3 + 5 * 6

Theo thứ tự ưu tiên, thường được gọi là BOMAS, trong toàn học, chúng ta mong đợi phần nhân được xét đến trước, và sau đó kết quả cuối cùng sẽ là 33. Nếu lập trình viên muốn bổ sung để phép cộng được xét trước thì điều này sẽ gây ra sự sai khác về kết quả mong chờ cuối cùng. Các lỗi như thế này là lỗi ngữ nghĩa, có nhiều việc phải làm với nó hơn là cấu trúc cú pháp.
Dấu ngoặc đơn khoảng 3 + 5 sẽ cho ra kết quả cuối cùng là 48.
(3 + 5) * 6

Lỗi trong thời gian chạy — Run-time Error

Giống như các lỗi ngữ nghĩa, các lỗi thời gian chạy không bao giờ được phát hiện tại thời gian biên dịch. Không giống như các lỗi ngữ nghĩa, các lỗi thời gian chạy làm gián đoạn chương trình và ngăn không cho nó thực thi thêm. Chúng thường xảy ra bất ngờ do các lỗi tính toán sai trong mã nguồn.
Dưới đây là một điển hình:
input = 25x = 0.8/(Math.sqrt(input) — 5)
Đoạn mã trên sẽ biên dịch thành công, nhưng đầu vào của 25 sẽ dẫn đến lỗi ZeroDivisionError. Đây là lỗi thời gian chạy. Một ví dụ phổ biến khác là StackOverflowError hoặc IndexOutofBoundError. Điều thực sự quan trọng là bạn xác định các lỗi này và tìm hiểu cách xử lý chúng.
Có lỗi gây ra bởi cách mã nguồn của bạn sử dụng bộ nhớ và không gian trên nền tảng hoặc môi trường mà nó đang chạy. Chúng cũng là lỗi trong thời gian chạy. Các lỗi như OutOfMemoryError and HeapError thường do mã nguồn của bạn sử dụng vượt quá tài nguyên. Một kiến thức tốt về thuật toán sẽ giúp bạn viết mã để tận dụng được tài nguyên tốt hơn.
Quá trình viết mã của bạn để có hiệu suất tốt hơn được gọi là tối ưu hoá — optimization, không liên quan lắm tới tối ưu hoá hiệu suất nhưng tái cấu trúc — refactoring là cách để chúng ta có được mã nguồn ngắn gọn dễ hiểu và có được cấu trúc chương trình vững chắc hơn, thế nên bạn cũng nên để ý tới nó.

Tìm và khắc phục lỗi — Debugging

Dưới đây là một số mánh nhỏ để biết làm cách nào tìm ra lỗi trong code của bạn:
  • Sử dụng Linter
    Linter là các công cụ kiểm tra mã nguồn của bạn xem chúng có tuân thủ đúng tiêu chuẩn trong ngôn ngữ lập trình hay không. Có nhiều linter cho nhiều ngôn ngữ khác nhau. Hãy chắc chắn về việc sử dụng linter cho ngôn ngữ bạn đang học và làm việc.
  • IDE đơn giản
    Bạn có thể chọn một IDE được thiết kế cho ngôn ngữ bạn đang học. IDE là viết tắt của Môi trường phát triển tích hợp — Integrated Development Environment. Chúng là phần mềm được xây dựng để viết, sửa lỗi, biên dịch và chạy mã. Chúng thường đi kèm với bộ dụng cụ gỡ lỗi mạnh mẽ, để xem hoặc dò tới từng bước mà mã nguồn của bạn được chạy.

Jetbrains tạo ra các IDE rất tuyệt như WebStorm và IntelliJ. Ngoài ra con có NetBeans, Komodo, trình soạn thảo Qt, Android Studio, XCode (với macOS) cũng là các ứng cử viên nặng kí

  • Đọc ra tiếng đoạn mã nguồn bạn viết
    Điều này thường hữu ích khi bạn đang tìm kiếm một lỗi ngữ nghĩa. Trong khi đọc to mã của bạn, có nhiều khả năng bạn cũng sẽ đọc lỗi đó. Và khi đó bạn có thể nhanh chóng phát hiện ra hơn là ngồi ngẫm nghĩ vu vơ.
  • Đọc nhật kí lỗi (error logs)
    Khi trình biên dịch đánh dấu được lỗi, hãy xem xét lại một cách chắc chắn số dòng hoặc một phần của đoạn mã được nó đánh dấu.

Tiếp tục tìm hiểu

là người mới bắt đầu, bạn sẽ học cách viết mã từ những cuốn sách, các bài hướng dẫn trực tuyến hoặc từ video. Bạn sẽ thường xuyên gõ mã khi bạn nhìn thấy chúng.
Đây là điều bạn nên làm, khi bạn viết xong hoặc chạy mã như vậy, hãy học cách phá vỡ chúng. Làm thế nào để bạn làm được điều này ?
Hãy thử thay đổi thứ gì đó để xem mã hoạt động như thế nào. Làm điều này để bạn không đưa ra giả định về bất cứ điều gì và bạn khá chắc chắn rằng bạn hiểu rõ những gì đang diễn ra.

Trắc nghiệm

  1. Lỗi trong đoạn mã Python bên dưới là gì ?

items = [0,1,2,3,4,5]
print items[8]
//hint: items here is an Array, with 6 items. To retrieve the 4th item for example, you will use items[3]. We start counting from 0.
2. Lỗi trong đoạn mã Python dưới đây là gì ?

input = Hippo'
if input == 'Hippo':
print 'Hello, Hippo'

Tổng kết

Xin chúc mừng! Lỗi không còn là một điều xa lạ với bạn nữa, và việc loại bỏ chúng bây giờ cũng không có gì khó khăn. Tiếp theo, chúng ta sẽ xem xét luồng thực thi của mã nguồn mà chúng ta viết hàng ngày.

Đáp án cho phần trắc nghiệm

(1) Runtime Error: Index Out of Range Error
(2) Syntax Error: Missing starting quotation mark on line 1
To be continue…
.    .    .

Hãy tiếp tục ủng hộ và giữ kết nối với Vnknowledge các bạn nhé:
Xin cảm ơn các bạn!