Trò chuyện với một đứa trẻ sáu tuổi về lập trình hàm
Bài viết chia sẻ trải nghiệm thú vị khi tác giả dạy con trai sáu tuổi về các khái niệm lập trình hàm thông qua trò chơi "Cỗ máy hàm". Câu chuyện hé lộ những khó khăn thú vị của người mới khi tiếp cận với các khái niệm trừu tượng như hàm hằng và phép tính Lambda.

Trò chuyện với một đứa trẻ sáu tuổi về lập trình hàm
Mới đây, con trai sáu tuổi của tôi đã bước đến và hỏi: "Bố đang đọc cái gì vậy?". Khi đó, tôi đang đọc một phần luận án tiến sĩ về các "định lý tự do" (free theorems). Không biết bắt đầu từ đâu, tôi quyết định trả lời một cách trực tiếp: "Bố đang đọc một câu chuyện rất dài về các định lý tự do".
Đứa trẻ tò mò hỏi tiếp: "Định lý tự do là gì?". Không bao giờ lùi bước trước một thách thức sư phạm, tôi suy nghĩ một chút rồi bắt đầu: "Con có biết hàm số (function) là gì không?". Con bé lắc đầu. Tôi giải thích: "Hàm số giống như một cỗ máy, con bỏ một thứ vào một đầu và một thứ khác sẽ ra ở đầu kia. Ví dụ, con bỏ một con số vào, và con số lớn hơn nó một đơn vị sẽ ra. Vậy nếu con bỏ 3 vào, 4 sẽ ra, hoặc nếu con bỏ 6 vào, 7 sẽ ra".
Hàm cộng 1
Giải thích này dường như hợp lý với cậu bé, nên tôi tiếp tục: "Kiểu của cỗ máy hàm sẽ cho con biết loại thứ gì được bỏ vào và loại thứ gì sẽ ra. Ví dụ, bỏ số vào thì ra số, hoặc bỏ một danh sách các số vào thì ra một số". Cậu bé hào hứng ngắt lời: "Hoặc là có thể bỏ chữ vào??". "Đúng rồi! Có thể bỏ chữ vào và lấy chữ ra. Hoặc có thể có một cỗ máy hàm nơi con bỏ các cỗ máy hàm khác vào và nhận lại các cỗ máy hàm!". Cậu bé kinh ngạc trước ý tưởng bỏ các cỗ máy vào trong các cỗ máy khác.
Tôi kết luận: "Vậy, một định lý tự do là khi con có thể nói điều gì đó luôn đúng về một cỗ máy hàm chỉ dựa trên kiểu của nó, mà không cần biết bên trong nó hoạt động như thế nào". Điều này có vẻ hơi vượt quá khả năng hiểu của cậu bé (thực ra, định lý tự do chỉ thú vị khi có sự tham gia của đa hình - polymorphism, điều tôi chắc chắn không muốn đi sâu vào). Nhưng toàn bộ cuộc trò chuyện đã cho tôi một ý tưởng khác.
Trò chơi "Cỗ máy hàm"
"Tớ có một ý tưởng hay cho một trò chơi", tôi nói. "Nó gọi là trò chơi Cỗ máy hàm. Bố sẽ nghĩ ra một cỗ máy hàm. Con nói cho bố biết những thứ cần bỏ vào cỗ máy, và bố sẽ nói cho con biết thứ gì ra. Sau đó con phải đoán xem cỗ máy hàm đó làm gì". Cậu bé thích trò chơi này ngay lập tức và nó trở nên cực kỳ phổ biến; cậu bé muốn chơi mọi lúc. Chúng tôi đã chơi nó khi lái xe đến tiệc tối qua, và chơi sáng nay khi tôi đang tắm.
Cho đến nay, cậu bé đã đoán đúng các hàm sau:
Hàm nhân đôi
Tôi đã thử hàm nhân với 10, nhưng đó là một chút khó khăn với cậu bé. Tôi nhận ra rằng trong một số trường hợp, cậu bé có thể hiểu trực giác hàm đó làm gì nhưng gặp khó khăn khi diễn đạt bằng lời (điều này cũng xảy ra với các hàm phức tạp hơn), vì vậy chúng tôi bắt đầu sử dụng biến thể rõ ràng nơi khi người đoán nghĩ rằng họ biết hàm làm gì, hai người sẽ đổi vai và người nghĩ ra hàm sẽ chỉ định các đầu vào để kiểm tra xem người đoán có tạo ra đầu ra đúng không.
Những thách thức bất ngờ
Hàm hằng cũng gây khó khăn đáng ngờ cho cậu bé (dù cuối cùng cậu bé cũng đoán đúng). Tôi nghĩ cậu bé bị mắc kẹt vào ý tưởng rằng hàm sẽ thực hiện một phép tính số học trên đầu vào, và gặp khó khăn trong việc tìm ra một quy trình số học nào đó sẽ dẫn đến kết quả là 6 bất kể con bỏ vào cái gì! Cậu bé đơn giản là không nghĩ đến việc cỗ máy có thể không quan tâm đến đầu vào.
Hàm hằng
Thú vị thay, nhiều sinh viên trong lớp lập trình hàm của tôi học kỳ này cũng bị bối rối bởi các hàm hằng khi chúng ta học về phép tính Lambda (lambda calculus); họ thực sự muốn thay thế đầu vào vào một vị trí nào đó và cảm thấy khó chịu/bối rối vì thực tế là biến ràng buộc không xuất hiện trong phần thân của hàm tại all!
Sau vài vòng đoán các hàm của tôi, cậu bé muốn tự nghĩ ra các hàm để tôi đoán (như tôi đã biết cậu bé sẽ muốn). Đôi khi các hàm của cậu bé rất hay và đôi khi chúng không có ý nghĩa (thường là vì ý tưởng của cậu bé về những gì hàm làm thay đổi theo thời gian, điều mà cậu bé, một cách chân thành, phủ nhận), nhưng dù thế nào thì nó cũng vui.
Và sau khi cậu bé cuối cùng cũng hiểu được hàm nhân với 10, cậu bé đã nghĩ ra một hàm riêng của mình, giống như:
Hàm nhân 10
Được truyền cảm hứng, tôi nghĩ, bởi lớp mẫu giáo nơi chúng đang học về các cặp số cộng lại bằng 10. Chắc chắn là một trong những ngày làm cha mẹ tốt hơn của tôi.


