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

Lấy từ blog: doanchienthang.wordpress.com

Đây là quan điểm của Peter Norvig về các loại sách “ăn xổi” bày bán ngoài thị trường hiện nay với những cái “tít” nghe rất ư là hứng khởi: “Tự học Java trong 7 ngày” hay “Học Visual C++.NET trong 24 giờ”, v.v… Tất nhiên, mỗi người đều có động cơ và mục đích riêng khi học lập trình. Nhưng Peter cho rằng để trở thành một “expert programmer”, bạn cần ít nhất 10 năm, và việc trông chờ vào những cuốn sách kiểu như trên để “thay da đổi thịt” là điều không tưởng. Nhân tiện đây tôi xin giới thiệu đôi chút về quý ngài Peter Norvig, kẻo dân Việt Nam ta vốn có thói quen chỉ nghe lời người nổi tiếng, tưởng bác này vô danh lại xì mũi cười khẩy mà cho rằng người ta đang loạn ngôn…

Theo từ điển bách khoa Wikipedia thì Peter Norvig hiện đang giữ chức giám đốc trung tâm nghiên cứu của Google Inc., (Director of Research, formly Director of Search Quality) với nhiệm vụ cao cả là sắp xếp và tổ chức lại thế giới thông tin cho người dùng dễ dàng truy cập, khai thác (đúng với slogan của Google). Ông đồng thời là ủy viên ban điều hành của Hiệp hội Trí tuệ nhân tạo Hoa Kì (American Association for Artificial Intelligence). Cùng với Stuart Russell, Peter Norvig là đồng tác giả của cuốn sách: “Artificial Intelligence – A Modern Approach” nổi tiếng, được giảng dạy tại 940 trường đại học thuộc hơn 90 quốc gia trên toàn thế giới. Cuốn sách là giáo trình chuẩn của rất nhiều University lừng danh như: MIT (Massachussetts Institute of Technology), University of California at Berkeley, Princeton University, Standford University, Oxford University, Yale University, v.v…Trước đó, ông giữ chức giám đốc điều hành trung tâm khoa học tính toán (Computational Science Division) của NASA tại Ames (NASA Ames Research Center), có nhiệm vụ giám sát hoạt động của hơn 200 nhà khoa học. Ngoài ra, ông còn đảm nhận chức vụ giáo sư tại đại học Nam California, thành viên hội đồng nghiên cứu khoa học của University of California at Berkeley, cũng như là một trong những nhà khoa học lão làng tại Sun Microsystems Laboratories…

Thôi, nói thế là đủ biết cái tầm của người ta rồi. Và ý kiến dưới đây của Peter Norvig cũng đáng để mọi người cùng nhau thưởng thức và suy ngẫm. Nào, hãy bắt đầu…

Tại sao người ta lại vội vàng đến như vậy?

Rảo bước quanh các cửa hàng sách, bạn sẽ thấy cái tựa Hướng dẫn lập trình Java trong 7 ngày nằm bên cạnh một dãy dài vô tận những lời đề nghị dạy học đại loại như vậy về Visual Basic, Windows hay Internet… chỉ cần vài ngày hay vài giờ ngắn ngủi. Tôi đã thử thực hiện một động tác tìm kiếm (power search) tại Amazon.com:

pubdate: after 1992 and title: days and
(title: learn or title: teach yourself)

và nhận được 248 kết quả. 78 hits đầu tiên là sách về máy tính (cuốn thứ 79 là Learn Bengali in 30 days). Thử thay “days” bằng “hours“, những gì thu được cũng hoàn toàn tương tự: 253 kết quả, với 77 hits đầu tiên về máy tính với cuốn thứ 78 là Teach Yourself Grammar and Style in 24 Hours. Khi vượt ra ngoài top 200, 96% cuốn sách đều là computer books. (Thời điểm Norvig “thí nghiệm” có lẽ đã cách đây một thời gian, bây giờ những con số ấy tăng lên một cách chóng mặt).

Từ đây có thể rút ra kết luận: “Hoặc là bây giờ người ta đổ xô đi tìm hiểu về máy tính, hoặc máy tính không hiểu vì một lí do hoang đường nào đó lại trở nên dễ học hơn những thứ khác”. Chẳng có quyển sách nào hướng dẫn học Beethoven, Vật lý Lượng tử hay thậm chí là “chăm sóc cho chó” (Dog Grooming) chỉ trong có vài ngày…

Hãy thử phân thử xem cái tiêu đề Learn C++ in Three Days gợi lên được điều gì:

  • Learn: Trong 3 ngày thậm chí bạn còn chưa đủ thời gian viết được một vài chương trình cho ra hồn chứ đừng nói đến việc học từ những thành công và thất bại. Bạn cũng không có cơ hội làm việc với những người giàu kinh nghiệm và hiểu xem cái gì đang xảy ra trong môi trường C++. Nói tóm lại là bạn chẳng thể nào học cho cặn kẽ được. 3 ngày chỉ đủ để bạn làm quen với phần nổi bề ngoài, đó không phải sự thấu hiểu. Và như Alexander Pope đã từng nói: “Hiểu biết nông cạn còn nguy hiểm hơn kẻ mù chữ” (Nguyên văn: A little learning is a dangerous thing).
  • C++: Trong 3 ngày có thể bạn học xong cú pháp của C++ (nếu bạn đã thực sự biết một vài ngôn ngữ lập trình khác), nhưng bạn khó mà học được cách sử dụng chúng. Nói ngắn gọn, nếu bạn là một lập trình viên Basic, bạn có thể viết những chương trình theo phong cách Basic sử dụng cú pháp của C++, nhưng bạn sẽ chẳng hiểu được những ưu điểm hay nhược điểm của C++. Vậy quan điểm ở đây là gì? Alan Perlis (giáo sư đại học Yale), trong Epigrams on Programming đã từng nói: “Một ngôn ngữ mà chẳng ảnh hưởng gì đến cách bạn tư duy về lập trình, ngôn ngữ ấy chỉ là đồ bỏ đi, không đáng để học” (Nguyên văn: A language that doesn’t affect the way you think about programming, is not worth knowing). Có thể chấp nhận được nếu bạn chỉ định học đôi chút về C++ (hoặc Visual Basic hay JavaScript) vì bạn chỉ cần làm quen với những công cụ có sẵn để làm một việc nào đó. Nhưng đấy không phải là bạn học ngôn ngữ để lập trình, bạn chỉ học để hoàn thành nhiệm vụ cụ thể của mình mà thôi.
  • Trong 3 ngày: Thật đáng tiếc, điều này là không thể, như tôi sẽ chỉ ra dưới đâ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 nhiều lĩnh vực, từ đánh cờ, sáng tác âm nhạc, hội họa, bơi lội, tennis, hay thu được kết quả trong tâm lí thần kinh hay hình học topo. Và lịch sử đã chứng minh không thể có con đường tắt. Dù cho đó là Mozart, thiên tài âm nhạc nảy nở từ năm lên 4 tuổi, cũng phải mất 13 năm để cho ra đời tác phẩm nhạc cổ điển đầu tiên. Dù cho đó là Beatles, trước khi xuất bản #1 đầu tiên vào năm 1964, họ cũng đã phải cặm cụi trong những câu lạc bộ nhỏ tại Liverpool hay Hamburg. Samuel Johnson (1704 – 1784, nhà ảo thuật) cho rằng bạn thậm chí mất hơn 10 năm: “Sự vượt trội ở bất cứ lĩnh vực nào cũng chỉ có thể đạt được bằng lao động cật lực trong suốt cuộc đời, bạn không thể mua nó bằng một cái giá rẻ hơn” (Nguyên văn: “Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price”). Và Chaucer phàn nàn: “Cuộc đời quá ngắn ngủi, trong khi những mánh khóe thì lại quá dài để có thể học được”. (Nguyên văn: “The lyf so short, the craft so long to lerne”).

Đây là công thức cho những thành công của tôi trong lập trình:

  • Hãy yêu thích nó, bạn làm vì bạn cảm thấy vui vẻ và hào hứng. Hãy chắc chắn rằng bạn luôn như thế trong 10 năm…
  • Hãy trao đổi với những lập trình viên khác, đọc chương trình của họ. Điều này còn quan trọng hơn bất kì quyển sách hay khóa đào tạo nào.
  • Cách học tốt nhất là thông qua thực hành (learning by doing). Nói cho rõ ràng hơn thì: “Tầm cao nhất của một lĩnh vực nào đó không thể có được chỉ thông qua sự bổ sung về mặt kinh nghiệm. Nhưng kể cả khi đã có rất nhiều kinh nghiệm, nếu cố gắng và nỗ lực, bạn vẫn có thể tiến xa hơn”. (Nguyên văn: “The maximal level of performance for individuals in a given domain is not attained automatically as a function of extended experience, but the level of performance can be increased even by highly experienced individuals as a result of deliberate efforts to improve”) và “để học tập một cách hiệu quả nhất, bạn cần phải xác định rõ khả năng hiện tại của mình, thu thập kiến thức từ người khác, và tự tìm lấy những cơ hội để học theo và sửa đổi sai lầm của chính mình” (Nguyên văn: “The most effective learning requires a well-defined task with an appropriate difficulty level for the particular individual, informative feedback, and opportunities for repetition and corrections of errors”). Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life là một cuốn sách rất hữu ích cho quan điểm này.
  • Nếu bạn muốn, hãy giành 4 năm ở đại học (và nhiều hơn ở trường phổ thông). Bạn sẽ có cơ hội làm những công việc yêu cầu khả năng và hiểu biết chuyên sâu hơn trong một vài lĩnh vực. Trong bất kì trường hợp nào, chỉ đọc sách thôi là chưa đủ. “Bút vẽ và mực màu không thể biến bạn trở thành họa sĩ, cũng như những bài giảng về khoa học máy tính trên lớp không thể giúp bạn trở thành chuyên gia lập trình” (Nguyên văn: “Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter”), Eric Raymond, tác giả của The New Hacker Dictionary đã nói như vậy. Một trong những lập trình viên giỏi nhất mà tôi đã từng thuê chưa từng có bằng đại học, nhưng anh ta đã tham gia viết những phần mềm tuyệt vời, có news group của riêng mình và anh ta thậm chí còn giàu hơn cả tôi.
  • Hãy tham gia vào các projects với những lập trình viên khác. Bạn có thể là best programmer trong một projects, nhưng cũng có thể là worst. Nếu là best, hãy thử khả năng làm leader của mình. Còn ngược lại, hãy học hỏi xem người giỏi nhất làm gì, và học xem họ không làm gì (vì họ muốn bạn làm những việc đó).
  • Trong một project, hãy bắt tay làm việc sau những lập trình viên khác, khi bạn đã hiểu chương trình của họ. Hãy tìm xem những gì cần thiết để hiểu và chỉnh sửa khi người viết ra chương trình đó không có mặt ở đây. Thử nghĩ xem làm thế nào để thiết kế những chương trình giúp cho những người sau này có thể dễ dàng hơn trong việc bảo trì nó.
  • Hãy học ít nhất khoảng nửa tá ngôn ngữ lập trình, bao gồm:
    • Một ngôn ngữ hỗ trợ việc tạo các lớp trừu tượng (Java hoặc C++)
    • Một ngôn ngữ lập trình hàm (Lisp hoặc ML)
    • Một ngôn ngữ cú pháp (Lisp)
    • Một ngôn ngữ hỗ trợ khai báo định danh (Prolog hoặc C++ templates)
    • Một ngôn ngữ hỗ trợ coroutine (Icon hay Scheme)
    • Một ngôn ngữ hỗ trợ song song (Sisal)
  • Hãy nhớ rằng máy tính là một phần của khoa học máy tính. Nên nắm rõ thời gian để máy tính thực hiện một chỉ thị, lấy một từ trong bộ nhớ (có hay không có cache), đọc những từ liên tiếp trong ổ đĩa, hay tìm kiếm một vùng nhớ cụ thể.

    Thời gian cần thiết để thực hiện các phép toán với một PC tốc độ 1GHz (2001):

    execute single instruction 1 nsec = (1/1,000,000,000) sec
    fetch word from L1 cache memory 2 nsec
    fetch word from main memory 10 nsec
    fetch word from consecutive disk location 200 nsec
    fetch word from new disk location (seek) 8,000,000nsec = 8msec
  • Hãy cố gắng tuân theo những qui định tiêu chuẩn của ngôn ngữ. Có thể đó là của ANSI C++, hoặc đơn giản đó là của công ty bạn. Bạn cũng nên tìm hiểu xem người ta thích gì ở ngôn ngữ đó, họ cảm thấy thế nào, hay vì sao họ thích nó.
  • Hãy sẵn sàng từ bỏ những tiêu chuẩn của ngôn ngữ càng nhanh càng tốt.

Với những điều tôi đã nói ở trên, bạn có thể băn khoăn rằng bạn sẽ đạt đến mức nào nếu chỉ đọc sách? Trước khi con trai cả của mình ra đời, tôi đã đọc tất cả những cuốn sách How To (làm thế nào), và vẫn cảm thấy vô cùng mù mờ, rối rắm. 30 tháng sau, khi sinh đứa thứ hai, phải chăng tôi đã quay lại chúng với cái nhìn hoàn toàn mới mẻ? Không, tôi chỉ dựa vào kinh nghiệm của chính mình. Chúng có ích và khiến tôi vững tin hơn nhiều so với việc đọc hàng ngàn trang sách của các bậc chuyên gia.

    Fred Brooks, trong bài luận nổi tiếng No Silver Bullets đã làm rõ ba bước để tìm một designer tốt:

  • Hãy giải thích một cách có hệ thống cho câu hỏi: “Thế nào là một top designer?” càng sớm càng tốt.
  • Hãy giao triển vọng và tương lai phát triển của công ty cho những người thông thái, có nhiều kinh nghiệm và tìm cách giữ chân họ cẩn thận.
  • Trao cơ hội cho những designers đang trong giai đoạn trưởng thành để họ có thể tiếp xúc, học hỏi, nâng cao trình độ.

Alan Perlis đã từng nói: “Mọi người đều có thể được dạy điêu khắc. Michealangelo thì không. Và ông đã tự trở thành nhà điêu khắc vĩ đại. Những lập trình viên siêu hạng cũng nên thế”.

Phụ lục: Lựa chọn ngôn ngữ

    Có nhiều người hỏi nên chọn học ngôn ngữ nào đầu tiên. Không có câu trả lời cụ thể, dưới đây là một số quan điểm:

  • Hãy nhìn vào bạn của mình. Khi hỏi: “Tôi nên sử dụng hệ điều hành nào đây, Windows, Unix hay Mac?”, tôi thường đáp rằng: “Hãy nhìn vào bạn của mình”. Lợi ích thu được từ việc học hỏi bạn bè sẽ bù đắp cho những khác biệt căn bản giữa các hệ điều hành hay ngôn ngữ lập trình. Thêm nữa, hãy nhìn những người bạn “sắp quen”: đó là tập hợp các programmers mà bạn sẽ song hành cùng họ nếu bạn vẫn tiếp tục hành trình. Ngôn ngữ bạn chọn có một cộng đồng phát triển rộng lớn hay chỉ một vài người tham gia? Có những tài liệu, websites hay forums nào mà bạn sẽ nhận được lời giải đáp cho thắc mắc của mình? Bạn có thích những người ở đó không?
  • Hãy làm thật đơn giản. Những ngôn ngữ như C++ và Java được thiết kế cho các ứng dụng chuyên nghiệp thực hiện bởi đội ngũ đông đảo các lập trình viên giàu kinh nghiệm, những người vốn rất quan tâm đến hiệu suất những dòng mã của họ. Vì thế, chúng thường bao gồm nhiều thành phần rất phức tạp. Nếu mới bắt đầu, bạn không cần đến sự phức tạp. Bạn hãy học những ngôn ngữ có cấu trúc đơn giản, dễ học.
  • Play. Bạn thích học piano theo cách nào hơn: cách bình thường, cách thức tương tác (interactive mode), tức là bạn nghe mỗi nốt nhạc ngay khi nhấn một phím đàn hay cách thức “batch”, bạn chỉ nghe các nốt sau khi đã hoàn thành cả nhạc phẩm? Rõ ràng, cách tương tác giúp bạn dễ dàng học hơn phải không? Lập trình cũng như vậy. Hãy chọn cho mình một “interactive mode” và sử dụng nó.

Theo tiêu chuẩn của riêng mình, tôi khuyên bạn nên bắt đầu với Python hoặc Scheme. Nhưng mỗi người có những hoàn cảnh khác nhau, và có thể có những lựa chọn tốt hơn. Nếu tuổi của bạn mới chỉ là số có một chữ số (tức bạn chưa đến 10 tuổi 😛 ), theo tôi bạn nên chọn Alice hoặc Squeak (những người lớn tuổi hơn cũng có thể thích chúng). Tuy nhiên, đó không phải là điều quan trọng. Quan trọng là, hãy chọn đi và bắt đầu ngay lập tức.


Bản gốc tiếng Anh, Teach Yourself Programming in Ten Years của Peter Norvig
(dịch bởi Đoàn Chiến Thắng)

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s