Thứ Năm, 3 tháng 3, 2016

Lập trình viên giỏi cần có “năng khiếu toán học”?


Bài viết được dịch từ blog Coding Horror
Một trong những trích dẫn nổi tiếng của nhà khoa máy tính Edsger Dijkstra là từ bài giảng nhận giải thưởng Turing vào năm 1972 của ông, Làm thế nào để chúng ta nói ra sự thật mà có thể làm tổn thương?
Bên cạnh một năng khiếu toán học, thì việc đặc biệt thông thạo tiếng mẹ đẻ là tài sản quan trọng nhất của một lập trình viên giỏi.
Lưu ý rằng ông chính xác nói là tiếng mẹ đẻ, không phải tiếng Anh. Điều này khiến tôi tự hỏi tại sao tất cả các công trình nghiên cứu quan trọng nhất của Dijkstra lại bằng tiếng Anh, chứ không phải tiếng Hà Lan quê hương ông.
Lập trình viên có cần phải giỏi toán học?Lập trình viên có cần phải giỏi toán học?

Nhưng tôi đã đi lạc đề. Chúng ta hãy xem xét phần đầu tiên trong trích dẫn của Dijkstra. Các lập trình viên giỏi cần có “năng khiếu toán học”? Nó có thể là một hướng dẫn để nghĩ rằng lập trình như là một hình thức của toán học, ít nhất là cho một lý do: để chống lại việc địa phương hóa. Mặc dù trên thế giới đã có nhiều nỗ lực để nhằm tạo ra các ngôn ngữ lập trình bản địa hóa, theo như tôi biết, nhưng chưa từng bao giờ có ai cố gắng để bản địa hoá các ký tự Ï€ hoặc số 3. Chúng là phổ quát. Vì vậy, theo ý nghĩa đó, các ngôn ngữ lập trình chịu đựng một sự mơ hồ, tương tự giống với toán học. Bạn tìm hiểu các biểu tượng một lần và sử dụng chúng ở khắp mọi nơi trên thế giới, không có vấn đề gì phụ thuộc vào tiếng mẹ đẻ của bạn cả.
Mặt khác, tôi không nhận thấy trong thực tế rằng các lập trình viên cần phải là người có năng khiếu toán học mới trở thành các nhà phát triển phần mềm giỏi. Trên thực tế hoàn toàn ngược lại. Điều này phụ thuộc rất nhiều vào những dạng code mà bạn đang viết, nhưng phần lớn code mà tôi đã nhìn thấy thì chủ yếu chỉ cần trình độ toán học đủ để “cân bằng sổ sách của bạn”, thậm chí không có gì là cao siêu giống như những gì bạn thấy trong các sách giáo khoa giải tích ở trường đại học.
{
i = j++ / (x + v);
}

Nó không chính xác như những công thức toán học.
Tôi chẳng bao giờ hiểu được mong muốn để người ta đánh đồng kỹ năng toán học với kỹ năng lập trình. Trong khi trở thành một người giỏi toán chắc chắn sẽ không làm ảnh hưởng đến việc bạn là một lập trình viên, nhưng thật khó cho tôi để vẽ một đường thẳng trực tiếp từ “giỏi toán” đến “giỏi lập trình”. Giống như Rory, tôi tin rằng phát triển phần mềm đòi hỏi một số nhạy cảm rõ rệt ở bán cầu não phải.
Khi tôi đang còn nhỏ, tôi nhớ đã nghe mọi người nói những câu kiểu như: “Nếu bạn thích lập trình máy tính, thì bạn sẽ yêu thích môn toán.” Tôi luôn luôn nghĩ rằng những người này là hoàn toàn ngớ ngẩn. Thực ra là cũng có cái gì đó về bản chất tương tự của một số loại toán và lập trình máy tính, nhưng những điểm khác nhau giữa chúng còn nhiều hơn.
Với môn toán, và tôi đang không nói về sự điên rồ trong triết lý toán học về lý thuyết số kiểu như “Liệu những số đó có thực sự tồn tại?”, nhưng với lĩnh vực toán ứng dụng thì luôn có những câu trả lời chính xác. Bạn hoặc là chính xác hoặc là không chính xác.
Với lập trình, điều tốt nhất bạn có thể hy vọng để làm là một cái gì đó tốt. Với rất nhiều cách khác nhau để thực hiện một kết quả duy nhất, và cần một sự nhạy cảm ở bán cầu não phải để xác định xem liệu bạn có đạt được mục tiêu hay không, và không có bất cứ ai (ngoại trừ [một nhà phát triển phần mềm có kinh nghiệm hơn]) người có thể cho bạn biết liệu bạn có đúng hay không.
Nếu bạn bỏ qua bán cầu não phải của mình, và tôi đang nói về sự trừu tượng và tính thẩm mỹ, thì bạn có thể ráp một số code lại với nhau mà có thể hoạt động được, nhưng nó cũng có thể là một địa ngục của một cơn ác mộng bảo trì. Nếu bạn chỉ tập trung vào bán cầu não phải, bạn có thể cũng có một cái gì đó chạy được, nhưng nó hoàn toàn kém hiệu quả và mang tính cách cá nhân mà bạn là người duy nhất trên trái đất này có thể hiểu và bảo trì phần code đó.
Tạm gác tất cả những điều ở trên sang một bên, mọi người vẫn ủng hộ ý tưởng rằng riêng toán học có sức mạnh để làm cho bạn trở thành một lập trình viên giỏi hơn. Steve Yegge đã liệt kê ra các trường hợp tốt nhất mà tôi đã từng đọc về mối quan hệ giữa lập trình viên và nhà toán học, với năm điểm sau đây:
  1. Toán học sẽ dễ dàng hơn rất nhiều đối với bạn sau khi bạn đã biết làm thế nào để lập trình. Trong thực tế, nếu bạn là một lập trình viên khá, thì bạn sẽ thấy nó hầu như không có gì khó khăn mấy.
  2. Người ta dạy toán trong trường học một cách sai lầm. Sai PHƯƠNG PHÁP. Nếu bạn tự học toán đúng cách, bạn sẽ học nhanh hơn, nhớ nó lâu hơn và nó sẽ có giá trị hơn nhiều đối với bạn với tư cách là một lập trình viên.
  3. Việc biết thậm chí chỉ một chút toán học cũng có thể cho phép bạn viết ra một số chương trình khá thú vị mà nếu không sẽ là quá khó. Nói cách khác, toán học là một cái gì đó bạn có thể học một chút mỗi lần, bất cứ khi nào bạn có thời gian rảnh.
  4. Không có ai biết tất cả mọi thứ về toán học, thậm chí là các nhà toán học giỏi nhất. Lĩnh vực này không ngừng mở rộng, và người ta đã phát minh ra những công thức mới để giải quyết các vấn đề của riêng họ. Và với bất kỳ vấn đề toán học nào được đưa ra, cũng giống như trong lập trình, sẽ có nhiều hơn một cách để giải quyết. Bạn có thể chọn lấy một cách mà mình thích nhất.
  5. Toán học thì… ummm, xin đừng nói cho ai biết là tôi nói điều này nhé; nếu không tôi sẽ chẳng bao giờ được mời đến các bữa tiệc khác miễn là tôi còn sống. Nhưng toán học, cũng… tốt hơn là tôi nên nói thầm điều này, vì vậy bạn hãy cố gắng lắng nghe nhé: (nó thực sự rất vui.)
Đối với tôi, 5 điểm trên giống như một công thức rộng để trở thành người khám phá tìm hiểu và xây dựng kỹ năng giải quyết các vấn đề trừu tượng. Các kỹ năng lập trình là quan trọng, chắc chắn vậy, nhưng không nhất thiết phải độc quyền cho các nghiên cứu về toán học. Nếu toán học là cách ưa thích của bạn để mài sắc lưỡi cưa của mình, thì hãy chọn nó – nhưng nó hầu như không phải là cách duy nhất.
Gần đây tôi nhận được bức email này:
Tôi điều hành một công ty phát triển web nhỏ (4 người) và tôi thấy rằng các lập trình viên trẻ đã không có niềm vui trong việc viết code assembler hay quản lý mà không có các thư viện function. Tôi đã luôn luôn nhận thấy rằng các kỹ năng toán học giỏi là một trong những kỹ năng hữu ích nhất để lập trình, và khi người ta có Google cùng một thư viện khổng lồ các function, người ta sẽ không cần phải giỏi toán để có được những thứ làm việc được, cho đến khi nó có thể bị phá vỡ, gặp những trường hợp gai góc, hoặc gặp phải những lỗi của hệ điều hành hoặc thư viện.
Một số ví dụ nhanh chóng: việc đơn giản hóa các phương trình khó để xác định các chỉ số mảng hoặc các memory offset; lượng giác để giúp đỡ các tính toán vật lý; việc chuyển đổi giữa các cơ số hex​​/bin/dec; các đẳng thức logic như định lý của DeMorgan.
Anh ta có ý tưởng đúng; nếu chúng ta nói về toán học, chúng ta hãy thoát ra khỏi sự trừu tượng và đi vào cụ thể. Chúng ta hãy nói thật chi tiết.
Những phần code nào bạn tự viết mà với một kiến thức chi tiết về toán học sẽ giúp thực hiện công việc của bạn dễ dàng hơn? Tôi có thể nghĩ đến một số thể loại như: Viết một trò game 3D. Hoặc một mô phỏng vật lý. Hoặc các bộ lọc hình ảnh ở cấp thấp. Hoặc các thuật toán nén. Và còn nhiều thứ khác nữa. Nhưng nếu bạn đang ở trong tình huống đó, bạn sẽ biết nó.
Có lẽ tôi là một người lạc quan vô vọng, nhưng tôi nghĩ rằng hầu hết các lập trình viên đều có đủ thông minh để tìm hiểu bất cứ điều gì về toán học mà họ cần ngay khi họ phải giải quyết các vấn đề đang gặp phải.
Các bài viết liên quan:

0 nhận xét: