Trước hết: Tôi là một nhà toán học - một người chuyên nghiệp (trong đó tôi được trả tiền để làm toán). Tôi không phải là một lập trình viên. Tôi thực hiện một số chương trình, nhưng rất chắc chắn về sự đa dạng của Cargo Cult (xem bình luận đầu tiên về https://tex.stackexchange.com/q/451/86 và phản hồi của tôi) và không có gì thuộc loại thường đưa tôi đến với điều này trang web (thực sự, tôi đã đăng ký ở đây để đăng câu trả lời này sau khi thấy một liên kết đến nó trong phòng trò chuyện TeX).
Tóm tắt câu trả lời của tôi là: Toán học là Lập trình .
Gần đây tôi đã dạy một khóa học toán cho một nhóm học sinh không phải là toán học. Họ là phần lập trình. Tôi nghĩ rằng điều này là tuyệt vời! Cuối cùng, tôi sẽ có thể dạy toán cho những người đã hiểu những ý tưởng cơ bản và những người đã có một bộ công cụ thô sơ để làm toán. Tôi đã vô cùng thất vọng khi tôi hỏi có bao nhiêu người trong số họ thực sự đã viết một chương trình và nhận được câu trả lời ở đâu đó giữa 0 và 1.
Trước khi tôi tiếp tục, tôi nên làm rõ một vài điều. Có những lĩnh vực toán học liên quan trực tiếp đến lập trình và phải làm với việc đánh giá các thuật toán và phân loại ngôn ngữ và những thứ tương tự. Tôi không nói về những điều đó. Ngoài ra còn có một chương trình đang cố gắng dịch tất cả toán học sang ngôn ngữ chính thức có thể được đánh giá bằng máy tính. Đây là một chút gần hơn với những gì tôi đang nói, nhưng ngay cả để tập trung vào đó sẽ bỏ lỡ phần chính của những gì tôi đang cố gắng nói. Toán học mà tôi làm và lập trình mà tôi làm gần như hoàn toàn không liên quan đến chủ đề. Sự kết nối giữa chúng ở một cấp độ khác nhau.
Nơi tôi muốn bắt đầu là nhận xét về câu hỏi chính:
Nếu đó là làm toán, thì tất cả hoạt động của con người là một dạng toán. Nếu đó là trường hợp thì từ toán học không có nghĩa hữu ích, bởi vì nó không thể được sử dụng để phân biệt hoạt động này với hoạt động khác.
Vâng, đó là làm toán. Nhưng "toán học" vẫn là một từ hữu ích bởi vì, như bài hát nói, "Đó không phải là những gì bạn làm, đó là cách bạn làm điều đó." Tôi sẽ nói rằng tôi đang làm toán khi tôi tiếp cận một cái gì đó theo cách toán học . Đôi khi, đó là toán học "lõi cứng": xây dựng định nghĩa, chứng minh các định lý. Đôi khi, nó không phải là. Đôi khi, nó viết những chương trình nhỏ ngớ ngẩn để con tôi có thể học từ chính tả.
Đây là những gì toán học giúp tôi khi tôi lập trình:
Trừu tượng này có lẽ là các kỹ năng chuyển nhượng quan trọng nhất từ toán học. Bằng cách này, tôi có nghĩa là khả năng loại bỏ tất cả những thứ không cần thiết và tập trung vào các thuộc tính quan trọng.
Phối cảnh Nếu tôi chỉ có thể chọn một điều mà tất cả các học sinh của tôi sẽ học, thì đây sẽ là: Khả năng thay đổi quan điểm phù hợp với vấn đề. Chúng ta thường xử lý điều này trong đại số tuyến tính bằng các công thức thay đổi cơ sở (dẫn đến ma trận khủng khiếp và các biến chứng khủng khiếp), nhưng nó được áp dụng nhiều hơn thế. Thực chất, đó là ý tưởng rằng chỉ vì một thứ gì đó đã được trình bày cho bạn theo một cách, đó không phải là cách bạn làm việc với nó. Điều này tách biệt quan điểm của mọi người về chính nó từ cách nó đã được trình bày. Điều này có thể cực kỳ thiết thực: tất cả là về việc làm cho một cái gì đó hữu ích hoặc hiệu quả. Nếu tôi có một danh sách các vectơ và sẽ hiệu quả hơn khi lưu trữ chúng dưới dạng danh sách tọa độ x và danh sách tọa độ y, vì vậy hãy là nó .
Hình thức so với chức năng Dẫn đầu từ trên; nếu một điều có thể được trình bày theo nhiều cách khác nhau sau đó nó không còn công bằng khi nói rằng một bài thuyết trình đặc biệt là các điều. Để dẫn chứng sai bài hát đó một lần nữa: "Nó không phải là những gì bạn đang đó là những gì bạn làm " mà vấn đề này.
Tôi có thể tiếp tục, nhưng đó là những người nghĩ đến mùa xuân.
Bây giờ, có lẽ có rất nhiều phản ứng (tiêu cực) đối với những gì tôi đã viết cho đến nay. Một người sẽ là "Đó không phải là toán học, đó chỉ là ý nghĩa tốt." (hoặc ý nghĩa xấu) mà tôi đề cập đến nhận xét của tôi ở trên đồng ý với tình cảm rằng "tất cả hoạt động của con người là một dạng toán học". Một câu hỏi khác sẽ là "Đó không phải là loại toán có nghĩa trong câu hỏi." Điều này gần như chắc chắn là đúng và ở đây tôi thực sự có nhiều thiện cảm hơn với người đã nói "Ít nhất tôi đã không chạm vào toán học trong 10 năm,". Anh ấy hoặc cô ấy sai, tất nhiên, họ đã làm toán trong 10 năm bởi vì bất cứ khi nào họ viết một chương trình họ đều làm toán . Họ không nhận ra điều đó.
Tôi thực sự sử dụng một số "toán học thực sự" trong các chương trình của mình. Gần đây tôi đã mã hóa một nhà thám hiểm hình dạng 3D vui nhộn liên quan đến việc sử dụng một số phép toán để tìm ra các phép chiếu và các phép biến đổi khác mà tôi phải áp dụng cho dữ liệu của mình. Tôi đã rất thích thú khi thấy mình thực sự mã hóa tứ phương! Nhưng tất nhiên, toán học có liên quan là không đáng kể so với toán học tôi làm khi tôi làm việc. Đó là "mặt sau của phong bì". Đó là loại toán học, sau đó tôi đồng ý với tình cảm mà bạn chọn nó khi bạn cần nó, và nếu bạn cần một cái gì đó phức tạp hơn bạn có thể tìm thấy trên Wikipedia thì bạn tìm một nhà toán học thực sự để làm điều đó cho bạn. Tuy nhiên, để bạn có thể nhặt nó lên khi bạn cần thì bạn cần phải học một cái gì đó. Thứ đó có thể không phải là bất cứ thứ gì bạn thực sự sử dụng, nhưng đã học được rằng thứ gì đó giúp mọi thứ dễ dàng hơn để chọn những gì bạn thực sự sử dụng sau này trong cuộc sống. Vì vậy, đây là nơi tôi không đồng ý với Coder: bạn cần phải học một số toán học nếu bạn sẽ sử dụng bất kỳ toán học nào và bạn cần học nó từ khía cạnh toán học (điều này không có nghĩa là chứng minh các định lý).
Và cuối cùng là "Toán học là lập trình". Bạn có thể học tất cả những điều này từ việc trở thành một lập trình viên giỏi. Và nếu bạn đã học được những điều này, bạn sẽ thấy toán học dễ dàng hơn nhiều bởi vì bạn sẽ hiểu rằng khi chúng ta nói về một vectơ trong không gian vectơ thì đó chỉ là một ví dụ của lớp Vector
có nghĩa là chúng ta có thể làm tất cả những việc cần Vector
làm ví dụ đó: thêm, trừ, chia tỷ lệ, v.v. Đó là lý do tại sao tôi thích dạy toán cho các lập trình viên. Nhưng, nói như một nhà toán học, tôi sẽ nói rằng đầu tiêntrong số này, "Trừu tượng", dễ học toán hơn so với lập trình vì toán học là sự theo đuổi trừu tượng. Bất cứ khi nào chúng ta thấy một số hành vi, việc đào tạo của chúng ta là luôn luôn hỏi "Điều gì về thứ đó khiến nó hành xử theo cách đó? Nếu tôi lấy một thứ khác tương tự, thì nó có hành xử theo cách tương tự không? tôi có phải mất nó để ngừng hành xử như vậy không? " (Đưa điều này đến mức cực đoan dẫn đến "toán học rết" - tìm kiếm thuật ngữ). Nhưng chúng tôi không làm điều này với (chỉ) các đối tượng "thế giới thực" (bất kể chúng là gì), chúng tôi làm điều này với những thứ đã được trừu tượng hóa.
Điều này đã diễn ra đủ lâu, vì vậy hãy để tôi kết thúc với một trong những trò đùa của nhà toán học cổ điển:
Cả một nhà toán học và một nhà vật lý đều tham dự hội thảo về một số mô hình mới liên quan đến không gian 24 chiều. Sau đó, họ đã thảo luận về nó và nhà vật lý nhận xét: "Điều đó thực sự khó khăn. Ý tôi là, làm thế nào để người ta hình dung được không gian 24 chiều?" Nhà toán học trả lời: "Ồ, thật dễ dàng. Chỉ cần hình dung không gian n chiều và sau đó đặt n = 24.".
Đã thêm 2012 / 03-2
Có khá nhiều bình luận về câu trả lời này thể hiện nhiều quan điểm khác nhau. Những điều này hiện đã bị xóa bởi người điều hành vì hiểu rằng tôi sẽ cố gắng đưa vào kết hợp chúng (hoặc trả lời chúng) trong câu trả lời của tôi.
Tuy nhiên, tôi không chắc là mình có thể. Đọc những bình luận đó và phần còn lại của những gì trên trang này, tôi chỉ có thể đi đến kết luận rằng có một sự hiểu lầm rất lớn về toán học thực sự là gì. Hơn nữa, tôi không cảm thấy đủ thẩm quyền để giải thích nó. May mắn thay, ai đó đã liên kết với Lockhart's Lament nên tôi sẽ hoãn lại lời giải thích cho điều đó. Trong khi tôi có thể đã đặt nó một cách khác biệt (khi tôi lớn lên trong một môi trường khoa học, tôi sẽ nhấn mạnh hơn vào bản chất thực nghiệm của toán học), tôi không nghĩ rằng tôi có thể làm nó tốt hơn .
Tôi vẫn nghĩ rằng tôi có thể thêm một cái gì đó. Cũng như những hiểu lầm về toán học là gì , cũng có những hiểu lầm về "làm toán" nghĩa là gì. Tôi thấy hai lập trường gần như mâu thuẫn:
Toán học là về phương trình và công thức. Vì vậy, không cần phải nghiên cứu nó vì Wikipedia tồn tại (đây gần như là sự đối nghịch của thách thức tận thế của Euler đối với Diderot ).
Toán học là về các định lý và định nghĩa. Vì vậy, không cần phải nghiên cứu nó vì các chương trình không bao giờ chứng minh bất cứ điều gì (đó là hoàn toàn sai lầm như ... chèn ngụy biện yêu thích ở đây).
Trong khi hai lập trường mâu thuẫn với nhau, chúng kết thúc ở cùng một nơi: không có điểm nào trong một lập trình viên học bất kỳ toán học nào - và chắc chắn nhất không phải từ một nhà toán học! Rốt cuộc, họ biết gì về bất cứ điều gì? Bất cứ điều gì mà một lập trình viên thực sự cần biết đều có thể được tìm thấy trong Wikipedia, hoặc đưa ra một người khác.
Ở trên, tôi mô tả bản thân là một lập trình viên Cult Cult. Tôi cá là hầu hết các bạn đều có một tiếng cười khúc khích riêng tư và nghĩ: "À đúng rồi, tôi cá là tôi biết chương trình của bạn trông như thế nào rồi." Bạn có thể cảm thấy một chút tự mãn và vượt trội (mặc dù tôi chắc rằng bạn cảm thấy tồi tệ về cảm giác tự mãn và vượt trội).
Những gì tôi đã mô tả ở trên là Toán học Cult Cult.
Vì vậy, khi tôi nói rằng bạn nên học một chút toán học để hiểu toán học hoạt động như thế nào, tôi đang nói nó với lý do chính xác giống như bạn có thể thấy một đoạn mã mà tôi đã viết: "Cuộc sống của bạn dễ dàng hơn bao nhiêu sẽ là nếu bạn dừng mã cắt và dán từ StackOverflow và chỉ tìm hiểu một chút về cách thực hiện đúng. ".
Tuy nhiên, điều quan trọng nhất là bạn nên học nó từ các nhà toán học. Tại sao vậy? Đây là một sự tương tự. Ngôn ngữ mà tôi yêu thích nhất là TeX. (Nói tất cả, thực sự!). Bây giờ, giả sử tôi muốn tìm hiểu thêm một chút về TeX và thật tình cờ là Don Knuth đang ở trong thị trấn và đã đề nghị cung cấp một số hướng dẫn về TeX. Hoặc tôi chỉ có thể đọc về nó trên Wikipedia. Hoặc có thể đó là Perl và Larry Wall, hoặc C # (đó có phải là cái đúng không?) Và Jon Skeet. Cũng có thể những người này không phải là giáo viên giỏi nhất , nhưng họ chắc chắn bù vào số tiền mà họ biết!
Và đó là những gì các nhà toán học là. Chúng tôi là những người viết ngôn ngữ thực tế, sau đó họ viết thư viện mà bạn sử dụng. Tất nhiên, bạn không cần phải biết cách chứng minh một định lý - bạn sẽ không viết thư viện! Nhưng nếu bạn biết một chút về cách chúng tôi nghĩ, thì nó có thể giúp bạn hiểu lý do tại sao chúng tôi viết thư viện theo cách chúng tôi đã làm và nếu bạn hiểu rằng nó có thể giúp bạn sử dụng nó tốt hơn.
Có một nền tảng giữa việc tìm kiếm các phương trình trên Wikipedia và chứng minh phỏng đoán Poincaré, giống như - để nói đến lời than thở của Lockhart - có một nền tảng giữa "Tôi không thực sự biết nhiều về nghệ thuật, nhưng tôi biết tôi thích gì" và là Monet, và giữa "Phím 'BẤT K' 'ở đâu?" và là Don Knuth. Nếu bạn vẫn còn ở trường đại học thì bạn có một cơ hội tuyệt vời để học hỏi từ những người là chuyên gia trong khu vực của họ và vì lý do nào đó - sẵn sàng dành thời gian giải thích cho bạn.
Điểm khác tôi muốn mở rộng một chút là tại sao là một lập trình viên, bạn không nên sợ học thêm một chút toán học. Đó không phải là kết nối sâu sắc, cũng không phải là hữu ích. Đó là khả năng lập trình máy tính của bạn có thể trực tiếp giúp bạn học toán. Tôi chỉ muốn đề cập đến một vài.
Hiểu các biến. Vì vậy, nhiều người bị nhầm lẫn bởi các câu đơn giản như "Gọi n là số tự nhiên ...". Hoặc "Đặt epsilon> 0". Có những nơi trong toán học, điều quan trọng là phải nhớ phạm vi của một biến. Đây là tất cả phổ biến trong lập trình. Học cách dịch một câu lệnh toán học thành một chương trình và bạn sẽ thấy việc theo dõi những gì là dễ dàng hơn nhiều.
Bản chất của bằng chứng. Nếu bạn đã từng viết một bài kiểm tra, hoặc viết một chương trình sẽ được người khác sử dụng, thì bạn hiểu cốt lõi của bằng chứng. Khi bạn làm điều đó, bạn phải biết rằng bất cứ điều gì người dùng đặt vào, bạn có thể đối phó với nó (chèn tham chiếu xkcd bắt buộc ở đây). Đó là tất cả bằng chứng! Một minh chứng rằng bất cứ điều gì "người dùng / vũ trụ" đưa vào, tuyên bố sẽ được giữ vững. Các nhà thực nghiệm sẽ nghiêng về "Nếu nó hoạt động trong hoàn cảnh bình thường, thì đó là sự thật" nhưng các lập trình viên biết rằng luôn có đứa trẻ đó sẽ thử Alt + G + Shift + chỉ để xem điều gì xảy ra.
KHÔ. Xin lỗi để phá vỡ điều này cho bạn, nhưng chúng tôi đã phát minh ra nó, không phải bạn. Chúng tôi đã "không lặp lại chính mình" trong nhiều thiên niên kỷ. Đó là lý do tại sao tôi có một bản sao các yếu tố của Euclid trên kệ của mình và nó vẫn hữu ích .
Và còn nữa. Nếu tôi biết thêm một chút về lập trình, tôi sẽ viết một cuốn sách có tên "Toán học cho lập trình viên" trong đó mục đích không dạy "Toán học mà các lập trình viên nên biết" nhưng "toán học mà mọi người nên biết, nhưng tối ưu hóa cho lập trình viên" . Nhưng có lẽ tôi sẽ không bao giờ biết đủ về lập trình để viết nó - trừ khi có ai đó đề nghị cộng tác với tôi!
Tôi sẽ để nó ở đó. Có lẽ nếu tôi nghĩ nhiều hơn, tôi sẽ thay đổi những gì tôi đã viết; hy vọng tôi sẽ giải thích nó tốt hơn. Trong một tháng, tôi thậm chí có thể không đồng ý với các phần của nó. Nếu bất cứ ai muốn tranh luận thêm, hoặc bình luận khác, có lẽ tốt nhất không nên làm như vậy trong các ý kiến ở đây. Bạn biết nơi để tìm tôi .