Giải thích lập trình hàm cho một cậu bé sáu tuổi: Khi "Hàm" trở thành trò chơi
Một người cha đã biến các khái niệm trừu tượng của lập trình hàm thành trò chơi thú vị để dạy cho con trai sáu tuổi. Bài viết này cho thấy rằng những ý tưởng như hàm số, kiểu dữ liệu và hàm bậc cao có thể được tiếp cận một cách trực quan ngay cả với trẻ em.

Hôm qua, cậu con trai sáu tuổi của tôi lại gần và hỏi: "Bố đang đọc cái gì?".
Lúc đó, tôi đang đọc một phần của luận vă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 đơn giản: "Bố đang đọc một câu chuyện rất dài về các định lý tự do".
Cậu bé 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 (function) là gì không?". Cậu bé lắc đầu. Tôi giải thích: "Hàm giống như một cái 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 ngoài. Vậy nếu con bỏ ba vào, bốn sẽ ra, hoặc nếu con bỏ sáu vào, bảy sẽ ra".
Hàm cộng một
Cậu bé dường như hiểu ngay lập tức, nên tôi tiếp tục: "Kiểu (type) của máy hàm sẽ cho con biết loại gì được bỏ vào và loại gì sẽ ra. Ví dụ, có thể con bỏ số vào và nhận được số. Hoặc có thể con bỏ một danh sách các số vào và nhận được một số". Cậu bé hào hứng ngắt lời: "Hoặc là có thể bỏ chữ vào??". "Đúng vậy! Có thể bỏ chữ vào và nhận chữ ra. Hoặc có thể có một máy hàm nơi con bỏ các máy hàm khác vào và nhận được máy hàm ra!". Cậu bé kinh ngạc trước ý tưởng về việc đưa các máy hàm vào trong các máy hàm khác.
"Vậy," tôi kết luận, "định lý tự do là khi con có thể nói một điều gì đó luôn luôn đúng về một máy hàm chỉ dựa trên việc biết kiểu của nó, nhưng con không biết gì về những gì nó làm ở bên trong". Điều này có vẻ hơi vượt quá khả năng của cậu bé (và công bằng mà nói, định lý tự do chỉ thú vị khi có liên quan đến đ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.
"Này, bố có một ý tưởng hay cho một trò chơi," tôi nói. "Nó gọi là trò chơi máy hàm. Bố sẽ nghĩ ra một máy hàm. Con nói cho bố biết những thứ cần bỏ vào máy hàm, và bố sẽ nói cho con biết cái gì ra. Sau đó con phải đoán xem 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ở thành một "cú hích" lớn; cậu bé muốn chơi nó mọi lúc. Chúng tôi đã chơi nó khi lái xe đến một bữa tiệc hôm qua, và chơi nó sáng nay khi tôi đang tắm. Cho đến nay, cậu bé đã đoán đúng:
Hàm nhân mười
Tôi đã thử hàm hằng (constant function) nhưng nó hơi khó với cậu bé một chút. 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 khác), 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 một số đầu vào để kiểm tra xem người đoán có thể tạo ra đầu ra đúng hay không.
Hàm hằng cũng đáng ngạc nhiên là khó để cậu bé đoán (dù cuối cùng cậu bé cũng đã đoán đúng).
Hàm hằ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 nào đó lê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 máy có thể không quan tâm đến đầu vào. (Thú vị là, 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ề giải tích Lambda; họ thực sự muốn thay thế đầu vào vào đâu đó và 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 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à tất nhiên 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 đôi, cậu bé đã nghĩ ra hàm riêng của mình, một cái gì đó giống như $10 - x$, được truyền cảm hứng, tôi nghĩ, từ lớp mẫu giáo của cậu bé nơi chúng đang học về các cặp số cộng lại với nhau 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.



