無需數(shù)學(xué),你就能成為一名頂尖程序員!這樣的話你信嗎?
不需要數(shù)學(xué)就能成為一名頂尖的程序員,但是如果借助數(shù)學(xué)工具,你會發(fā)現(xiàn)另一個世界。

作者 | Arnuld
譯者 | 王坤祥
策劃 | 萬佳
1?我的數(shù)學(xué)水平
每當(dāng)我想深入學(xué)習(xí)一下算法相關(guān)的內(nèi)容時,其中涉及的一些復(fù)雜數(shù)學(xué)知識有時候就會成為“攔路虎”。
我承認(rèn)自己的數(shù)學(xué)確實(shí)沒學(xué)好,但也不至于很糟糕。不過,這種“不上不下”的數(shù)學(xué)水平,完全無法應(yīng)對業(yè)界 Big Tech 公司(亞馬遜、蘋果、谷歌、Facebook 和微軟)的面試,尤其是面試被問到算法的一些問題,比如某個算法的時間和空間復(fù)雜度,或者具體的排序和搜索算法之間的比較等。
因此,我要學(xué)習(xí)所有這些知識點(diǎn)。在搜索和學(xué)習(xí)過程中,我搜集了幾篇有關(guān)編程所需的數(shù)學(xué)知識的文章。
在編程方面,最為知名的數(shù)學(xué)支持者是史蒂夫·耶格(Steve Yegge)。關(guān)于編程所需的數(shù)學(xué),我列舉了以下內(nèi)容供你參考:
數(shù)學(xué)筆記——?http://www.eskimo.com/~scs/cclass/mathintro/top.html
《Math Everyday》——?https://sites.google.com/site/steveyegge2/math-every-day
《Math for Programmers》——?http://steve-yegge.blogspot.in/2006/03/math-for-programmers.html
成為一名黑客需要多少數(shù)學(xué)——?http://www.catb.org/~esr/faqs/hacker-howto.html#mathematics
談數(shù)學(xué)——?http://www.paulgraham.com/college.html
《數(shù)學(xué)黑客》——?http://www.evanmiller.org/mathematical-hacker.html
《關(guān)于 C 語言實(shí)現(xiàn)的斐波那契數(shù)示例》——?http://blog.noblemail.ca/2013/01/on-calculating-fibonacci-numbers-in-c.html
2?編程不是數(shù)學(xué)
如果你還沒讀過以上內(nèi)容,那么你可能會錯過我寫這篇博客所要表達(dá)的意圖。按照史蒂夫·薩米特(Steve Summit)、埃里克·雷蒙德(Eric Raymond)以及保羅·格雷厄姆(Paul Graham)的觀點(diǎn),你無需過多地關(guān)注數(shù)學(xué)就可以成為一名出色的程序員或者黑客(此處黑客泛指維基百科中對黑客的定義以及埃里克·雷蒙德(Eric Raymond)對黑客的定義)。
史蒂芬·諾布爾(Steven Noble)認(rèn)為,程序員應(yīng)該懂一些數(shù)學(xué);埃文·米勒(Evan Miller)似乎在某種程度上也同意這一觀點(diǎn)。我本人只是出于熱愛而開始踏上編程之路的。
從 2009 年以來,我主要使用 C 語言進(jìn)行編程,有時候還會用 C++,并且大部分時候是在 Linux 和 UNIX 環(huán)境下工作。我對編程充滿熱情,有時候需要使用多種不同的語言進(jìn)行編程,因此我必須學(xué)習(xí)用不同的思維方式工作。編寫代碼不是很難,但是,使用特定的編程語言并按照一定的范式尋找思路且建立模型,才是最難最耗時的工作。
我在編程道路上的經(jīng)歷告訴我,?編程不是數(shù)學(xué)?,而且永遠(yuǎn)不是。如果你想學(xué)習(xí)計(jì)算機(jī)編程,那么去學(xué)計(jì)算機(jī)編程就好了,不需要你去翻閱數(shù)學(xué)書籍,而是要經(jīng)常瀏覽一些編程論壇(比如 comp.lang.c 和 comp.lang.lisp)。關(guān)于瀏覽論壇,你可以使用一個新聞閱讀器,比如 Pan,訂閱來自 GNU 的所有軟件信息,并使用 Linux 發(fā)行版來處理日常工作,我趨向于使用輕量級版本。如果你想學(xué)習(xí)計(jì)算機(jī)編程而學(xué)習(xí)了大量的數(shù)學(xué)知識,那么很有可能會迷失在復(fù)雜的數(shù)學(xué)理論當(dāng)中,并朝著錯誤的方向前進(jìn),最終也不會學(xué)到太多的編程知識。

3?程序員的目的:用代碼解決現(xiàn)實(shí)問題
作為一名程序員,我們的任務(wù)是編寫代碼,那我們編寫代碼的最終目的是什么呢?編寫代碼的目的當(dāng)然是解決現(xiàn)實(shí)世界中的問題呀!?使用代碼解決現(xiàn)實(shí)世界中的問題,這就是程序員要做的事情。
那數(shù)學(xué)家是做什么的呢??數(shù)學(xué)家的任務(wù)是使用數(shù)學(xué)語言來解釋自然規(guī)律?。數(shù)學(xué)幫我們解決了世界上的許多問題,比如物理學(xué)的一個分支量子力學(xué),改變了我們長久以來對原子世界的既有認(rèn)識,這一進(jìn)步離不開數(shù)據(jù)的魔力。數(shù)學(xué)無處不在,從化學(xué)工業(yè)到社會問題,我們會用到統(tǒng)計(jì)學(xué)。日常生活的方方面面,都會看到數(shù)學(xué)影子。數(shù)學(xué)不僅可以用來解釋自然規(guī)律,還能用來解決現(xiàn)實(shí)世界中的問題。因?yàn)楝F(xiàn)實(shí)世界中的所有變量,都可以用數(shù)學(xué)語言來描述。
身為一個程序員我并不擅長數(shù)學(xué),所以我會試圖用自己的?直覺、常識、流程圖或其他類型的圖表來解決工作中遇到的問題?。這種狀態(tài)持續(xù)了好幾年,并逐漸養(yǎng)成了通過創(chuàng)建模型來解決問題的習(xí)慣。建立模型有一個非常明確的目的:對問題及其解決方案要始終保持清晰的思路??梢允褂谜Z言符號、流程圖或其他形式的圖表來創(chuàng)建模型,模型具有明確的假設(shè)、規(guī)則和條件。向創(chuàng)建好的模型輸入數(shù)據(jù),經(jīng)過該模型處理后輸出計(jì)算結(jié)果。模型必須保持清晰和簡潔。

數(shù)學(xué)模型是一種通用的抽象機(jī)制,可以應(yīng)用于特定問題以獲取解決方案。幾個月前,當(dāng)我閱讀了前面提到的有關(guān)數(shù)學(xué)的文章后,我又讀到了埃文·米勒的另一篇名為《Don’t Kill Math》的文章,該文章實(shí)際上是為回應(yīng)布雷特·維克多的《Kill Math》而寫的。
這兩篇文章有點(diǎn)打擊到我。首先,布雷特·維克多一直嘗試在做幾年以來我做的同樣的事情,他在創(chuàng)作方面比我成功。我永遠(yuǎn)想不出可以適用于任何人的可靠模型,而布雷特已經(jīng)做到了。是的,我非常高興,因?yàn)槲艺业搅艘恢痹趯ふ业臇|西,并且準(zhǔn)備跟隨布雷特的腳步。但是我從來也沒有這樣做,這是為什么呢?
我無法提出這樣一個可靠的模型是有一定原因的。我一直認(rèn)為我構(gòu)建的模型缺點(diǎn)什么東西。無論我做了什么,以及我做了多少工作,我始終感覺缺少一些非?;A(chǔ)的元素。每當(dāng)我研究 Schrodinger 方程、Maxwell 方程、牛頓定律、開普勒定律、不確定性原理或 Shulba-Sutras 時,我總是感覺所有這些方程都是完整的,但是我的模型卻并不完整。
這兩篇文章《Kill Math》和《Dont’ Kill Math》都使我意識到了什么是完整性。這是在文章《Dont’ Kill Math》中提到的一個數(shù)學(xué)概念。埃文·米勒在本文中提出的問題以及對問題進(jìn)行簡單易懂的解釋方式,結(jié)束了我對模型的探索。數(shù)學(xué)是解決問題和解釋現(xiàn)象的簡潔明了的方法。這些直白了當(dāng)?shù)奶卣魇菙?shù)學(xué)固有的,就像靈魂是每個生物固有的一樣。與不使用數(shù)學(xué)相比,使用它可以更快更好的解決問題。
這使我想到了一個非?;A(chǔ)的問題:?為什么我會討厭數(shù)學(xué)?應(yīng)該是讀書上學(xué)的時候,數(shù)學(xué)的教學(xué)方式存在問題?。課堂上總是被教導(dǎo)死記硬背數(shù)學(xué)公式,而不是真正的數(shù)學(xué)理念。這是學(xué)校的錯誤,是整個教育系統(tǒng)的錯誤,而不是學(xué)生的問題?;氐阶铋_始討論的“成為一名優(yōu)秀的程序員是否需要數(shù)學(xué)”這一問題,下圖描述的是最開始現(xiàn)實(shí)世界解決問題的方式:

然后,數(shù)學(xué)開始應(yīng)用,下面這張圖描述的是大多數(shù)數(shù)學(xué)家所做的工作:

下圖描述的是所有計(jì)算機(jī)程序員 / 軟件工程師 / 開發(fā)人員所要做的工作:

埃文·米勒提到,你可以在不使用大量數(shù)學(xué)的情況下成為一名頂尖黑客,我認(rèn)同他的說法,并且這與其他作者的觀點(diǎn)一致。他闡述的重點(diǎn)是數(shù)學(xué)在解決現(xiàn)實(shí)世界中的問題上的作用,即數(shù)學(xué)在解決現(xiàn)實(shí)世界中的問題上簡單而又粗暴,而且十分有效。
作為一個程序員,我們的目標(biāo)是解決問題,但是如果借助數(shù)學(xué)模型并將其應(yīng)用到解決方案當(dāng)中去(如下圖所示),那么我們就可以通過一些驚艷的方式來提供更好的解決方案。從而我們的工作生活會變得輕松很多。

4?總結(jié)
你不需要數(shù)學(xué)就可以成為一名頂尖的程序員,因?yàn)樵诠こ躺?,我們不會直接使用大量的?shù)學(xué)理論。如果你想成為程序員,那么就去直接學(xué)習(xí)編程。計(jì)算機(jī)編程與數(shù)學(xué)有很大的不同,作為程序員,你必須更多地專注于如何編寫更好的程序,如何使用特定的范式思考(例如,函數(shù)、面向?qū)ο?、泛型、過程、邏輯、聲明等),在創(chuàng)建軟件的方式上找到更好的方法,你需要了 [設(shè)計(jì)模式,盡管使用 C 語言編程很多年,設(shè)計(jì)模式仍將會給你的編程思考帶來新的認(rèn)識。
所有這些都與數(shù)學(xué)沒有直接聯(lián)系。你需要優(yōu)先學(xué)習(xí)這些編程知識,并且這將會花費(fèi)好幾年的時間才能掌握它們,然后,如果有需要的話,就可以進(jìn)階學(xué)習(xí)數(shù)學(xué)了。
原文鏈接:https://lispmachine.wordpress.com/2014/12/05/how-much-math-you-need-for-programming/
另外的話,作為一名編程學(xué)習(xí)者,如果你想更好的提升你的編程能力,好好學(xué)習(xí)C/C++編程知識,以后努力成為高薪軟件開發(fā)工程師的話!

UP在主頁上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會對你有幫助的~
分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!
編程學(xué)習(xí)書籍:

編程學(xué)習(xí)視頻:
