Đến nội dung chính
Thư viện GKNơi khơi nguồn tò mò
Tiếng Việt

Càng giải thích càng thấy lỗi: gỡ lỗi với vịt cao su (Rubber Duck Debugging)

Bạn đã bao giờ nhìn chằm chằm vào mã suốt mấy tiếng vì chương trình chạy bất thường, rồi nhờ đồng nghiệp ngồi bên cạnh giúp đỡ chưa? Nhưng điều kỳ lạ là trong lúc giải thích “Ở đây nhận giá trị này, rồi truyền đi như thế này…”, bạn thường tự tìm ra câu trả lời: “À, chỗ này sai rồi”. Trong khi đó, đồng nghiệp chỉ gật đầu mà thôi. Trong giới lập trình viên, từ lâu đã lưu truyền một phương pháp chủ động tận dụng hiện tượng này. Đó chính là “gỡ lỗi với vịt cao su (Rubber Duck Debugging)”.

Nói một cách đơn giản, gỡ lỗi với vịt cao su là “phương pháp gỡ lỗi bằng cách giải thích thành tiếng từng dòng mã cho một chú vịt cao su trên bàn để tìm ra vấn đề”. Bên nghe không cần nói gì; chính quá trình giải thích sẽ làm lộ ra những ngộ nhận và thiếu sót trong suy nghĩ.

Trong bài viết này, chúng ta sẽ lần lượt tìm hiểu nguồn gốc tên gọi gỡ lỗi với vịt cao su, cách thực hiện trên thực tế, nguyên lý khiến việc giải thích làm lộ ra vấn đề, cùng những cách vận dụng trong đời sống ngoài lĩnh vực phát triển phần mềm.


Vì sao trò chuyện với vịt lại giúp nhìn ra lỗi

Ví dụ mã giả định về gỡ lỗi với vịt cao su. Mục tiêu là đạt từ 80 điểm trở lên, nhưng điều kiện lại được viết thành lớn hơn 80, khiến mức 80 điểm bị loại; lỗi được phát hiện khi giải thích từng dòng. Sau khi sửa thành từ 80 trở lên, kiểm tra lại xem 79 điểm có không đạt, còn 80 điểm và 81 điểm có đạt hay không.
Ví dụ giả định về gỡ lỗi với vịt cao su, trong đó mục tiêu và điều kiện thực tế được diễn giải bằng lời để đối chiếu. Phương pháp không bảo đảm hiệu quả; sau khi sửa vẫn cần chạy chương trình và kiểm thử thực tế. Nguồn: Harvard CS50x, Stanford CS106B.

Câu chuyện từ cuốn “Lập trình viên thực dụng”

Một lập trình viên cầm chú vịt cao su, mỉm cười giải thích điều gì đó cho vịt tại bàn làm việc trong phòng đọc sách ấm cúng, trên bàn có máy tính xách tay và một cuốn sách đang mở

Tên gọi này được phổ biến rộng rãi qua cuốn sách về phát triển phần mềm “Lập trình viên thực dụng (The Pragmatic Programmer)”, xuất bản năm 1999. Cuốn sách do Andy Hunt và Dave Thomas cùng viết đến nay vẫn là một tác phẩm kinh điển được nhiều lập trình viên giới thiệu.

  • Nhân vật trong câu chuyện (Greg Pugh): Theo cuốn sách, một trợ lý nghiên cứu tên Greg Pugh luôn mang theo một chú vịt cao su và giải thích cho vịt mỗi khi gặp vấn đề bế tắc.
  • Lời giải thích trong sách (Explaining the Problem): Cuốn sách cho biết bên nghe không cần nói một lời nào; thường chỉ cần giải thích từng bước mã phải làm gì là vấn đề tự hiện rõ ngay trên màn hình.
  • Những biến thể khác nhau (Other Objects): Đối tượng không nhất thiết phải là vịt; còn có những câu chuyện về việc giải thích cho gấu bông, thú cưng, thậm chí cả hình chú chó cắt bằng giấy.

Sau cùng, điều cốt lõi nằm ở hành động giải thích cho một đối tượng từ đầu đến cuối, chứ không nằm ở món đạo cụ hình con vịt.


Cách giải thích thành tiếng từng dòng

Một lập trình viên chỉ tay vào màn hình và giải thích thành tiếng, trong khi chú vịt cao su màu vàng trên bàn hướng về phía màn hình

Vì cách thực hiện gỡ lỗi với vịt cao su khá đơn giản nên việc tuân thủ trình tự rất quan trọng. Nhìn chung, phương pháp gồm ba bước sau.

(1) Trước tiên, nói cho vịt biết mục tiêu
Trước hết, hãy dùng một hoặc hai câu để giải thích đoạn mã này vốn phải làm gì. Ngay khi diễn đạt mục tiêu bằng lời, đôi khi bạn sẽ nhận ra mình đã hiểu sai yêu cầu từ đầu.

(2) Đọc từng dòng, không bỏ qua dòng nào
Đọc mã từng dòng từ trên xuống, nói thành tiếng dòng đó làm gì và biến có thể đang chứa giá trị nào. Giải thích đầy đủ cả những phần bạn thường bỏ qua vì nghĩ “chỗ này chắc chắn chạy được” chính là cốt lõi của phương pháp này.

(3) Đối chiếu lời giải thích với kết quả thực tế
Tìm điểm mà nội dung đã giải thích lệch khỏi kết quả chương trình thực sự đưa ra. Thông thường, dòng mã có sự lệch nhau đó chính là nơi lỗi đang ẩn náu.

Lúc này, bạn nên thực sự cử động miệng và nói ra, thay vì chỉ đọc thầm trong đầu; nếu khó làm vậy thì hãy thử viết thành câu. Khi nói thành tiếng, tốc độ tự nhiên chậm lại, khiến bạn kiểm tra cả một dấu phẩy hay chiều của một dấu bất đẳng thức mà mình đã bỏ qua khi đọc lướt. Ở những nơi khó nói thành tiếng như văn phòng, viết lời giải thích vào sổ ghi chép cũng mang lại hiệu quả tương tự.

Chú vịt là một thính giả lắng nghe như thể chẳng biết gì. Vì vậy, càng xem đối tượng nghe là người hoàn toàn chưa biết và giải thích bằng những lời thật dễ hiểu, hiệu quả càng cao.


Nguyên lý khiến việc giải thích làm lộ ra vấn đề

Một lập trình viên trẻ chống cằm, trầm ngâm nhìn chú vịt cao su và gấu bông trên bàn, bên cạnh có cuốn vở trắng, bút chì và máy tính xách tay

Khi chỉ suy nghĩ trong đầu, chúng ta tự nhiên bỏ qua những phần mà mình tin là đã hiểu. Ngược lại, để giải thích bằng lời, bạn phải lần lượt đưa từng ý nghĩ ra theo đúng trình tự.

  • Làm lộ chỗ thiếu sót (Explicit Reasoning): Lời nói chậm hơn suy nghĩ và có trình tự rõ ràng, nên những khoảng trống trong mạch lập luận vốn được nối ghép qua loa trong đầu sẽ hiện ra nguyên vẹn.
  • Thay đổi góc nhìn (Shift in Perspective): Khi đứng ở vị trí giải thích cho người khác, bạn sẽ nhìn lại mã bằng con mắt của người lần đầu tiếp xúc, thay vì của người đã viết ra nó.
  • Hiệu ứng tự giải thích (Self-Explanation Effect): Trong khoa học học tập, các nghiên cứu liên tục ghi nhận rằng những học sinh tự giải thích nội dung đã học sẽ củng cố được mức độ hiểu sâu hơn.

Đặc biệt, lỗi thường ẩn ở những chỗ bạn tin rằng “không thể nào sai”, hơn là những chỗ mã có vẻ sai. Khi giải thích, bạn phải nói ra cơ sở của niềm tin đó; khoảnh khắc không đưa ra được cơ sở chính là dấu hiệu cho thấy cần xem xét lại chỗ ấy.

Một điểm thú vị nữa là phương pháp này hiệu quả hơn khi có đối tượng lắng nghe so với lúc chỉ lẩm bẩm một mình. Bởi chỉ cần đặt một chú vịt trước mặt, bạn đã có cảm giác phải giải thích cho đàng hoàng, từ đó nói đầy đủ mà không lược bỏ.


Vận dụng vào đời sống ngoài lĩnh vực phát triển phần mềm

Một sinh viên trong phòng học sáng sủa đang giải thích thành tiếng cách giải bài tập cho chú vịt cao su đặt trên chồng sách giáo khoa

Gỡ lỗi với vịt cao su giờ đây đã trở thành một biểu tượng của văn hóa phát triển phần mềm. Khóa nhập môn khoa học máy tính CS50 của Đại học Harvard đã đưa nhân vật vịt vào công cụ giảng dạy, còn trang hỏi đáp Stack Overflow từng khiến mọi người bật cười vào ngày Cá tháng Tư năm 2018 khi cho xuất hiện một chú vịt lắng nghe câu hỏi của người dùng rồi chỉ kêu “quạc”.

Phương pháp này cũng có thể áp dụng nguyên vẹn cho những vấn đề ngoài mã lập trình. Khi lập luận trong báo cáo trở nên rối rắm, khi bí cách giải một bài toán, hay khi nội dung thuyết trình chưa trôi chảy, hãy đặt một chiếc ghế trống hoặc một con thú bông trước mặt rồi giải thích từ đầu; điểm bế tắc sẽ hiện rõ. Trước khi gửi câu hỏi cho đồng nghiệp, thử giải thích cho vịt trước thường giúp bạn tự tìm ra câu trả lời; ngay cả khi chưa tìm được, câu hỏi cũng sẽ rõ ràng hơn nhiều.

Có những sai sót chỉ hiện ra khi được nói thành lời. Tạo thói quen kể từng bước cho vịt nghe về vấn đề đang bế tắc chính là bước đầu tiên để tự tìm ra câu trả lời và giải quyết vấn đề.