不需要數學就能成為一名頂尖的程式員,但是如果借助數學工具,你會發現另一個世界,
作者 | 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++編程知識,以后努力成為高薪軟體開發工程師的話!
C語言C++編程學習交流圈子,QQ群464501141【點擊進入】微信公眾號:C語言編程學習基地
編程學習書籍:
編程學習視頻:
分享(原始碼、專案實戰視頻、專案筆記,基礎入門教程)
歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/262417.html
標籤:其他
