Friday, July 28, 2017

Tự học lập trình trong 10 năm

Tại sao mọi người lại hối hả như vậy?

Nếu bước chân vào bất kỳ hiệu sách nào, thì bạn cũng sẽ bắt gặp cuốn sách có tựa đề Tự học Java trong vòng 24 giờ và bên cạnh đó là vô số những cuốn sách chào mời việc học C, SQL, Ruby, Thuật toán, và nhiều thứ khác trong chỉ trong một vài ngày hoặc vài giờ. Tôi thử tìm trên trang web bán sách trực tuyến Amazon với cụm từ tìm kiếm “tự học trong vài giờ” thì đã tìm thấy đến 512 cuốn sách. Trong top 10 cuốn đầu tiên, thì đã có đến 9 cuốn là sách về lập trình. Nếu đổi cụm từ tìm kiếm từ “tự học trong vài giờ” sang “tự học trong vài ngày” thì cũng ra kết quả tương tự.
Liệu tôi có phải khổ luyện 10,000 giờ (10 năm) để trở thành một chuyên gia phát triển phần mềm?Liệu tôi có phải khổ luyện 10,000 giờ (10 năm) để trở thành một chuyên gia phát triển phần mềm?
Kết luận đó là hoặc mọi người đang đổ xô học về lập trình, hoặc lập trình là một cái gì đó vô cùng dễ dàng để học hơn bất cứ thứ gì khác. Giáo sư Felleisen cũng đã đưa ra quan điểm đồng tình với xu hướng này trong cuốn sách How to Design Programs của ông, khi ông nói rằng “Lập trình tồi thì rất dễ. Bất kỳ thằng ngốc nào cũng có thể học nó trong 21 ngày, thậm chí nếu chúng là những kẻ đần độn.” Trang web Abtruse Goose cũng đã đưa ra một truyện tranh biếm họa về vấn đề này.
Hãy cùng tôi phân tích một tựa sách kiểu như Tự học C++ trong 24 giờ có ý nghĩa gì nhé:
  • Tự học: Trong vòng 24 giờ thì bạn sẽ không có đủ thời gian để viết ra một vài chương trình quan trọng, và học được từ những thành công cũng như thất bại cùng với chúng. Bạn sẽ không có thời gian để làm việc cùng một lập trình viên nhiều kinh nghiệm và hiểu được việc sống trong một môi trường giống như C++ nó sẽ như thế nào. Nói một cách ngắn gọn, bạn không có đủ thời gian để học được gì nhiều. Vì vậy cuốn sách đó có thể chỉ nói về những thứ hời hợt và nông cạn theo kiểu “cưỡi ngựa xem hoa” chứ chẳng mang lại kiến thức sâu sắc gì. Cũng như Alexander Pope đã nói rằng, hiểu biết nông cạn là một điều rất nguy hiểm.
  • C++: Trong vòng 24 giờ bạn có khả năng học một số cú pháp của C++ (nếu bạn đã biết một ngôn ngữ lập trình khác rồi), nhưng bạn không thể học được nhiều về làm thế nào để sử dụng ngôn ngữ đó. Nói ngắn gọn, ví dụ nếu bạn là một lập trình viên ngôn ngữ Basic, thì bạn có thể học cách để viết các chương trình theo phong cách của Basic bằng việc sử dụng cú pháp của C++, nhưng bạn không thể học được điểm thực sự tốt (và tồi) của C++ là gì. Vì vậy quan điểm ở đây là gì? Nhà khoa học máy tính nổi tiếng Alan Perlis đã nói rằng: “Một ngôn ngữ mà không ảnh hưởng đến cái cách bạn nghĩ về lập trình, thì nó không đáng để học.” Một quan điểm khác cho rằng bạn phải học một chút xíu về ngôn ngữ C++ (hoặc cũng tương tự cho ngôn ngữ JavaScript hay Processing) bởi vì bạn cần phải giao tiếp với một công cụ hiện có để hoàn thành một tác vụ xác định nào đó. Nhưng nếu theo cách này thì không phải là bạn đang học về cách lập trình như thế nào; mà bạn đang học cách để hoàn thành tác vụ đó mà thôi.
  • trong 24 giờ: Không may là quãng thời gian này thì quá ngắn, và phần tiếp theo sẽ nói rõ hơn về điều này.

Tự học lập trình trong 10 năm

Các nhà nghiên cứu (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) đã chỉ ra rằng cần ít nhất 10 năm để đạt được sự tinh thông trong bất cứ một lĩnh vực nào, từ đánh cờ, sáng tác âm nhạc, lập trình máy tính, hội họa, chơi piano, bơi lội, chơi tennis, hoặc thu được kết quả trong lĩnh vực tâm lý học hay hình học topo. Điều quan trọng ở đây là phương pháp thực hành: không chỉ là việc lặp đi lặp lại đơn thuần, mà còn phải thử thách chính mình bằng những nhiệm vụ khó khăn vượt quá khả năng hiện tại của bản thân, thử nghiệm nó, phân tích đánh giá hiệu suất của mình trong và sau quá trình rèn luyện, sửa chữa bất cứ sai lầm nào. Cứ như vậy, lặp đi lặp lại.
Và lịch sử đã chứng minh rằng không thể có con đường tắt nào khác: dù cho đó là Mozart, thần đồng âm nhạc ở tuổi lên 4, cũng phải mất hơn 13 năm sau mới sáng tác ra những kiệt tác âm nhạc. Trong một thể loại khác, ban nhạc The Beatles dường như từ chỗ vô danh leo thẳng lên vị trí số 1 bằng một loạt các bài hát đứng top #1 và xuất hiện tại các buổi trình diễn Ed Sullivan trong năm 1964. Nhưng họ cũng đã phải cặm cụi chơi nhạc tại những phòng trà nhỏ ở Liverpool và Hamburg từ những năm 1957, mặc dù họ đã tạo được sự thu hút từ rất sớm, nhưng thành công lớn đầu tiên của nhóm là Sgt. Peppers, album được phát hành vào năm 1967. Tác giả Malcolm Gladwell đã phổ biến ý tưởng này trong cuốn sách nổi tiếng “Những Kẻ Xuất Chúng” của ông, mặc dù ông đã đề cập đến 10,000 giờ khổ luyện chứ không phải là 10 năm.
Con đường đi tới giải Fields đầy vinh quang của GS Ngô Bảo Châu cũng phải trải qua 15 năm đóng cửa cô đơn đối mặt với Bổ đề cơ bản.
Con đường đi tới giải Fields đầy vinh quang của GS Ngô Bảo Châu cũng phải trải qua 15 năm đóng cửa cô đơn đối mặt với Bổ đề cơ bản.
Nó có thể là 10,000 giờ, không phải là 10 năm, nhưng đó là một con số thần kỳ. Hoặc nó có thể được ước lượng theo một cách khác; Henri Cartier-Bresson (1908-2004) đã nói rằng “10,000 bức hình đầu tiên mà bạn chụp là những bức hình tồi nhất của bạn“. Để trở thành một chuyên gia đích thực thì có khi cần luyện tập cả đời: Samuel Johnson (1709-1784) đã nói rằng: “Để trở nên xuất sắc trong bất kỳ lĩnh vực nào thì chỉ có thể đạt được bằng lao động suốt đời; nó không thể mua được bằng một cái giá rẻ hơn“. Còn Chaucer (1340-1400) đã phàn nàn rằng “cuộc đời thì quá ngắn ngủi, mà nghề thì cần quá nhiều thời gian để học.” Ông tổ của ngành y học hiện đại là Hippocrates (năm 400 trước công nguyên) cũng được biết đến với câu nói “Cuộc đời thì rất ngắn, việc học nghề thì rất lâu, cơ hội thì phù du, trải nghiệm thì khó tin, phán xét thì rất khó“. Dĩ nhiên, không có một con số đơn lẻ nào có thể là câu trả lời cuối cùng: dường như có một lý do chấp nhận được khi cho rằng không nhất thiết mỗi công việc như lập trình, đánh cờ, và chơi nhạc đều cần chính xác cùng một số lượng thời gian để tinh thông, cũng không phải rằng tất cả mọi người đều cần chính xác một số lượng thời gian đó.
Hãy là những người đầu tiên đăng ký vé Early Bird từ 01/04 – 15/04 với giá ưu đãi chỉ còn 150k

Nếu bạn muốn trở thành một lập trình viên giỏi

-------------------- Thông tin cho Dev --------------------
Đây là công thức của tôi để trở thành công trong nghề lập trình:
  • Hãy thích thú trong việc lập trình, và làm nó bởi vì nó mang lại cho bạn nhiều niềm vui. Hãy chắc chắn rằng nó đủ vui để làm cho bạn sẽ sẵn lòng bỏ thêm 10 năm (hoặc 10,000 giờ) để luyện tập.
  • Lập trình. Cách học tốt nhất là học thông qua thực hành. Cuốn sách Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life là một tham khảo thú vị cho quan điểm này. Một số trích đoạn đáng chú ý trong cuốn sách đó như sau, “đẳng cấp của một cá nhân trong một lĩnh vực nào đó thì không đạt được một cách tự nhiên theo thời gian, mà đẳng cấp chỉ có thể tăng lên thông qua nỗ lực luyện tập để tiến bộ” và “để việc học được hiệu quả nhất thì yêu cầu mỗi tác vụ phải được xác định rõ ràng cùng với độ khó thích hợp cho người tham gia, có đánh giá phản hồi, và có cơ hội để lặp lại và sửa chữa những sai lầm.
  • Nói chuyện cùng những lập trình viên khác; đọc các chương trình do họ viết ra. Điều này thì còn quan trọng hơn bất kỳ cuốn sách hoặc khóa huấn luyện nào.
  • Nếu bạn muốn, hãy học 4 năm tại một trường đại học (hoặc nhiều hơn tại mức sau đại học). Điều này giúp bạn có thể kiếm được một công việc mà yêu cầu bằng cấp, và nó sẽ mang lại cho bạn mức hiểu biết sâu hơn trong lĩnh vực này; nhưng nếu không thích trường học, thì bạn cũng có thể (cùng với nhiều nỗ lực) thu được kinh nghiệm tương tự bằng cách tự học hoặc dựa trên công việc của bạn. Trong bất kỳ trường hợp nào, chỉ học qua sách vở sẽ là chưa đủ. Tác giả của cuốn sách The New Hacker’s Dictionary là Eric Raymond đã nói rằng, “Giáo dục về Khoa học máy tính không thể khiến cho bất kỳ ai trở thành chuyên gia lập trình, cũng như là việc học về cọ và màu không thể làm cho ai đó trở thành họa sĩ tài ba”. Một trong những lập trình viên tốt nhất mà tôi đã từng thuê, thì anh ta chỉ mới có bằng tốt nghiệp trung học; nhưng anh ta đã tạo ra được rất nhiều phần mềm tuyệt vời, có hẳn một nhóm tin (news group) của riêng mình, và kiếm đủ cổ phiếu dạng tùy chọn để có thể sở hữu một quán bar.
  • Làm việc trên nhiều dự án cùng với những lập trình viên khác. Hãy là người giỏi nhất trong một số dự án; và hãy là người kém nhất trong một số dự án khác. Khi bạn là người giỏi nhất, bạn sẽ có cơ hội kiểm tra các khả năng về lãnh đạo một dự án, và cách truyền cảm hứng tới những người khác với tầm nhìn của bạn. Khi bạn là người kém nhất, bạn sẽ học được cách mà các cao thủ sẽ làm, và bạn biết được những công việc mà họ không muốn làm (bởi vì đó là những việc mà họ sẽ sai bạn làm cho họ).
  • Làm việc trên các dự án sau những lập trình viên khác. Hiểu rõ một chương trình được viết ra bởi một người khác. Đọc code để hiểu nó và có thể sửa chữa khi những lập trình viên ban đầu không còn hỗ trợ nó nữa. Hãy nghĩ về việc làm thế nào để thiết kế các chương trình của bạn khiến cho những người sau này bảo trì nó được dễ dàng hơn.
  • Hãy học ít nhất nửa tá các ngôn ngữ lập trình. Bao gồm một ngôn ngữ nhấn mạnh về các lớp trừu tượng (ví dụ như Java hoặc C++), một ngôn ngữ nhấn mạnh về các hàm trừu tượng (ví dụ Lisp hoặc ML hay Haskell), một ngôn ngữ hỗ trợ cú pháp trừu tượng (kiểu như Lisp), một ngôn ngữ hỗ trợ khai báo các đặc tả (ví dụ như Prolog hoặc C++ templates), và một ngôn ngữ nhấn mạnh về tính song song (ví dụ như Clojure hoặc Go).
  • Nên nhớ rằng có một chữ “máy tính” trong cụm từ “khoa học máy tính”. Phải biết máy tính của bạn thực thi một lệnh mất bao lâu, tìm nạp một từ vào bộ nhớ (có và không có cache), đọc liên tục các từ (word) từ đĩa, và tìm kiếm một một vị trí mới trên đĩa.
  • Nên tham gia vào nỗ lực chuẩn hóa một ngôn ngữ. Đó có thể là ủy ban ANSI C++, hoặc đó có thể là việc quyết định liệu coding style của bạn sẽ có 2 hoặc 4 mức căn lề. Hoặc theo một cách khác, bạn hãy tìm hiểu xem những người khác thích một ngôn ngữ ở điểm gì, họ cảm thấy sâu sắc như thế nào, và thậm chí về lý do tại sao họ lại cảm thấy như vậy.
  • Có sự nhạy bén để áp dụng những nỗ lực chuẩn hóa của ngôn ngữ đó một cách nhanh nhất có thể.
Cùng với tất cả những điều kể trên, một câu hỏi đặt ra là bạn có thể đi được bao xa nếu chỉ thông qua việc đọc sách. Trước khi con cả của tôi chào đời, tôi đã đọc tất cả các cuốn sáchLàm Thế Nào (How To), mà vẫn cảm thấy tương đối mơ hồ. 30 tháng sau đó, khi đứa con thứ hai của tôi chào đời, thì tôi đã quay trở lại đọc những cuốn sách đó để có một cách nhìn tươi mới hơn? Không. Thay vì đó, tôi đã dựa trên kinh nghiệm cá nhân của bản thân mình, và chính chúng đã giúp ích cho tôi rất nhiều còn hơn hàng ngàn trang sách được viết bởi các chuyên gia.
Tác giả Fred Brooks, trong tiểu luận của mình là No Silver Bullet đã đưa ra một kế hoạch gồm 3 bước nhằm tìm kiếm ra một người thiết kế phần mềm tuyệt vời như sau:
  1. Hệ thống hóa việc nhận diện top những người thiết kế phần mềm sớm nhất có thể.
  2. Gán một người cố vấn nghề nghiệp để chịu trách nhiệm cho sự phát triển của tài năng tương lai đó và lưu giữ cẩn thận một hồ sơ nghề nghiệp.
  3. Cung cấp thật nhiều cơ hội để những người này có thể phát triển thông qua việc tương tác và cạnh tranh lẫn nhau.
Giả sử rằng một số người đã có sẵn những phẩm chất cần thiết để trở thành một nhà thiết kế phần mềm giỏi; công việc ở đây là hướng dẫn họ theo một cách thích hợp để họ có thể phát triển. Nhà khoa học về máy tính nổi tiếng Alan Perlis đã nói một cách cô đọng như sau: “Bất cứ ai cũng có thể được dạy để trở thành một nhà điêu khắc: nhưng nhà điêu khắc thiên tài Michelangelo không được dạy làm thế nào để được như vậy. Và điều đó cũng đúng đối với các lập trình viên vĩ đại“. Perlis cũng nói rằng những con người vĩ đại đó có một tố chất nội lực vượt quá cả việc huấn luyện họ. Nhưng mà những tố chất đó đến từ đâu? Đó có phải là yếu tố bẩm sinh? Hay là họ đã phát triển nó thông qua sự siêng năng tập luyện? Cũng như Auguste Gusteau (bếp trưởng trong Ratatouille) đã nói, “bất kỳ ai cũng có thể nấu ăn, nhưng chỉ những người không biết sợ mới trở nên vĩ đại”. Tôi nghĩ đó phần nhiều là nhờ họ sẵn lòng cống hiến một phần lớn cuộc đời để luyện tập và sửa sai. Nhưng có thể không biết sợ là cách để tóm tắt lại công thức thành công một cách ngắn gọn nhất. Hoặc, như nhà phê bình của Gusteau là Anton Ego đã nói rằng: “Không phải ai cũng có thể trở thành một họa sĩ vĩ đại, nhưng một họa sĩ vĩ đại thì có thể đến từ bất cứ đâu”.
Vì vậy bạn có thể vẫn cứ mua những cuốn sách về Java/Ruby/Javascript/PHP nói trên; và có thể thu được một vài kiến thức từ chúng. Nhưng bạn không thể thay đổi cuộc đời, hay toàn bộ sự nghiệp lập trình viên của mình chỉ trong 24 giờ hoặc 21 ngày. Còn nếu bạn tiếp tục làm việc chăm chỉ để phát triển trên 24 tháng thì sao? Vâng, nếu theo cách thứ hai thì bạn đang bắt đầu đi đúng hướng rồi đấy…

No comments:

Post a Comment