Friday, August 25, 2017

Turing Award

The ACM A.M. Turing Award is an annual prize given by the Association for Computing Machinery (ACM) to "an individual selected for contributions of a technical nature made to the computing community". It is stipulated that the contributions "should be of lasting and major technical importance to the computer field".[2] The Turing Award is generally recognized as the highest distinction in computer science[3][4] and the "Nobel Prize of computing".[5][6]
The award is named after Alan Turing, a British mathematician and reader in mathematics at the University of Manchester. Turing is often credited as being the key founder of theoretical computer science and artificial intelligence.[7] From 2007 to 2013, the award was accompanied by a prize of US $250,000, with financial support provided by Intel and Google.[2] Since 2014, the award has been accompanied by a prize of US $1 million,[1] with financial support provided by Google.[8]
The first recipient, in 1966, was Alan Perlis, of Carnegie Mellon University. The first female recipient was Frances E. Allen of IBM in 2006.[9]

Recipients[edit]

YearRecipientsCitation
1966Alan J. PerlisFor his influence in the area of advanced computer programming techniques and compiler construction[10]
1967Maurice WilkesProfessor Wilkes is best known as the builder and designer of the EDSAC, the first computer with an internally stored program. Built in 1949, the EDSAC used a mercury delay line memory. He is also known as the author, with Wheeler and Gill, of a volume on "Preparation of Programs for Electronic Digital Computers" in 1951, in which program libraries were effectively introduced[11]
1968Richard HammingFor his work on numerical methods, automatic coding systems, and error-detecting and error-correcting codes[12]
1969Marvin MinskyFor his central role in creating, shaping, promoting, and advancing the field of artificial intelligence.[13]
1970James H. WilkinsonFor his research in numerical analysis to facilitate the use of the high-speed digital computer, having received special recognition for his work in computations in linear algebra and "backward" error analysis[14]
1971John McCarthyMcCarthy's lecture "The Present State of Research on Artificial Intelligence" is a topic that covers the area in which he has achieved considerable recognition for his work[15]
1972Edsger W. DijkstraEdsger Dijkstra was a principal contributor in the late 1950s to the development of the ALGOL, a high level programming language which has become a model of clarity and mathematical rigor. He is one of the principal proponents of the science and art of programming languages in general, and has greatly contributed to our understanding of their structure, representation, and implementation. His fifteen years of publications extend from theoretical articles on graph theory to basic manuals, expository texts, and philosophical contemplations in the field of programming languages[16]
1973Charles W. BachmanFor his outstanding contributions to database technology[17]
1974Donald E. KnuthFor his major contributions to the analysis of algorithms and the design of programming languages, and in particular for his contributions to "The Art of Computer Programming" through his well-known books in a continuous series by this title[18]
1975Allen Newell and
Herbert A. Simon
In joint scientific efforts extending over twenty years, initially in collaboration with J. C. Shaw at the RAND Corporation, and subsequently with numerous faculty and student colleagues at Carnegie Mellon University, they have made basic contributions to artificial intelligence, the psychology of human cognition, and list processing[19]
1976Michael O. Rabin and
Dana S. Scott
For their joint paper "Finite Automata and Their Decision Problem,"[20] which introduced the idea of nondeterministic machines, which has proved to be an enormously valuable concept. Their (Scott & Rabin) classic paper has been a continuous source of inspiration for subsequent work in this field[21][22]
1977John BackusFor profound, influential, and lasting contributions to the design of practical high-level programming systems, notably through his work on FORTRAN, and for seminal publication of formal procedures for the specification of programming languages[23]
1978Robert W. FloydFor having a clear influence on methodologies for the creation of efficient and reliable software, and for helping to found the following important subfields of computer science: the theory of parsing, the semantics of programming languages, automatic program verification, automatic program synthesis, and analysis of algorithms[24]
1979Kenneth E. IversonFor his pioneering effort in programming languages and mathematical notation resulting in what the computing field now knows as APL, for his contributions to the implementation of interactive systems, to educational uses of APL, and to programming language theory and practice[25]
1980Tony HoareFor his fundamental contributions to the definition and design of programming languages[26]
1981Edgar F. CoddFor his fundamental and continuing contributions to the theory and practice of database management systems, esp. relational databases[27]
1982Stephen A. CookFor his advancement of our understanding of the complexity of computation in a significant and profound way[28]
1983Ken Thompson and
Dennis M. Ritchie
For their development of generic operating systems theory and specifically for the implementation of the UNIX operating system
1984Niklaus WirthFor developing a sequence of innovative computer languages, EULER, ALGOL-W, MODULA and Pascal
1985Richard M. KarpFor his continuing contributions to the theory of algorithms including the development of efficient algorithms for network flow and other combinatorial optimization problems, the identification of polynomial-time computability with the intuitive notion of algorithmic efficiency, and, most notably, contributions to the theory of NP-completeness
1986John Hopcroft and
Robert Tarjan
For fundamental achievements in the design and analysis of algorithms and data structures
1987John CockeFor significant contributions in the design and theory of compilers, the architecture of large systems and the development of reduced instruction set computers (RISC)
1988Ivan SutherlandFor his pioneering and visionary contributions to computer graphics, starting with Sketchpad, and continuing after
1989William KahanFor his fundamental contributions to numerical analysis. One of the foremost experts on floating-point computations. Kahan has dedicated himself to "making the world safe for numerical computations."
1990Fernando J. CorbatóFor his pioneering work organizing the concepts and leading the development of the general-purpose, large-scale, time-sharing and resource-sharing computer systems, CTSS and Multics.
1991Robin MilnerFor three distinct and complete achievements: 1) LCF, the mechanization of Scott's Logic of Computable Functions, probably the first theoretically based yet practical tool for machine assisted proof construction; 2) ML, the first language to include polymorphic type inference together with a type-safe exception-handling mechanism; 3) CCS, a general theory of concurrency. In addition, he formulated and strongly advanced full abstraction, the study of the relationship between operational and denotational semantics.[29]
1992Butler W. LampsonFor contributions to the development of distributed, personal computing environments and the technology for their implementation: workstations, networks, operating systems, programming systems, displays, security and document publishing.
1993Juris Hartmanis and
Richard E. Stearns
In recognition of their seminal paper which established the foundations for the field of computational complexity theory.[30]
1994Edward Feigenbaum and
Raj Reddy
For pioneering the design and construction of large scale artificial intelligence systems, demonstrating the practical importance and potential commercial impact of artificial intelligence technology.[31]
1995Manuel BlumIn recognition of his contributions to the foundations of computational complexity theory and its application to cryptography and program checking.
1996Amir PnueliFor seminal work introducing temporal logic into computing science and for outstanding contributions to program and systems verification.
1997Douglas EngelbartFor an inspiring vision of the future of interactive computing and the invention of key technologies to help realize this vision.
1998Jim GrayFor seminal contributions to database and transaction processing research and technical leadership in system implementation.
1999Frederick P. Brooks, Jr.For landmark contributions to computer architecture, operating systems, and software engineering.
2000Andrew Chi-Chih YaoIn recognition of his fundamental contributions to the theory of computation, including the complexity-based theory of pseudorandom number generation, cryptography, and communication complexity.
2001Ole-Johan Dahl and
Kristen Nygaard
For ideas fundamental to the emergence of object-oriented programming, through their design of the programming languages Simula I and Simula 67.
2002Ronald L. Rivest,
Adi Shamir and
Leonard M. Adleman
For their ingenious contribution for making public-key cryptography useful in practice.
2003Alan KayFor pioneering many of the ideas at the root of contemporary object-oriented programming languages, leading the team that developed Smalltalk, and for fundamental contributions to personal computing.
2004Vinton G. Cerf and
Robert E. Kahn
For pioneering work on internetworking, including the design and implementation of the Internet's basic communications protocols, TCP/IP, and for inspired leadership in networking.
2005Peter NaurFor fundamental contributions to programming language design and the definition of ALGOL 60, to compiler design, and to the art and practice of computer programming.
2006Frances E. AllenFor pioneering contributions to the theory and practice of optimizing compiler techniques that laid the foundation for modern optimizing compilers and automatic parallel execution.
2007Edmund M. Clarke,
E. Allen Emerson and
Joseph Sifakis
For their roles in developing model checking into a highly effective verification technology, widely adopted in the hardware and software industries.[32]
2008Barbara LiskovFor contributions to practical and theoretical foundations of programming language and system design, especially related to data abstraction, fault tolerance, and distributed computing.
2009Charles P. ThackerFor his pioneering design and realization of the Xerox Alto, the first modern personal computer, and in addition for his contributions to the Ethernet and the Tablet PC.
2010Leslie G. ValiantFor transformative contributions to the theory of computation, including the theory of probably approximately correct (PAC) learning, the complexity of enumeration and of algebraic computation, and the theory of parallel and distributed computing.
2011Judea Pearl[33]For fundamental contributions to artificial intelligence through the development of a calculus for probabilistic and causal reasoning.[34]
2012Silvio Micali
Shafi Goldwasser
For transformative work that laid the complexity-theoretic foundations for the science of cryptography and in the process pioneered new methods for efficient verification of mathematical proofs in complexity theory.[35]
2013Leslie LamportFor fundamental contributions to the theory and practice of distributed and concurrent systems, notably the invention of concepts such as causality and logical clocks, safety and liveness, replicated state machines, and sequential consistency.[36][37]
2014Michael StonebrakerFor fundamental contributions to the concepts and practices underlying modern database systems.[38]
2015Martin E. Hellman
Whitfield Diffie
For fundamental contributions to modern cryptography. Diffie and Hellman's groundbreaking 1976 paper, "New Directions in Cryptography,"[39] introduced the ideas of public-key cryptography and digital signatures, which are the foundation for most regularly-used security protocols on the internet today.[40]
2016Tim Berners-LeeFor inventing the World Wide Web, the first web browser, and the fundamental protocols and algorithms allowing the Web to scale.[41]

Friday, July 28, 2017

5 Ngôn ngữ lập trình tốt nhất cho người mới bắt đầu

Bài viết được dịch từ trang web LifeHacker
Nếu bạn đang nghĩ đến việc học lập trình, thì ngôn ngữ bạn quyết định chọn để bắt đầu phụ thuộc rất nhiều vào cái mà bạn đang cố gắng học, cái mà bạn muốn làm với kỹ năng đó, và cái đích cuối cùng mà bạn muốn đi tới. Tuy nhiên, một số ngôn ngữ lập trình dễ học hơn những ngôn ngữ khác, và có một cộng đồng tích cực trong việc dạy hoặc đưa ra nhiều các kỹ năng hữu ích một khi bạn đã học chúng. Đây là 5 ngôn ngữ tốt nhất, dựa trên sự đề cử của chính các bạn độc giả.
Đâu là ngôn ngữ lập trình tốt nhất cho người mới bắt đầu?
Đâu là ngôn ngữ lập trình tốt nhất cho người mới bắt đầu?
Xin được nói rõ rằng - chúng ta đang không cố gắng giải quyết triệt để câu hỏi "Ngôn ngữ lập trình nào bạn nên học đầu tiên nếu bạn đang thử học lập trình?". Mọi người đều có những quan điểm khác nhau và phụ thuộc vào những lý do xác định trong việc học của bạn, có lẽ trong trường hợp này không có câu trả lời nào là hoàn toàn chính xác cả. Các bạn đã đưa ra rất nhiều ý kiến trong bài viết trước và chúng tôi chỉ làm rõ hơn ở đây, với rất nhiều sự mô tả và những lý do cơ bản cho mỗi ngôn ngữ. Chúng tôi đã tiến hành tổng hợp và xếp hạng 5 ngôn ngữ lập trình phổ biến nhất theo đề cử của các bạn, nhưng không theo một trật tự nào cả.

1. Java

Ngôn ngữ lập trình Java
Ngôn ngữ Java của hãng Oracle là một trong những ngôn ngữ lập trình có chỗ đứng lâu nhất, bền bỉ và có tầm ảnh hưởng nhất. Bạn sẽ tìm thấy Java tại lõi của các ứng dụng trong và ngoài môi trường web, trên tất cả các nền tảng, các hệ điều hành và các thiết bị khác nhau. Nó là một ngôn ngữ lập trình hướng đối tượng, có đặc trưng sâu sắc dựa trên lớp (class-based), được thiết kế để có thể hoạt động được trên nhiều nền tảng nhất có thể. Vì lý do đó, nó cũng là một trong những ngôn ngữ lập trình phổ biến nhất thế giới, điều đó khiến nó trở nên vô cùng giá trị để học nếu bạn đang có hứng thú trong việc học lập trình. Nhược điểm của Java đó là để đảm bảo khả năng có thể chạy được ở nhiều nơi, nên nó tương đối khó nắm bắt để lập trình một cách hiệu quả và năng suất.
Mặc dù Java không phải là một ngôn ngữ lập trình hoàn hảo - nhiều trường lớp bắt đầu dạy bằng ngôn ngữ C hoặc C++ bởi vì Java thừa kế rất nhiều cú pháp từ những ngôn ngữ đi trước này. Những bạn chọn Java ở vị trí quán quân về ngôn ngữ lập trình nên học đầu tiên đã ghi chú rằng Java buộc bạn nghĩ giống như một lập trình viên - nghĩ một cách có logic và phân tích, và thực sự nắm được cách mà máy tính sẽ xử lý thông tin để thành công. Nó là một tập các khái niệm cốt lõi nền tảng sẽ giúp bạn khi bạn chuyển sang những ngôn ngữ và công nghệ khác.
TechMaster có đầy đủ các khóa học lập trình bằng những ngôn ngữ tốt nhất cho người mới bắt đầu.

2. Ruby

Ngôn ngữ lập trình Ruby
Ruby là một ngôn ngữ lập trình hướng đối tượng, dynamic, mã nguồn mở được phát triển bởi nhà khoa học máy tính người Nhật Bản là Yukihiro Matsumoto vào những năm 90s của thế kỷ trước, điều đó khiến cho nó trở thành một trong những ngôn ngữ lập trình tuổi đời còn ít nhưng lại được sử dụng rộng rãi. Ruby được thiết kế có cú pháp dễ đọc và dễ viết đối với con người, mà không cần thiết phải học một số lượng lớn những dòng lệnh và những "từ điển" chuyên biệt khi mới bắt đầu. Trong khi bản thân ngôn ngữ này là hướng đối tượng, nhưng nó cũng hỗ trợ lập trình thủ tục, chức năng và mệnh lệnh (imperative), một trong những yếu tố khiến nó đặc biệt linh hoạt.
Ruby nổi tiếng trong việc khá dễ học, chỉ với 20 phút xem một hướng dẫn dành cho người mới bắt đầu trên trang chủ của ngôn ngữ này là có thể khiến bạn trở nên quen thuộc với một số đặc điểm căn bản của nó, đây thực sự là một khoảng thời gian rất ngắn. Những fan hâm mộ các ngôn ngữ như Perl và Python cũng sẽ tìm thấy một số điểm tương đồng để trở nên thích thú. Những độc giả đề cử Ruby đã ca ngợi nó bởi tính dễ hiểu và dễ học, dễ đọc khi mới bắt đầu; và nó có một cộng đồng developer rộng lớn, năng động và đam mê để đảm bảo sự thành công của ngôn ngữ này.

3. Python

Ngôn ngữ lập trình Python
Khi mọi người bàn luận về những ngôn ngữ lập trình nên học đầu tiên và ngôn ngữ nào dễ dàng hơn cho mọi người có thể học nhanh chóng, Python chắc chắn là một lựa chọn. Nó được phát triển từ những năm 80s bởi Guido van Rossum, người sau đó đã quản lý ngôn ngữ này thông qua tổ chức phi lợi nhuận Python Software Foundation, phục vụ như là đơn vị quản lý của ngôn ngữ này, Python là ngôn ngữ mã nguồn mở và sử dụng miễn phí, thậm chí cho các ứng dụng thương mại. Python thường được sử dụng và xem như là một ngôn ngữ kịch bản, cho phép các lập trình viên tạo ra một số lượng lớn code dễ đọc trong một khoảng thời gian ngắn, nhưng nó cũng là một ngôn ngữ dynamic, hỗ trợ hướng đối tượng, thủ tục, và có phong cách lập trình chức năng như những ngôn ngữ khác. Bởi tính mềm dẻo của nó, Python là một trong những ngôn ngữ lập trình bậc cao được sử dụng rộng rãi nhất ngày nay.
Python không chỉ bắt đầu dạy ở mức cơ bản, mà nó dạy một số kiến thức hữu ích như indentation, module hóa, tính quan trọng của quy tắc đặt tên biến và hàm (naming conventions) sẽ giúp bạn rất nhiều khi bạn học và làm việc với những ngôn ngữ khác. Trong bài viết trước, tôi đã đề cập đến một chủ đề trên mạng xã hội Reddit nói về những mặt ưu và nhược điểm của ngôn ngữ này khi chọn nó để học đầu tiên. Những bạn đã đề cử Python cũng làm nổi bật một thực tế rằng cộng đồng các developer Python rất hạnh phúc bởi ngôn ngữ này thường được sử dụng như là một ngôn ngữ để dạy học, vì vậy họ có hàng tấn các công cụ học tập và các tài liệu có sẵn để giúp những người lần đầu tiên học code. Nhưng tutorial trên trang chủ của nó cũng dễ để làm theo, rất hữu ích và thực tế.

4. C/C++

Ngôn ngữ lập trình C/C++
Trong khi những đề cử của độc giả đa số là cho ngôn ngữ lập trình C và khá ít đề cử C++, chúng tôi đã quyết định gộp 2 ngôn ngữ này làm một, vì dù sao C++ cũng là một bước tiến từ C. Chúng ta không đi quá chi tiết vào lịch sử của ngôn ngữ C, và sau đó là C++ (cái mà đã bắt đầu cải tiến và cập nhật để mang ngôn ngữ C đến với các ứng dụng hiện đại), hãy chỉ nói về 2 ngôn ngữ này kể từ khi chúng được sinh ra từ những năm 1970s và đầu những năm 80s, tương ứng (bạn có thể đọc thêm về lịch sử của hai ngôn ngữ này ở link Wikipedia phía trên). C là ngôn ngữ lập trình mệnh lệnh được sử dụng cực kỳ rộng rãi, đa mục đích; có một tầm ảnh hưởng lớn đến hầu hết các ngôn ngữ lập trình đi sau nó. C++ mặt khác còn đi một bước xa hơn trong việc bổ sung các đặc trưng hướng đối tượng class đến ngôn ngữ này, đi kèm với các hàm ảo và template. C++ là một trong những ngôn ngữ lập trình phổ biến nhất trên thế giới, và ngày nay nó vẫn còn được sử dụng rộng rãi trong mọi thứ từ video games cho đến các phần mềm thương mại. Việc học C++ có một chút khó khăn hơn so với C, mặc dù nhiều người sẽ tranh cãi rằng không có lý do gì mà lại bắt đầu học lập trình bằng ngôn ngữ C cả. Đó là một cuộc tranh luận không có hồi kết.
Có một điều quan trọng về C và C++: cả 2 ngôn ngữ này hầu như là những ngôn ngữ nền tảng nhất trong khoa học máy tính và lập trình. Nếu bạn học chúng, bạn sẽ thu được nhiều lợi ích, thậm chí nếu sau này bạn không còn sử dụng chúng nữa. Chúng sẽ mang lại cho bạn cái nhìn sâu sắc vào trong điểm bắt đầu và nguồn gốc của khoa học máy tính và lập trình máy tính, trong khi nhiều người chỉ ra rằng việc học đó cũng giống như bạn đang học lái xe hơi trước khi học cách lắp ráp một chiếc xe, cả hai ngôn ngữ này đều có những mặt ưu và nhược điểm của chúng. Những độc giả đã ca ngợi chúng là ngôn ngữ đầu tiên để học nói rằng bạn sẽ có một sự hiểu biết phong phú về lập trình nếu bạn bắt đầu với chúng, và một độc giả đã trỏ link sang bài viết tuyệt vời này có nội dung về làm thế nào để các ngôn ngữ có thể phân biệt những lập trình viên giỏi và lập trình viên vĩ đại một cách dễ dàng. Lúc này, nếu bạn không nhắm đến lập trình chuyên nghiệp thì nó có thể trở thành vấn đề đối với bạn, nhưng nó vẫn có giá trị đáng để quan tâm. Ngoài ra, một số bạn đã đề cử những "biến thể" khác của C và C++ áp dụng cho những ứng dụng xác định, như ANSI C thường được sử dụng trong lập trình các vi xử lý Arduino, Robot C được sử dụng trong lập trình robot. Nhiều bạn cũng nói rằng việc bắt đầu với những ngôn ngữ khó như C và C++ khiến cho việc chuyển sang học ngôn ngữ khác (ví dụ: Java) sẽ trở nên dễ dàng hơn.

5. JavaScript

Ngôn ngữ lập trình JavaScript
Bạn đừng nhầm lẫn JavaScript với Java, đây là một ngôn ngữ kịch bản đã được phát triển vào những năm 90s bởi Brendan Eich, cựu nhân viên của hãng Netscape Communications và giờ là Mozilla Foundation. JavaScript là một trong những công nghệ nền tảng mà web dựa trên đó. Đừng để tôi đánh lừa bạn - JavaScript tồn tại bên ngoài các trình duyệt, nhưng phần lớn nằm trong ngữ cảnh của các ứng dụng và dịch vụ kết nối. Ngôn ngữ này tự bản thân nó là dynamic, và cung cấp cho các lập trình viên sự mềm dẻo để sử dụng phong cách lập trình hướng đối tượng (và bản thân ngôn ngữ này hầu như là hướng đối tượng) cũng như là hướng chức năng và mệnh lệnh. Nó tiếp nhận nhiều cú pháp từ ngôn ngữ C, và nếu bạn lên kế hoạch để làm bất kỳ sự phát triển cho web, thì việc học JavaScript nên nằm trong danh sách của bạn.
May mắn thay, JavaScript khá dễ học, đã sẵn sàng ở trong trình duyệt để bạn có thể vọc vậy, và mặc dù nó đã tồn tại được khá lâu, nhưng ngày càng thu được sự nổi tiếng hơn. Nhiều người đề cử nó đã lưu ý rằng khả năng bạn áp dụng khi học JavaScript là rất lớn, bởi vì bạn có thể bắt đầu sử dụng nó ngay bằng cách xây dựng một vài thứ trên web - điều này có thể rất tốt khi mọi người bắt đầu học lập trình. Một số bạn thậm chí còn nói rằng họ đã học được những ngôn ngữ phức tạp hơn nhiều như C và Java bằng cách chọn JavaScript là ngôn ngữ đầu tiên (nhưng đừng lầm lẫn - có rất ít sự liên quan giữa JavaScript và Java). Ngoài ra, nếu bạn đang tìm cách để lập trình chuyên nghiệp, thì hiện nay JavaScript có nhu cầu rất lớn.

Kết luận

Bây giờ là lúc để đưa ra kết quả 5 ngôn ngữ được bình chọn bởi chính các bạn, những độc giả của cộng đồng Lifehacker, danh sách những ngôn ngữ dành cho người mới học lập trình:
Bảng xếp hạng các ngôn ngữ lập trình
Chúng tôi gần như không có đủ không gian để đưa ra những đề cập về tất cả mọi ngôn ngữ nên phải cắt bớt một số ứng viên cũng rất tuyệt vời. Tuy nhiên chúng tôi sẽ đưa ra một ngoại lệ với ngôn ngữ C# .NET, ngôn ngữ mà độc giả có nickname wakers01 đã tạo ra một tranh luận thuyết phục để đề cử nó. C# và .NET Framework được thiết kế và phát triển bởi Microsoft, và họ cũng rất hạnh phúc khi khuyến khích bạn học nó.
Bạn có điều gì muốn bàn luận về một trong những ứng cử viên nói trên? Ngôn ngữ ưa thích của bạn là gì, nó có nằm trong danh sách đó không? Bạn cũng nên nhớ rằng, top 5 ngôn ngữ ở trên là dựa trên số lượng đề cử của chính các độc giả từ bài viết tuần trước. Đừng chỉ phàn nàn về top 5 này, hãy cho chúng tôi biết bạn muốn thay thế ngôn ngữ nào trong danh sách trên bằng cách để lại bình luận phía dưới nhé!
8 Điều bạn cần biết về giáo dục trực tuyến Hồ Sỹ Hùng Blog Home Chọn nghề nghiệp – khi cả phụ huynh và người học là những kẻ vô trách nhiệm Techmaster team
Hồ Sỹ Hùng
Hùng là lập trình viên có nhiều năm kinh nghiệm trong lĩnh vực: C#, VB.NET, ASP.NET, SQL Server, MVC, Entity Framework… và đồng thời cũng là admin của blog http://vinacode.net/. Bạn có thể liên hệ với anh qua email hungpm2000[at]gmail.com

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…