Làm thế nào để debug và fix bug nhanh hơn

Ai trong chúng ta cũng đều muốn thiết kế ra một phần mềm tuyệt vời, code được viết một cách hoàn hảo, ấn run và chạy được luôn mà không có một bug nào xảy ra.

Nhưng thực tế rằng, chúng ta đã dành nhiều thời gian cho việc debug - gỡ lỗi hơn là cho việc code mới, tạo ra các chức năng mới. Đôi khi bạn sẽ cảm thấy bó tay trước việc hiểu được cơ chế xảy ra của bug và tìm cách để fix được nó, nó sẽ trở thành vấn đề ảnh hưởng rất lớn đến tốc độ và chất lượng của dự án.

Ngày nay, chúng ta có thể học thêm rất nhiều các kiến thức mới, các kỹ năng về lập trình, các công cụ mới v.v... từ một cuốn sách, tham dự các buổi seminar hay vào các trang mạng, google v.v... Tuy nhiên chúng ta thường tập trung vào các công cụ, ngôn ngữ, hoặc framework mà ít khi chúng ta tìm kiếm về các đề tài cơ bản khác như: kĩ năng đọc source code, fix bug nhanh, tổ chức source code, thiết kế class hợp lý và hiệu quả v.v... Các ngôn ngữ lập trình, framework có thể thay đổi, công cụ không phải là tất cả, nhưng khả năng nắm tổng thể source code, lần theo vết bug, fix bug một cách nhanh chóng sẽ ở lại với chúng ta mãi mãi, sẽ tiết kiệm cho chúng ta vô khối thời gian.

Kĩ năng debug và fix bug phần lớn là đến từ kinh nghiệm, có thể là kinh nghiệm cả chính bản thân, có thể là được chia sẻ từ người khác. Hoặc như có thể đó cũng là một loại năng khiếu bẩm sinh, năng khiếu sử lý lỗi, tức là sinh ra đã có rồi, thời gian sử lý bug thường rất nhanh và hầu như không gặp một chút khó khăn gì cả. Tuy nhiên, cả hai con đường, hoặc đến từ kinh nghiệm rèn luyện, hay từ bẩm sinh đi nữa, đều có những đặc điểm chung, chúng ta có thể học tập và làm theo một trong số những bước sau:

  • Tăng cường tính kỉ luận của bản thân khi debug. Debug là một quá trình, nó không phải là một chuỗi các sự kiện ngẫu nhiên, khi có cùng điều kiện ở đầu vào, cùng điều kiện về môi trường thì đầu ra luôn cố định. Không debug một cách vu vơ, làm theo một quy trình nhất định và theo dõi chặt chẽ quá trình sử lý của source code. Kiểm tra đầu vào và đầu ra của các module để chắc chắn rằng nó đã thực hiện đúng như ta mong muốn hay chưa, luôn phải xác định được đầu vào và đầu ra ta mong muôn sẽ như thế nào, nếu đúng thì chúng ta có thể chuyển sang xem xét ở phần tiếp theo.

  • Để cải thiện kỹ năng debug & fix bug, chúng ta cần thực hành trên code của người khác nữa. Điều này sẽ giúp chúng ta có được cách nhìn nhận khách quan hơn trong quá trình gỡ lỗi, phát triển khả năng nhận ra các nguyên nhân gây ra bug nhanh hơn, loại bỏ chúng trong quá trình phát triển source code của bản thân.

  • Học cách đưa ra các giả thuyết về cách thức làm việc của compiler, của server, chạy logic để kiểm định tính chính xác của nó. Luôn nghi ngờ và xác minh lại về cơ chế làm việc của source code, đôi khi bug xuất hiện ở chính đoạn code mà chúng ta luôn cho rằng chính xác -> sẽ rất khó để tìm ra những bug như thế này nếu không thay đổi tính cố chấp của bản thân.

  • Học cách fig bug sớm trong quá trình phát triển phần mềm, thông qua viết theo TDD, chuẩn bị unit test. Hoặc học cách gỡ lỗi các thiết kế kém, chỉnh sửa lại detail design.

  • Nếu có thể, hãy giữ toàn bộ hệ thống trong đầu của bạn, lúc đấy thì debug và fix bug rất là đơn giản. Hãy chú ý đến mối quan hệ của toàn hệ thống, cách thức các module trao đổi với nhau, đọc và hiểu source code ở nhiều cấp độ. Một lập trình viên giỏi thì luôn có khả năng nắm hết được hệ thống, và không phải chờ đến lúc fix bug anh ta mới tìm hiểu chương trình chạy như thế nào.

  • Cần học tập để có sự hiểu biết sâu hơn về hệ thống, bạn cần hiểu chính xác thông điệp của hệ thống gửi đến bạn có nghĩa là gì, nó sẽ giúp bạn tìm ra những gì đang xảy ra với source code của bạn.

Tất nhiên để đạt tới tất cả các mục ở trên thì không phải là một việc đơn giản, chúng ta có thể bắt đầu làm từ những việc đơn giản trước như:

  • Sử dụng thật tốt tool debug, watch variable, next step, go into, go finish, Nếu ở dùng visual studio thì có một chức năng rất mạnh là Trace output và go to step.

  • Check kĩ lại môi trường, điều kiện gây ra bug. Lời khuyên ở đây là tìm mọi cách để loại bỏ bớt điều kiện đi trước khi fix bug, -> Giúp chúng ta tập trung vào ít module hơn.

  • Nếu như không tìm được bug, quay lại tìm kiếm ở bước trước nó, các thành phần liên quan xung quanh, check lại mọi giả thuyết của bản thân.

  • Không work around qua bug, khi chưa tìm được nguyên nhân bug, không fix bug hú hóa. Mang tâm lý work around sẽ không giúp chúng ta tiến bộ lên được.

  • Log các thông tin cần thiết ra file

  • Gặp các bug xuất hiện không ổn định thì check log file để tìm hiểu điều kiện đầu vào, đầu ra, error message, trace log.

  • Thay đổi suy nghĩ, fix bug không chỉ đơn giản là sửa chữa các bug mà còn là học hỏi từ bug, có tinh thần tốt, bản lĩnh vững vàng không chấp nhận lùi bước.

  • Trình bày về bug với một ai đó, giúp chúng ta tổ chức, xắp xếp lại cách thức source code làm việc.