Thứ Ba, tháng 5 29, 2012

Tự Học Lập Trình trong 10 năm (Peter Norvig)


Tại sao mọi người lại vội vã như vậy?
Bước vào bất cư một hiệu sách nào, và bạn sẽ nhìn thấy cuốn Tự học Java trong 7 ngày cùng với vô số những cuốn sách tương tự giúp bạn tự học Visual Basic, Windows, Internet, … trong vòng một vài ngày, thậm chí một vài giờ. Tôi đã dùng công cụ Power Search của Amazon thử tìm những cuốn sách xuất bản sau năm 1992 với mục đích giúp bạn học một thứ gì đó trong vòng vài ngày và tìm được 248 cuốn. 78 cuốn đầu tiên là sách về computer (đứng thứ 79 là cuốn Learn Bengali in 30 days). Tôi thử thay thế “ngày” bằng “giờ” và kết quả giống nhau một cách kinh ngạc: 253 cuốn sách nữa, đầu tiên là 77 cuốn sách computer và đứng thứ 78 là cuốn Teach Yourself Grammar and Style in 24 Hours. Trong số 200 cuốn đầu tiên, 96% là sách máy tính.


Có thể kết luận rằng (1)Mọi người đang đổ xô đi học computer, (2) hoặc computer cực kỳ dễ học, dễ học hơn bất cứ một thứ gì khác. Chẳng có cuốn sách nào dạy bạn nghe Beethoven, dạy Vật lý lượng tử, hay thậm chí dạy cắt lông chó... chỉ trong vòng một vài ngày.
Thử phân tích tựa đề của cuốn Học Pascal trong 3 ngày (Learn Pascal in Three Days)

  • Học: Trong 3 ngày bạn sẽ không đủ thời gian để viết được những chương trình thực sự phức tạp, và học từ những thành công cũng như thất bại của bạn. Bạn cũng không đủ thời gian để làm việc với một lập trình viên giàu kinh nghiệm, và cũng không kịp hiểu cuộc sống trong môi trường đó là như thế nào. Nói một cách ngắn gọn bạn không đủ thời gian để học được nhiều. Đó chỉ có thể là một thứ kiến thức nông cạn chứ không thể là một hiểu biết sâu sắc. Theo như Alexander Pope thì: học một chút là một điều nguy hiểm.

  • Pascal: Trong 3 ngày có lẽ bạn sẽ học được cú pháp của Pascal (nếu bạn đã biết một ngôn ngữ tương tự), nhưng bạn không có nhiều thời gian để học cách sử dụng cú pháp ấy. Nếu bạn là lập trình viên BASIC, bạn sẽ viết một chương trình theo phong cách của BASIC nhưng lại dùng cúp pháp của Pascal, tuy nhiên bạn sẽ không học được Pascal hay ở đâu và dở ở chỗ nào. Vậy thì học Pascal để làm gì? Alan Perlis có nói “Nếu một ngôn ngữ không làm thay đổi cách suy nghĩ của bạn về lập trình thì ngôn ngữ đó không đáng học”. Rất có thể lý do bạn phải học một chút Pascal (hoặc thực tế hơn là Visual Basic hay Javascript) là vì bạn phải dùng một công cụ sẵn có nào đó để hoàn thành nhiệm vụ của bạn. Trong trường hợp này, bạn không học lập trình, bạn đang học cách hoàn thành nhiệm vụ.
  • Trong 3 ngày: Thật đáng tiếc, 3 ngày không đủ cho bạn, như sẽ thảo luận chi tiết hơn ở phần tiếp theo.

Tự học lập trình trong 10 năm
Một số nhà nghiên cứu (Hayes, Bloom) cho rằng phải mất khoảng 10 năm để đạt đến mức tinh thông về một lĩnh vực nào đó – bao gồm đánh cờ, soạn nhạc, vẽ tranh, chơi đàn piano, bơi, tennis… Hình như không có trường hợp ngoại lệ nào: ngay cả Mozart, người được xem là thần đồng âm nhạc vào năm lên 4, cũng phải mất đến 13 năm nữa 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 #1 hit, và xuất hiện trong sô của Ed Sullivan năm 1964. Thực ra, The Beatles đã bắt đầu chơi trong các quán bar nhỏ ở Liverpool và Hamburg từ 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 thực sự của The Beatles – Sgt. Peppers – ra đời năm 1967. Sammuel Johnson cho rằng để đạt được sự hoàn hảo phải mất hơn 10 năm: “Sự hoàn hảo trong bất cứ một lĩnh vực nào chỉ có thể đạt được bằng cách làm việc cật lực trong suốt cuộc đời; nó không thể mua được với một cái giá rẻ hơn”. Còn Chaucer thì than phiền “Đời thì quá ngắn, mà thời gian học nghề thì quá lâu”
Còn đây là công thức của tôi để thành công trong lập trình:
  • Tìm thấy hứng thú trong việc lập trình và đảm bảo bạn còn đủ hứng thú để đeo đuổi công việc này trong 10 năm.
  • Trao đổi với các lập trình viên khác. Đọc những chương trình do người khác viết. Điều này quan trọng hơn bất cứ cuốn sách học khóa huấn luyện nào.
  • Lập trình. Cách học tốt nhất là vừa học vừa làm. Nói theo cách của giới chuyên môn thì “năng suất tối đa của mỗi người không đơn thuần chỉ do kinh nghiệm, năng suất tăng lên - ngay cả đối với người giàu kinh nghiệm - là kết quả của những cố gắng để hoàn thiện.” và “cách học có hiệu quả nhất cần có: mục đích được xác định rõ ràng với độ khó thích hợp, ý kiến đóng góp phê bình, cơ hội làm lại và sửa sai.” CuốnCognition 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.
  • Nếu bạn muốn hãy theo học đại học (hoặc cao học). Như vậy, bạn sẽ thêm cơ hội để làm những công việc đòi hỏi bằng cấp, và cũng giúp bạn có một hiểu biết sâu sắc hơn, nhưng nếu bạn không thích môi trường trường học, bạn vẫn có thể (với một chút cố gắng nhất định) thu được kiến thức tương tự từ công việc. Trong mọi trường hợp, học từ sách sẽ không đủ. Eric Raymond, tác giả cuốn The New Hacker’s Dictionary nói: “Các chương trình giảng dạy về máy tính không thể biến bạn thành một chuyên gia máy tính, cũng giống như nghiên cứu chổi vẽ và bột màu cũng chẳng biến bạn thành một họa sĩ”. Một trong số những lập trình viên xuất sắc nhất mà tôi đã từng mướn chỉ học hết trung học; anh ta đã viết rất nhiều phần mềm tuyệt vời; có news group của riêng anh; và kiếm được đủ tiền từ stock options để mua cho mình một nightclub.
  • Làm việc chung 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ố projects; là người kém nhất trong vài projects khác. Khi bạn là người giỏi nhất, bạn kiểm tra khả năng lãnh đạo của mình, và truyền cảm hứng cho người khác từ sư sắc sảo và tầm nhìn của mình. Khi bạn là người kém nhất, bạn học từ những việc mà người giỏi làm, và từ những việc họ không thích làm (vì họ sẽ bắt bạn làm thay họ)
  • Làm việc với các projects sau những lập trình viên khác. Cố gắng hiểu các chương trình viết bởi người khác. Để ý xem cần phải có những gì để hiểu và sửa nó lúc không có tác giả của chương trình. Thiết kế chương trình của bạn để những người làm việc sau bạn có thể bảo trì, sửa chữa nó một cách dễ dàng.
  • Học ít nhất là nửa tá ngôn ngữ lập trình. Bao gồm ít nhất là một ngôn ngữ hỗ trợ class abstractions (như Java hay C++), một ngôn ngữ hỗ trợ functional abstraction (như LISP hay ML), môt ngôn ngữ hỗ trợ syntactic abstraction (như LISP), môt ngôn ngữ hỗ trợ declarative specifications (như Prolog hay C++ template), một ngôn ngữ hỗ trợ coroutines (như Icon hay Scheme) và một ngôn ngữ hỗ trợ parallelism (như Sisal).
  • Nhớ rằng có chữ “computer” trong “computer science”. Bạn cần biết thời gian máy tính của bạn thực hiện một lệnh là bao lâu; thời gian để máy tính tìm một word trong bộ nhớ (khi word đó có và không có trong cache); thời gian đọc các word kế tiếp nhau từ đĩa cứng; và thời gian tìm đến một vị trí mới trong đĩa cứng.
  • Tham gia vào các cố gắng để tiêu chuẩn hóa ngôn ngữ lập trình. Đó có thể là cuộc họp của hội đồng ANSI C++, nhưng cũng có thể chỉ là quyết định xem nhóm lập trình của bạn sẽ dùng 2 hay 4 khoảng trắng ở đầu mỗi dòng. Bằng cách nào thì bạn cũng học được mọi người thích gì ở một ngôn ngũ lập trình, mức độ, và có lẽ hiểu được một chút tại sao họ lại cảm thấy như vậy.
  • Hoàn tất việc tiêu chuẩn hóa ngôn ngữ càng nhanh càng tốt.

Nếu theo công thức này, bạn thử tính xem bạn có thể học được bao nhiêu chỉ từ sách vở. Trước khi đứa con đầu lòng của tôi ra đời, tôi đã nghiền ngẫm tất cả các cuốn sách Làm cách nào để … mà vẫn cảm thấy mình vẫn chẳng biết gì. 30 tháng sau, khi đứa con thứ 2 của tôi chào đời, tôi có đọc lại những cuốn sách đó không? Không. Thay vào đó tôi dựa theo kinh nghiệm của mình, mà hóa ra là những kinh nghiệm này lại có ích và làm cho tôi yên tâm hơn hàng ngàn trang sách viết bởi các chuyên gia.
Fred Brooks, trong bài No Silver Bullets đã đưa ra một kế hoạch gồm 3 giai đoạn để tìm một người thiết kế phần mềm xuất sắc:
  • Tìm kiếm có một cách có hệ thống những người thiết kế phần mềm giỏi nhất càng sớm càng tốt.
  • Phân công các cố vấn nghề nghiệp để giúp đỡ họ thăng tiến trong công việc và theo dõi hồ sơ nghề nghiệp của họ.
  • Tạo cơ hộ để họ trao đổi và cạnh tranh lẫn nhau

Kế hoạch này dựa trên giả thiết là đã tìm được những người đã có sẵn các đức tính để trở thành một người thiết kế phần mềm xuất sắc, và công việc chỉ là tạo điều kiện để họ phát triển. Alan Perlis nói một cách ngắn gọn hơn: “Nếu tất cả mọi người đều có thể học được điêu khắc thì có lẽ Michelangelo đã được dạy để làm ngược lại. Với các lập trình viên xuất sắc cũng vậy.”
Bạn cứ mua cuốn sách Java đó đi, có lẽ bạn sẽ thấy nó có ích. Nhưng, là một lập trình viên, bạn sẽ không thay đổi cuộc đời bạn, hay trình độ của bạn trong 24 giờ, 24 ngày, thậm chí 24 tháng.

Phụ lục: Lựa chọn ngôn ngữ lập trình
Rất nhiều người hỏi tôi: nên bắt đầu từ ngôn ngữ lập trình nào. Không có một câu trả lời chung, nhưng bạn hãy cân nhắc những điểm sau:
Dùng ngôn ngữ lập trình mà bạn bè dùng: Khi người ta hỏi tôi: “Tôi nên dùng hệ điều hành nào, Windows, Unix, hay Mac?” câu trả lời của thôi thường là “Hãy dùng hệ điều hành mà bạn bè của bạn dùng”. Những gì bạn học từ bạn bè quá đủ đề bù đắp những điểm khác nhau giữa các hệ điều hành, hoặc giữa các ngôn ngữ lập trình. Cũng nên xem xét đến những bạn bè tương lai của bạn: cộng đồng lập trình viên mà bạn sẽ là tham gia nếu bạn tiếp tục. Ngôn ngữ mà bạn chọn có một cộng đồng đang phát triển hay đang lụi tàn? Có sách, có website, có diễn đàn để tìm kiếm câu trả lời cho những vấn đề mà bạn gặp phải hay không? Bạn có thích mọi người trên các diễn đàn đó hay không?
Đơn giản. Những ngôn ngữ lập trình như C++ và Java được thiết kế cho những nhóm làm việc gồm nhiều lập trình viên giàu kinh nghiệm và mối quan tâm của họ là hiệu quả của chương trình. Hậu quả là chúng đã bị phức tạp hóa đề phục vụ cho mục đích này. Mối quan tâm chính của bạn là học lập trình, bạn chưa cần đến sự phức tạp đó. Bạn muốn một ngôn ngũ được thiết kế thật đơn giản, dễ học, dễ nhớ cho một người mới bắt đầu.
Chơi. Nếu bạn muốn học chơi piano, bạn sẽ học chơi theo cách nào: (1)bạn muốn nghe thấy note nhạc ngay sau khi bạn gõ vào phím đàn (interactive mode) hay (2) bạn muốn nghe lại toàn bộ các notes sau khi bạn hoàn tất bản nhạc (batch mode). Rõ ràng cách 1 giúp bạn học piano dễ dàng hơn, và học lập trình cũng vậy. Tìm một ngôn ngữ lập trình có hỗ trợ interactive mode và dùng nó.
Dựa trên những tiêu chuẩn trên, ngôn ngũ lập trình cho người mới bắt đầu mà tôi giới thiệu là Python hay Scheme. Nhưng tùy vào hoàn cảnh của bạn, còn có nhiều chọn lựa tốt khác. Với các lập trình viên tương lai còn đang trong lứa tuổi nhi đồng, thì Alice hoặc Squeak có lẽ thích hợp nhất. Điều quan trọng là bạn chọn nó và hãy bắt đầu.
Source here