不需要數學就能成為一名頂尖的程式設計師,但是如果藉助數學工具,你會發現另一個世界。
作者 | Arnuld
譯者 | 王坤祥
策劃 | 萬佳
1 我的數學水平每當我想深入學習一下演算法相關的內容時,其中涉及的一些複雜數學知識有時候就會成為“攔路虎”。
我承認自己的數學確實沒學好,但也不至於很糟糕。不過,這種“不上不下”的數學水平,完全無法應對業界 Big Tech 公司(亞馬遜、蘋果、谷歌、Facebook 和微軟)的面試,尤其是面試被問到演算法的一些問題,比如某個演算法的時間和空間複雜度,或者具體的排序和搜尋演算法之間的比較等。
因此,我要學習所有這些知識點。在搜尋和學習過程中,我搜集了幾篇有關程式設計所需的數學知識的文章。
在程式設計方面,最為知名的數學支持者是史蒂夫·耶格(Steve Yegge)。關於程式設計所需的數學,我列舉了以下內容供你參考:
數學筆記—— 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
成為一名駭客需要多少數學—— 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++程式設計知識,以後努力成為高薪軟體開發工程師的話!
程式設計學習書籍:
程式設計學習影片:
分享(原始碼、專案實戰影片、專案筆記,基礎入門教程)