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

Học để làm gì?

Trong phim 3 chàng ngốc (3 idiots) phiên bản Ấn Độ, có một cảnh mà mình rất thích, đó là khi nhân vật Rancho sau khi cố trình bày cho thầy hiệu trưởng về tình hình giáo dục và mục đích học tập của đa số sinh viên Ấn Độ hiện tại. Rancho đã chứng minh bằng cách cho thầy và các bạn tìm định nghĩa một từ trong vòng một phút. Kết quả cả lớp cắm cúi tìm và không ai tìm ra vì từ đó không tồn tại. Rancho đã hỏi (mình chỉ nhớ đại ý) cả lớp là “có ai lúc tìm câu trả lời với niềm vui thích là sẽ học được một cái gì đó mới hay chỉ vì mục đích muốn trở thành người thắng cuộc?”

Một câu hỏi đáng để tất cả chúng ta ngẫm!

Trả lời cho câu hỏi “học để làm gì?”. Mình luôn tự hỏi, có khi nào ta vô tình bị cuốn vào cuộc đua kia. Nếu chỉ là học để nâng cao kiến thức, có cơ hội kiếm một công việc tốt hơn, kiếm được nhiều tiền hơn trong lĩnh vực chuyên môn của mình, vậy thì giả sử ta đã có rất nhiều tiền rồi (trúng vé số chẳng hạn), vậy thì ta có còn động lực để học không? Có bao nhiêu người sau khi có được nhiều tiền rồi sẽ tiếp tục làm công việc hiện tại?

Nhưng để tìm được niềm vui thích trong việc học một cái gì đó mới mẻ thực sự rất khó. Thời phổ thông, sinh viên, ta chỉ học khi áp lực kì thi gần đến. Có phải vì áp lực của việc học hay không mà mình nhớ là chưa từng gặp được cậu bạn nào mặt hớn hở khi nghe giảng hay khi đọc sách như cậu Rancho trong phim kia.

Giờ đây, khi đã đi làm, việc học (tự học) trở nên khó khăn hơn vì ta không còn áp lực kì thi. Mình luôn có cả “kho” những cuốn sách kinh điển mà mọi lập trình viên cần “phải” đọc, nhưng kết quả là đọc được chẳng bao nhiêu, tải về để đó, hoặc đọc được vài chục trang rồi bỏ. Mình cũng đăng ký những khóa học miễn phí hoặc với phí rất rẻ nhưng cũng chỉ học được vài bữa. Rõ ràng là mình đã không có đủ đam mê và nghị lực để duy trì việc tự học. Nhiều lúc cũng tự hỏi mình: “mình có thực sự thích công việc này không? Mình có muốn bản thân trở thành người xuất xuất trong lĩnh vực này không?”. Mặc dù câu trả lời chắc chắn là CÓ nhưng mình vẫn gặp nhiều nhiều khó khăn trong việc duy trì việc học.

Nhưng từ khi được làm việc, tiếp xúc với những người giỏi hơn, những người đã có những thành công nhất định, đọc được những chia sẻ trong blog khmt (cũ), đọc về thaidn, brad fitzpatrick hay huyen chip mình thì mình lại có động lực để học hơn rất nhiều và đã có niềm vui thích khi học được cái gì đó mới (cảm giác phấn khích khi tưởng tượng mình cũng có thể đạt được những thành tựu như họ nếu đủ cố gắng)

Và mình đã đúc kết được là: ta thường bỏ cuộc bởi vì ta kì vọng quá nhiều vào bản thân, ta cứ tưởng học xong 1, 3 tháng, đọc được vài quyển sách là đã khá, đến khi kết quả không được như ý ta lại chán nản và dễ bỏ cuộc. Do đó, hãy bắt đầu, nhưng chậm thôi, quan trọng nhất là kiên trì và enjoy quá trình nhiều hơn. Mình đã áp dụng lời khuyên này trong việc đọc chạy bộ. Và hiện tại mình đang rất HAPPY khi thực hiện điều đó mỗi ngày.

Kết: mình nghĩ mục tiêu ta đi làm để kiếm tiền, tiếp tục học để bổ sung kiến thức, để giỏi hơn, kiếm được nhiều tiền hơn là mục tiêu hoàn toàn chính đáng, chẳng có gì phải xấu hổ khi thừa nhận điều đó cả. Nhưng sẽ thật tệ với chính bản thân mình nếu ta không tìm thấy được niềm vui thích trong công việc, trong việc học của chúng ta hằng ngày.

Bài hát nhạc phim mà mình rất thích nghe (mặc dù không hiểu gì, hehe): https://www.youtube.com/watch?v=IBr798ZSOx4