Toán Học Là Một Phong Cách Tư Duy - nói dối e blog

Toán Học Là Một Phong Cách Tư Duy

Vài hôm nay, một độc giả liên tục gửi email trao đổi với tôi, đặt ra những câu hỏi thú vị: Mối quan hệ giữa toán học và lập trình là gì? Học lập trình cần nắm vững toán học đến mức độ nào? Rốt cuộc thì những lĩnh vực toán học nào mới thực sự hữu ích cho việc nâng cao kỹ năng lập trình?

Câu trả lời thật không đơn giản.

Nếu xét đến những gì được dạy trên lớp, ngoài đại số sơ cấp, tôi gần như chưa từng gặp tình huống lập trình nào đòi hỏi kỹ năng toán học chuyên sâu để giải quyết. Hồi học ngôn ngữ C thời niên thiếu, tôi thậm chí còn chưa hiểu rõ khái niệm “hàm số” trong toán học, vậy mà vẫn chinh phục xong khóa học. Phải vài năm sau, tôi mới nhận ra sự tương đồng giữa hàm số trong toán học và hàm (function) trong lập trình.

Khi làm lập trình game 3D, có lẽ cần đến kiến thức đại số tuyến tính đã học ở đại học. Ít nhất cũng phải hiểu phép tính ma trận. Tuy nhiên đa số lập trình viên không tiếp xúc những thứ này. Chẳng ai có thể nghiêm túc tuyên bố rằng phải thành thạo giải tích mới có thể lập trình được - điều đó thật phi thực tế.

Nếu bạn hứng thú với việc dùng lập trình để giải quyết các vấn đề đa dạng, kiến thức toán học liên quan đến lĩnh vực cụ thể sẽ phát huy tác dụng. Ví dụ như khi tôi tự tay phân tích dữ liệu thống kê vì đam mê, lúc đó kiến thức xác suất thống kê trở thành công cụ không thể thiếu. Nhưng cả lập trình và toán học đều chỉ là những công cụ, có vị thế ngang nhau, không phải lập trình phụ thuộc tuyệt đối vào toán học.

Vậy học toán có ích gì không? Tất nhiên là có. Vì bản chất, toán học là một phong cách tư duy, mà lập trình cần đến phong cách tư duy đó.

Tôi từng có một người bạn, cách đây mười năm khi tôi mới quen, anh ấy đang theo đuổi Phật pháp. Anh luôn vướng mắc một câu hỏi: Đức Phật dạy “chớ chấp trước”, vậy nếu cố chấp vào việc không chấp trước, có phải vẫn là một hình thức chấp trước không?

Năm tháng trôi qua, anh ấy vẫn chưa tìm được lời giải.

Làm sao có thể dùng logic ngôn ngữ để luận bàn về việc tu học Phật pháp được? Chỉ đọc kinh điển thôi chưa đủ, nhiều chân lý cần đến sự khai ngộ tức thời. Toán học cũng vậy.

Học toán tuyệt đối không phải là việc giải vô số bài tập đến kiệt sức. Chúng ta cần lĩnh hội phương pháp tư duy ẩn chứa trong đó: kỹ năng suy luận logic chặt chẽ, khả năng xây dựng những hệ thống hoàn hảo, năng lực phát hiện khiếm khuyết lý thuyết rồi phân tích, tái cấu trúc. Dĩ nhiên, quá trình này đòi hỏi chúng ta phải luyện tập không ngừng, qua đó dần ngộ ra tinh hoa ẩn chứa.

Lập trình cũng vậy. Việc viết code liên tục không trực tiếp làm kỹ năng lập trình tiến bộ. Chúng ta cần khả năng nhìn thấu bản chất vấn đề, năng lực xây dựng hệ thống, hiểu rõ từng bước quá trình máy tính vận hành. Những năng lực này chỉ có được qua thực hành liên tục và những khoảnh khắc khai sáng bất ngờ.

Giống như toán học, lập trình là một hệ thống tuyệt đối nghiêm cẩn. Một chương trình với đầu vào cụ thể, trải qua quy trình xác định, chắc chắn sẽ sinh ra đầu ra duy nhất. Không có bug nào xuất hiện hay biến mất một cách thần bí. Chúng luôn có nguồn gốc rõ ràng, giống như khiếm khuyết trong logic toán học sẽ tồn tại mãi cho đến khi được các thế hệ sau sửa chữa.

Một điểm tương đồng nữa: trực giác đóng vai trò quan trọng trong toán học. Trực giác giúp ta hiểu và giải quyết vấn đề nhanh chóng. Khi hiểu sâu về toán, trực giác toán học ngày càng sắc bén. Nhiều kiến thức không cần nghiên cứu kỹ, chỉ cần trực giác là đã có thể thấu hiểu. Người viết code nhiều cũng có cảm giác tương tự như vậy.

Tuy nhiên thỉnh thoảng có những định lý toán học trông thì rất trực quan, nhưng chứng minh lại phức tạp đến mức khó tin.

Ví dụ như định lý đường cong Jordan trong tô-pô học: Trên mặt phẳng, một đường cong kín đơn giản C sẽ chia mặt phẳng thành hai miền - miền trong và miền ngoài. Nói cách khác, tập hợp các điểm trên mặt phẳng được chia làm hai nhóm: nhóm A (điểm ngoài) và nhóm B (điểm trong). Hai điểm bất kỳ trong cùng nhóm luôn có thể nối với nhau bằng một đường cong không cắt C, còn hai điểm thuộc nhóm khác nhau thì đường nối chắc chắn phải cắt C.

Định lý này nhìn qua tưởng chừng hiển nhiên, nhưng hầu như không ai có thể chứng minh chặt chẽ, thậm chí khó hiểu nổi cách chứng minh. Trong lập trình hiện đại, chúng ta cũng thường gặp tình huống tương tự. Nhất là với các hệ thống ngày càng phức tạp, những đoạn code ứng dụng đơn giản có thể dễ dàng nhận ra chức năng, nhưng ít ai giải thích rõ từng bước chi tiết quá trình vận hành. Chẳng hạn như đoạn code Windows đơn giản nhất. Chỉ những ai mang tinh thần toán học “đi đến tận cùng chân lý” mới đủ kiên nhẫn đào sâu xuống tận lớp hệ điều hành, khám phá cơ chế vận hành thực sự của hệ thống. Việc này không thể thành công trong một sớm một chiều, thậm chí yêu cầu cả chục năm nghiên cứu. Trong khi đó, nhiều lập trình viên tầm thường chỉ đủ sức kéo vài control, dán ghép code qua ngày, rồi than vãn “lập trình chỉ làm được đến 30 tuổi”. Theo tôi nghĩ, dù资质 tầm thường, nếu 30 tuổi có thể thật sự nhập môn lĩnh vực này đã là điều đáng mừng lắm rồi.

Chặng đường phát triển của toán học cũng là hành trình chưng cất trí tuệ sáng tạo vô tận của nhân loại. Chỉ dựa vào lập luận logic theo từng bước không thể giải quyết hết các vấn đề. Nhiều bài toán được giải nhờ trực giác đặc biệt, nhờ khả năng sáng tạo kết nối những thứ tưởng như không liên quan, sau đó mới dùng lập luận chặt chẽ để hoàn thiện.

Tiêu biểu như cách chứng minh định lý lớn Fermat. Đầu tiên, người ta phát hiện mối liên hệ giữa nghiệm của phương trình Fermat với đường cong elliptic. Tiếp theo xây dựng một đường cong elliptic đặc biệt, tồn tại nếu và chỉ nếu định lý lớn Fermat sai. Cuối cùng, chứng minh rằng đường cong này mang những tính chất kỳ lạ đến mức không thể tồn tại - từ đó phản chứng định lý đúng. Dù phải dựa vào nhiều lý thuyết toán học cao cấp hiện đại, nhưng toàn bộ cấu trúc tư duy đã chứng tỏ trí tuệ nhân loại khi kết hợp trực giác và logic.

Lập trình cũng vậy. Chúng ta phải nhuần nhuyễn đặc tính của các phương pháp và ngôn ngữ lập trình. Hơn nữa, lập trình không đơn thuần là xếp chồng code, mà đòi hỏi xây dựng hệ thống tinh tế, giải quyết vấn đề bằng cách thích hợp tại nơi thích hợp, đồng thời đảm bảo từng thành phần đều chính xác tuyệt đối.

Cuối cùng, với câu hỏi của độc giả kia, tôi chỉ có thể chia sẻ vài lời khuyên cá nhân. Học lập trình thực sự cần học toán. Nhưng học toán không nhất thiết phải liệt kê danh sách giáo

0%