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

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

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

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 đề

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

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 đề.