“Lớp này có bạn nào được tuyển thẳng mà học dốt vật lý không thế?”
— Thầy Trịnh Văn Chiến, trong một tiết học Electronics for IT Lab, kì 2022.2
Chào bạn, tôi là Tiểu Phương, thành phần sinh viên được tuyển thẳng nhờ một bài thi chuẩn hoá. Là một trong những thứ gây ngán ngẩm với không ít thầy cô ở Bách Khoa. Học lệch chỉ một môn, hoặc không quá chú trọng chuyện học và thi đại học khi vốn dĩ đã đủ điều kiện đỗ – những sinh viên như tôi xách ba lô đến trường đầy đủ người ngợm nhưng kiến thức thì hay thiêu thiếu ở đâu đó.
Tệ hơn là không phải hổng, mà còn chẳng có tí gì để được gọi là “thiếu”…
Tôi chọn học Công nghệ thông tin, trong khi suốt 3 năm cấp ba và 4 năm cấp hai trước đó, tôi không viết một dòng code nào. À, thực ra là cấp hai tôi đã có từng “code” một chút. Nó như thế này:

Sau đúng năm lớp 8 định mệnh đó, tôi không đụng đến code một lần nào nữa.
Tôi chọn ngành này vì những hoạt động ngoại khoá mình tham gia sau đó; chứ không phải qua những gì được dạy ở trường.
Lên Đại học khiến tôi choáng váng. Những bài thi bấm giờ. Code giấy. Compile bằng não, để đoán ra chương trình lỗi thực thi hay lỗi biên dịch. Cùng bạn học hùn hạp làm những component để ghép lại thành một sản phẩm.
Tôi chật vật code, với khối lượng ít nhất có thể mà vẫn đủ sống sót. Với tôi, việc code là một vấn đề cảm xúc nhiều hơn là một vấn đề về sự chăm chỉ, cũng giống như giảm cân hay bỏ hút thuốc lá chẳng hạn.
Sau hai năm, cuối cùng tôi đã bước đầu gỡ được dần cho mình cái mác “sợ code”. Xin chia sẻ cùng bạn 3 bài học lớn nhỏ của tôi ngày hôm nay.
1 – Dành quá nhiều thời gian cho một bài toán
Thời gian lâu nhất mà bạn dành ra để giải quyết một bài toán là bao lâu?
Tính đến thời điểm này, kỉ lục của tôi là 1 tháng. Đó là năm lớp 11, khi tôi bỗng dưng có một ý định là mình sẽ cài Ubuntu nghịch chơi. Cũng chẳng vì lí do gì đặc biệt, tự dưng trong đầu tôi nảy ra thế. À, hoặc có thể đó là do khi ấy tôi đang dùng một con máy HP Folio tới tay tôi đã là hàng “third-hand”, lag lòi ra, thấy người ta bảo dùng Linux đi, phần cứng yếu vẫn chạy ngon lành, nên tôi mới có động lực chăng.
Tôi mày mò làm USB boot, phân vùng ổ cứng, back up các kiểu. Đến phần quan trọng nhất (và đáng ra nhẹ nhàng nhất) là cắm USB vào và boot hệ điều hành mới vào phân vùng tôi đã chia sẵn – thì mãi tôi không làm được. Hay nói đúng hơn là cái trình bootup của nó tương đối khó hiểu. Tôi chỉ có vài giây để bấm một tổ hợp phím, thứ sẽ đưa tôi đến phần setup. Nhưng lắm lúc bấm thì nó không vào, hoặc lúc vào rồi thì không chọn nhanh tay thì sau khoảng vài phút nó lại boot Windows gốc lên – tôi lại phải quay lại làm mọi thứ từ đầu.
Hồi ấy chưa có ChatGPT, mà tôi cũng còn mù công nghệ lắm, nên tất cả những gì tôi làm là tìm Google và đọc. Nói là “cào Internet ra mà đọc” kể cũng không quá lắm đâu. Tôi còn viết cả một cái document dài ngoằng, đầu dòng ghi ngày tháng năm, kế đó ghi những gì tôi đã thử và những gì đúng sai trong ngày hôm đó.
Trên bảng, cô giáo giảng văn bản mới “Hai đứa trẻ”. Dưới lớp, tôi ngồi sát cửa sổ nhìn ra ngoài, tay chống cằm nghĩ xem máy mình dùng UEFI hay BIOS.
Cuối cùng thì tôi cũng cài cắm thành công. Song sau đấy cũng phải lật đật nhặt lại gốc Văn. (Hồi ấy tôi học khối chuyên thuộc Khoa học xã hội, nên học Văn khá quan trọng.)
Lên đại học, tôi vẫn tiếp tục tinh thần “không được không về” – ngồi với một bài toán cho đến khi nào giải bằng được nó mới thôi. Tôi là đứa cuối cùng ngồi lại phòng máy trong các tiết thực hành – chỉ ra về khi thầy yêu cầu tắt đèn đóng cửa, hoặc đói quá phải đi ăn.
Tôi biết mình code kém, lại cũng học chậm hơn các bạn, nên cũng biết lối mà lên LeetCode, Codecademy, HackerRank các kiểu để học. Nhưng ở đấy tôi lại tiếp tục cái trò cứng đầu ở trên. Hay nói đúng hơn là cái tôi to: Mình mà không giải được bài này á!?
Kết cục là tôi mất rất nhiều thời gian, mà không học được hay giải được bao nhiêu. Một bài LeetCode mà ngồi cả tuần thì đúng là… cạn lời (nói nhỏ: nó còn được đánh dấu là “Easy” nữa kìa!).
Trong cuốn “A Mind for Numbers”, giáo sư Babara Oakley có giới thiệu về hiệu ứng Einstellung: Khi bạn đang giải một bài toán, một ý tưởng có sẵn trước đó sẽ cản trở việc bạn tìm thấy một lời giải hay ý tưởng tốt hơn.
Một hình ảnh dễ hình dung hơn cho hiệu ứng này là về chuyện một cốc nước đầy: Nếu bạn không làm cách nào cho nước trong cốc vơi đi, thì không thể nào đổ nước mới vào cốc được.
Đôi khi cố gắng quá độ lại là một phần của vấn đề. Chúng ta bị kẹt trong “chế độ tập trung” (focus mode) và nghĩ theo lối mòn. Việc nghỉ ngơi, cho bản thân làm việc khác – cho phép bộ não chuyển về “chế độ phân tán” (diffuse mode), thứ đem đến nhiều kết nối sáng tạo và những lời giải hay không ngờ đến.
Giải pháp
- Đứng trước một bài toán, chỉ nên dành tối đa 45 phút – 1 giờ cho nó. Dù sao thì đây cũng là khoảng thời gian chúng ta còn giữ được sự tập trung, cũng như trong phỏng vấn thật thì cũng có ngần ấy để suy nghĩ.
- Sau khoảng này, kể cả có làm được hay không, xem lời giải của những người khác. Đọc code và hiểu tại sao.
- Đọc ít nhất 3 lời giải khác nhau.
- Code lại. Viết lại từng chữ một để nhớ hơn và quen với syntax. Khi học như thế này tôi không dùng autocomplete hay GitHub Copilot nữa.
- Chuyển sang bài tiếp theo.
2 – Trì hoãn bằng… những thứ không phải code
“Anh hỏi em mấy câu, giúp em học với… mai em thi Lập trình hướng đối tượng rồi, hic hic.”
“Ờ, thế nói cho anh nghe định nghĩa OOP là gì?”
Tôi ậm ờ một lúc, rồi sau đó cố gắng nặn chữ từ những gì mình còn nhớ trong slide khi ôn tập hồi sáng. “Là… là xây dựng nên những lớp (class), trong đó thì mỗi class có thuộc tính và hành vi. Thuộc tính thì bao gồm…”
“Chẹp…” Anh thở dài, ngắt lời tôi. “Em ít khi code đúng không?”
Một câu nói đâm trúng tim đen.
Làm bài nhóm, mình thường là đứa không phải code hoặc code cực kì ít – chính vì bản thân có xu hướng trốn tránh cái mình làm dở làm kém; cộng với việc khá tài tình trong công cuộc làm những thứ râu ria khác nên hay được giao hoặc nhận làm luôn. Làm slide? Viết LaTeX? Soạn report? Thiết kế UI? Làm gì cũng được, miễn không phải là code, làm ơn đấy!
Mình đi học chẳng thiếu buổi nào, nhưng đi học chỉ là một khoảng rất nhỏ trong phần thời gian đáng ra phải dành cho việc luyện tập.
Kết cục cho sự trốn tránh kia là cái gì mình cũng làm ngon ơ: Thiết kế, viết lách, thuyết trình,… Nếu như môn chuyên ngành đi theo cặp (Môn lí thuyết – môn thực hành) thì điểm môn lí thuyết luôn cao. Thay vì ngồi code, mình học có mỗi lí thuyết mà thôi.
Chỉ có code là kém vẫn hoàn kém. Và dĩ nhiên, điểm thực hành thì bê bối khỏi nói.
Giải pháp
Code giống như tập một kĩ năng – việc thực sự ta cần làm không phải là đi mua thêm gear, làm thêm dăm bảy kế hoạch đẹp đẽ, xem hay đọc về những người đang làm nó – mà là code.
Muốn giỏi hơn? Hãy luyện tập chính kĩ năng đó. Chỉ đơn giản thế thôi.
Luyện tập thế nào? Qua hỏi han bạn bè và tìm kiếm người thầy Internet, mình xin gợi ý một đường hướng cơ bản như thế này:
- Chọn một trang web “luyện ngón” code mà bạn yêu thích: Codeforces, LeetCode, HackerRank… Lập tài khoản.
- Chọn ngôn ngữ/ chủ đề mà bạn quan tâm, muốn luyện tập.
- Bắt đầu làm bài từ mức “Easy”, mức dễ nhất. Nhớ cách tiếp cận ở phần Giải pháp của mục 1.
- Tiến lên dần với những bài toán khó hơn.
- Khi bạn đã cảm thấy phần nào thoải mái (cái này mỗi người tự định nghĩa, nhưng hãy đặt cho mình những mục tiêu cân đong đo đếm được), cân nhắc việc bắt tay vào làm một project.
Việc làm này sẽ giúp bạn có cái nhìn tốt hơn về những gì mình học, xem xem chúng được áp dụng thế nào, thực tế yêu cầu gì – thay vì chỉ chăm chăm học và giải như một cái máy. Đó cũng có thể là một thứ hữu dụng để bạn đưa vào CV và phát triển lên thành dự án cá nhân lớn hơn.
3 – Nhận đề bài? Xông vào code luôn
Khi nhận một đề bài, chúng ta thường phạm phải hai sai lầm:
- Xông vào code luôn
- Nghĩ về cách viết code cho lời giải, thay vì cách giải của bài toán
Trong đó sai lầm thứ nhất thường hay gặp phải bởi những người mới. Với những bài ở mức độ “Hello World”, việc code ngay lập tức hoàn toàn không có vấn đề gì. Lời giải thường có ngay chỉ sau khi đọc xong đề bài, và ta có thể viết ra ngay lập tức.
Tuy nhiên, cách làm này lại không hiệu quả, thậm chí gây hại khi chúng ta tiến đến những bài toán phức tạp hơn.
Việc code mà không nháp trước sẽ khiến cho ta:
- Hiểu sai/ không kĩ đề bài, bỏ sót dữ kiện, điều kiện;
- Nghĩ qua trong đầu, tưởng là giải được, sau đó code mãi không được vì dòng suy nghĩ còn rối rắm;
- Code bẩn;
- Lỗi logic, bug tùm lum, mất thời gian đi sửa.
Được thôi, thế giờ tôi nháp trước khi làm bài. Hết rồi chứ?
Tốt, nhưng bạn vẫn chưa xong đâu.
Đối với sai lầm thứ hai, khi chúng ta nghĩ về cách giải một bài toán, thứ chúng ta thực sự nghĩ là cách để code lời giải. Có một sự khác biệt lớn giữa hai lối tư duy này.
Ví dụ như bài “Same Tree” trên LeetCode:

Trong bài này, chúng ta được cho 2 gốc của hai cây nhị phân, và cần phải nói được liệu hai cây này có giống nhau hay không.
Một người mới, nghĩ theo lối code lời giải – sẽ bắt đầu nghĩ về việc so sánh giá trị giữa 2 nút gốc; và nếu hai nút này bằng nhau, tiếp tục kiểm tra và so sánh hai nút con bên trái với nhau và hai nút con bên phải với nhau.
Nhưng hãy giả dụ bây giờ bạn hoàn toàn không biết code.
Hãy nghĩ về đề bài: Thứ gì cần để hai cây nhị phân được coi là giống nhau?
Nút gốc giống nhau, nút bên trái giống nhau, và nút bên phải giống nhau.
Và khi bạn nhìn ra điều đó, lời giải chỉ còn là 1 dòng code duy nhất:

Ví dụ trên đây là lời giải thích rất hay từ Sahil (Power Couple) về sai lầm trên. Tôi thực sự đã học được nhiều từ anh chàng Ấn Độ này. Rất khuyến khích bạn xem nha:
Giải pháp
- Khi nhận một đề bài, hít vào thở ra, bình tĩnh, đọc kĩ một lượt. Xem xem nó hỏi gì. Minh hoạ ví dụ thế nào. Giới hạn các biến (constraint) ra sao. Hiểu nó yêu cầu mình làm gì.
- Rút giấy ra và nháp. Phần này nên là phần chiếm thời gian nhiều nhất. Chúng ta suy nghĩ và hoạch định ra phương án giải quyết vấn đề.
- Code lại, hiện thực hoá ý tưởng phía trên.
Lời bạt
Nói đi học người đủ não thiếu vậy thôi, chứ tôi nghĩ rằng đi học Đại học mà bạn thấy bạn “đủ cả rồi” thì một là bạn hơi bị… chểnh mảng, hai là trường Đại học vốn không dành cho bạn. Kể cả bạn có là thủ khoa, á khoa của một tổ hợp THPT QG nào đó. Đi học mà không nhận ra mình còn thiếu, còn yếu kém, thì chẳng có chỗ nào cho sự phát triển.
Nhân dịp các trường Đại học tưng bừng công bố điểm chuẩn (trong đó có trường tôi), tôi viết bài này hi vọng giúp đỡ một ai đó: đã, đang hoặc sẽ trải qua những gì giống như mình đã từng.
Nhìn điểm chuẩn với những con số cao chót vót đến mức bực mình, tôi nghĩ mình có thể đem thứ gì đó hay ho hơn đến bàn thảo luận – thay vì cái vỗ ngực “IT là vua của mọi nghề” vô thưởng vô phạt. Vào được trường không có nghĩa là xả hơi, mà cũng chẳng có nghĩa là nghiễm nhiên trở thành “chiến thần”: Đó chỉ là một bước tiếp theo trong quá trình hoàn thiện bản thân bạn.