Làm thế nào để cải thiện kỹ năng debug?

Làm thế nào để đối phó với bugs?

Dù bạn đã đạt đến trình Senior hay chỉ là một Junior mới bước chân vào con đường lập trình thì việc gặp bugs khi coding là điều thường xuyên và gần như không thể tránh khỏi. Sự khác biệt là một lập trình viên giỏi sẽ biết cách cải thiện kỹ năng debug của mình, giúp việc đối mặt với bugs trở nên “bớt đáng sợ” hơn.

Debug là một trong những kỹ năng quan trọng của lập trình viên

Làm thế nào để đối phó với bugs?

Có ba cách chính hiện đang được nhiều người biết đến:

  • Prebugging: giảm thiểu các lỗi trước khi chúng được tạo ra.
  • Debugging: xác định, khắc phục và loại bỏ lỗi khi tìm thấy chúng.
  • Post-debugging: có lỗi không mong muốn hoặc không xác định.

1. Prebugging là gì?

Nếu chúng ta hay gặp lỗi ở một chương trình thông qua việc lập trình, điều đó có nghĩa là chúng ta cần tự hướng dẫn mình để giảm số lượng lỗi mà chúng ta gặp phải. Tôi gọi quá trình hướng dẫn bản thân này là “Prebugging”. Đây là một kỹ năng debug khá cơ bản.

Tôi đã tìm kiếm rất nhiều và có thể thấy một khái niệm khái quát nhất về Prebugging, đây là quá trình xác định và loại bỏ các lỗi khỏi phần cứng hoặc phần mềm của máy tính.

 

Prebugging la gi?

1.1. Lỗi cú pháp

Mỗi ngôn ngữ lập trình đều có các quy tắc riêng và các dev có trách nhiệm tuân theo các quy tắc đó. Ngôn ngữ lập trình nghiêm ngặt về các quy tắc và sẽ đưa ra lỗi bất cứ khi nào các quy tắc đó bị vi phạm.

Ví dụ, hãy tưởng tượng rằng bạn bỏ qua dấu ngoặc đơn của một hàm hoặc phương thức như sau: function {}

Bug sẽ lập tức xuất hiện.

Việc làm quen với thông báo lỗi của một lỗi cú pháp và cách khắc phục nó sẽ giúp bạn có lợi hơn trong khi gỡ lỗi. Cá nhân tôi nhận thấy rằng hầu hết các lỗi liên quan đến cú pháp luôn đề cập đến một số từ khóa giúp bạn tìm ra phần code nào đang có bug.

let school = { 
name: "Harvard", 
location: "Heaven On Earth", admit: function() { return "weeew! You are admitted" } 
} 
console.log(school.names); // undefined

Lỗi “Không xác định” được trả về cho chúng ta biết liệu đối tượng hoặc thuộc tính đang truy cập có khả dụng hay không. Chúng tôi có thể tìm ra vấn đề ở đâu nếu chúng tôi chú ý đến thông báo lỗi.

1.2. Lỗi logic

Các lỗi logic rất khó xử lý vì chúng luôn có vẻ như không có lỗi – nhưng bạn vẫn không nhận được kết quả như mong đợi.

Ví dụ: một cách đơn giản để xác nhận loại lỗi này là kiểm tra mã bên dưới trong bảng điều khiển của trình duyệt

prompt("enter number") + 3;

Bạn có thể mong đợi một số như một đầu ra, nhưng nó sẽ trả về một chuỗi. Tóm lại, bạn sẽ không nhận được kết quả như mong đợi. Do đó việc lên kế hoạch trước khi code và hiểu những điều cơ bản về ngôn ngữ lập trình đang sử dụng có thể giúp bạn đối phó với các lỗi logic – miễn là bạn hiểu các yêu cầu chương trình đưa ra cho bạn.

1.3. Lỗi biên dịch

Chương trình của bạn có thể không biên dịch vì bạn có thể đã vi phạm một số quy tắc mà trình biên dịch mong muốn bạn tuân theo.

Ví dụ: viết một chuỗi mà không có dấu ngoặc kép thông thường, như trong const name = Ayobami, sẽ dẫn đến lỗi biên dịch vì một chuỗi phải được trích dẫn. Vì vậy, code sẽ không biên dịch.

‌‌Điều này tương tự như lỗi cú pháp, và càng viết nhiều code, bạn càng xử lý tốt hơn các lỗi biên dịch. Bạn có thể làm việc hiệu quả hơn và giảm những lỗi này bằng cách biên dịch hoặc kiểm tra code của mình thường xuyên.

1.4. Lỗi resources

Đôi khi, chương trình của bạn có thể vượt quá giới hạn bộ nhớ hoặc sử dụng hết tài nguyên có sẵn. Điều đó có thể khiến ứng dụng của bạn ngừng hoạt động hoặc hoạt động sai. Đoạn code dưới đây là một ví dụ trong thế giới thực về đoạn mã dẫn đến lỗi resources.

function factorial(num) {
  var result = 1;
  for(var i = num; i > 0; i--){
    result = num * factorial(num-1);
  }
  return result;
}

factorial(5);
factorial(10);
factorial(20);
factorial(0);

Hàm factorial() bị treo hoặc làm chậm trình duyệt vì không gian ngăn xếp, tức là bộ nhớ mà trình duyệt phân bổ cho chuỗi lệnh gọi hàm, đã được sử dụng hết. Trong trường hợp này, lỗi là lỗi resources vì nó xảy ra do sử dụng hết bộ nhớ được cấp phát.

1.5. Lỗi giao diện‌‌

Đôi khi chúng tôi thiết kế các API chương trình để sử dụng theo những cách nhất định nhưng người dùng sử dụng các chương trình theo cách khác nhau và gây ra lỗi. Những lỗi như vậy được gọi là lỗi giao diện.

‌‌Ví dụ: giả sử rằng phương thức go(string) mong đợi một chuỗi nhưng thay vào đó chúng ta gọi nó bằng một số. Điều đó sẽ dẫn đến lỗi nếu người tạo ra chương trình không mong đợi và quản lý cách chương trình sẽ phản hồi trong trường hợp như vậy.

‌‌Hầu hết mọi thứ trong phần mềm đều tuân theo các tiêu chuẩn. Nếu các tiêu chuẩn đã xác định của bạn không được tuân thủ, bạn cần cung cấp cho người dùng của mình thông báo lỗi hoặc hướng dẫn để giúp họ tìm ra họ đang sử dụng ứng dụng sai. Việc ghi lại các API của bạn có thể giúp ích rất nhiều trong trường hợp này.

2. Debugging là gì?

2.1. Cách tìm lỗi

Tìm lỗi bắt đầu bằng việc hiểu các thông báo lỗi mà bạn thấy. Không cần phải nói rằng một thông báo lỗi là một con trỏ dẫn đến một lỗi. Nếu bạn hiểu thông báo lỗi, bạn có thể theo dõi chính xác vị trí của lỗi. 

2.3. Cách khắc phục hoặc loại bỏ lỗi

‌‌Sau khi tìm và hiểu được nguyên nhân gây ra lỗi, chúng ta phải sửa lỗi đó. Một khi bạn hiểu lỗi là gì, bạn sẽ đơn giản tìm ra giải pháp mà không cần căng thẳng. ‌‌Tuy nhiên, có những lúc sự hiểu biết của chúng ta không mang lại giải pháp nào cho dù chúng ta có cố gắng đến đâu. ‌‌Thay vì mất thời gian, bạn có thể thông báo lỗi trên Google hoặc bất cứ điều gì bạn cảm thấy phù hợp.

‌‌Bạn cũng có thể hỏi một người khác vì những người khác có xu hướng nhìn mọi thứ theo cách khác. Họ trung lập và sự trung lập đó thực sự giúp sửa một số lỗi.

2.2. Tìm nguyên nhân của việc xảy ra lỗi?

‌‌Sau khi tìm thấy một lỗi, bạn cần phải tìm ra lý do tại sao code lại hoạt động theo cách mà nó thực hiện. Làm điều này giúp bạn xây dựng một hệ thống hiệu quả. ‌‌Thay vì nhiều devs chỉ search Google và sử dụng câu trả lời họ nhận được trực tiếp từ StackOverflow.

‌Điều đó tốt trong một số trường hợp nhất định, nhưng tốt hơn là bạn nên hiểu nguyên nhân của lỗi và giải pháp cho vấn đề là gì. Hiểu nguyên nhân gây ra lỗi là một bước quan trọng trên con đường sửa chữa hoặc loại bỏ lỗi.

‌‌3. Post-debugging là gì?

“Post-debugging” là dự đoán các lỗi không mong muốn trong các chương trình bạn đã viết. Nó đề cập đến tất cả các cơ chế bạn có thể sử dụng để đảm bảo rằng các lỗi không xác định được dễ dàng

Bạn nên có một hệ thống theo dõi lỗi trong quá trình sản xuất để bạn có thể dễ dàng phát hiện ra các lỗi khi chúng xuất hiện sau khi đưa ứng dụng của bạn vào phiên bản sản xuất. Có rất nhiều công cụ theo dõi lỗi trên mạng. Nhưng đây là một số web mà bạn có thể kiểm tra:

  • www.sentry.io
  • www.honeybadger.io
  • www.pypi.org
  • www.airbrake.io
  • www.logrocket.com

Có rất nhiều công cụ theo dõi lỗi trên mạng, bạn sẽ phải nghiên cứu để tìm ra thứ tốt nhất cho mình.

Kết luận

Kỹ năng debug là một kỹ năng quan trọng mà tất cả các nhà phát triển phần mềm phải trau dồi. Nó là cốt lõi của việc viết code, và nếu bạn làm tốt, nó có thể giúp bạn trở thành một lập trình viên giỏi hơn. Tìm hiểu thêm nhiều cách debug chắc chắn là một trong những giải pháp quan trọng nhất dành cho bạn.