最近更新: 2007-05-28

「寫程式需要懂數學」是個偽命題

三不五時就會聽到有人問寫程式需不需要懂數學,例如《寫程式到底需不需要懂數學》。在我這個大學時五修微積分才過關的人聽來,還真是刺耳。這根本是個偽命題。

若說寫程式要懂邏輯與代數,這我同意。但若說寫程式要懂數學,那我就反問要懂數學的哪一部份?

數學有兩個內容,一是數論,二是算術。數論是邏輯與代數的概念;算術是演算技巧與符號記述。本來數論才是重點。然而我們在說懂不懂數學時,通常指的是算術,亦即我們是看這個人能不能把邏輯演算的思考過程,以數學的算術式記錄下來。

程式語言跟數學一樣,都是一種符號系統。就像中文和英文一樣。對於眼前的一顆蘋果,如果你能用中文記述「這是一顆蘋果」,就算你不懂英文「This is an apple」又有什麼關係?如果你能用程式語言表達1~100累加的內容,如下面的C語言所示,那麼就算你不懂如何用數學符號表達,有錯嗎?

int esum(int n, int m) {
    int c, i;
    for (c = i = n; i < m; ++i, c+=i);
    return c;
}
esum(1,100)

數學家和程序員同樣運用邏輯與代數概念進行思考。差別在於數學家用數學式記述思考過程,程序員用程式語言記述思考過程。僅此而已。

再舉一例。當一般人習慣用積分計算圖形面積時,我這 programmer 卻是用迴圈去累計面積,而精確度則視變數型態而定。如果我用整數去累計 (切割的最小單位是 1 ),則我的面積就會是整數的。如果我要更精確的答案,就要用將最小單位切的更小的數值型態。一般人不習慣用如此細緻的描述方式。
程序員處理計算問題時的思考方式不同於數學

延伸閱讀: 《語言的使用,會訓練並影嚮我們的思考方式。在電腦程式語言中,特別突顯這個現象》。

相關文章
樂多舊網址: http://blog.roodo.com/rocksaying/archives/3360399.html

樂多舊回應
fostermeng@gmail.com(Foster) (#comment-10670359)
Mon, 28 May 2007 16:42:31 +0800
最近剛好朋友也在問我這個問題,對於石兄的看法
小弟我深感認同,待會把這篇貼給朋友看看
未留名 (#comment-10675601)
Tue, 29 May 2007 07:51:49 +0800
幾個需要除了離散數學以及演算法之外,"其他類的高等數學"的例子:

http://www.nrbook.com/a/bookcpdf.php
Numerical recipes in C
求積分事實上是很大的學問! 至於計算的精度,數值方法的書中都有很深入的討論。

http://www.rose-hulman.edu/~bryan/googleFinalVersionFixed.pdf THE $25,000,000,000 EIGENVECTOR: THE LINEAR ALGEBRA BEHIND GOOGLE

當然還有 3D graphics...
未留名 (#comment-10676067)
Tue, 29 May 2007 09:56:27 +0800
我正文中舉的累加1~100的 C語言例子,在數學家眼中看來是小孩子的把戲。

不錯,在高斯之前,每個人都是憨直地一個一個累計。在高斯之後,數學家會寫成 (n+m)*(m-n+1)/2 。他們會說這樣簡單,計算又快。

然而數學符號與計算形式,只對人類來說才是又快又簡單。計算機系統仍然要把這樣的算式編譯成更基本、更純粹的邏輯形式才能計算。換句話說,我們習慣使用的數學形式,是我們在更基本的「實在」之上,所加上的一道濾光鏡。這道濾光鏡將「實在」轉換成人類易於解讀的形式。如果我們不用這道濾光鏡,就不能描述實在了嗎?不儘然如此。

例如我在參考文章中舉10進位換算16進位的例子。就是不用一般數學乘除法換算而直接用基本邏輯進行運算的例子。

我不否認多數人要透過數學系統才能思考,但我也不能否認有些人可以跳過數學系統,直接運用邏輯系統思考。

最後一點。直接運用邏輯系統思考的方式,等到形式化後,又會被納入數學系統。我們口中的數學,涵蓋的內容會不斷增加。所以我們現在認為不需要數學的部份,以後就會變成人們認為是需要懂數學才會的部份(因為數學又把它涵蓋進去了)。反正我們遲早會把它變成數學的一部份,那麼「寫程式需要懂數學」不就是個偽命題嗎?
未留名 (#comment-10678649)
Tue, 29 May 2007 13:07:47 +0800
與其把數學當作抽象的文字遊戲,不如看看數學在現實生活中可以有多大的幫助,不是嗎?還有,"數學"跟"程式"在這裡都太概括了。這樣問吧: 若說寫程式要懂數學,是要寫哪一種程式?要懂哪一種數學?

用迴圈去計算從一累加到一百,理論上固然可行,不過實際上卻不甚實用。如果要從一累加到2^31-1,只怕你我有生之日這個迴圈也跑不完。這時高斯的公式就很有價值了。

另外一個例子是密碼學。著名的RSA編碼法必須要每個使用者都有一個獨特的很大的質數(1024~2048 bits),不過若要用國中尋找質數的演算法去找,全世界所有人加起來的有生之年也找不到幾個(如果運氣好的話)。不過有人找出快速產生類似性質的數字的方式。這些都是數學研究的成果。當然,實際上把RSA演算法寫成程式,不見得需要懂背後的數學原理,不過我的經驗是可以用這些數學性質幫忙除蟲...
未留名 (#comment-10679935)
Tue, 29 May 2007 16:01:13 +0800
程序員不用自己計算,而是交給電腦計算。

不過 LS 的回應內容又把主題扯回那個死胡同去了。我還是一句話「數學家和程序員同樣運用邏輯與代數概念進行思考。差別在於數學家用數學式記述思考過程,程序員用程式語言記述思考過程。僅此而已。」差別只是記述方式不一樣,但腦子裡想的東西是一樣的。假設我沒學過高斯定理,但我腦中想的是上底加下底乘高除2,然後寫成 c=0; ((m - n + 1) >> 1).times{c+=n+m},這樣算懂數學還是不懂數學呢?

嗯,我糊塗了,忘了哲學流別之分。各位是否認同我上面的內容,視各位的邏輯觀屬於哪一種哲學體系而定。我傾向維根斯坦的語言分析哲學,所以數學對我而言,只是一種語言。但是本質論者會駁斥我的觀點,對他們而言,數學不是一種語言,而是本質的相貌。

在大多數時候,這類觀點的支持者會挑起「寫程式需要懂數學」的筆戰。對我而言,這是個偽命題;對他們而言,這是個真命題。
未留名 (#comment-10682559)
Tue, 29 May 2007 21:03:00 +0800
這其實不需要變成筆戰,我也沒有屬於什麼哲學流派。當我在思考這個問題時,不是從事哲學上的思維,卻是從教育的角度來思考:下一代的學生要不要修目前資訊系提供的標準課程之外的數學課程?唸相關的書對程式設計到底有什麼幫助?如果有一個小學弟向我們請教這個問題,我們卻告訴他們這在哲學上是無意義的命題,我可以想像這位學弟的表情會有多奇怪。

這樣說吧,要寫好程式要不要唸線性代數?要不要唸機率?要不要唸微積分?修這些課程或唸這些書,對於寫程式有無幫助?如果要把機率學說成只是一堆符號,對於機率學本身或相關的程式設計問題並無幫助。

版主個人的經驗為何?我個人的經驗是有時幫助很大,有時卻沒有用。目前為止,微積分的幫助很有限,不過還是有的。要寫的程式種類越多,越有可能某些數學會起作用;要解的問題若與數學有關,懂的數學越多越有幫助。例如寫網頁程式當然跟數學無關,不過設計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
未留名 (#comment-10682615)
Tue, 29 May 2007 21:09:26 +0800
還有對於版主說的,"程序員不用自己計算,而是交給電腦計算。"事實上電腦的計算能力是有限的。程序員寫的程式不同,電腦算起來不僅會有不同的效率,甚至有不同的結果。

記得小時候拿計算機算1/7/7/7/7/7/7/7.../7 *7*7*7*7 ... *7結果不會剛剛好等於一嗎?但是若順序換一換,寫作1/7*7/7*7...就不會有這樣的問題。當然,這是因為浮點運算的精度有限。雖然這是一個沒什麼意義的例子,但是也有類似的,非常重要的例子:解線性代數方程式使用高斯消去法時,消去的順序不同,有時會有不同的結果。這個概念(pivoting/condition of a matrix)在數值方法的課程中有提到。
未留名 (#comment-10689881)
Wed, 30 May 2007 10:59:26 +0800
請看到本文,我說「寫程式要懂邏輯與代數,這我同意」;又說「數學有兩個內容,一是數論,二是算術。數論是邏輯與代數的概念;算術是演算技巧與符號記述。本來數論才是重點。」

沒有數論作為基礎,我們可以一筆劃掉 7*7*7/7/7/7 ,直接寫1嗎?同樣地,在電腦程式中,若沒有數論作為基礎,我們可以一筆劃掉 8543295743205974294321/8 ,寫成 8543295743205974294321 >> 3 嗎? 8543295743205974294321 >> 3 是程序員基於計算工具的特性(位元)所想出來的速算法。我沒看過有程序員以外的人這樣用。

LS說「版主的論點,似乎是把程式寫作當作哲學思考來看,我沒有看到從個人的經驗來切入!」

上例就是我的個人經驗。我的個人經驗還有 語言的使用,會訓練並影嚮我們的思考方式。在電腦程式語言中,特別突顯這個現象 中的例子,我也沒看過有程序員以外的人這般處理數值換算。

以上種種都是抽象的思考活動。本來,這才是重點。但是多數人提到這個問題時,關心的不是自己是否具備這種思考能力,而是自己能不能用數學符號與定理記述。

再回到1~100累加的例子。當人們拿著這問題問我懂不懂數學時,似乎只看我是不是用高斯定理處理。如果我不是用高斯定理處理,是不是就表示我不懂數學了呢?簡單說,如果我記不住高斯定理,我就不懂數學。至於我是否理解1+100、2+99的結果具有重覆性,且重複的累加就是乘法等等內容,似乎沒人在意。

包括 LS 的回覆,都只在意我有沒有用高斯定理表達。這是好事嗎?請看《計算的形式真是多樣化》,我自己承認我們在討論這問題時,都陷入記憶式數學教育的框框了。

果真如此,那還不如把命題改成「寫程式需要記住很多的數學定理」吧!
未留名 (#comment-10690097)
Wed, 30 May 2007 11:35:06 +0800
高斯定理只是我舉的一個例子,我還有舉其他很多例子,而這些例子是除了Arithmetic (算數)之外的應用數學的例子,這些問題絕對不是版主的"數論"可以解決的。

8543295743205974294321 >> 3這個算法是利用二進位的特性,但是除了十以外的進位數學早在電腦發明之前就已經有人研究了,這跟在十進位算術中,12345 / 1000 = 12 (向右移三位)一樣,沒什麼特別的。

再舉些簡單例子吧:如何寫一個程式算圓形的面積?算圓球的體積?算高次元球的"體積"?裡面有用到圓週率,這個常數又是怎麼計算出來的?怎麼用電腦來算二的平方根?浮點運算器應該都有支援這個指令,但這個指令的電路是如何設計出來的?這些都是數論或邏輯以外的數學。

我倒認為抽象的思考不是這個問題的重點,見我之前提到學弟請教的例子。至少我不希望我請教指導教授跟我前途相關的問題的時候,他給我一些哲學的答案!

數學簡單分做數論跟算術的分法,似乎太小看數學了!不知出自何處?詳細一點的分類可以看http://www.ams.org/msc/

懂數學跟光記住很多數學定理或光會使用數學符號是不同的,就像懂英文跟背很多單字例句,寫程式跟熟背各種程式語言,寫作文跟背很多成語是不同的。箇中奧秘,學數學的學生都懂,但是是只能意會,不能言傳 -- What we cannot speak of we must pass over in silence...

或許就版主個人的經驗來說,真的不需要用到特別高深的數學。不知版主寫的是哪些類型的程式?我工作的關係,常常要計算各種數學的結果,自然需要數學;不過我想還有其他許多程式設計的情況,必須要懂簡單算術以外的數學,例如3D圖形。
未留名 (#comment-10690779)
Wed, 30 May 2007 13:01:26 +0800
很遺憾,跟數學有關的話題,確實很哲學。話說有什麼學問可以不跟哲學扯上關係嗎?我最近看了一些量子力學的書,那跟哲學的牽扯之深,幾乎可以自成一門哲學科目。

"What we cannot speak of we must pass over in silence..." 這句話就是維根斯坦說的(《邏輯哲學論》)。

我只分數論和算術,顯然是不夠的。但這樣也比用一個全稱的「數學」要好。你可以告訴你的學弟。不能做「全稱命題」,而要做「偏稱命題」。令「寫3D圖形程式需要懂三角函數及微積分」,成立。令「寫密碼程式需要懂質數」,成立。令「寫密碼程式需要懂微積分」,嗯... 這要請 LS 兄回答是否成立了?

我分太細?這是沒辦法的,事實如此。不然光數學就學不完了,哪有時間寫程式。

LS說「懂數學跟光記住很多數學定理或光會使用數學符號是不同的」。嗯,我可以理解這句話的意思是「寫程式不需要懂數學,只要知道該用什麼數學定理就可以」嗎?畢竟很多人在使用如微積分等計算工具時,儘管不知道基本原理,照樣算得很熟練,並頻繁地用於程式碼中。

我過往有一段時間,是在寫系統程式。在這個領域中,位元運算、查表、指標索引、資料結構是主要工作。有時我們不是透過已知的數學定理或演算技巧,而是從基礎算術單元之中建構出有效率的演算法。在這個領域中,甚至有一個無名定理「查表比計算快」。這個「表」的來源是用憨直的方式慢慢算,或是用優美的數學定理速算,甚至矇眼擲骰子(如果我要一個亂數種子表),都可以。
未留名 (#comment-10693989)
Wed, 30 May 2007 18:09:15 +0800
什麼東西都跟哲學有關係,但不代表用哲學討論會有實質的意義,會是最好的途徑,那是清談。

問題是數學分成數論跟算術這種分法是錯的。不知道拓樸學該算哪類?代數統計(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
數學還是很好用的,而且常會在意想不到的地方出現。
coolken@gmail.com(Ken) (#comment-10704421)
Thu, 31 May 2007 11:33:35 +0800
看這些討論
我看到的是: 一個階段時期 果然會有一種言論與思維

隨著學習經驗的累積, 你會發現~
現在的(or 過去的)想法會被未來的你推翻掉.

現今大多數的程式設計師, 都只會用別人CODE好的LIB
要他去寫個JPEG解碼器看看...
要他去寫個邊緣搜尋, 3D轉2D看看...

編譯器本身 也是數學
幾乎能想到最基本的東西都是數學!

當然 如果你只是當一般的程式設計員 CALL CALL別人寫的LIB當然不同, 你可以大聲的說..寫程式 不需要會數學!!
未留名 (#comment-10705207)
Thu, 31 May 2007 12:16:02 +0800
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 表示,你覺得這樣對嗎?
雖然你似乎認為哲學不能用於討論實質問題,但我還是要說,從哲學來看,提問者用數學這個名詞時,並沒有正確表達出提問者心中所要問的。因此必須要進一步分析,才能給提問者有意義的答案。

你反覆強調的也是「撰寫特定需求的程式時,如果程序員懂某些領域的數學,寫起來比較快」,這不是一個必然的關係。充其量只能得到一個偏稱命題、特稱命題。

只要能找到一個反例,就能證明全稱命題為偽。與其在這上面打轉,我倒認為一個特稱命題更有意義可言。

不論是程式或數學,這兩個名詞所包含的知識領域都太廣了。你說不想學弟問時,卻只能回答這在哲學上是無意義的命題。我倒認為若我只用「是」、或「不是」回答他才是在打馬虎眼,而不是認真回答對方。
未留名 (#comment-10708063)
Thu, 31 May 2007 12:47:08 +0800
Again, 把"寫程式需要懂數學"當作邏輯問題來談,原非我本意,我相信對於絕大多數的人來說,也不是他們問這個問題的本意。

我想要強調的是"會有各種程式寫作的情況,多唸點各種數學常常會有幫助,要保持開放的心"。如果我的發言讓版主對於這個論點有所誤解,或許是我寫的不夠清楚。

不論微積分或是線性代數,我寫程式時都常會用到其中的觀念或重要的結果;甚至拓樸學,機率與統計,數值方法,群論,都對我的思維有很大的幫助。而我認為這個論點是值得大家參考的。就算僵硬的版本"寫任何程式都要懂所有的數學"嚴格來說在邏輯上不成立,我認為這並不傷害我主張的立場。

版主說的邏輯或許都對,但是這不是討論切磋,只是在找語病。這是白馬非馬的邏輯,而且這樣討論下去不會有共識。

最後,推薦版主找本線性代數來唸唸看吧!這大概是所有高等數學裡面我用的最多的,一開始比較辛苦,但是保證會有很大的收穫與成就。或許版主會喜歡上高等數學也說不定。
未留名 (#comment-10709519)
Thu, 31 May 2007 14:54:36 +0800
我在本文一開始就點出這個問題有語病,我要解釋的重點也正是這個語病。「寫程式需要懂數學」這個命題的判斷意義,令「懂數學」且是全稱、所有領域的數學成了一個人是否會寫程式的判斷條件。

奈何各位以為我給了一個否定命題。於是浩浩累累地寫了許多關於各種領域的數學有多重要的例子。

LS很推崇數學,但似乎對邏輯有所偏見,似乎我們不應該討論邏輯問題?我也建議 LS 多接觸語言邏輯,不要把它們當作挑語病的清談。
未留名 (#comment-10713711)
Thu, 31 May 2007 18:30:10 +0800
不知語言邏輯該從何學習起?我比較熟悉的是符號邏輯。
未留名 (#comment-11252541)
Thu, 12 Jul 2007 02:08:28 +0800
或者這樣說,一個沒學過任何數學的人,有可能寫程式嗎?或許可以,但接下來又必須問,什麼叫"寫程式"?

又或者這樣問,一個人數學進步了,是否程式功力也會進步?我覺得這是肯定的。但同樣的,當一個人哲學或經濟學進步了,我認為程式功力也會進步。

這時代,各個領域都是直接或間接相關的,但是要先會X才能夠會Y的例子,除非切的太細,不然應該也很少。
HACGIS@gmail.com(tokimeki) (#comment-11255745)
Thu, 12 Jul 2007 15:44:42 +0800
文字所代表的是概念,不是精準的敘述。

「數學」可以是個統稱,也可以是這個統稱的一小部份,辦這一小部份含有這個統稱分類中的共有特性:「數學」。

所以在敘述這個命題「寫程式需要懂數學」時,我可以這麼斷字:寫、程式、需要、懂、數學。
那麼你們在討論時是否要對上述的斷字先有個共同的認識及定義?

所以這個題目不但是偽命題,也是真命題,而且是個奇妙的命題。

P.S.請不要問我奇妙在哪裡!
未留名 (#comment-11256605)
Thu, 12 Jul 2007 17:16:09 +0800
前幾天看了一本書,叫《數字感》。看完之後大嘆相見恨晚。因為作者書中所言,和我的主張竟是如此接近,而且都有相關的科學研究成果。

這個議題的奇妙在於,我們是如何看待數學的?按《數字感》所述,柏拉圖學派、形式學派與直覺學派將有不同的看法。

柏拉圖學派毫無疑問將肯定「寫程式需要懂數學」。因為在他們眼中,「宇宙是用數學寫成的」。柏拉圖學派是多數數學家的普遍信仰。

但我不喜歡柏拉圖學派。依我在正文中所述:「數學家和程序員同樣運用邏輯與代數概念進行思考。差別在於數學家用數學式記述思考過程,程序員用程式語言記述思考過程」。此一主張接近直覺學派的觀點。

我們都會透過直覺獲得對空間、時間、運動和宇宙的知識,然後再將這些概念形式化,用最熟悉的語言表述。以我為例,我對程式語言的熟悉程度遠勝高等數學,因此當我要將腦中的知識形式化時,我腦中優先浮現的符號將是程式語言,而不是數學符號(㏑∫Σλ...)。
HACGIS@gmail.com(tokimeki) (#comment-11259513)
Thu, 12 Jul 2007 22:14:10 +0800
這個世界可愛之處在於:你可以看到不同的東西。

我個人的看法比較接近朱邦復先生所說的常識概念。

當然啦,有些事物是力求精準的,但有些不是,這要看需求跟載體而定~

有句話說:近朱者赤,近墨者黑。
我覺得很適合來評論這串文的論戰。
未留名 (#comment-13151891)
Fri, 27 Jul 2007 15:24:33 +0800
我本身也是有接觸程式語言的
我認為寫程式可以不用會很高深的數學學問
但是若你本身擁有高深的數學學問,跨來寫程式的話,寫出來的程式完整性,邏輯性,效能,普遍都會比較好
就像文中提出了高斯的公式
那個公式對於不懂數學的人,只能拿來套用
而真的懂數學的人,也許能改進它,增進效能,或是可讀性,減少指令碼等

我本身數學也是破的一蹋糊塗,所以有些簡單的遞迴,或是運算方式,經過會數學較強的人修改一下,200行程式碼也許就只剩下100行

其實程式,數學,本來就分不開的

x=1+y/2

這個簡單的運算式可以是程式碼,也可以是數學表示式

我很羨慕數理很強的人,不像我需要靠很多邏輯概念、寫程式的經驗去彌補數學上的差距,寫程式真的不需要懂太深的數學,但我相信要寫出好的程式,數理、邏輯概念,都要超出常人的水準
未留名 (#comment-13344933)
Sun, 29 Jul 2007 09:44:46 +0800
to gan068:
我在10689881號回應中說「再回到1~100累加的例子。當人們拿著這問題問我懂不懂數學時,似乎只看我是不是用高斯定理處理。如果我不是用高斯定理處理,是不是就表示我不懂數學了呢?簡單說,如果我記不住高斯定理,我就不懂數學。至於我是否理解1+100、2+99的結果具有重覆性,且重複的累加就是乘法等等內容,似乎沒人在意」。
說了半天,我這人算是懂數學還是不懂數學?


數學和邏輯,大概只有數學中的形式主義才接受邏輯=數學。柏拉圖學派和直覺學派並不認為邏輯=數學。

程式語言和數學相比較時,程式語言的弱項在於其發展歷史僅有不到100年,數學至少已經發展5000年之久。而且人類從小時候起,就在學習使用數學而不是程式語言。

你認為你的程式交由數學好的人可以改得比較有效率時,其實原因只是因為數學家經過5000年的發展而累積了許多現有的解答。如果我們現在面臨的是一個新問題,那麼理論上,程式語言和數學的起跑點相同。只是,我們學習數學的時間遠多於程式語言,所以我們還是習慣讓數學主導我們的思考。
未留名 (#comment-13344937)
Sun, 29 Jul 2007 09:45:08 +0800
很抱歉,這不是一個應用問題,而是一個知識論問題。請先看完正文及其他回應,並確定你能區分數學中的柏拉圖學派、形式主義學派和直覺學派後,再回應。

我希望接下來的回應者,回覆的是下列內容,謝謝。

一、說明數學不是一種程式語言。
若數學是一種程式語言,則:算數學需要懂程式。

二、說明人類不能經由直覺獲得對空間、時間、運動和宇宙等等知識。
對柏拉圖學派而言,這是必要事項。唯有如此,才能說:人類只能透過數學才能獲得知識。

三、說明人類為何不可能透過其他符號系統獲得對空間、時間、運動和宇宙等等知識。
這其實是第二點的另一種表述形式。

四、說明為什麼馮.紐曼(von Neumann) 說「大腦語言不是數學語言」(The Brain and the Computer, 1957)
馮.紐曼是電腦科學的創始人之一。
HACGIS@gmail.com(tokimeki) (#comment-13399225)
Mon, 30 Jul 2007 00:37:07 +0800
我提出一個觀點:結構改變了,能量也改變了。
基本上,大多數人只會記得XX定理啦,YY公式啦,很少人注意到「結構」改變了。

基本上,從邏輯形式到加法就是一次結構的變化,這時候運算的「能量」改變了。

人們用「數學」的形式描述他,就是加法定理。

如果有人理解我上面描述的東西,那問題就清楚了。
石頭你要問的那老四項基本上都獲得解決~
haryewkun@lcmart.com(haryewkun) (#comment-13542025)
Tue, 31 Jul 2007 19:08:07 +0800
写程式和擅长数学本来就是不一样的学问。这就好比说,写程式需不需要了解一个商业的营运及管理?写程式需不需要懂得英文?写程式需不需要熟悉使用Google?

我的意思是指,没有必要硬要把数学转换成同样的程序公式。一个程序可以描述世界上任何一样东西。比方说,ERP描述的,就是一个公司的企业流程。一套翻译软件描述的,就是人类语言的转换。
未留名 (#comment-14870551)
Mon, 29 Oct 2007 16:55:48 +0800
有人只要懂代數就能寫程式,
有人卻要懂三角函數才能寫程式,
更有人需要懂微積分才能寫程式,
還有人卻要懂拉普拉斯與傅立葉轉換才能寫出程式

我要寫信號分析方面的軟體就要懂傅立葉轉換等等工程數學,不懂得話就算給你人家寫好的函式庫也不知道怎麼用,所以說寫程式需不需要懂數學?

答案:就看你要寫什麼程式囉~
未留名 (#comment-14871103)
Mon, 29 Oct 2007 18:31:07 +0800
工程師的毛病就是不自覺吹毛求疵(鑽牛角尖),用在工程上很好,但平常就以平常心來看待就好。

要不要懂數學?會這樣問當然不是指會不會加減乘除啊,這小學生都會,很自然就是泛指應用數學,這才是一般人的門檻所在,理所當然的就會這樣問,尤其是剛入門者才會提這種問題,所以沒那麼嚴重啦,就看你工作的需求而定。

我老大第一次丟給我信號分析的需求,我傻眼,傅立葉已經很久沒跟他聯絡了,雖然我知道有函式庫可以呼叫,問題是那麼多函式該如何運用?只好重拾課本把工程數學搞懂。

有人只要會加減乘除就可以寫程式了,而我卻要懂工程數學,那我問你我寫程式需不需要懂數學?

唉~放輕鬆一點,沒那們嚴重啦。
未留名 (#comment-14873085)
Mon, 29 Oct 2007 23:11:12 +0800
上一篇我的第一段並不是要批評版主,而是我自己也是一個超龜毛的工程師,我老婆常常懷疑自己為什麼會嫁给我這個龜毛男,恩~我自己也這麼覺得,怕大家誤會澄清一下,各位大大的論點都很棒,只是覺得好像把這問題看的太嚴重了而已,小弟是個遜咖,竟然敢來這裡教訓各位前輩,別打我嘿~哈哈~

版主的部落格是我新發現的寶庫,有很多很棒的資料,都是我準備由Programer進入SA/SD甚至架構師領域的寶貴知識,給您拍拍手鼓勵加油一下囉,還請多指教。
未留名 (#comment-14997153)
Wed, 14 Nov 2007 20:14:30 +0800
其實石頭大大看到的是數學和物理都在使用的那套形式語言系統,而這套形成語言系統是不是就於數學本身?
我個人認為不等於,而石頭大大認為等於,這就是問題的分歧所在。
rhgu.tw@gmail.com(gg) (#comment-15073769)
Wed, 21 Nov 2007 11:19:04 +0800
數學只是工具,只是看你會不會用,不會用也是可以寫程式,但是會用數學你會得到更多。
sonet.all@gmail.com(xue) (#comment-16623861)
Tue, 10 Jun 2008 13:41:05 +0800
把需要解決的問題抽象化是數學,同時也是程式共通之處,不懂英文確實可以寫程式,但是反過來說;如果使用中文語法來寫程式那又是另一種不同的思維
未留名 (#comment-18711381)
Thu, 12 Mar 2009 12:47:13 +0800
看完上述論述另小弟受益良多,也勾起過去在學習語言邏輯、數學、程式等方面的回憶。大家都很棒!
未留名 (#comment-19958091)
Sun, 18 Oct 2009 20:12:03 +0800
石頭大的意思大概是說數學:

只是一堆符號,幫助人類記憶,推演,教導,傳播
數學是一種人類直覺思維的系統化,結構化之後所出來的東西.

是這樣嗎?
--------------------------
有些數學公式乍看之下不是這麼直覺,是因為那些公式是由其他數學公式再用數學推導出來的
未留名 (#comment-19971769)
Wed, 21 Oct 2009 15:15:09 +0800
數學是人類創造出來的眾多符號系統之一,它不是上帝創造的。
我只是不喜看人把數學神化。
hoamon@gmail.com(hoamon) (#comment-21803685)
Wed, 08 Jun 2011 22:24:06 +0800
寫程式當然不見得要懂數學。因為某些程式需要某些數學,而某些程式不需要數學。

某些程式不需要數學。像是網頁留言系統,一個簡單的留言網頁,只是打打字,按個送出就記到資料庫去,這跟數學有什麼關係。不懂數學的人,也能寫得出來。

某些程式需要某些數學。像是結構計算程式(算房屋結構的),它會用到微積分、代數、工程學數,但不見得會用到幾何、數論、統計等。
未留名 (#comment-22700122)
Sun, 02 Dec 2012 22:19:14 +0800
路過看到此篇頗有心得,我以邏輯學並不是數學為前提發表我的意見。


我個人認為是寫程式不需要懂數學,即便在此的數學是廣義的。
程式是指數位計算機程式,程式設計亦指設計邏輯程序以供計算機運行。

我想真正有爭議的部分並非數學,而是程式,因為程式泛屬工程學,而工程學並非基礎科學。不過計算機領域是使用邏輯建構上來的,故懂得設計程式的人必定懂邏輯。


也因為個人未曾鑽研哲學,所以就不敢用論證的方式來討論我的觀點,以免辭不達意。我大致從工程的立場描述我的觀點,如下:


1.計算機架構為分層抽象,且由人設計,故演算單元(CPU/GPU...ETC)皆可任意變動。
2.Machine code, Assembly撰寫者須懂計算機架構、指令。
3.編譯語言(C/C++...)、直譯語言(Basic,Python,Javascript...)與腳本與言(HLSL,GLSL...)撰寫者可不須懂計算機相關架構。

以組合語言撰寫者為例,他可以不會算加法,但是他只要會使用add指令。哪天他想要寫一個計算連續整數總和的程式時可以請一個國小五年級的學生幫他列出理論基礎,然後由這個程式設計師撰寫成計算機程式即可。依此理可泛用至任何後層之抽象工程。


程式是工程學在計算機領域的工具,屬於軟體體系,所有軟體是由硬體抽象出來的,所以我認為寫程式與數學之間並交集。而邏輯是計算機原理之根本,故邏輯是程式設計之全集。


至於用數學可以提升程序效率等等的已經與程式設計無關,因為數學方法不屬於計算機科學主要研究的方法,
即使有一個程式設計師用他所知道的數學方法來透過程式求解,也不代表他就比較會寫程式。



晚輩留下一個反證命題:
學作曲需不需要懂數學?(或作:懂作曲的人一定懂數學!)
未留名 (#comment-22797368)
Sat, 02 Mar 2013 15:14:53 +0800
如果人類滅絕了,數學就不存在了;因為數學跟語言本質上是一樣的東西。


數學是人類發明出來用以描述自然界的語言。


為什麼現代漢語把樹稱作「樹」,而英語卻稱它為「tree」,在西語中卻又是「árbol」,可瑞典人又叫它「träd」?


語言只是符號系統,不同語言就是不同符號系統,可他們所指涉的物件卻是一樣的;「樹」、「tree」、「árbol」、「träd」......等等,都是指具有生命卻無法移動、具有根莖幹、沒有主要花目、有綠葉可以行光合作用的一種生物體。這是語言的功能之一:描述這個世界與其所有。


所以,為什麼阿拉伯數字「1」非得是「1」?難道......我們不能改叫它「※」嗎?當然可以,因為數學根語言一樣,都只是符號系統罷了。