Ngưỡng Cửa Lập Trình
Trong ngành công nghiệp game, công việc thiết kế thường được chia thành ba lĩnh vực chính: lập trình, mỹ thuật và thiết kế gameplay - cả ba đều đóng vai trò quan trọng như nhau. Đây chính là điểm khác biệt lớn so với các ngành IT khác. Tuy nhiên, trong ba lĩnh vực này, lập trình luôn được xem là có ngưỡng cửa cao nhất. Rất ít họa sĩ chuyên nghiệp hay nhà thiết kế gameplay có thể tự biến mình thành lập trình viên chuyên nghiệp chỉ bằng cách tự học từ con số không.
Về bản chất, kiến thức nền tảng của lập trình không quá phức tạp. Về lý thuyết, chỉ cần đầu tư thời gian luyện tập, bất kỳ ai cũng có thể trở thành lập trình viên xuất sắc. Các thành viên trong nhóm càng hiểu biết lẫn nhau về công việc của từng lĩnh vực, hiệu suất làm việc càng được nâng cao. Nhưng tại sao nhiều người dù đã cố gắng vẫn không thể bước qua cánh cửa lập trình? Kết quả là đa số họa sĩ không thể viết script cho 3ds Max hoặc Maya, các nhà thiết kế gameplay cũng không thể tự xây dựng những cấu trúc script phức tạp.
Vậy rốt cuộc ngưỡng cửa lập trình nằm ở đâu? Điều gì khiến những người không chuyên về lập trình gặp khó khăn khi tiếp cận với những script đơn giản? Là một lập trình viên có nhiều năm kinh nghiệm, tôi gần như đã quên mất cảm giác ban đầu khi mới học lập trình. Để tìm câu trả lời, tôi phải đào sâu vào ký ức của chính mình.
Khi nhìn lại, tôi nhận ra mình cũng giống như đa số lập trình viên có trên mười năm kinh nghiệm - chúng tôi đều cho rằng việc học lập trình là điều hiển nhiên. Những người đã thành thạo lập trình thường không nhận ra những khó khăn ban đầu. Nhưng khi hồi tưởng kỹ, tôi nhận ra thực tế không đơn giản như vậy.
Ký ức đầu tiên về lập trình của tôi bắt đầu từ năm 6 tuổi, khi tôi đọc những đoạn code BASIC ngắn ngủi (chỉ khoảng 10 dòng) do cha tôi viết trên chiếc máy tính gia đình. Tôi vừa hiểu vừa không hiểu, thử sửa vài dòng code và cảm thấy thích thú khi thấy chương trình thay đổi theo ý mình. Có lẽ lúc đó tôi đã lờ mờ hiểu được bản chất của lập trình, nhưng thực sự có phải vậy không?
Hai năm sau, khi 8 tuổi, tôi học cách giải phương trình bậc nhất một ẩn. Đối với một đứa trẻ, việc giải hệ phương trình hai ẩn vẫn là thử thách lớn. Tôi từng mơ ước nhập phương trình vào máy tính để có kết quả ngay lập tức. May mắn thay, cha tôi đã dành thời gian giải thích về khái niệm biến và câu lệnh gán. Liệu lúc đó tôi đã thật sự hiểu được lập trình?
Lên 10, tôi quyết định tự viết một trò chơi nhỏ. Nguồn tài liệu duy nhất là cuốn giáo trình BASIC bằng tiếng Trung phồn thể (có lẽ là bản Hồng Kông) đi kèm máy tính. Đồng thời tôi tham gia một khóa học BASIC dành cho sinh viên cao đẳng và hoàn thành xuất sắc mọi bài tập. Tuy nhiên, khi tự viết game, tôi gặp vô vàn khó khăn và dự án đành phải hủy bỏ.
Tôi thực sự cảm thấy mình đã vượt qua ngưỡng cửa lập trình khi 12 tuổi, lúc đó tôi tin rằng có thể dùng code giải quyết mọi vấn đề. Tôi cho rằng “chương trình = thuật toán + cấu trúc dữ liệu” là chân lý tuyệt đối. Cùng năm đó, tôi học lập trình hợp ngữ (assembly) một cách dễ dàng, năm sau tự học xong vài cuốn giáo trình C. Lúc này, việc học lập trình không còn cần sự hướng dẫn của thầy cô nữa. Tính từ lần đầu tiếp xúc lập trình đã 7 năm trôi qua.
Trong nhiều năm sau đó, tôi luôn nghĩ ngưỡng cửa lập trình rất khó vượt qua. Việc tự học lập trình và tiếp thu kiến thức mới dường như cần một sự “giác ngộ”. Đến khi vào đại học, một người bạn cùng phòng chỉ mất chưa đầy nửa năm đã thành thạo lập trình, tôi mới nhận ra yếu tố tuổi tác cũng rất quan trọng. Người trưởng thành thường dễ tiếp cận lập trình hơn trẻ nhỏ.
Theo tôi, ngưỡng cửa thực sự nằm ở phương pháp học tập. Phần lớn mọi người khi bắt đầu học thứ mới đều dùng phương pháp suy luận tương tự. Chỉ cần hiểu đặc điểm bề ngoài của một vấn đề, họ có thể suy luận cho các vấn đề tương tự. Ví dụ, khi dạy trẻ đi mua tương, bạn dẫn nó đến cửa hàng, đưa chai tương và tiền cho nhân viên, rồi mang tương về. Một đứa trẻ thông minh lần sau sẽ tự biết đi mua thuốc lá, qua đó nhận ra tiền quan trọng hơn chai tương.
Chúng ta thấy nhiều người có thể làm các công việc script cơ bản. Họ cần một mẫu tham khảo, sau đó chỉnh sửa theo ý mình. Đơn giản thì thay vài tham số, đổi màu sắc; phức tạp hơn thì điều chỉnh logic. Nhưng đây vẫn là học theo kiểu tương tự, chưa chạm đến bản chất của lập trình.
Theo tôi, không ai có thể thành thạo ngôn ngữ lập trình chỉ bằng cách học thuộc bảng cú pháp toán học chặt chẽ. Nhưng lập trình viên giàu kinh nghiệm lại làm được điều đó. Có lẽ vì lập trình dựa trên suy luận logic, ngôn ngữ lập trình được xây dựng trên nền tảng logic. Đây là một phương pháp tư duy thế giới mà nhiều người trưởng thành vẫn chưa thành thạo, dù kinh nghiệm vẫn là yếu tố quan trọng hàng đầu (dĩ nhiên kinh nghiệm cũng rất cần thiết cho lập trình viên).
Qua nhiều năm, tôi thường nhận được email xin mã nguồn từ khắp nơi. Trên mạng, những bài viết “xin code” đã trở nên quá phổ biến. Liệu mã nguồn có quan trọng đến vậy? Theo tôi, với lập trình viên chuyên nghiệp, mã nguồn chủ yếu để tái sử dụng, tiết kiệm thời gian làm việc. Xét theo khía cạnh này, việc tái sử dụng file nhị phân còn có giá trị hơn. Học kiến thức mới qua ví dụ code cũng được nhiều người ưa chuộng, bởi không phải ai cũng thích đọc tài liệu kỹ thuật khô khan. Ngay cả khi học ngôn ngữ mới, việc nghiên cứu vài đoạn code mẫu cũng rất trực quan. Tuy nhiên, việc tìm code tương tự để giải quyết vấn đề tương tự gần như là điều viển vông. Chúng ta thường thấy nhiều “lập trình viên giả hiệu” chỉ biết sửa lung tung vài dòng code, thay đổi vị trí câu lệnh hoặc xóa vài dòng để thử nghiệm xem lỗi có được giải quyết không. Theo tôi, đây chính là biểu hiện của việc chưa thực sự bước qua ngưỡng cửa lập trình.
Hiện nay, sinh viên các ngành kỹ thuật đều được học lập trình. Tuy nhiên, số cử nhân ra trường mà không biết lập trình vẫn rất nhiều. Việc học thuộc lòng đoạn code để đối phó thi cử đã không còn là chuyện cười nữa. Các giảng viên biên soạn giáo trình và giảng dạy cần tự vấn lại phương pháp giảng dạy của mình - phải chăng đã có vấn đề trong cách truyền đạt kiến thức?