「寫程式需要懂數學」是個偽命題
Tags: 邏輯 維根斯坦
三不五時就會聽到有人問寫程式需不需要懂數學,例如《寫程式到底需不需要懂數學 》。在我這個大學時五修微積分才過關的人聽來,還真是刺耳。這根本是個偽命題。
若說寫程式要懂邏輯與代數,這我同意。但若說寫程式要懂數學,那我就反問要懂數學的哪一部份?
數學有兩個內容,一是數論,二是算術。數論是邏輯與代數的概念;算術是演算技巧與符號記述。本來數論才是重點。然而我們在說懂不懂數學時,通常指的是算術,亦即我們是看這個人能不能把邏輯演算的思考過程,以數學的算術式記錄下來。
程式語言跟數學一樣,都是一種符號系統。就像中文和英文一樣。對於眼前的一顆蘋果,如果你能用中文記述「這是一顆蘋果」,就算你不懂英文「This is an apple」又有什麼關係?如果你能用程式語言表達1~100累加的內容,如下面的C語言所示,那麼就算你不懂如何用數學符號表達,有錯嗎?
數學家和程序員同樣運用邏輯與代數概念進行思考。差別在於數學家用數學式記述思考過程,程序員用程式語言記述思考過程。僅此而已。
再舉一例。當一般人習慣用積分計算圖形面積時,我這 programmer 卻是用迴圈去累計面積,而精確度則視變數型態而定。如果我用整數去累計 (切割的最小單位是 1 ),則我的面積就會是整數的。如果我要更精確的答案,就要用將最小單位切的更小的數值型態。一般人不習慣用如此細緻的描述方式。
《程序員處理計算問題時的思考方式不同於數學 》
延伸閱讀: 《語言的使用,會訓練並影嚮我們的思考方式。在電腦程式語言中,特別突顯這個現象 》。
Posted by shirock at
樂多Roodo! │14:02
│
回應(31)
│
引用(3)
│
Programming
引用URL
http://cgi.blog.roodo.com/trackback/3360399
我發現在討論這問題時,就連我自己也陷入數學指的是某一種記述形式的框框。這只能怪國內的記憶式數學教育方式太成功,以致於我們都默認數學的記述形式只有固定一種了。
計算的形式真是多樣化 【石頭閒語】
at 2007年05月29日 18:11
Tags: 維根斯坦 數學 哲學 經濟學 方法論
日前在《寫程式需不需要懂數學》一文的討論中,一位回應者引用了
維根斯坦眼中的數學並非不可言的 【石頭閒語】
at 2007年06月6日 17:59
本篇文章引用石頭大大的《自「寫程式需要懂數學」是個偽命題》
本篇文章引用石頭大大的《語言的使用,會訓練並影嚮我們的思考方式。》
本篇文章引用石頭大大的《Re
電腦與數學 【界列芝部】
at 2007年11月14日 20:19
最近剛好朋友也在問我這個問題,對於石兄的看法
小弟我深感認同,待會把這篇貼給朋友看看
我正文中舉的累加1~100的 C語言例子,在數學家眼中看來是小孩子的把戲。
不錯,在高斯之前,每個人都是憨直地一個一個累計。在高斯之後,數學家會寫成 (n+m)*(m-n+1)/2 。他們會說這樣簡單,計算又快。
然而數學符號與計算形式,只對人類來說才是又快又簡單。計算機系統仍然要把這樣的算式編譯成更基本、更純粹的邏輯形式才能計算。換句話說,我們習慣使用的數學形式,是我們在更基本的「實在」之上,所加上的一道濾光鏡。這道濾光鏡將「實在」轉換成人類易於解讀的形式。如果我們不用這道濾光鏡,就不能描述實在了嗎?不儘然如此。
例如我在參考文章中舉10進位換算16進位的例子。就是不用一般數學乘除法換算而直接用基本邏輯進行運算的例子。
我不否認多數人要透過數學系統才能思考,但我也不能否認有些人可以跳過數學系統,直接運用邏輯系統思考。
最後一點。直接運用邏輯系統思考的方式,等到形式化後,又會被納入數學系統。我們口中的數學,涵蓋的內容會不斷增加。所以我們現在認為不需要數學的部份,以後就會變成人們認為是需要懂數學才會的部份(因為數學又把它涵蓋進去了)。反正我們遲早會把它變成數學的一部份,那麼「寫程式需要懂數學」不就是個偽命題嗎?
與其把數學當作抽象的文字遊戲,不如看看數學在現實生活中可以有多大的幫助,不是嗎?還有,"數學"跟"程式"在這裡都太概括了。這樣問吧: 若說寫程式要懂數學,是要寫哪一種程式?要懂哪一種數學?
用迴圈去計算從一累加到一百,理論上固然可行,不過實際上卻不甚實用。如果要從一累加到2^31-1,只怕你我有生之日這個迴圈也跑不完。這時高斯的公式就很有價值了。
另外一個例子是密碼學。著名的RSA編碼法必須要每個使用者都有一個獨特的很大的質數(1024~2048 bits),不過若要用國中尋找質數的演算法去找,全世界所有人加起來的有生之年也找不到幾個(如果運氣好的話)。不過有人找出快速產生類似性質的數字的方式。這些都是數學研究的成果。當然,實際上把RSA演算法寫成程式,不見得需要懂背後的數學原理,不過我的經驗是可以用這些數學性質幫忙除蟲...
程序員不用自己計算,而是交給電腦計算。
不過 LS 的回應內容又把主題扯回那個死胡同去了。我還是一句話「數學家和程序員同樣運用邏輯與代數概念進行思考。差別在於數學家用數學式記述思考過程,程序員用程式語言記述思考過程。僅此而已。」差別只是記述方式不一樣,但腦子裡想的東西是一樣的。假設我沒學過高斯定理,但我腦中想的是上底加下底乘高除2,然後寫成 c=0; ((m - n + 1) >> 1).times{c+=n+m},這樣算懂數學還是不懂數學呢?
嗯,我糊塗了,忘了哲學流別之分。各位是否認同我上面的內容,視各位的邏輯觀屬於哪一種哲學體系而定。我傾向維根斯坦的語言分析哲學,所以數學對我而言,只是一種語言 。但是本質論者會駁斥我的觀點,對他們而言,數學不是一種語言,而是本質的相貌。
在大多數時候,這類觀點的支持者會挑起「寫程式需要懂數學」的筆戰。對我而言,這是個偽命題;對他們而言,這是個真命題。
這其實不需要變成筆戰,我也沒有屬於什麼哲學流派。當我在思考這個問題時,不是從事哲學上的思維,卻是從教育的角度來思考:下一代的學生要不要修目前資訊系提供的標準課程之外的數學課程?唸相關的書對程式設計到底有什麼幫助?如果有一個小學弟向我們請教這個問題,我們卻告訴他們這在哲學上是無意義的命題,我可以想像這位學弟的表情會有多奇怪。
這樣說吧,要寫好程式要不要唸線性代數?要不要唸機率?要不要唸微積分?修這些課程或唸這些書,對於寫程式有無幫助?如果要把機率學說成只是一堆符號,對於機率學本身或相關的程式設計問題並無幫助。
版主個人的經驗為何?我個人的經驗是有時幫助很大,有時卻沒有用。目前為止,微積分的幫助很有限,不過還是有的。要寫的程式種類越多,越有可能某些數學會起作用;要解的問題若與數學有關,懂的數學越多越有幫助。例如寫網頁程式當然跟數學無關,不過設計Compiler就有很大的關係。詳情請見任何一本Compiler的課本。
版主的論點,似乎是把程式寫作當作哲學思考來看,我沒有看到從個人的經驗來切入!如果真的要寫這個累加的迴圈,我想沒有懂高斯公式的人會之後還願意寫迴圈,而是換做高斯的公式。
況且,數學不是探討如何發明符號去記這些本質,如果要用這種符號的觀點來討論(抱歉,我對維根斯坦的哲學並不熟),數學是研究不同statement之間的關係。例如等差級數的例子,從唸數學得到的是這樣一個關係的存在:
For all m and n, m>n, m + ... + n = (n+m)(m-n+1)/2
若用"程式設計員的符號"亦可: c=0; for (a in m..n) {c+=a}; return(c) 可以換做 return((n+m)*(m-n+1)/2)
這個恆等式就是知識,而且運用在現實生活中對於計算的效率可以有很大的幫助!
設計一套好的符號,或許從哲學思維來看沒有意義,但是卻往往有其實質的意義!這是因為人腦進行思考是有限度的,複雜的符號系統往往成為思考的阻礙。最好的例子就是量子力學中的費曼圖(Feynman's diagram)。
而且,如果要把千百年來所有數學家的努力,甚至高斯的公式簡化成文字遊戲,這也不是維根斯坦的本意吧!
最後,我從Google上找到這篇文章,寫的不錯,雖然我並不同意他的每一點。這是英文的文章,讀起來可能比較費時,抱歉!ttp://steve-yegge.blogspot.com/2006/03/math-for-programmers.html
還有對於版主說的,"程序員不用自己計算,而是交給電腦計算。"事實上電腦的計算能力是有限的。程序員寫的程式不同,電腦算起來不僅會有不同的效率,甚至有不同的結果。
記得小時候拿計算機算1/7/7/7/7/7/7/7.../7 *7*7*7*7 ... *7結果不會剛剛好等於一嗎?但是若順序換一換,寫作1/7*7/7*7...就不會有這樣的問題。當然,這是因為浮點運算的精度有限。雖然這是一個沒什麼意義的例子,但是也有類似的,非常重要的例子:解線性代數方程式使用高斯消去法時,消去的順序不同,有時會有不同的結果。這個概念(pivoting/condition of a matrix)在數值方法的課程中有提到。
請看到本文,我說「寫程式要懂邏輯與代數,這我同意」;又說「數學有兩個內容,一是數論,二是算術。數論是邏輯與代數的概念;算術是演算技巧與符號記述。
本來數論才是重點 。」
沒有數論作為基礎,我們可以一筆劃掉 7*7*7/7/7/7 ,直接寫1嗎?同樣地,在電腦程式中,若沒有數論作為基礎,我們可以一筆劃掉
8543295743205974294321/8 ,寫成
8543295743205974294321 >> 3 嗎?
8543295743205974294321 >> 3 是程序員基於計算工具的特性(位元)所想出來的速算法。我沒看過有程序員以外的人這樣用。
LS說「版主的論點,似乎是把程式寫作當作哲學思考來看,我沒有看到從個人的經驗來切入!」
上例就是我的個人經驗。我的個人經驗還有
語言的使用,會訓練並影嚮我們的思考方式。在電腦程式語言中,特別突顯這個現象 中的例子,我也沒看過有程序員以外的人這般處理數值換算。
以上種種都是抽象的思考活動。本來,這才是重點。但是多數人提到這個問題時,關心的不是自己是否具備這種思考能力,而是自己能不能用數學符號與定理記述。
再回到1~100累加的例子。當人們拿著這問題問我懂不懂數學時,似乎只看我是不是用高斯定理處理。如果我不是用高斯定理處理,是不是就表示我不懂數學了呢?簡單說,如果我記不住高斯定理,我就不懂數學。至於我是否理解1+100、2+99的結果具有重覆性,且重複的累加就是乘法等等內容,似乎沒人在意。
包括 LS 的回覆,都只在意我有沒有用高斯定理表達。這是好事嗎?請看《
計算的形式真是多樣化 》,我自己承認我們在討論這問題時,都陷入記憶式數學教育的框框了。
果真如此,那還不如把命題改成「寫程式需要記住很多的數學定理」吧!
高斯定理只是我舉的一個例子,我還有舉其他很多例子,而這些例子是除了Arithmetic (算數)之外的應用數學的例子,這些問題絕對不是版主的"數論"可以解決的。
8543295743205974294321 >> 3這個算法是利用二進位的特性,但是除了十以外的進位數學早在電腦發明之前就已經有人研究了,這跟在十進位算術中,12345 / 1000 = 12 (向右移三位)一樣,沒什麼特別的。
再舉些簡單例子吧:如何寫一個程式算圓形的面積?算圓球的體積?算高次元球的"體積"?裡面有用到圓週率,這個常數又是怎麼計算出來的?怎麼用電腦來算二的平方根?浮點運算器應該都有支援這個指令,但這個指令的電路是如何設計出來的?這些都是數論或邏輯以外的數學。
我倒認為抽象的思考不是這個問題的重點,見我之前提到學弟請教的例子。至少我不希望我請教指導教授跟我前途相關的問題的時候,他給我一些哲學的答案!
數學簡單分做數論跟算術的分法,似乎太小看數學了!不知出自何處?詳細一點的分類可以看http://www.ams.org/msc/
懂數學跟光記住很多數學定理或光會使用數學符號是不同的,就像懂英文跟背很多單字例句,寫程式跟熟背各種程式語言,寫作文跟背很多成語是不同的。箇中奧秘,學數學的學生都懂,但是是只能意會,不能言傳 -- What we cannot speak of we must pass over in silence...
或許就版主個人的經驗來說,真的不需要用到特別高深的數學。不知版主寫的是哪些類型的程式?我工作的關係,常常要計算各種數學的結果,自然需要數學;不過我想還有其他許多程式設計的情況,必須要懂簡單算術以外的數學,例如3D圖形。
很遺憾,跟數學有關的話題,確實很哲學。話說有什麼學問可以不跟哲學扯上關係嗎?我最近看了一些量子力學的書,那跟哲學的牽扯之深,幾乎可以自成一門哲學科目。
"What we cannot speak of we must pass over in silence..." 這句話就是維根斯坦說的(《邏輯哲學論》)。
我只分數論和算術,顯然是不夠的。但這樣也比用一個全稱的「數學」要好。你可以告訴你的學弟。不能做「全稱命題」,而要做「偏稱命題」。令「寫3D圖形程式需要懂三角函數及微積分」,成立。令「寫密碼程式需要懂質數」,成立。令「寫密碼程式需要懂微積分」,嗯... 這要請 LS 兄回答是否成立了?
我分太細?這是沒辦法的,事實如此。不然光數學就學不完了,哪有時間寫程式。
LS說「懂數學跟光記住很多數學定理或光會使用數學符號是不同的」。嗯,我可以理解這句話的意思是「寫程式不需要懂數學,只要知道該用什麼數學定理就可以」嗎?畢竟很多人在使用如微積分等計算工具時,儘管不知道基本原理,照樣算得很熟練,並頻繁地用於程式碼中。
我過往有一段時間,是在寫系統程式。在這個領域中,位元運算、查表、指標索引、資料結構是主要工作。有時我們不是透過已知的數學定理或演算技巧,而是從基礎算術單元之中建構出有效率的演算法。在這個領域中,甚至有一個無名定理「查表比計算快」。這個「表」的來源是用憨直的方式慢慢算,或是用優美的數學定理速算,甚至矇眼擲骰子(如果我要一個亂數種子表),都可以。
什麼東西都跟哲學有關係,但不代表用哲學討論會有實質的意義,會是最好的途徑,那是清談。
問題是數學分成數論跟算術這種分法是錯的。不知道拓樸學該算哪類?代數統計(Algebraic Statistics)跟代數幾何呢?
密碼程式或許不需要用到微積分,但是不代表微積分對寫程式無用。至少我們都同意了,微積分或許對某些程式很有用。而且,事實上微積分是可以用在密碼學上的!http://www.certicom.com/index.php?action=ecc_tutorial,home
可以邊學數學邊寫程式啊。活到老學到老。
"寫程式不需要懂數學,只要知道該用什麼數學定理就可以"不是我的本意,因為數學也不只是一堆定理!不知道微積分的基本原理卻算的很熟練,這樣也不錯,不過若能懂背後的原理,或許會更進一步的簡化程式碼也說不定。
查表當然比較快,但是不是每個數學問題都有表可以查。事實上有表可以查的問題是極少數,基本的問題。如果今天有一個問題沒有表可以查,那要怎麼辦?
最後我想要舉Steve Jobs一場畢業演說作為例子。見下面連結,我想要提的是他說的第一個故事,他如何把大學修的"如何把字型畫的很漂亮"的設計課運用在麥金塔的設計上面,他如何鼓勵學生多學習,因為你永遠不知道未來會不會有一天把這些"點"連在一起。我個人的經驗是,以往學的數學(上課或自修),不是每一門每一章頁都有用,但是只要有一小部分有用,我就受益無窮了,而且似乎我能用的數學,連結的點,越來越多!
http://news-service.stanford.edu/news/2005/june15/jobs-061505.html
再舉一個例子:網頁設計。
SVG有些地方是要用到線性代數的。
http://www.w3.org/TR/SVG11/coords.html
路線(Path)的設計也運用到數值方法的概念(Bezier curve):
http://www.w3.org/TR/SVG11/paths.html
數學還是很好用的,而且常會在意想不到的地方出現。
看這些討論
我看到的是: 一個階段時期 果然會有一種言論與思維
隨著學習經驗的累積, 你會發現~
現在的(or 過去的)想法會被未來的你推翻掉.
現今大多數的程式設計師, 都只會用別人CODE好的LIB
要他去寫個JPEG解碼器看看...
要他去寫個邊緣搜尋, 3D轉2D看看...
編譯器本身 也是數學
幾乎能想到最基本的東西都是數學!
當然 如果你只是當一般的程式設計員 CALL CALL別人寫的LIB當然不同, 你可以大聲的說..寫程式 不需要會數學!!
to Ken, 打那麼多字辛苦了,但偽命題並不是全盤否定。
to LS:
好奇怪啊。
你明明知道數學是個全稱,其下還可以分出拓樸學、代數統計跟代數幾何等等。我相信在數學界中,精通數學所有領域的人也不多。即便如此,你仍執意要討論「寫程式需要懂數學」?
令 X = {1..10}, 若 x = 2 ,則 x 屬於 X (或稱 x is a X)。我想這部份的邏輯應該你也能理解。
(我不知道你把邏輯歸類在數學還是哲學。若你把邏輯歸類在哲學,則上述推論對你而言只是清談,不能用於討論實質意義)
但再接著推論:若 Y 需要 x ,故 Y 需要 X 。在我看來這推論不成立。用程序員的說法,可說若 Y 需要一個子類別,不表示 Y 可以接受屬於同一父類別下的其他子類別。若「我需要太空梭才能到月球」成立,並不表示「我需要運輸工具才能到月球」成立。如果我得到是一輛腳踏車(也是運輸工具),我能到月球嗎?喔,我還需要 E.T. 幫忙才行。
再者。懂加法也是懂數學啊,但程序員會問你寫程式需不需要懂加法嗎?顯然不會。進一步說,當一個人問寫程式需不需要懂數學時,他口中的數學必定是指某特定領域的數學,而不是加法。用符號來說, X = {a,b,c} ,a表示加法。對方實際要問的是 X-a ,但仍然用 X 表示,你覺得這樣對嗎?
雖然你似乎認為哲學不能用於討論實質問題,但我還是要說,從哲學來看,提問者用數學這個名詞時,並沒有正確表達出提問者心中所要問的。因此必須要進一步分析,才能給提問者有意義的答案。
你反覆強調的也是「撰寫特定需求的程式時,如果程序員懂某些領域的數學,寫起來比較快」,這不是一個必然的關係。充其量只能得到一個偏稱命題、特稱命題。
只要能找到一個反例,就能證明全稱命題為偽。與其在這上面打轉,我倒認為一個特稱命題更有意義可言。
不論是程式或數學,這兩個名詞所包含的知識領域都太廣了。你說不想學弟問時,卻只能回答這在哲學上是無意義的命題。我倒認為若我只用「是」、或「不是」回答他才是在打馬虎眼,而不是認真回答對方。
Again, 把"寫程式需要懂數學"當作邏輯問題來談,原非我本意,我相信對於絕大多數的人來說,也不是他們問這個問題的本意。
我想要強調的是"會有各種程式寫作的情況,多唸點各種數學常常會有幫助,要保持開放的心"。如果我的發言讓版主對於這個論點有所誤解,或許是我寫的不夠清楚。
不論微積分或是線性代數,我寫程式時都常會用到其中的觀念或重要的結果;甚至拓樸學,機率與統計,數值方法,群論,都對我的思維有很大的幫助。而我認為這個論點是值得大家參考的。就算僵硬的版本"寫任何程式都要懂所有的數學"嚴格來說在邏輯上不成立,我認為這並不傷害我主張的立場。
版主說的邏輯或許都對,但是這不是討論切磋,只是在找語病。這是白馬非馬的邏輯,而且這樣討論下去不會有共識。
最後,推薦版主找本線性代數來唸唸看吧!這大概是所有高等數學裡面我用的最多的,一開始比較辛苦,但是保證會有很大的收穫與成就。或許版主會喜歡上高等數學也說不定。
我在本文一開始就點出這個問題有語病,我要解釋的重點也正是這個語病。「寫程式需要懂數學」這個命題的判斷意義,令「懂數學」且是全稱、所有領域的數學成了一個人是否會寫程式的判斷條件。
奈何各位以為我給了一個否定命題。於是浩浩累累地寫了許多關於各種領域的數學有多重要的例子。
LS很推崇數學,但似乎對邏輯有所偏見,似乎我們不應該討論邏輯問題?我也建議 LS 多接觸語言邏輯,不要把它們當作挑語病的清談。
不知語言邏輯該從何學習起?我比較熟悉的是符號邏輯。
或者這樣說,一個沒學過任何數學的人,有可能寫程式嗎?或許可以,但接下來又必須問,什麼叫"寫程式"?
又或者這樣問,一個人數學進步了,是否程式功力也會進步?我覺得這是肯定的。但同樣的,當一個人哲學或經濟學進步了,我認為程式功力也會進步。
這時代,各個領域都是直接或間接相關的,但是要先會X才能夠會Y的例子,除非切的太細,不然應該也很少。
文字所代表的是概念,不是精準的敘述。
「數學」可以是個統稱,也可以是這個統稱的一小部份,辦這一小部份含有這個統稱分類中的共有特性:「數學」。
所以在敘述這個命題「寫程式需要懂數學」時,我可以這麼斷字:寫、程式、需要、懂、數學。
那麼你們在討論時是否要對上述的斷字先有個共同的認識及定義?
所以這個題目不但是偽命題,也是真命題,而且是個奇妙的命題。
P.S.請不要問我奇妙在哪裡!
前幾天看了一本書,叫《數字感》。看完之後大嘆相見恨晚。因為作者書中所言,和我的主張竟是如此接近,而且都有相關的科學研究成果。
這個議題的奇妙在於,我們是如何看待數學的?按《數字感》所述,柏拉圖學派、形式學派與直覺學派將有不同的看法。
柏拉圖學派毫無疑問將肯定「寫程式需要懂數學」。因為在他們眼中,「宇宙是用數學寫成的」。柏拉圖學派是多數數學家的普遍信仰。
但我不喜歡柏拉圖學派。依我在正文中所述:「數學家和程序員同樣運用邏輯與代數概念進行思考。差別在於數學家用數學式記述思考過程,程序員用程式語言記述思考過程」。此一主張接近直覺學派的觀點。
我們都會透過直覺獲得對空間、時間、運動和宇宙的知識,然後再將這些概念形式化,用最熟悉的語言表述。以我為例,我對程式語言的熟悉程度遠勝高等數學,因此當我要將腦中的知識形式化時,我腦中優先浮現的符號將是程式語言,而不是數學符號(㏑∫Σλ...)。
這個世界可愛之處在於:你可以看到不同的東西。
我個人的看法比較接近朱邦復先生所說的常識概念。
當然啦,有些事物是力求精準的,但有些不是,這要看需求跟載體而定~
有句話說:近朱者赤,近墨者黑。
我覺得很適合來評論這串文的論戰。
我本身也是有接觸程式語言的
我認為寫程式可以不用會很高深的數學學問
但是若你本身擁有高深的數學學問,跨來寫程式的話,寫出來的程式完整性,邏輯性,效能,普遍都會比較好
就像文中提出了高斯的公式
那個公式對於不懂數學的人,只能拿來套用
而真的懂數學的人,也許能改進它,增進效能,或是可讀性,減少指令碼等
我本身數學也是破的一蹋糊塗,所以有些簡單的遞迴,或是運算方式,經過會數學較強的人修改一下,200行程式碼也許就只剩下100行
其實程式,數學,本來就分不開的
x=1+y/2
這個簡單的運算式可以是程式碼,也可以是數學表示式
我很羨慕數理很強的人,不像我需要靠很多邏輯概念、寫程式的經驗去彌補數學上的差距,寫程式真的不需要懂太深的數學,但我相信要寫出好的程式,數理、邏輯概念,都要超出常人的水準
to gan068:
我在
10689881號回應中 說「再回到1~100累加的例子。當人們拿著這問題問我懂不懂數學時,似乎只看我是不是用高斯定理處理。如果我不是用高斯定理處理,是不是就表示我不懂數學了呢?簡單說,如果我記不住高斯定理,我就不懂數學。至於我是否理解1+100、2+99的結果具有重覆性,且重複的累加就是乘法等等內容,似乎沒人在意」。
說了半天,我這人算是懂數學還是不懂數學?
數學和邏輯,大概只有數學中的形式主義才接受邏輯=數學。柏拉圖學派和直覺學派並不認為邏輯=數學。
程式語言和數學相比較時,程式語言的弱項在於其發展歷史僅有不到100年,數學至少已經發展5000年之久。而且人類從小時候起,就在學習使用數學而不是程式語言。
你認為你的程式交由數學好的人可以改得比較有效率時,其實原因只是因為數學家經過5000年的發展而累積了許多現有的解答。如果我們現在面臨的是一個新問題,那麼理論上,程式語言和數學的起跑點相同。只是,我們學習數學的時間遠多於程式語言,所以我們還是習慣讓數學主導我們的思考。
很抱歉,這不是一個應用問題,而是一個知識論問題。請先看完正文及其他回應,並確定你能區分數學中的柏拉圖學派、形式主義學派和直覺學派後,再回應。
我希望接下來的回應者,回覆的是下列內容,謝謝。
一、說明數學不是一種程式語言。
若數學是一種程式語言,則:算數學需要懂程式。
二、說明人類不能經由直覺獲得對空間、時間、運動和宇宙等等知識。
對柏拉圖學派而言,這是必要事項。唯有如此,才能說:人類只能透過數學才能獲得知識。
三、說明人類為何不可能透過其他符號系統獲得對空間、時間、運動和宇宙等等知識。
這其實是第二點的另一種表述形式。
四、說明為什麼馮.紐曼(von Neumann) 說「大腦語言不是數學語言」(The Brain and the Computer, 1957)
馮.紐曼是電腦科學的創始人之一。
我提出一個觀點:結構改變了,能量也改變了。
基本上,大多數人只會記得XX定理啦,YY公式啦,很少人注意到「結構」改變了。
基本上,從邏輯形式到加法就是一次結構的變化,這時候運算的「能量」改變了。
人們用「數學」的形式描述他,就是加法定理。
如果有人理解我上面描述的東西,那問題就清楚了。
石頭你要問的那老四項基本上都獲得解決~
写程式和擅长数学本来就是不一样的学问。这就好比说,写程式需不需要了解一个商业的营运及管理?写程式需不需要懂得英文?写程式需不需要熟悉使用Google?
我的意思是指,没有必要硬要把数学转换成同样的程序公式。一个程序可以描述世界上任何一样东西。比方说,ERP描述的,就是一个公司的企业流程。一套翻译软件描述的,就是人类语言的转换。
有人只要懂代數就能寫程式,
有人卻要懂三角函數才能寫程式,
更有人需要懂微積分才能寫程式,
還有人卻要懂拉普拉斯與傅立葉轉換才能寫出程式
我要寫信號分析方面的軟體就要懂傅立葉轉換等等工程數學,不懂得話就算給你人家寫好的函式庫也不知道怎麼用,所以說寫程式需不需要懂數學?
答案:就看你要寫什麼程式囉~
工程師的毛病就是不自覺吹毛求疵(鑽牛角尖),用在工程上很好,但平常就以平常心來看待就好。
要不要懂數學?會這樣問當然不是指會不會加減乘除啊,這小學生都會,很自然就是泛指應用數學,這才是一般人的門檻所在,理所當然的就會這樣問,尤其是剛入門者才會提這種問題,所以沒那麼嚴重啦,就看你工作的需求而定。
我老大第一次丟給我信號分析的需求,我傻眼,傅立葉已經很久沒跟他聯絡了,雖然我知道有函式庫可以呼叫,問題是那麼多函式該如何運用?只好重拾課本把工程數學搞懂。
有人只要會加減乘除就可以寫程式了,而我卻要懂工程數學,那我問你我寫程式需不需要懂數學?
唉~放輕鬆一點,沒那們嚴重啦。
上一篇我的第一段並不是要批評版主,而是我自己也是一個超龜毛的工程師,我老婆常常懷疑自己為什麼會嫁给我這個龜毛男,恩~我自己也這麼覺得,怕大家誤會澄清一下,各位大大的論點都很棒,只是覺得好像把這問題看的太嚴重了而已,小弟是個遜咖,竟然敢來這裡教訓各位前輩,別打我嘿~哈哈~
版主的部落格是我新發現的寶庫,有很多很棒的資料,都是我準備由Programer進入SA/SD甚至架構師領域的寶貴知識,給您拍拍手鼓勵加油一下囉,還請多指教。
其實石頭大大看到的是數學和物理都在使用的那套形式語言系統,而這套形成語言系統是不是就於數學本身?
我個人認為不等於,而石頭大大認為等於,這就是問題的分歧所在。
數學只是工具,只是看你會不會用,不會用也是可以寫程式,但是會用數學你會得到更多。
把需要解決的問題抽象化是數學,同時也是程式共通之處,不懂英文確實可以寫程式,但是反過來說;如果使用中文語法來寫程式那又是另一種不同的思維