作為程序員,為什麼你應該學好數學?

作為程序員,為什麼你應該學好數學?

你好,我是黃申,目前在 LinkedIn 從事數據科學的工作,主要負責全球領英的搜索引擎優化,算法和數據架構的搭建。

2006 年,我博士畢業於上海交通大學計算機科學與工程專業,在接下來十餘年時間裡,我曾經在微軟亞洲研究院、IBM 研究院、eBay 中國研發中心做機器學習方向的研究工作,也負責過大潤發飛牛網和 1 號店這兩家互聯網公司的核心搜索和推薦項目,還寫過一本書《大數據架構商業之路》。

對於數學和計算機編程的聯繫,我之前也沒有思考過。直到有一次,在硅谷的一個技術交流 Meetup 上,我聽到一位嘉賓分享說:“如果你只想當一個普通的程序員,那麼數學對你來說,並不重要。但是如果你想做一個頂級程序員,夢想著改變世界,那麼數學對你來說就很重要了。”

聽完這句話,我馬上感受到強烈的共鳴,因為就我自己的工作經歷而言,越是往高處走,就越能發現數學的重要性。我知道,數學對於我們每一個程序員來說,都是最熟悉的陌生人。你從小就開始學習數學,中考、高考、研究生考試還要考數學,所以那些熟悉的數學定理、數學公式,陪伴你至少也有 10 年時間了。

但是,自從做了程序員,你可能早就把數學拋在了腦後,甚至覺得曾經為了應試而“硬學”的數學應該是徹底沒什麼用了,終於可以和他們 say goodbye 了。畢竟作為一個基礎學科,數學肯定是沒操作系統、數據結構、計算機網絡這樣的課程看起來“實用”。

起碼我之前就是這麼認為的。大學的時候,我非常喜歡編程,甚至還翹過數學課,專門在圖書館看計算機類的圖書。那會兒我覺得,數學這東西,完全就是應試教育,我更喜歡計算機這樣操作類的課程,不喜歡待在教室裡聽數學老師講那些枯燥的理論和定理。

再到後來,我讀了碩士,開始接觸機器學習,猛然間才發現,機器學習表面上是“寫程序”,但實際上剝去外表,本質上就是在研究數學。從那會兒開始,我對數學的認知也才逐步客觀和理性起來。

再到現在,我參加了工作,寫了這麼多年代碼,我想說,數學學得好不好,將會直接決定一個程序員有沒有發展潛力。因為往大了說,數學它其實是一種思維模式,考驗的是一個人歸納、總結和抽象的能力。把這個能力放到程序員的世界裡,其實就是解決問題的能力。

往小了說,不管是數據結構與算法還是程序設計,其實底層很多原理或者思路都是源自於數學,所以很多大公司,在招人時,也會優先考慮數學專業的畢業生,這些人他們數學基礎很好,學起編程也更容易上手。

所以我覺得,如果編程語言是血肉,數學的思想和知識就是靈魂。它可以幫助你選擇合適的數據結構和算法、提升系統效率、並且賦予機器智慧。尤其是在大數據和智能化的時代,更是如此。

舉個例子,比如我們小學就學到的餘數,其實在編程的世界裡也有很多應用。你經常用到的分頁功能,根據記錄的總條數和每頁展示的條數,最後來計算整體的頁數,這裡面就會有餘數的思想。再難一點,奇偶校驗、循環冗餘檢驗、散列函數、密碼學等等都有餘數相關的知識。

遇到這些問題的時候,你能說你不懂餘數嗎?我想你肯定懂,只是很多時候沒有想到可以用餘數的思想來解決相關問題罷了。那為什麼沒有想到呢?我認為,本質原因還是你沒有數學思維,還是你數學的基礎不夠好。

首先,我梳理了編程中最常用的數學概念,由淺入深剖析它們的本質,希望能夠幫你徹底掌握這些最基礎、也最核心的數學知識。這其中包括那些你曾經熟悉的數學名詞,比如數學歸納法、迭代法、遞歸、排列、組合等等。

其次,我把線性代數和概率統計中的抽象概念、公式、定理都由內而外地講了出來,並分析它們在編程中的應用案例,幫助你提升編程的高階能力。對於這些內容,我會從基本的概念入手,結合生活和工作中的實際案例,讓你更輕鬆地理解概念的含義。

比如,對於樸素貝葉斯方法,我會從基本的隨機現象、隨機變量和概率分佈等著手。隨後,我會逐步深入,結合這些數學知識在編程算法中的應用進行展開。比方說,貝葉斯定理是什麼,隨機變量之間的獨立性是什麼,這些是如何構成樸素貝葉斯方法的,而最終樸素貝葉斯又是如何被運用在機器學習的分類算法之中的。

作為程序員,為什麼你應該學好數學?

這樣的講解路線,既能讓你鞏固基礎的概念和知識,同時也能讓你明白這些基礎性的內容,對計算機編程和算法究竟意味著什麼。

不過話又說回來,我認為數學理論和編程實踐的結合其實是“決裂”的,所以學習數學的時候,你不能太功利,覺得今天學完明天就能用得著,我覺得這個學習思路可以用在其他課程上,但放在數學裡絕對不合適。

因為數學知識總是比較抽象,特別是概率統計和線性代數中的概率、數據分佈、矩陣、向量等概念。它們真的很不好理解,也需要我們花時間琢磨,但是對於高級一點的程序設計而言,特別是和數據相關的算法,這些概念就非常重要了,這可都是先人總結出來的經驗。

如果你能夠將這些基本概念和核心理論都搞懂、搞透,那麼面對系統框架設計、性能優化、準確率提升這些難題的時候,你就能從更高的角度出發去解決問題,而不只是站在一個“熟練工”的視角,去增刪改查。

最後,我希望數學能夠成為你的一種基礎能力,希望這個專欄能幫你用數學思維來分析問題和解決問題。數學思想是啟發我們思維的中樞,如果你對數學有更好的理解,遇到問題的時候就能追本溯源,快、準、穩地找到解決方案。

伽利略曾經說過,“宇宙這本書是用數學語言寫成的”,數學是人類科學進步的重要基礎,所以,你我都要懷著敬畏的心態去學習、思考數學。同樣,我還要求我自己的孩子一定要學好數學,因為我確信,這對於他未來的發展來說,至關重要。

編程的世界遠不止條件和循環語句,程序員的人生應當是創造的舞臺。我希望,通過這個專欄的學習,能夠讓你切實感受到數學這個古老學科的活力和魅力。

好了,說了這麼多,相信你已經下定決心和我一起攻克數學。


分享到:


相關文章: