Học lập trình có khó không?

Tháng trước có một bạn mail cho mình tâm sự là bản đang làm công việc cần kĩ năng giao tiếp và cảm thấy không phù hợp, muốn “rẽ nhánh” sang ngành lập trình và đang theo học một khóa học lập trình Java. Qua lời quảng cáo là chỉ cần hoàn thành khóa học là có thể kiếm được việc làm và 1 – 2 năm thì sẽ đạt mức thu nhập tầm 1000$ đổ lại. Nhưng hiện tại thấy khó quá, tình cờ đọc được blog của mình, nghĩ là mình strong về Java nên muốn mình giúp đỡ và cho lời khuyên.

Mình đã không thể đưa ra lời khuyên nào cho bản là nên tiếp tục hay không vì mình không biết background cũng như đam mê của bản như thế nào. Mình chỉ phân tích dựa trên kinh nghiệm cá nhân của mình là để trở thành một lập trình viên (kỹ sư phần mềm) cần phải học nhiều thứ, ban đầu cần có kiến thức toán, kiến trúc máy tính, cấu trúc dữ liệu và giải thuật, cơ sở dữ liệu (database) … rồi sau đó mới học một ngôn ngữ cụ thể để có thể đi làm. Nếu không việc học về sau sẽ càng lúc càng khó, sinh ra chán nản như hiện tại. Việc các bạn sinh viên mới ra trường có được mức lương 1000 – 2000$ thì thực ra các bạn đã có sẵn nền tảng tốt (từ các năm ở phổ thông), trải qua quá trình “học thực sự” (cũng phải mất 3 – 4 năm trước khi tốt nghiệp đại học) mới đạt được.

Trở lại tiêu đề của bài viết, sẽ không có câu trả lời nào đúng với tất cả mọi người. Với mình lập trình cũng như chơi game vậy, dễ để biết nhưng để trở thành cao thủ thì phải tiêu tốn rất nhiều thời gian. Chưa kể cần phải có chiến lược học tập hợp lý. Và bài viết hôm nay, mình sẽ chia sẻ quan điểm của Peter Norvig – Director of Research của Google về chiến lược này, một bài blog truyền cho mình rất nhiều cảm hứng về việc học. Bài viết của mình lược dịch từ blog của tác giả, các bạn có thể xem link bài gốc bên dưới.

Tại sao mọi người lại vội vàng như vậy?

“Đi vào bất kỳ hiệu sách nào và bạn sẽ thấy sách Tự học Java trong 24 giờ bên cạnh vô vàn các biến thế khác dạy C, SQL, Ruby, Thuật toán, … trong vài ngày hoặc vài giờ. Tìm kiếm nâng cao trên Amazon cho cụm từ [title: teach, yourself, hours, since: 2000] bạn sẽ tìm thấy 512 cuốn sách như vậy. Trong số mười kết quả đầu tiên, chín quyển là sách lập trình (còn lại là về sổ sách kế toán). Kết quả tương tự đến từ việc thay thế “Teach yourself” bằng “learn” hoặc “hours” bằng “days”.

Kết luận là có hai khả năng, hoặc là mọi người đang rất vội vàng để học về lập trình, hoặc lập trình bằng cách nào đó dễ học hơn bất kỳ thứ gì khác.

Hãy phân tích một tiêu đề như Tự học C ++ trong 24 giờ có nghĩa là gì:

  • Tự học: Trong 24 giờ, bạn sẽ không có thời gian để viết một số chương trình có ý nghĩa và học hỏi từ những thành công và thất bại với chúng. Bạn sẽ không có thời gian để làm việc với một lập trình viên có kinh nghiệm và hiểu được một chương trình chạy trong môi trường C++ như thế nào. Nói tóm lại, bạn sẽ không có thời gian để học hỏi nhiều. Vì vậy, cuốn sách chỉ có thể nói về một sự quen thuộc hời hợt, không phải là một sự hiểu biết sâu sắc. Như Alexander Pope đã nói “học một chút là một điều nguy hiểm” (a little learning is a dangerous thing).
  • C++: Trong 24 giờ, bạn có thể học một số cú pháp của C++ (nếu bạn đã biết một ngôn ngữ khác), nhưng bạn không thể tìm hiểu nhiều về cách sử dụng ngôn ngữ. Nói tóm lại, nếu bạn là một lập trình viên căn bản, bạn có thể học viết chương trình theo kiểu căn bản bằng cú pháp C++, nhưng bạn không thể học được C++ thực sự tốt (và xấu) để làm gì. Vậy quan điểm là gì? Alan Perlis từng nói: “Một ngôn ngữ không ảnh hưởng đến cách bạn nghĩ về lập trình thì không đáng để biết”. Có trường hợp bạn phải học một chút C ++ (hoặc JavaScript hoặc Processing) vì bạn cần phải làm việc với các module (phần) được viết bằng các ngôn ngữ đó. Nhưng đó chỉ là cách bạn tiếp cận để hoàn thành công việc, không phải là học lập trình.
  • Trong 24 giờ: Thật không may, điều này là không đủ, như phần tiếp theo cho thấy.

Các nhà nghiên cứu (Simmon & Chase (1973), Bloom (1985), Hayes (1989), Bryan & Harter (1899)) đã cho thấy phải mất khoảng 10 năm để phát triển chuyên môn trong bất kỳ lĩnh vực nào, bao gồm chơi cờ, sáng tác âm nhạc, hoạt động điện báo, vẽ tranh, chơi piano, bơi lội, quần vợt, nghiên cứu về khoa học thần kinh và cấu trúc liên kết…

Chìa khóa chính là luyện tập có chủ ý: không chỉ thực hiện lặp đi lặp lại mà còn thử thách bản thân với một nhiệm vụ vượt quá khả năng hiện tại của bạn, thử, phân tích hiệu suất của bạn trong và sau khi thực hiện nó, và sửa chữa bất kỳ sai lầm nào. Sau đó lặp lại, và lặp lại lần nữa.

Dường như không thực sự có con đường tắt nào: ngay cả Mozart, một thần đồng âm nhạc năm 4 tuổi, phải mất thêm 13 năm trước khi anh bắt đầu sản xuất âm nhạc đẳng cấp thế giới. Ở một thể loại khác, The Beatles dường như bùng nổ tại hiện trường với chuỗi hit số 1 và xuất hiện trong chương trình Ed Sullivan năm 1964. Nhưng họ đã chơi các câu lạc bộ nhỏ ở LiverpoolHamburg từ năm 1957, và trong khi họ có sức hấp dẫn lớn từ rất sớm, nhưng thành công quan trọng đầu tiên của họ, Sgt. Peppers, được phát hành vào năm 1967.

Malcolm Gladwell đã đưa ra quan điểm là tập trung vào 10.000 giờ chứ không phải 10 năm. Henri Cartier-Bresson (1908-2004) đã có một số liệu khác: “10.000 bức ảnh đầu tiên của bạn là thứ tồi tệ nhất của bạn”. (Tuy nhiên ngày nay với máy ảnh kỹ thuật số, một số người có thể đạt được điểm đó trong một tuần) Chuyên môn thực sự có thể mất cả đời: Samuel Johnson (1709-1784) nói “Sự xuất sắc trong bất kỳ lĩnh vực nào chỉ có thể đạt được bằng lao động của trọn đời, nó không thể được mua với giá thấp hơn.”…

Tất nhiên, không một con số nào có thể là câu trả lời cuối cùng: có vẻ không hợp lý khi cho rằng tất cả các kỹ năng (ví dụ: lập trình, chơi cờ và chơi nhạc) đều có thể yêu cầu chính xác cùng một lượng thời gian để thành thạo, cũng không phải là tất cả mọi người sẽ mất chính xác cùng một lượng thời gian. Như Giáo sư K. Anders Ericsson nói, “Trong hầu hết các lĩnh vực, đáng chú ý là ngay cả những cá nhân tài năng nhất cũng cần bao nhiêu thời gian để đạt được mức hiệu suất cao nhất. Con số 10.000 giờ mang đến cho bạn cảm giác rằng chúng ta đang nói chuyện nhiều năm từ 10 đến 20 giờ một tuần mà một số người sẽ tranh luận là những cá nhân tài năng nhất vẫn cần để đạt đến cấp độ cao nhất.”

Và bạn muốn trở thành một lập trình viên, đây là công thức của tôi:

  • Phải có hứng thú với lập trình, và làm gì đó mang lại cho bạn niềm vui. Hãy chắc chắn rằng nó vẫn đủ vui để bạn sẵn sàng bỏ ra mười năm / 10.000 giờ của mình.
  • Cách học tốt nhất là thực hành.
  • Nói chuyện với các lập trình viên khác; đọc các chương trình khác. Điều này quan trọng hơn bất kỳ cuốn sách hoặc khóa đào tạo nào.
  • Nếu bạn muốn, dành bốn hoặc năm năm tại một trường cao đẳng hoặc đại học. Nhưng nếu bạn không thích đến trường, bạn có thể có được kinh nghiệm tương tự với tự học hoặc trong công việc.
  • Trong mọi trường hợp, đọc sách một mình sẽ không đủ. “Chuyên ngành khoa học máy tính không thể khiến bất cứ ai trở thành một chuyên gia lập trình, hay việc nghiên cứu bút vẽ và bột màu có thể khiến ai đó trở thành họa sĩ giỏi”
  • Làm việc trên các dự án với các lập trình viên khác. Hãy là lập trình viên giỏi nhất trong một số dự án; hoặc tệ nhất trong một số khác. Khi bạn là người giỏi nhất, bạn sẽ chứng minh khả năng của mình để dẫn dắt một dự án và truyền cảm hứng cho những người khác bằng tầm nhìn của bạn. Khi bạn là người tệ nhất, bạn học những điều từ những người có kinh nghiệm làm và những gì họ không thích làm (vì họ bắt bạn làm điều đó cho họ).
  • Làm việc trên các dự án đã được phát triển bởi các lập trình viên khác. Hiểu một chương trình được viết bởi người khác để có thể tự fix khi xảy ra lỗi. Hãy suy nghĩ về cách thiết kế chương trình của bạn để giúp những người bảo trì chúng dễ dàng hơn.
  • Học ít nhất nửa tá ngôn ngữ lập trình: bao gồm một ngôn ngữ hướng đối tượng (như Java hoặc C++), một ngôn ngữ functional (như Lisp hoặc ML hoặc Haskell), một ngôn ngữ hỗ trợ trừu tượng cú pháp (như Lisp), một ngôn ngữ hỗ trợ các đặc tả khai báo (như các mẫu Prolog hoặc C++) và một trong đó mạnh về parallelism (như Clojure hoặc Go).
  • Hãy nhớ rằng có một “máy tính” trong “khoa học máy tính”. Biết máy tính của bạn mất bao lâu để thực hiện một lệnh, lấy một từ trong bộ nhớ (có và không có trong bộ nhớ cache), đọc các từ liên tiếp từ đĩa và tìm đến vị trí mới trên đĩa…
  • Tham gia vào một cộng đồng chuẩn hóa ngôn ngữ . Dù bằng cách nào, bạn cần tìm hiểu về những gì người khác thích ở một ngôn ngữ, họ cảm thấy sâu sắc như thế nào, và một chút về lý do tại sao họ lại cảm thấy như vậy.

Với tất cả những điều đó, bạn có thể nghi ngờ rằng bạn có thể đi được bao xa chỉ bằng cách đọc sách. Trước khi đứa con đầu lòng của tôi chào đời, tôi đã đọc tất cả các cuốn sách Làm thế nào (How to) và vẫn cảm thấy như một người mới không biết gì. 30 tháng sau, khi đứa con thứ hai của tôi chào đời, tôi có quay lại đọc sách để ôn lại không? Không. Thay vào đó, tôi dựa vào kinh nghiệm cá nhân của mình, hóa ra nó hữu ích và yên tâm hơn nhiều so với hàng ngàn trang được viết bởi các chuyên gia.

Vì vậy, hãy đi mua các cuốn sách Java / Ruby / Javascript / PHP đó; bạn có thể sẽ nhận được một số lợi ích từ nó. Nhưng bạn sẽ không thay đổi cuộc sống của bạn, hoặc chuyên môn thực sự của bạn như là một lập trình viên chỉ trong 24 giờ hoặc 21 ngày. Làm thế nào để làm việc chăm chỉ và liên tục cải thiện trong 24 tháng? Chà, bây giờ bạn đang bắt đầu đi đến một nơi nào đó …”

Nguồn: https://norvig.com/21-days.html

1 thought on “Học lập trình có khó không?

Leave a Reply

Your email address will not be published. Required fields are marked *