
你好,我是黃申,目前在 LinkedIn 從事數(shù)據(jù)科學(xué)的工作,主要負(fù)責(zé)全球領(lǐng)英的搜索引擎優(yōu)化,算法和數(shù)據(jù)架構(gòu)的搭建。
2006 年,我博士畢業(yè)于上海交通大學(xué)計算機科學(xué)與工程專業(yè),在接下來十余年時間里,我曾經(jīng)在微軟亞洲研究院、IBM 研究院、eBay 中國研發(fā)中心做機器學(xué)習(xí)方向的研究工作,也負(fù)責(zé)過大潤發(fā)飛牛網(wǎng)和 1 號店這兩家互聯(lián)網(wǎng)公司的核心搜索和推薦項目,還寫過一本書《大數(shù)據(jù)架構(gòu)商業(yè)之路》。
對于數(shù)學(xué)和計算機編程的聯(lián)系,我之前也沒有思考過。直到有一次,在硅谷的一個技術(shù)交流 Meetup 上,我聽到一位嘉賓分享說:“如果你只想當(dāng)一個普通的程序員,那么數(shù)學(xué)對你來說,并不重要。但是如果你想做一個頂級程序員,夢想著改變世界,那么數(shù)學(xué)對你來說就很重要了。”
聽完這句話,我馬上感受到強烈的共鳴,因為就我自己的工作經(jīng)歷而言,越是往高處走,就越能發(fā)現(xiàn)數(shù)學(xué)的重要性。我知道,數(shù)學(xué)對于我們每一個程序員來說,都是最熟悉的陌生人。你從小就開始學(xué)習(xí)數(shù)學(xué),中考、高考、研究生考試還要考數(shù)學(xué),所以那些熟悉的數(shù)學(xué)定理、數(shù)學(xué)公式,陪伴你至少也有 10 年時間了。
但是,自從做了程序員,你可能早就把數(shù)學(xué)拋在了腦后,甚至覺得曾經(jīng)為了應(yīng)試而“硬學(xué)”的數(shù)學(xué)應(yīng)該是徹底沒什么用了,終于可以和他們 say goodbye 了。畢竟作為一個基礎(chǔ)學(xué)科,數(shù)學(xué)肯定是沒操作系統(tǒng)、數(shù)據(jù)結(jié)構(gòu)、計算機網(wǎng)絡(luò)這樣的課程看起來“實用”。
起碼我之前就是這么認(rèn)為的。大學(xué)的時候,我非常喜歡編程,甚至還翹過數(shù)學(xué)課,專門在圖書館看計算機類的圖書。那會兒我覺得,數(shù)學(xué)這東西,完全就是應(yīng)試教育,我更喜歡計算機這樣操作類的課程,不喜歡待在教室里聽數(shù)學(xué)老師講那些枯燥的理論和定理。
再到后來,我讀了碩士,開始接觸機器學(xué)習(xí),猛然間才發(fā)現(xiàn),機器學(xué)習(xí)表面上是“寫程序”,但實際上剝?nèi)ネ獗?,本質(zhì)上就是在研究數(shù)學(xué)。從那會兒開始,我對數(shù)學(xué)的認(rèn)知也才逐步客觀和理性起來。
再到現(xiàn)在,我參加了工作,寫了這么多年代碼,我想說,數(shù)學(xué)學(xué)得好不好,將會直接決定一個程序員有沒有發(fā)展?jié)摿?。因為往大了說,數(shù)學(xué)它其實是一種思維模式,考驗的是一個人歸納、總結(jié)和抽象的能力。把這個能力放到程序員的世界里,其實就是解決問題的能力。
往小了說,不管是數(shù)據(jù)結(jié)構(gòu)與算法還是程序設(shè)計,其實底層很多原理或者思路都是源自于數(shù)學(xué),所以很多大公司,在招人時,也會優(yōu)先考慮數(shù)學(xué)專業(yè)的畢業(yè)生,這些人他們數(shù)學(xué)基礎(chǔ)很好,學(xué)起編程也更容易上手。
所以我覺得,如果編程語言是血肉,數(shù)學(xué)的思想和知識就是靈魂。它可以幫助你選擇合適的數(shù)據(jù)結(jié)構(gòu)和算法、提升系統(tǒng)效率、并且賦予機器智慧。尤其是在大數(shù)據(jù)和智能化的時代,更是如此。
舉個例子,比如我們小學(xué)就學(xué)到的余數(shù),其實在編程的世界里也有很多應(yīng)用。你經(jīng)常用到的分頁功能,根據(jù)記錄的總條數(shù)和每頁展示的條數(shù),最后來計算整體的頁數(shù),這里面就會有余數(shù)的思想。再難一點,奇偶校驗、循環(huán)冗余檢驗、散列函數(shù)、密碼學(xué)等等都有余數(shù)相關(guān)的知識。
遇到這些問題的時候,你能說你不懂余數(shù)嗎?我想你肯定懂,只是很多時候沒有想到可以用余數(shù)的思想來解決相關(guān)問題罷了。那為什么沒有想到呢?我認(rèn)為,本質(zhì)原因還是你沒有數(shù)學(xué)思維,還是你數(shù)學(xué)的基礎(chǔ)不夠好。
所以,在這個專欄里,我想和你重點聊聊數(shù)學(xué)。當(dāng)然,我知道數(shù)學(xué)博大精深,所以在一開始做專欄的時候,我就和極客時間團(tuán)隊一起定義好了專欄的邊界,用一句話來說就是“只做程序員需要學(xué)的數(shù)學(xué)知識”。
首先,我梳理了編程中最常用的數(shù)學(xué)概念,由淺入深剖析它們的本質(zhì),希望能夠幫你徹底掌握這些最基礎(chǔ)、也最核心的數(shù)學(xué)知識。這其中包括那些你曾經(jīng)熟悉的數(shù)學(xué)名詞,比如數(shù)學(xué)歸納法、迭代法、遞歸、排列、組合等等。
其次,我把線性代數(shù)和概率統(tǒng)計中的抽象概念、公式、定理都由內(nèi)而外地講了出來,并分析它們在編程中的應(yīng)用案例,幫助你提升編程的高階能力。對于這些內(nèi)容,我會從基本的概念入手,結(jié)合生活和工作中的實際案例,讓你更輕松地理解概念的含義。
比如,對于樸素貝葉斯方法,我會從基本的隨機現(xiàn)象、隨機變量和概率分布等著手。隨后,我會逐步深入,結(jié)合這些數(shù)學(xué)知識在編程算法中的應(yīng)用進(jìn)行展開。比方說,貝葉斯定理是什么,隨機變量之間的獨立性是什么,這些是如何構(gòu)成樸素貝葉斯方法的,而最終樸素貝葉斯又是如何被運用在機器學(xué)習(xí)的分類算法之中的。
作為程序員,為什么你應(yīng)該學(xué)好數(shù)學(xué)?
這樣的講解路線,既能讓你鞏固基礎(chǔ)的概念和知識,同時也能讓你明白這些基礎(chǔ)性的內(nèi)容,對計算機編程和算法究竟意味著什么。
不過話又說回來,我認(rèn)為數(shù)學(xué)理論和編程實踐的結(jié)合其實是“決裂”的,所以學(xué)習(xí)數(shù)學(xué)的時候,你不能太功利,覺得今天學(xué)完明天就能用得著,我覺得這個學(xué)習(xí)思路可以用在其他課程上,但放在數(shù)學(xué)里絕對不合適。
因為數(shù)學(xué)知識總是比較抽象,特別是概率統(tǒng)計和線性代數(shù)中的概率、數(shù)據(jù)分布、矩陣、向量等概念。它們真的很不好理解,也需要我們花時間琢磨,但是對于高級一點的程序設(shè)計而言,特別是和數(shù)據(jù)相關(guān)的算法,這些概念就非常重要了,這可都是先人總結(jié)出來的經(jīng)驗。
如果你能夠?qū)⑦@些基本概念和核心理論都搞懂、搞透,那么面對系統(tǒng)框架設(shè)計、性能優(yōu)化、準(zhǔn)確率提升這些難題的時候,你就能從更高的角度出發(fā)去解決問題,而不只是站在一個“熟練工”的視角,去增刪改查。
最后,我希望數(shù)學(xué)能夠成為你的一種基礎(chǔ)能力,希望這個專欄能幫你用數(shù)學(xué)思維來分析問題和解決問題。數(shù)學(xué)思想是啟發(fā)我們思維的中樞,如果你對數(shù)學(xué)有更好的理解,遇到問題的時候就能追本溯源,快、準(zhǔn)、穩(wěn)地找到解決方案。
伽利略曾經(jīng)說過,“宇宙這本書是用數(shù)學(xué)語言寫成的”,數(shù)學(xué)是人類科學(xué)進(jìn)步的重要基礎(chǔ),所以,你我都要懷著敬畏的心態(tài)去學(xué)習(xí)、思考數(shù)學(xué)。同樣,我還要求我自己的孩子一定要學(xué)好數(shù)學(xué),因為我確信,這對于他未來的發(fā)展來說,至關(guān)重要。
編程的世界遠(yuǎn)不止條件和循環(huán)語句,程序員的人生應(yīng)當(dāng)是創(chuàng)造的舞臺。我希望,通過這個專欄的學(xué)習(xí),能夠讓你切實感受到數(shù)學(xué)這個古老學(xué)科的活力和魅力。
好了,說了這么多,相信你已經(jīng)下定決心和我一起攻克數(shù)學(xué)。重新開始就要告別過去,你可以在留言區(qū)做個“數(shù)學(xué)學(xué)習(xí)復(fù)盤”,在之前的學(xué)習(xí)過程中,你的學(xué)習(xí)狀況是怎樣的?你遇到的最大困難是什么?現(xiàn)在,你最希望學(xué)到的是什么?
