Bài viết dịch từ Teach Yourself Programming in Ten Years – một bài luận của Peter Norvig.

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

Bước vào bất kỳ cửa hàng sách nào, bạn sẽ thấy sách “Học Java trong vòng 24 giờ” cùng với vô số phiên bản khác hứa hẹn dạy C, SQL, Ruby, Thuật toán, và nhiều thứ khác trong vài ngày hoặc giờ. Trên trang tìm kiếm tiên tiến của Amazon với [tiêu đề: học, tự học, giờ, từ năm 2000], tôi tìm thấy 512 quyển sách như vậy. Trong số mười quyển sách hàng đầu, chín quyển là sách lập trình (một quyển còn lại nói về kế toán). Kết quả tương tự được đạt được khi thay thế “tự học” bằng “học” hoặc “giờ” bằng “ngày”. Kết luận là hoặc mọi người đều đang hăm hở học lập trình, hoặc lập trình somehow thật dễ hơn bất kỳ thứ gì khác. Felleisen và cộng sự đề cập đến xu hướng này trong cuốn sách của họ “Cách Thiết Kế Chương Trình”, khi họ nói “Lập trình kém chất lượng dễ dàng học. Người ngốc cũng có thể học được nó trong 21 ngày, ngay cả khi họ là người ngốc.” Tranh châm biếm của Abtruse Goose cũng có quan điểm của họ.

Hãy phân tích ý nghĩa của một tựa sách như “Học C++ trong 24 giờ” có thể mang lại:

  • Tự Học: Trong 24 giờ, bạn không có đủ thời gian để viết một số chương trình quan trọng, và học 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 cuộc sống trong một môi trường C++. Nói chung, bạn sẽ không có đủ thời gian để học nhiều. Vì vậy, cuốn sách chỉ có thể nói về sự quen thuộc hời hợt, không phải là hiểu biết sâu sắc. Như Alexander Pope đã nói, “Ít kiến thức là điều nguy hiểm.
  • 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ể học nhiều về cách sử dụng ngôn ngữ này. Nói chung, nếu bạn đã biết lập trình Basic, bạn có thể học cách viết các chương trình theo phong cách của Basic sử dụng cú pháp của C++, nhưng bạn không thể hiểu được C++ thích hợp (và không tốt) cho điều gì. Vậy thì ý nghĩa 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 không đáng để biết“. Một ý nghĩa có thể là bạn phải học một chút C++ (hoặc có thể là JavaScript hoặc Processing) vì bạn cần giao tiếp với một công cụ hiện tại để hoàn thành một nhiệm vụ cụ thể. Nhưng sau cùng, bạn không học lập trình; bạn chỉ học cách hoàn thành nhiệm vụ đó.
  • Trong 24 Giờ: Thật không may, điều này không đủ, như phần tiếp theo sẽ thể hiện.

Học Lập Trình Trong Mười Năm

Các nghiên cứu (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) đã chỉ ra rằng cần khoảng mười năm để phát triển thành chuyên gia trong nhiều lĩnh vực khác nhau, bao gồm chơi cờ, soạn nhạc, vận hành telegraph, vẽ tranh, chơi piano, bơi lội, chơi tennis, và nghiên cứu về tâm thần học và độ hình học. Chìa khóa ở đây là việc thực hành có chủ đích: không chỉ làm điều đó điều này lần nữa và lần nữa nữa, mà là tự thách thức bản thân với một nhiệm vụ mà chỉ hơn một chút so với khả năng hiện tại của bạn, thử nghiệm, phân tích hiệu suất của bạn trong khi làm và sau khi hoàn thành, và sửa chữa bất kỳ sai sót nào. Sau đó, lặp lại. Và lặp lại nữa. Dường như không có lối tắt thực sự: ngay cả Mozart, người là một đại tài âm nhạc từ khi 4 tuổi, cũng mất thêm 13 năm trước khi bắt đầu tạo ra những tác phẩm âm nhạc hàng đầu thế giới. Trong một thể loại khác, The Beatles dường như bắt đầu sự nghiệp với hàng loạt các ca khúc đứng đầu bảng và xuất hiện trên chương trình Ed Sullivan vào năm 1964. Nhưng họ đã biểu diễn ở các câu lạc bộ nhỏ ở Liverpool và Hamburg từ năm 1957, và mặc dù họ thu hút đám đông sớm, thành công đầu tiên lớn của họ, Sgt. Peppers, được phát hành vào năm 1967.

Malcolm Gladwell đã phổ biến ý tưởng này, mặc dù ông tập trung vào con số 10,000 giờ, không phải 10 năm. Henri Cartier-Bresson (1908-2004) có một số liệu đoán khác: “10,000 bức ảnh đầu tiên của bạn là tồi tệ nhất.” (Ông không dự đoán được rằng với máy ảnh số, một số người có thể đạt được con số đó trong một tuần.) Kiến thức chuyên môn thực sự có thể mất cả đời: Samuel Johnson (1709-1784) nói “Xuất sắc trong bất kỳ lĩnh vực nào cũng chỉ có thể đạt được thông qua nỗ lực của cả đời; nó không thể được mua với giá rẻ hơn.” Và Chaucer (1340-1400) phàn nàn “cuộc sống ngắn ngủi, nghệ thuật mà học lâu dài.” Hippocrates (khoảng năm 400 trước Công Nguyên) được biết đến với đoạn trích “ars longa, vita brevis”, là một phần của trích dẫn dài hơn “Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile”, có nghĩa là “Cuộc sống ngắn, [nghệ thuật] dài, cơ hội thoáng qua, thử nghiệm đầy rủi ro, đánh giá khó khăn.” Tất nhiên, không có một con số duy nhất có thể là câu trả lời cuối cùng: dường như không hợp lý khi giả định rằng tất cả các kỹ năng (ví dụ: lập trình, chơi cờ, chơi đánh cờ, và chơi nhạc) đều yêu cầu chính xác cùng một lượng thời gian để thành thạo, cũng như không phải 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, “Ở hầu hết các lĩnh vực, đáng chú ý là ngay cả những người tài năng nhất cần bao nhiêu thời gian để đạt đến các cấp độ hiệu suất cao nhất. Con số 10,000 giờ chỉ cho bạn biết chúng ta đang nói về những năm dài, từ 10 đến 20 giờ mỗi tuần, những người mà một số người có thể đưa ra lập luận là những người có tài năng bẩm sinh cần để đạt đến cấp độ cao nhất.

Vậy bạn muốn trở thành một Lập trình viên

Dưới đây là công thức của tôi cho sự thành công trong lập trình:

  1. Hãy quan tâm đến lập trình và thực hiện nó vì nó thú vị. Đảm bảo rằng việc này vẫn giữ vững niềm vui đủ lớn để bạn sẽ sẵn lòng dành thời gian trong khoảng mười năm hoặc 10,000 giờ.
  2. Lập trình. Loại hình học tập tốt nhất là học bằng cách làm. Để nói rõ hơn, “mức độ hiệu suất tối đa của cá nhân trong một lĩnh vực cụ thể không đạt được tự động dựa trên kinh nghiệm kéo dài, nhưng mức độ hiệu suất có thể được nâng cao ngay cả với những người có kinh nghiệm cao bằng những nỗ lực chủ đích để cải thiện.” (trang 366) và “học tập hiệu quả nhất đòi hỏi một nhiệm vụ được định rõ với mức độ khó khăn phù hợp với từng người cụ thể, phản hồi có ý nghĩa và cơ hội để lặp lại và sửa chữa lỗi.” (trang 20-21) Cuốn sách “Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life” là một tài liệu tham khảo thú vị cho quan điểm này.
  3. Trò chuyện với các lập trình viên khác; đọc mã nguồn của 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 khác.
  4. Nếu bạn muốn, hãy dành bốn năm ở một trường đại học (hoặc hơn nếu bạn chọn học sau đại học). Điều này sẽ mang lại cho bạn cơ hội tiếp cận một số công việc đòi hỏi bằng cấp, và nó sẽ giúp bạn hiểu sâu hơn về lĩnh vực này, nhưng nếu bạn không thích học đại học, bạn vẫn có thể (với sự hiên ngang) có được trải nghiệm tương tự trên đường tư vấn hoặc tại nơi làm việc. Trong mọi trường hợp, việc chỉ học từ sách vở sẽ không đủ. “Giáo dục khoa học máy tính không thể biến ai thành một lập trình viên xuất sắc bằng cách nào đó giống như việc nghiên cứu về cọ và sơn không thể biến ai thành một họa sĩ chuyên nghiệp” như Eric Raymond, tác giả của “The New Hacker’s Dictionary” đã nói. Một trong những lập trình viên giỏi nhất mà tôi từng thuê chỉ có tấn chỉnh cấp Trung học; anh ấy đã tạo ra nhiều phần mềm xuất sắc, có nhóm tin tức riêng của mình và kiếm đủ từ quyền chọn cổ phiếu để mua một quán bar riêng của anh ấy.
  5. Tham gia vào các dự án với các lập trình viên khác. Hãy là người lập trình giỏi nhất trong một số dự án; hãy là người lập trình tệ nhất trong một số dự án khác. Khi bạn là người giỏi nhất, bạn có cơ hội kiểm tra khả năng dẫn dắt dự án của mình và truyền động lực cho người khác với tầm nhìn của bạn. Khi bạn là người tệ nhất, bạn học được những gì các chuyên gia làm và học được những gì họ không thích làm (vì họ bắt bạn làm việc đó cho họ).
  6. Tham gia vào các dự án sau khi các lập trình viên khác đã thực hiện. Hiểu rõ một chương trình được viết bởi người khác. Xem điều gì cần để hiểu và sửa chữa nó khi các lập trình viên gốc không có mặt. Suy nghĩ về cách thiết kế chương trình của bạn để làm cho nó dễ dàng hơn cho những người sẽ duy trì chúng sau bạn.
  7. Học ít nhất sáu ngôn ngữ lập trình. Bao gồm một ngôn ngữ tập trung vào trừu tượng hóa lớp (như Java hoặc C++), một ngôn ngữ tập trung vào trừu tượng hóa chức năng (như Lisp hoặc ML hoặc Haskell), một ngôn ngữ hỗ trợ trừu tượng hóa cú pháp (như Lisp), một ngôn ngữ hỗ trợ đặc tả mô tả (như Prolog hoặc mẫu C++), và một ngôn ngữ tập trung vào song song hóa (như Clojure hoặc Go).
  8. Hãy nhớ rằng có một “máy tính” trong “khoa học máy tính”. Biết bao lâu nó bắt máy tính của bạn thực hiện một lệnh, lấy một từ từ bộ nhớ (với và không có cache miss), đọc các từ liên tiếp từ đĩa và điều hướng đến một vị trí mới trên đĩa.
  9. Tham gia vào các nỗ lực chuẩn hóa ngôn ngữ. Điều này có thể là ủy ban ANSI C++, hoặc có thể là quyết định xem phong cách lập trình cục bộ của bạn có độ lề 2 hay 4 không gian. Dù sao, điều này giúp bạn biết về những gì mà người khác thích trong một ngôn ngữ, họ cảm thấy như thế nào về nó, và có lẽ thậm chí còn biết một chút về lý do tại sao họ cảm thấy như vậy.
  10. Hãy có tri thức tốt để rời bỏ nỗ lực chuẩn hóa ngôn ngữ càng sớm càng tốt.

Với tất cả những điều này, cách xa xôi bạn có thể đi chỉ thông qua việc học từ sách vở là một dấu hỏi. Trước khi con đầu lòng của tôi được sinh, tôi đã đọc tất cả các sách “Cách Thực Hiện”, và vẫn cảm thấy như một người mới bắt đầu ngớ ngẩn. 30 tháng sau đó, khi con thứ hai của tôi sắp chào đời, liệu tôi có trở lại sách để tìm kiến thức mới không? Không. Thay vào đó, tôi tin dựa vào kinh nghiệm cá nhân của mình, mà cuối cùng lại trở nên hữu ích và an tâm hơn với tôi so với hàng nghìn trang sách được viết bởi các chuyên gia.

Trong bài luận của mình “Không Có Vàng Nào Cả,” Fred Brooks đã đề xuất một kế hoạch ba phần để tìm ra các nhà thiết kế phần mềm xuất sắc:

  1. Xác định hệ thống các nhà thiết kế hàng đầu một cách có hệ thống ngay từ khi có thể.
  2. Chỉ định một người hướng dẫn nghề nghiệp để chịu trách nhiệm phát triển cho người có tiềm năng và cẩn thận duy trì hồ sơ sự nghiệp.
  3. Cung cấp cơ hội cho các nhà thiết kế trẻ để tương tác và kích thích lẫn nhau.

Điều này giả định rằng một số người đã có những phẩm chất cần thiết để trở thành một nhà thiết kế xuất sắc; công việc là cách thích hợp để khuyến khích họ. Alan Perlis đã diễn giải điều này một cách ngắn gọn hơn: “Mọi người đều có thể được dạy cách điêu khắc: Michelangelo sẽ phải được dạy cách không điêu khắc. Cũng như với những nhà lập trình xuất sắc.” Perlis cho biết rằng những người xuất sắc có một phẩm chất nội tại vượt qua quá trình đào tạo của họ. Nhưng phẩm chất đó đến từ đâu? Có phải là bẩm sinh không? Hoặc họ phát triển nó thông qua sự chăm chỉ? Như Auguste Gusteau (đầu bếp hư cấu trong bộ phim hoạt hình Ratatouille) nói, “bất kỳ ai cũng có thể nấu ăn, nhưng chỉ có những người không sợ hãi mới có thể xuất sắc.” Tôi nghĩ đó hơn là lòng chủ động dành một phần lớn cuộc đời của mình để thực hành có chủ đích. Nhưng có lẽ “không sợ hãi” là cách tóm tắt điều đó. Hoặc, như người phê bình của Gusteau, Anton Ego, nói: “Không phải ai cũng có thể trở thành nghệ sĩ xuất sắc, nhưng một nghệ sĩ xuất sắc có thể đến từ bất cứ ai.

Vì vậy, hãy tiếp tục mua cuốn sách Java/Ruby/Javascript/PHP đó; bạn có thể sử dụng nó một chút. Nhưng bạn sẽ không thay đổi cuộc sống của mình hoặc kiến thức tổng quát thực sự của bạn về lập trình trong vòng 24 giờ hoặc 21 ngày. Làm thế nào về việc nỗ lực liên tục để cải thiện trong suốt 24 tháng? Đó mới là nơi bạn bắt đầu thấy được sự tiến triển…

Posted in , , , ,