Đâ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 xin giới thiệu đôi chút về Peter Norvig:
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, xem thêm “Những anh hùng sau thành công 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…
Ý 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 bây giờ 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 tìm kiếm nâng cao (advanced search) tại Amazon.com:
và nhận được 248 kết quả. 78 kết quả đầ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 kết quả đầu tiên là máy tính (cuốn thứ 78 là Teach Yourself Grammar and Style in 24 Hours). Khi vượt ra ngoài top 200, tất cả các cuốn sách đều là sách về máy tính.
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. Felleisen và các đồng sự đồng tình với xu hướng này trong cuốn How to Design Programs, khi họ cho rằng “lập trình bẩn là rất dễ, những kẻ ngốc, thậm chí đần độn có thể học nó trong 24 giờ”
Hãy thử xem cái title: 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 có kinh nghiệm và hiểu xem cái gì đang xảy ra xung quanh mình. 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ữ” (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 Pascal, nhưng bạn sẽ chẳng hiểu được những ưu điểm hay nhược điểm của Pascal. Vậy quan điểm ở đây là gì? Alan Perlis (ND: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”. Có thể chấp nhận được nếu bạn chỉ định học đôi chút về Pascal (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. Điều quan trọng là bàn về 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 thử thách chính mình bằng những nhiệm vụ như vượt qua khả năng hiện tại của bản thân, cố gắng, phân tích hiệu xuất của mình trong và sau quá trình rèn luyện, và sửa chữa bất kỳ sai lầm nào. Cứ như vậy, lặp đi lặp lại. 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 từ năm 1957, và trong khi họ có sức hấp dẫn đại chúng từ rất sớm, thành công quan trọng đầu tiên của nhóm làSgt. Pepper, album được phát hành năm 1967. Malcolm Gladwell có bài báo nghiên cứu so sánh về các sinh viên tại Học viện âm nhạc Berlin trong ba nhóm tốt, khá và trung bình và hỏi họ đã thực hành chăm chỉ như nào:
Tất cả mọi người, từ tất cả ba nhóm, bắt đầu chơi ở cùng một khoảng thời gian – tầm khoảng năm tuổi. Trong những năm đầu tiên, tất cả mọi người thực hành một lượng như nhau – khoảng hai hoặc ba giờ một tuần. Nhưng tầm tám tuổi sự khác biệt thực sự bắt đầu xuất hiện. Các sinh viên trong nhóm tốt nhất, họ bắt đầu thực hành nhiều hơn những người khác: sáu giờ một tuần lúc chín tuổi, tám tuổi là 12 giờ, 16 giờ một tuần khi 14 tuổi, và tăng lên dần, cho đến tuổi 20 họ đã được tập luyện 30 giờ một tuần. 20 tuổi, nghệ sĩ ưu tú đã có tất cả 10.000 giờ thực hành trong cuộc sống của họ. Các sinh viên chỉ đơn thuần là tốt đã đạt 8.000 giờ, và giáo viên âm nhạc trong tương lai là hơn 4.000 giờ.
Vì vậy, có thể 10.000 giờ, chứ không phải 10 năm, là con số kỳ diệu. (Henri Cartier-Bresson (1908-2004) nói: “10.000 bức ảnh đầu tiên của bạn là tệ nhất”, nhưng ông đã chụp nhiều hơn một bức trong một giờ.). Samuel Johnson (1709-1784) nghĩ rằng việc này thậm chí còn lâu hơn: “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”. Và Chaucer (1340-1400) phàn nàn rằng: “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”. Hippocrates (khoảng 400BC) được biết đến với các trích đoạn “ars longa, vita brevis”, là một phần của chích đoạn dài hơn “Ars longa, vita brevis, occasio praeceps, periculosum experimentum, iudicium difficile”, với nghĩa tạm dịch là “Cuộc đời là ngắn ngủi, với cơ hội phù du, đầy dãy các kỹ năng, với các thử nghiệm nguy hiểm, và phán quyết khó khăn”. Mặc dù trong tiếng Latin, ars có thể có nghĩa là nghệ thuật, hoặc mánh khóe, nếu so từ gốc tiếng Hy Lạp “techne” thì chỉ có thể có nghĩa là “kỹ năng”, không phải “nghệ thuật”.
Và nếu bạn muốn trở thành lập trình viên
Đâ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ọ viết. Đ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.
- Lập trình: Cách học tốt nhất là học đi đôi với 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” 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”. 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, nhưng nếu bạn không thích trường học, bạn có thể (với một số sự nỗi lực và cống hiến) có được kinh nghiệm tương tự của riêng bạn hoặc trong công việ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”, 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 (ví dụ), 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:
execute typical instruction 1/1,000,000,000 sec = 1 nanosec fetch from L1 cache memory 0.5 nanosec branch misprediction 5 nanosec fetch from L2 cache memory 7 nanosec Mutex lock/unlock 25 nanosec fetch from main memory 100 nanosec send 2K bytes over 1Gbps network 20,000 nanosec read 1MB sequentially from memory 250,000 nanosec fetch from new disk location (seek) 8,000,000 nanosec read 1MB sequentially from disk 20,000,000 nanosec send packet US to Europe and back 150 milliseconds = 150,000,000 nanosec
- 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 nhà thiết kế 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 nhà thiết kế đỉnh?” 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 nhà thiết kế đ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 độ.
Điều này coi như giả định là một số người có đầy đủ những phẩm chất cần thiết để trở thành một nhà thiết kế lớn, và công việc đủ để dụ họ theo. 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ế”. Perlis đã từng nói rằng những người vĩ đại sẵn có một nội lực vượt qua cả sự đào tạo. Nhưng nội lực đó đến từ đâu? Bẩm sinh ư? Hay chúng được phát triển thông qua sự tích cực? Như Auguste Gusteau (đầu bếp huyền thoại của Ratatouille) đã nói: “bất cứ 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ĩ về điều này nhiều đến mức cứ như là sẵn sàng cống hiến phần lớn thời gian trong đời của ai đó để luận bàn. Nhưng không hề sợ hãi có lẽ là cách để tóm lại tất cả những điều đó. Hoặc, như nhà phê bình Gusteau, Anton Ego, nói: “Không phải tất cả mọi người đều có thể trở thành một nghệ sĩ lớn, nhưng một nghệ sĩ lớn có thể đến từ bất cứ nơi nào.”
Vì vậy, nếu mua quyển sách Java/Ruby/Javascript/PHP nói trên, bạn có thế sẽ thu được một vài điều có ích. Nhưng nó không thể thay đổi cuộc đời của bạn, hoặc đưa bạn đến sự thành thạo hay tinh thông, chỉ trong 24 giờ, vài ngày hay thậm chí là vài tháng.
Tham khảo
Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
Bryan, W.L. & Harter, N. “Studies on the telegraphic language: The acquisition of a hierarchy of habits. Psychology Review, 1899, 8, 345-375
Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
Chase, William G. & Simon, Herbert A. “Perception in Chess” Cognitive Psychology, 1973, 4, 55-81.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.
Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
Bryan, W.L. & Harter, N. “Studies on the telegraphic language: The acquisition of a hierarchy of habits. Psychology Review, 1899, 8, 345-375
Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
Chase, William G. & Simon, Herbert A. “Perception in Chess” Cognitive Psychology, 1973, 4, 55-81.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.
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 bè 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.
- Chơi. Bạn thích học piano theo cách nào hơn: kiểu tương tác thông thường, 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 theo “lô”, tức bạn chỉ nghe các nốt sau khi đã hoàn thành cả nhạc phẩm? Rõ ràng, cách thứ nhất 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 kiểu tương tác 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ố, theo tôi bạn nên chọn Alice hoặc Squeak (người lớ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.
Phụ lục: Sách và các tài nguyên khác
Nhiều người hay hỏi rằng họ nên học từ những cuốn sách hay những trang web nào. Tôi luôn lặp lại rằng: “chỉ học trong sách vở là không đủ”, nhưng tôi có thể giới thiệu một vài cuốn sau đây:
- Scheme: Structure and Interpretation of Computer Programs (Abelson & Sussman) có thể là lựa chọn tốt nhất để nhập môn về khoa học máy tính, và nó dạy việc lập trình như là cách để hiểu về khoa học máy tính. Bạn có thể xem online video trực tuyến các bải giảng trong cuốn sách này, cũng như toàn bộ tài liệu văn bản trực tuyến. Cuốn sách là sự thách thức và sẽ loại bỏ một số người, những người có thể thành công hơn với phương pháp tiếp cận khác.
- Scheme: How to Design Programs (Felleisen et al.) là một trong những cuốn sách tốt nhất về làm thế nào để thực sự thiết kế chương trình một cách thanh lịch và thiết thực.
- Python: Python Programming: An Intro to CS (Zelle) là cuốn sách tốt để nhập môn Python.
- Python: Rất nhiều các tutorials trên trang Python.org.
- Oz: Concepts, Techniques, and Models of Computer Programming (Van Roy & Haridi) Cuốn sách được xem như là phiên bản của thế hệ hiện đại sau Abelson và Sussman. Đây là một tour du lịch thông qua những ý tưởng lớn về lập trình, bao gồm phạm vi rộng hơn Abelson và Sussman, trong khi lại dễ dàng hơn để đọc và làm theo. Nó sử dụng ngôn ngữ Oz, không được biết đến rộng rãi nhưng phục vụ như là cơ sở cho việc học các ngôn ngữ khác.
Tác giả: Peter Norvig
0 nhận xét:
Đăng nhận xét