Minh viết đủ năm bước, rõ ràng từng chữ. Robot của CLB làm đúng-y — rồi dừng khựng ngay từ bước đầu tiên, báo lỗi. Sao lại thế?
Ở CLB Rô-bốt, thầy Huy có một con robot đồ chơi biết đi theo lệnh — gõ đúng lệnh là nó làm.
Minh mê con robot này lắm. Nó không to, chỉ cỡ hộp giày, nhưng gõ lệnh vào là nó nhấc tay, quay đầu, đi tới đi lui — làm đúng-y những gì được gõ.
Hôm nay Minh muốn thử một việc khó hơn hẳn mọi lần: "lập trình" cho robot tự pha một cốc nước cam. Minh gõ ra đúng năm dòng lệnh, chắc chắn là đủ:
Bống đứng cạnh, gật gù: "Rõ ràng thế này thì chạy ngon rồi." Minh cũng nghĩ vậy. Bấm nút chạy — chắc mẩm chỉ vài giây nữa là có cốc nước cam đầu tiên do chính mình "lập trình" ra.
Nếm thử trong đầu: nếu là em, em có nghĩ năm dòng lệnh trên đã đủ để một cái máy làm ra cốc nước cam chưa? Cứ giữ câu trả lời đó, lát quay lại xem đúng không nhé.
Robot làm đúng-y từng chữ Minh viết — và dừng khựng lại, ngay bước đầu tiên.
Đèn báo lỗi trên ngực robot nhấp nháy đỏ. Màn hình nhỏ hiện dòng chữ: Không thực hiện được bước 1.
Minh sững người. Bước 1 chỉ có mỗi "Lấy quả cam" — đơn giản đến mức chẳng có gì để sai cả. Cánh tay robot đưa ra, kẹp lấy quả cam thật, rồi dừng lại y như đang chờ lệnh tiếp theo mà không biết làm gì với nó.
Bống cũng ngơ ngác: "Lạ nhỉ, lệnh đâu có sai chữ nào." Cả hai đứa đọc đi đọc lại năm dòng lệnh, không thấy chỗ nào viết nhầm hay thiếu dấu.
Minh ngồi thừ ra cạnh robot, không phải vì bực — mà vì thấy vô lý quá.
Từng bước Minh viết ra đều đúng. Đều rõ ràng. Chẳng có chữ nào sai, chẳng có dấu chấm nào thiếu. Vậy sao robot — cái máy vốn chỉ biết vâng lời tuyệt đối — lại không làm được ngay từ bước dễ nhất?
Minh chạy đi tìm thầy Huy, kể lại từ đầu: "Con viết đúng hết mà thầy, sao nó vẫn báo lỗi ngay bước 1?"
"Con thử làm chậm lại xem — để lấy được nước cam từ một quả cam, tay con phải làm bao nhiêu việc, chứ không phải chỉ mấy chữ con gõ?"
Minh ngẫm nghĩ. Bống cũng đứng cạnh, im lặng một lúc lâu — như đang cố hình dung lại đúng-y cái tay mình vẫn làm mỗi sáng.
Minh vừa hình dung lại động tác vắt cam trong đầu, thì khựng lại — giống hệt robot.
Trước khi vắt được nước, quả cam phải được bóc vỏ đã. Ai cũng làm thế, tự động, chẳng ai từng phải nghĩ ra nó, chẳng ai từng viết nó thành lời. Nó "hiển nhiên" tới mức Minh quên hẳn là nó tồn tại.
Nhưng với robot thì khác. Robot không có "hiển nhiên". Nó chỉ có đúng-y năm dòng lệnh được gõ vào — và giữa "Lấy quả cam" với "Vắt lấy nước", với nó, chẳng có gì cả.
Vậy cái việc Minh vừa làm — viết ra từng bước cho robot — nói cho đúng, gọi là gì?
Việc viết ra một chuỗi lệnh chi tiết, không bỏ sót bước nào, để máy làm theo đúng-y, gọi là LẬP TRÌNH (programming).
Bản lệnh Minh viết ra — cả năm dòng, kể cả những chỗ còn thiếu — gọi là một CHƯƠNG TRÌNH (program). Và thứ dùng để viết ra chương trình đó, một hệ thống từ và ký hiệu mà máy hiểu được, gọi là NGÔN NGỮ LẬP TRÌNH.
Nghe có vẻ là ba chữ to tát. Nhưng thật ra Minh vừa làm đúng-y việc đó rồi — chỉ là làm thiếu một bước.
Vì từ giờ, mỗi lần một chương trình "không chạy đúng", em sẽ không còn nghĩ máy "dở hơi" nữa — mà sẽ hỏi đúng câu: chỗ nào trong chương trình đang thiếu một bước mà người viết tưởng là hiển nhiên?
Chặng này giải thích kỹ hơn lập trình thật ra là việc gì — chặng quan trọng nhất bài.
Lập trình là dịch một ý tưởng của con người — thứ vốn có rất nhiều bước ngầm hiểu, chẳng ai buồn nói ra — thành một chuỗi lệnh mà máy có thể thực hiện từng bước một, không thiếu bước nào, không mơ hồ chỗ nào.
Không được để sót bất cứ bước nào chỉ vì nó quá quen thuộc với người. Bóc vỏ cam cũng phải được viết ra, y như "vắt lấy nước".
Bóc vỏ phải đứng trước vắt nước. Đổi chỗ hai bước là chương trình hỏng, dù cả hai bước đều đúng.
"Làm cho ngon" thì máy chịu. Phải là những chữ, những lệnh cụ thể mà máy nhận ra được, không còn khoảng trống để đoán.
Đây chính là hệ quả trực tiếp của điều đã học ở bài Thuật toán: máy không tự "đoán bù" phần thiếu. Một thuật toán đúng mà thiếu một bước khi lập trình ra vẫn thất bại y như một thuật toán sai.
Không phải người gõ nhanh nhất. Người lập trình giỏi là người nghĩ ra và liệt kê được HẾT các bước, kể cả những bước tưởng "hiển nhiên" với người — như chuyện bóc vỏ quả cam.
Không cần có robot mới thấy được điều này. Dạy một em nhỏ buộc dây giày cũng y hệt vậy.
Thử nói với một em chưa biết buộc dây giày bao giờ: "Buộc dây giày lại đi." Em sẽ đứng đó, cầm hai đầu dây, không biết làm gì tiếp — y như robot đứng khựng ở bước 1.
Không phải vì em "dốt". Mà vì câu lệnh đó thiếu từng bước cụ thể: bắt chéo hai dây, luồn vòng, kéo chặt... Với em, chưa từng làm thì chẳng có gì là "hiển nhiên" cả.
Thử tưởng tượng: nếu không có lập trình — nếu chưa ai từng nghĩ ra cách viết đủ từng bước cho máy — thì sao?
Không có lập trình, sẽ không có cách nào bảo máy tính làm bất cứ việc gì phức tạp hơn một phép tính đơn giản. Không có ứng dụng, không có trò chơi, không có gì cả — vì mọi thứ đó, trước khi tới tay em, đều bắt đầu từ việc ai đó ngồi lập trình ra nó.
Con robot bé nhỏ ở CLB, cái app em vẫn mở mỗi ngày, con robot hút bụi ở nhà — tất cả đều đi ra từ đúng-y một việc: có người đã ngồi lập trình cho nó, từng bước một, không thiếu bước nào.
Chuyện này không chỉ có ở CLB Rô-bốt của thầy Huy. Rất có thể em cũng đã gặp nó rồi.
Những app học lập trình bằng khối lệnh kéo-thả như Scratch — mỗi khối chính là một bước, phải xếp đúng thứ tự thì nhân vật mới chạy đúng ý.
Robot hút bụi ở nhà chạy đúng theo một chương trình đã lập sẵn: đi tới đâu, quay đầu khi nào, sạc pin lúc nào hết điện.
Và cả những lần em thấy "app bị đơ" — phần lớn không phải vì máy hỏng, mà vì chương trình gặp đúng một tình huống mà người lập trình đã quên tính tới. Y hệt chuyện quả cam chưa bóc vỏ.
Không chấm điểm đâu — bấm vào câu em nghĩ là đúng, xem gợi ý bên dưới.
1. Robot dừng lại ở bước vắt cam vì lý do gì — vì nó "lười", hay vì thiếu đúng-y một bước trong lệnh?
2. Nếu em viết đủ 99% các bước nhưng thiếu đúng 1 bước quan trọng, chương trình có "tự hiểu" và làm đúng phần còn thiếu không?
3. Theo cuốn sách, người lập trình giỏi là người thế nào?
Đọc xong bài, chắc em còn thắc mắc gì đó chưa được giải thích hết. Viết ra đây, không cần đúng-sai, chỉ cần thật.
Cuộn nốt xuống dưới nhé — sắp xong trang này rồi!
Nếu chỉ được nhớ một câu từ cả bài này, hãy nhớ câu này.
Tối đó Minh kể lại cho bố nghe chuyện quả cam chưa bóc vỏ — và thử rút cả câu chuyện xuống còn đúng một câu, ngắn nhất có thể.
Từ giờ mỗi lần thấy một chương trình, một app, hay chính con robot ở CLB làm sai điều gì đó, Minh sẽ không còn nghĩ "chắc nó hỏng" nữa — mà sẽ tự hỏi: có bước nào ở đây đang bị coi là "hiển nhiên" mà chẳng ai viết ra không?