Tư duy lập trình¶
Hay: bắt đầu giải quyết vấn đề càng sớm càng tốt.
Tôi đã dành hơn một ngàn giờ trong hai năm qua để làm việc cùng các học viên ở mọi trình độ về kỹ năng lập trình. Những người gặp khó khăn nhất đều có một điểm chung: khi đối mặt với một vấn đề mới, họ không biết bắt đầu từ đâu. Đây là lý do tôi nghĩ điều đó xảy ra, và cách bạn có thể tránh nó.
Khi bạn mới bắt đầu học lập trình, bạn đang học hai kỹ năng:
1) Cách giải quyết vấn đề, bao gồm việc phân tách một vấn đề thành các bước nhỏ hơn mà nếu thực hiện theo, sẽ dẫn đến lời giải.
2) Cách biểu đạt các bước đó bằng một ngôn ngữ lập trình. Điều này bao gồm việc học các quy tắc và cú pháp của ngôn ngữ lập trình đó.
Đây là hai kỹ năng riêng biệt. Chúng ta giải quyết vấn đề bằng cách chia nhỏ chúng ra mọi lúc mà không cần đến ngôn ngữ lập trình (ví dụ: khi nấu ăn, hoặc tính toán cách chia hóa đơn). Có thể bạn biết rõ các quy tắc và cú pháp của một ngôn ngữ lập trình nhưng vẫn không giải quyết được vấn đề bằng code. Nhưng vì cả hai kỹ năng này đều cần thiết để tạo ra những chương trình có ích, nên người mới bắt đầu phải học cả hai kỹ năng cùng lúc.
Đây thực sự là một thách thức, vì có RẤT NHIỀU thứ để học về quy tắc (rules) và cú pháp (syntax) của một ngôn ngữ lập trình. Tôi học được điều mới về JavaScript mỗi lần sử dụng nó. Và bởi vì có quá nhiều thứ phải học về quy tắc và cú pháp, nên đôi khi người học cảm thấy như đó là tất cả những gì họ cần học, và hoàn toàn bỏ qua kỹ năng giải quyết vấn đề. (Hơn nữa, hầu hết các tài liệu giảng dạy đều tập trung vào quy tắc và cú pháp, vì nó dễ dạy hơn so với tư duy giải quyết vấn đề tổng quát).
Điều này xảy ra mỗi khi chúng ta (đặc biệt là người mới) làm theo tutorial và chỉ đơn giản là sao chép đoạn code mà mình thấy. Hầu hết tutorial đều rất giỏi trong việc chỉ cho bạn các lệnh và chỉ dẫn cần chạy để một thứ gì đó hoạt động, nhưng lại không dạy bạn toàn bộ quá trình suy nghĩ để tìm ra những chỉ dẫn đó là gì.
Vì vậy, khi bắt đầu học lập trình, bạn cần bắt đầu giải quyết vấn đề một cách độc lập càng sớm càng tốt. Ban đầu, những vấn đề này sẽ nhỏ, nhưng điều quan trọng là bạn phải tự mình thử qua tất cả các bước trong "chu trình giải quyết vấn đề" — từ việc phân tích vấn đề thành các bước nhỏ, đến việc đánh giá xem các bước đó có đúng không, và cuối cùng là mở code editor và viết ra các bước đó bằng một ngôn ngữ lập trình.
Hai tài nguyên gợi ý là https://www.codewars.com và https://codestepbystep.com. Codestepbystep đặc biệt có nhiều bài tập rất tốt cho mọi trình độ người mới bắt đầu. Cả hai trang đều có rất nhiều bài tập nhỏ để bạn thực hành "chu trình giải quyết vấn đề" một cách độc lập.
Hãy làm theo quy trình này. Giả sử bạn đang học for-loop. Đầu tiên, hãy tìm tài liệu để học quy tắc và cú pháp. Sau đó, hãy thử tìm ngay các bài toán cần sử dụng for-loop để giải quyết. (Điều này sẽ cải thiện cả kỹ năng giải quyết vấn đề lẫn hiểu biết của bạn về cú pháp for-loop). Bằng cách làm theo quy trình này, bạn sẽ xây dựng nền tảng để giải các vấn đề ngày càng phức tạp hơn (như các bài về cấu trúc dữ liệu và thuật toán trên leetcode) với các công nghệ ngày càng mạnh mẽ hơn (React, Docker), những cũng là kỹ năng giúp bạn kiếm tiền.
Và khi bạn đang cố giải quyết những bài toán đó, hãy cố gắng hiểu từng bước đóng vai trò gì trong việc giải quyết bài toán tổng thể (nói thành lời hoặc viết ra bằng ngôn ngữ tự nhiên (kiểu Tiếng Việt ấy) sẽ rất hữu ích).
Hãy chấp nhận việc bị bí (không nghĩ ra được cách giải). Bị bí là hoàn toàn bình thường. Nếu bạn bị bí nhưng sau đó tiến bộ — dù là tự tìm ra hay nhờ người khác giúp — thì điều đó có nghĩa là bạn đang học được điều gì đó.
Sau khi làm như vậy vài lần, bạn sẽ nhận ra rằng khi đọc đề bài cho một bài tập mới, bạn sẽ ngay lập tức nảy ra một vài bước đầu tiên nên làm gì. Với càng nhiều thực hành, những bước bạn nghĩ đến ngay lập tức sẽ ngày càng gần với lời giải đúng, và bạn sẽ có thể diễn đạt chúng bằng ngôn ngữ lập trình một cách dễ dàng hơn.
Học zui zẻ.
Bài viết được viết bởi Jimmy trên Reddit
Một số gợi ý khác từ phần bình luận¶
Khi giải một bài toán lập trình (coding challenge), tôi sử dụng một phương pháp gọi là PREP (Parameters, Return, Example, Pseudocode):
- Parameters – Bài toán bao gồm những gì? Đầu vào là gì? Có phải chỉ là số, chữ cái, v.v.? Có ký tự đặc biệt nào cần chú ý không?
- Return – Bài toán yêu cầu trả về điều gì?
- Example – Ví dụ về cách giải bài toán.
- Pseudocode – Viết ra pseudocode, tức là các hướng dẫn từng bước để bạn sẽ giải quyết bài toán như thế nào.
Đây là một video phân tích kỹ hơn về cách giải các bài tập lập trình:
👉 https://youtu.be/FS7UxmzYF_M
Về cơ bản thì đây cũng chính là TDD (Test-Driven Development), nhưng phần pseudocode sẽ dần dần trở thành code thật khi bạn thêm vào nhiều phần hơn.
Đồng thời, bạn cũng có thể học môn Cấu trúc dữ liệu và giải thuật với môn Toán rời rạc nhaa!
75 leetcode problems để tu luyện DSA: https://leetcode.com/discuss/general-discussion/460599/blind-75-leetcode-questions