À RA LÀ VẬY! · MƯỜI CHẶNG

Viết hướng dẫn cho một người máy ngoan cố

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ế?

nó làm đúng từng chữ không hơn, không kém
CHẶNG 1

Chuyện là thế này

Ở 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.

Trước khi đọc tiếp, thử tự hỏi mình

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é.

1. Lấy quả cam 2. Vắt lấy nước 3. Cho vào cốc 4. Cho đường 5. Khuấy đều MINH GÕ NĂM DÒNG LỆNH robot đứng chờ, cam và cốc để sẵn
Minh chắc mẩm năm dòng lệnh này là đủ — quả cam và cái cốc đã để sẵn ngay bên cạnh robot.
CHẶNG 2

Rắc rối xuất hiện

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.

LỆNH MINH VIẾT 1. Lấy quả cam 2. Vắt lấy nước 3. Cho vào cốc 4. Cho đường 5. Khuấy đều ROBOT LỖI — BƯỚC 1 dừng khựng ngay từ bước đầu tiên
Từng dòng lệnh đều đúng chính tả, đúng thứ tự — vậy mà robot vẫn không nhích qua nổi bước đầu tiên.
CHẶNG 3

Tại sao lại vậy nhỉ?

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?"

Thầy Huy chỉ hỏi ngược lại một câu

"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 nhắm mắt, hình dung lại cầm cam bóc vỏ? bổ đôi vắt nước
Chậm lại từng động tác tay, Minh mới nhận ra: giữa "cầm quả cam" và "vắt nước" còn cả một khúc tay mình vẫn làm mà chưa từng gọi tên.
CHẶNG 4

À!

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ả.

1. LẤY QUẢ CAM có trong lệnh ??? BÓC VỎ bước bị thiếu — không có trong lệnh 2. VẮT LẤY NƯỚC có trong lệnh với người thì bước này "tự hiểu" — với máy thì không nói ra là không có
Không phải Minh viết sai. Minh chỉ quên nói ra đúng một bước mà mình chưa từng phải nghĩ tới.
Với người, có những bước
tự động ai cũng hiểu ngầm.
Với máy, không có trong lệnh
thì coi như không tồn tại.
CHẶNG 5

Gọi tên nó

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ì sao biết ba chữ này lại có ích?

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?

LẬP TRÌNH việc làm — viết ra đủ từng bước CHƯƠNG TRÌNH kết quả — bản lệnh đã viết ra xong NGÔN NGỮ LẬP TRÌNH công cụ để viết ngôn ngữ lập trình là thứ dùng để làm ra chương trình đó
Ba chữ, ba vai trò khác nhau — nhưng Minh vừa làm cả ba việc đó, chỉ là làm thiếu một bước.
CHẶNG 6

Bản chất thật sự

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.

  1. Nghĩ ra đủ các bước — kể cả bước "hiển nhiên"

    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".

  2. Sắp đúng thứ tự — không đảo lộn

    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.

  3. Viết bằng ngôn ngữ máy hiểu được — không mập mờ

    "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.

Ý TƯỞNG CON NGƯỜI nhiều bước ngầm hiểu LẬP TRÌNH liệt kê hết bước, đúng thứ tự, không mập mờ CHƯƠNG TRÌNH máy làm theo đúng-y từng bước
Lập trình là công đoạn ở giữa: biến một ý tưởng còn nhiều chỗ ngầm hiểu thành một chuỗi lệnh không còn chỗ nào để máy tự đ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.

Vậy ai mới là người lập trình giỏi?

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.

CHẶNG 7

Một ví dụ khác

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ả.

"BUỘC DÂY GIÀY LẠI ĐI" NÓI ĐỦ TỪNG BƯỚC cầm hai đầu dây... rồi đứng im, không biết làm gì tiếp 1. bắt chéo hai dây 2. luồn một dây qua vòng 3. kéo chặt lại 4. làm một vòng tai thỏ 5. luồn dây kia qua, kéo chặt → em làm được ngay
Nói đủ từng bước thì em làm được ngay, dù trước đó chưa biết gì — không hề vì em bỗng dưng "thông minh" hơn.
CHẶNG 8

Nếu không có nó thì sao?

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ó.

NẾU KHÔNG CÓ LẬP TRÌNH Không có app nào chạy được, kể cả cái đơn giản nhất
Robot đồ chơi chỉ đứng yên, không nhấc tay được
Mỗi máy tính chỉ là một cục kim loại không biết làm gì
VÌ CÓ LẬP TRÌNH Mọi app, mọi trò chơi em dùng đều có người lập trình ra
Robot làm theo đúng-y từng lệnh, kể cả lệnh phức tạp
Máy tính trở thành công cụ làm được cả nghìn việc khác nhau

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.

KHÔNG CÓ LẬP TRÌNH CÓ LẬP TRÌNH chỉ là cục kim loại, đứng im nhấc tay, đi tới đi lui, làm được việc
Cùng một khối kim loại — có lập trình hay không quyết định nó là đồ vô dụng hay một công cụ làm được cả nghìn việc.
CHẶNG 9

Em đã gặp nó ở đâu rồi?

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ỏ.

bắt đầu đi tới 10 bước quay 90 độ lặp lại KHỐI LỆNH SCRATCH ROBOT HÚT BỤI ĐI THEO ĐƯỜNG ĐÃ LẬP TRÌNH
Từ khối lệnh kéo-thả tới robot hút bụi trong nhà — chỗ nào cũng là những bước đã được viết ra sẵn, đúng thứ tự.

Đọc xong rồi, thử tự kiểm tra nhé

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òn phần em — câu hỏi của riêng em là gì?

Đọ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!

    CHẶNG 10

    Kể lại cho bạn trong 30 giây

    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ể.

    "con quên nói bóc vỏ cam!"
    Kể lại chuyện quả cam cho bố nghe, Minh mới thấy nó buồn cười thật — nhưng cũng nhớ nó lâu hơn hẳn.
    Lập trình không phải nói chuyện với máy —
    mà là viết ra từng bước
    không được thiếu bước nào.

    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?