無需數學,你就能成爲一名頂尖程序員!這樣的話你信嗎?

不須要數學就能成爲一名頂尖的程序員,可是若是藉助數學工具,你會發現另外一個世界。html

做者 | Arnuld程序員

譯者 | 王坤祥面試

策劃 | 萬佳算法

1 個人數學水平

每當我想深刻學習一下算法相關的內容時,其中涉及的一些複雜數學知識有時候就會成爲「攔路虎」。編程

我認可本身的數學確實沒學好,但也不至於很糟糕。不過,這種「不上不下」的數學水平,徹底沒法應對業界 Big Tech 公司(亞馬遜、蘋果、谷歌、Facebook 和微軟)的面試,尤爲是面試被問到算法的一些問題,好比某個算法的時間和空間複雜度,或者具體的排序和搜索算法之間的比較等。設計模式

所以,我要學習全部這些知識點。在搜索和學習過程當中,我搜集了幾篇有關編程所需的數學知識的文章。微信

在編程方面,最爲知名的數學支持者是史蒂夫·耶格(Steve Yegge)。關於編程所需的數學,我列舉了如下內容供你參考:編程語言

數學筆記—— http://www.eskimo.com/~scs/cclass/mathintro/top.htmlwordpress

《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

成爲一名黑客須要多少數學—— http://www.catb.org/~esr/faqs/hacker-howto.html#mathematics

談數學—— http://www.paulgraham.com/college.html

《數學黑客》—— http://www.evanmiller.org/mathematical-hacker.html

《關於 C 語言實現的斐波那契數示例》—— http://blog.noblemail.ca/2013/01/on-calculating-fibonacci-numbers-in-c.html

2 編程不是數學

若是你還沒讀過以上內容,那麼你可能會錯過我寫這篇博客所要表達的意圖。按照史蒂夫·薩米特(Steve Summit)、埃裏克·雷蒙德(Eric Raymond)以及保羅·格雷厄姆(Paul Graham)的觀點,你無需過多地關注數學就能夠成爲一名出色的程序員或者黑客(此處黑客泛指維基百科中對黑客的定義以及埃裏克·雷蒙德(Eric Raymond)對黑客的定義)。

史蒂芬·諾布爾(Steven Noble)認爲,程序員應該懂一些數學;埃文·米勒(Evan Miller)彷佛在某種程度上也贊成這一觀點。我本人只是出於熱愛而開始踏上編程之路的。

從 2009 年以來,我主要使用 C 語言進行編程,有時候還會用 C++,而且大部分時候是在 Linux 和 UNIX 環境下工做。我對編程充滿熱情,有時候須要使用多種不一樣的語言進行編程,所以我必須學習用不一樣的思惟方式工做。編寫代碼不是很難,可是,使用特定的編程語言並按照必定的範式尋找思路且創建模型,纔是最難最耗時的工做。

我在編程道路上的經歷告訴我, 編程不是數學 ,並且永遠不是。若是你想學習計算機編程,那麼去學計算機編程就行了,不須要你去翻閱數學書籍,而是要常常瀏覽一些編程論壇(好比 comp.lang.c 和 comp.lang.lisp)。關於瀏覽論壇,你可使用一個新聞閱讀器,好比 Pan,訂閱來自 GNU 的全部軟件信息,並使用 Linux 發行版來處理平常工做,我趨向於使用輕量級版本。若是你想學習計算機編程而學習了大量的數學知識,那麼頗有可能會迷失在複雜的數學理論當中,並朝着錯誤的方向前進,最終也不會學到太多的編程知識。

3 程序員的目的:用代碼解決現實問題

做爲一名程序員,咱們的任務是編寫代碼,那咱們編寫代碼的最終目的是什麼呢?編寫代碼的目的固然是解決現實世界中的問題呀! 使用代碼解決現實世界中的問題,這就是程序員要作的事情。

那數學家是作什麼的呢? 數學家的任務是使用數學語言來解釋天然規律 。數學幫咱們解決了世界上的許多問題,好比物理學的一個分支量子力學,改變了咱們長久以來對原子世界的既有認識,這一進步離不開數據的魔力。數學無處不在,從化學工業到社會問題,咱們會用到統計學。平常生活的方方面面,都會看到數學影子。數學不只能夠用來解釋天然規律,還能用來解決現實世界中的問題。由於現實世界中的全部變量,均可以用數學語言來描述。

身爲一個程序員我並不擅長數學,因此我會試圖用本身的 直覺、常識、流程圖或其餘類型的圖表來解決工做中遇到的問題 。這種狀態持續了好幾年,並逐漸養成了經過建立模型來解決問題的習慣。創建模型有一個很是明確的目的:對問題及其解決方案要始終保持清晰的思路。可使用語言符號、流程圖或其餘形式的圖表來建立模型,模型具備明確的假設、規則和條件。向建立好的模型輸入數據,通過該模型處理後輸出計算結果。模型必須保持清晰和簡潔。

數學模型是一種通用的抽象機制,能夠應用於特定問題以獲取解決方案。幾個月前,當我閱讀了前面提到的有關數學的文章後,我又讀到了埃文·米勒的另外一篇名爲《Don’t Kill Math》的文章,該文章其實是爲迴應佈雷特·維克多的《Kill Math》而寫的。

這兩篇文章有點打擊到我。首先,佈雷特·維克多一直嘗試在作幾年以來我作的一樣的事情,他在創做方面比我成功。我永遠想不出能夠適用於任何人的可靠模型,而佈雷特已經作到了。是的,我很是高興,由於我找到了一直在尋找的東西,而且準備跟隨佈雷特的腳步。可是我歷來也沒有這樣作,這是爲何呢?

我沒法提出這樣一個可靠的模型是有必定緣由的。我一直認爲我構建的模型缺點什麼東西。不管我作了什麼,以及我作了多少工做,我始終感受缺乏一些很是基礎的元素。每當我研究 Schrodinger 方程、Maxwell 方程、牛頓定律、開普勒定律、不肯定性原理或 Shulba-Sutras 時,我老是感受全部這些方程都是完整的,可是個人模型卻並不完整。

這兩篇文章《Kill Math》和《Dont’ Kill Math》都使我意識到了什麼是完整性。這是在文章《Dont’ Kill Math》中提到的一個數學概念。埃文·米勒在本文中提出的問題以及對問題進行簡單易懂的解釋方式,結束了我對模型的探索。數學是解決問題和解釋現象的簡潔明瞭的方法。這些直白了當的特徵是數學固有的,就像靈魂是每一個生物固有的同樣。與不使用數學相比,使用它能夠更快更好的解決問題。

這使我想到了一個很是基礎的問題: 爲何我會討厭數學?應該是讀書上學的時候,數學的教學方式存在問題 。課堂上老是被教導死記硬背數學公式,而不是真正的數學理念。這是學校的錯誤,是整個教育系統的錯誤,而不是學生的問題。回到最開始討論的「成爲一名優秀的程序員是否須要數學」這一問題,下圖描述的是最開始現實世界解決問題的方式:

而後,數學開始應用,下面這張圖描述的是大多數數學家所作的工做:

下圖描述的是全部計算機程序員 / 軟件工程師 / 開發人員所要作的工做:

埃文·米勒提到,你能夠在不使用大量數學的狀況下成爲一名頂尖黑客,我認同他的說法,而且這與其餘做者的觀點一致。他闡述的重點是數學在解決現實世界中的問題上的做用,即數學在解決現實世界中的問題上簡單而又粗暴,並且十分有效。

做爲一個程序員,咱們的目標是解決問題,可是若是藉助數學模型並將其應用到解決方案當中去(以下圖所示),那麼咱們就能夠經過一些驚豔的方式來提供更好的解決方案。從而咱們的工做生活會變得輕鬆不少。

4 總結

你不須要數學就能夠成爲一名頂尖的程序員,由於在工程上,咱們不會直接使用大量的數學理論。若是你想成爲程序員,那麼就去直接學習編程。計算機編程與數學有很大的不一樣,做爲程序員,你必須更多地專一於如何編寫更好的程序,如何使用特定的範式思考(例如,函數、面向對象、泛型、過程、邏輯、聲明等),在建立軟件的方式上找到更好的方法,你須要了 [設計模式,儘管使用 C 語言編程不少年,設計模式仍將會給你的編程思考帶來新的認識。

全部這些都與數學沒有直接聯繫。你須要優先學習這些編程知識,而且這將會花費好幾年的時間才能掌握它們,而後,若是有須要的話,就能夠進階學習數學了。

原文連接:https://lispmachine.wordpress.com/2014/12/05/how-much-math-you-need-for-programming/

另外的話,做爲一名編程學習者,若是你想更好的提高你的編程能力,好好學習C/C++編程知識,之後努力成爲高薪軟件開發工程師的話!

C語言C++編程學習交流圈子,QQ羣464501141點擊進入】微信公衆號:C語言編程學習基地

編程學習書籍:

編程學習視頻:

分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)

歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比本身琢磨更快哦!

相關文章
相關標籤/搜索