Cách đây hơn một thập kỷ, mình – một sinh viên tài chính – quyết định quay xe sang IT với hành trang gần như bằng 0. Thời điểm đó, mình không chắc mình có theo nổi con đường này không. Kiến thức về lập trình thì mơ hồ, khái niệm về “lập trình viên” cũng không rõ ràng. Thứ duy nhất mình có là… biết bật máy tính và dùng nó như một người dùng bình thường.
Sau học kỳ đầu tiên ở Bách Khoa, mọi thứ có vẻ “sáng” hơn một chút. Mình bắt đầu hiểu rằng để trở thành lập trình viên thì cần học những gì. Nhưng đồng thời, một sự thật khá đau lòng cũng lộ ra: mình không biết cách bắt đầu một dự án.
Nghe thì buồn cười, nhưng thật sự là vậy. Viết một con game tic-tac-toe trên terminal thôi mà mình cũng không biết bắt đầu từ đâu. Trong khi đó, điểm số các môn như nhập môn lập trình hay cấu trúc dữ liệu giải thuật của mình lại khá ổn. Bài toán có input/output rõ ràng? Làm ngon. Thuật toán khó? Cũng không vấn đề. Nhưng khi chuyển sang “thiết kế một chương trình hoàn chỉnh” – tức là ghép nhiều thứ lại với nhau – thì mình đứng hình.
Nói đơn giản: mình giỏi viết từng mảnh, nhưng không biết ghép thành bức tranh.
Bước ngoặt đến từ bài tập lớn đầu tiên – viết một game kiểu Mario, làm một mình. Lần này thì không còn đường lui. Không làm là rớt.
Và đúng nghĩa là hoảng thật. Hoảng tới mức gần như dành toàn bộ thời gian ngoài giờ học chỉ để nghĩ cách làm sao hoàn thành được cái game đó. Nhưng cũng chính từ sự “bị ép vào chân tường” đó, mình bắt đầu làm những thứ trước đây chưa từng làm: tự thiết kế chương trình.
Ban đầu rất đơn giản – chỉ cố pass được mấy test case mẫu. Sau đó mở rộng dần. Mình bắt đầu nghĩ theo kiểu: Mario cần làm gì? → moveRight, moveLeft, jump, fall. Game cần biết gì? → isObstacle, isFloor, isFinished. Rồi thêm cả phần render, nhận input từ người chơi – những thứ thậm chí không bắt buộc trong bài.
Cứ như vậy, từng chút một, mình bắt đầu “nhìn thấy” cấu trúc của một chương trình. Không còn là những function rời rạc nữa, mà là một hệ thống mình có thể điều khiển.
Khi hoàn thành bài đó, mình gần như trở thành một con người khác.
Từ đó về sau, bất kỳ yêu cầu nào – dù nhìn qua có vẻ phức tạp – mình đều có thể bóc tách thành các phần nhỏ hơn, rõ ràng hơn, và bắt đầu code gần như ngay lập tức. Mình không còn chỉ là người “giải bài toán”, mà bắt đầu thực sự trở thành một lập trình viên: biến yêu cầu trong đời sống thành bài toán lập trình và giải nó.
Nhìn lại, bài học rất đơn giản – đơn giản tới mức nghe hơi… vô lý:
Bạn không cần hết sợ rồi mới làm. Bạn cứ vừa sợ, vừa làm.
Cái cảm giác “không biết bắt đầu từ đâu” thực ra không biến mất trước khi bạn bắt đầu. Nó chỉ biến mất sau khi bạn đã đâm đầu vào đủ lâu.
Rồi đến một lúc nào đó, bạn sẽ nhìn lại và tự nói: “Ủa, tưởng gì ghê gớm… hóa ra cũng không khó lắm.”
Chúc bạn sớm có khoảnh khắc đó.