在開篇,我詳細(xì)講了程序員為什么需要學(xué)數(shù)學(xué)。那么,怎樣的學(xué)習(xí)方法才是行之有效的呢?我想你現(xiàn)在心里還沒有一個固定的答案,而我不想一味地去講我自己的一家之言,畢竟沒有什么學(xué)習(xí)方法是最好的。
你能做的是要多看,去找適合自己的。而我能做的,就是盡量給你更多的參考,讓你可以自己來選擇。所以,我邀請了幾位朋友,讓他們來談一談,自己學(xué)習(xí)數(shù)學(xué)的一些心得體會,希望對你有所啟發(fā)。
程序員是否需要學(xué)好數(shù)學(xué)?原本學(xué)數(shù)學(xué)分析、概率論、線性代數(shù)的時候,我也沒想到數(shù)學(xué)和寫程序有啥關(guān)系,但是隨著研究的開源軟件越來越多,我發(fā)現(xiàn)很多技術(shù)深入下去,本質(zhì)就是數(shù)學(xué)。
程序員應(yīng)該怎么學(xué)習(xí)數(shù)學(xué)呢?我不建議你將大學(xué)的數(shù)學(xué)書拿出來啃一遍,一來耗費大量時間,二來和實際應(yīng)用結(jié)合不起來,往往該看的忽略了,不該看的費了半天勁用不上,過一陣又忘了。
我們了解一個新技術(shù)有三個階段,第一階段是,怎么使用;第二階段是,如何實現(xiàn),原理是什么;第三階段是,為什么這樣實現(xiàn)。學(xué)數(shù)學(xué)和學(xué)一門新技術(shù)一樣,也有這樣三個階段,先用起來,了解原理,然后了解為什么。
用一句話來說,我們不能為了數(shù)學(xué)而學(xué)數(shù)學(xué),學(xué)數(shù)學(xué)要和具體的應(yīng)用結(jié)合在一起。
隨著過去幾年深度學(xué)習(xí)成為程序員界的顯學(xué),不少程序員開始回頭復(fù)習(xí)微積分、概率論和線性代數(shù)這樣的基礎(chǔ)數(shù)學(xué)課,乃至開始學(xué)習(xí)最優(yōu)化、博弈論這樣的應(yīng)用數(shù)學(xué)課。我自己則是因為從 2010 年一頭扎入了計算廣告的大坑之后,重新開始學(xué)習(xí)數(shù)學(xué)。
可以說,這次重新學(xué)習(xí)數(shù)學(xué),為我自己推開了程序世界中另一扇門,使得我在埋頭具體寫代碼之外,有機會重新從另一個角度,去認(rèn)識和理解“程序”和“問題的解決方案”這兩件事情。
我為什么要學(xué)點數(shù)學(xué)?
投入時間學(xué)習(xí)數(shù)學(xué),于我來說主要是兩個原因,一來,數(shù)學(xué)在工作中用得上;二來,學(xué)點數(shù)學(xué)很多時候是個有趣的事。
譬如說,過去幾年火起來的深度學(xué)習(xí),以及之前沒那么火,但是實際上早早就在搜索、廣告這些領(lǐng)域,應(yīng)用的機器學(xué)習(xí)和推薦算法。這里面其實就是結(jié)合了微積分、線性代數(shù)、概率論之后的最優(yōu)化問題。
事實上,大部分應(yīng)用領(lǐng)域的核心解決方案,都是把應(yīng)用領(lǐng)域的問題,形式化為一個個數(shù)學(xué)問題。在找到數(shù)學(xué)問題的“解法”之后,用寫程序的方式翻譯成實際應(yīng)用的“算法”。而能夠應(yīng)用“數(shù)學(xué)”的方式來解決問題,是從一個只能套用現(xiàn)成方案的“碼農(nóng)”,向能夠?qū)⑿聠栴}形式化、并找出創(chuàng)新解決方案的“研發(fā)工程師”邁出的第一步。
很多問題當(dāng)你知道如何用數(shù)學(xué)來解決的時候,常常會有醍醐灌頂?shù)母杏X。譬如當(dāng)我第一次搞明白,廣告中的競價問題,居然能夠變成一個博弈論中“尋找上策均衡”的問題,并且能夠通過簡簡單單的公式表示出來的時候,我是很有滿足感的。
此外,一旦熟悉了機器學(xué)習(xí)中用到的數(shù)學(xué)知識,很多想要解決的系統(tǒng)問題,都能通過定義更好的數(shù)學(xué)優(yōu)化目標(biāo),變成一個能夠找到最優(yōu)解的程序算法,最后通過寫個程序,翻譯成數(shù)學(xué)問題來解決,這個過程帶給我巨大的身心愉悅。
我是如何學(xué)數(shù)學(xué)的?
數(shù)學(xué)整個領(lǐng)域很大,如果想要學(xué)點什么,我建議從工作相關(guān)的領(lǐng)域開始,先廣度,再深度。
從工作相關(guān)的領(lǐng)域開始,是讓自己一是能有實際用得上學(xué)到的知識的機會,二是日常工作中容易耳濡目染,相當(dāng)于常常在復(fù)習(xí)。而先有廣度,是讓自己在心中有一個問題到解決方法的“地圖”,遇到具體的問題能夠?qū)Φ蒙?,容易獲得正反饋;然后再有深度,具體去對一個特定的主題學(xué)習(xí)應(yīng)用。
當(dāng)開始深入學(xué)一個特定問題的時候,最好的方式是,追一門在線課程,譬如 Coursera、TEDx,或者在極客時間上找一門課程來學(xué)習(xí)。
這是因為,在線課程有明確的節(jié)奏,通常還會提供作業(yè)和測驗。通過作業(yè)和測驗,讓自己對自己的學(xué)習(xí)有一個聯(lián)系和反饋的過程。即使實踐中沒有足夠的應(yīng)用,過一段時間有些知識沒有那么熟悉了,但是也容易建立自己很快可以“撿”回來的信心,降低“復(fù)習(xí)”的啟動成本。跟隨在線課程的節(jié)奏,可以有效避免“三天打漁兩天曬網(wǎng)”的惡習(xí),讓學(xué)習(xí)有始有終。
最后,給你介紹一個有程序員特色的學(xué)習(xí)方法,針對學(xué)習(xí)的內(nèi)容寫一點程序。把正在學(xué)習(xí)的問題的解法,寫一個算法實現(xiàn)出來。這是一個非常有效的練習(xí)方式。譬如學(xué)習(xí)線性代數(shù),理解仿射,反復(fù)讀書的效率對我來說,就不如找來 Coding The Matrix,通過寫程序,讓學(xué)習(xí)、理解變得更深入。
在數(shù)學(xué)的學(xué)習(xí)中,首要的問題是明確需求。作為非數(shù)學(xué)專業(yè)出身的“外行”,我們使用數(shù)學(xué)的目的不是頂天,而是立地;不是上下求索艱深的理論問題,而是將生活中的具體問題抽象化,進而加以解決。
因此,對于我們這些票友來說,學(xué)習(xí)數(shù)學(xué)的基礎(chǔ)在于經(jīng)驗而非哲學(xué),比較實際的思路是秉持功利主義的原則,用多少學(xué)多少。掌握基本的線性代數(shù)與矩陣論、概率論與數(shù)理統(tǒng)計知識足以應(yīng)付日常的使用,盲目地好高騖遠(yuǎn)通常有害無益。理論化和公理化這些比較深邃的嘗試固然讓人著迷,但它們可能并沒有肉眼可見的實用性,對于絕大部分計算機從業(yè)者恐怕過于陽春白雪。
其次,在學(xué)習(xí)時還要理解數(shù)學(xué)的本質(zhì)。數(shù)學(xué)是工具而非問題,是手段而非目的。探索世界奧秘的學(xué)科是“格物窮理”的物理學(xué),相形之下,數(shù)學(xué)更像是個任人打扮的小姑娘,它存在的意義就是通過合理的設(shè)計簡化物理學(xué)的研究。
正因如此,在數(shù)學(xué)中存在著各種各樣在現(xiàn)實中不可能出現(xiàn)的理想化模型(比如無窮小和極限的誕生),也存在著對同一個物理過程不同的建模方式(比如矩陣力學(xué)和波動力學(xué))。充分理解數(shù)學(xué)的人造特質(zhì),可以在學(xué)習(xí)中少走很多無謂的彎路。
理解數(shù)學(xué)的工具屬性就會自然而然地引出了數(shù)學(xué)學(xué)習(xí)中的另一個關(guān)鍵點,那就是工具設(shè)計的出發(fā)點,也就是所謂的數(shù)學(xué)思想與數(shù)學(xué)邏輯。
任何一個工具都不是平白無故地設(shè)計出來的,它必然要解決某個特定的問題,比如線性代數(shù)與矩陣論是對具體對象的抽象表示與運算,比如概率論和數(shù)理統(tǒng)計是對不確定性及其定型定量表示的建模。因此,在掌握每一種數(shù)學(xué)工具的微觀技巧之前,理解它們的宏觀目標(biāo)是更加重要的。只有掌握了工具誕生的背景與目的,才有可能有效地使用它們。
在這里還要多說一句,數(shù)學(xué)絕不僅僅是算術(shù),把主要精力放在計算上未免因小失大。在經(jīng)典科幻《銀河系漫游指南》中,超級計算機告訴人們,世界的終極答案是“42”——這更像是對數(shù)字主義者善意嘲諷的一個梗。但對算術(shù)的過度強調(diào)并不鮮見,在相當(dāng)數(shù)量的現(xiàn)行數(shù)學(xué)教材中,講解線性代數(shù)時開篇便給出行列式的計算方法,這種編排著實讓人費解。
具體到數(shù)學(xué)每個子學(xué)科的學(xué)習(xí)方法上,相關(guān)的經(jīng)驗教訓(xùn)已然汗牛充棟,很多內(nèi)容都無需在此贅言。但在我看來,學(xué)習(xí)時值得突出強調(diào)的一點是舉一反三的能力。同一種工具及其背后的思想可以出現(xiàn)在不同的場景下,解決不同的問題,但是一旦深入到本質(zhì)層面,就會發(fā)現(xiàn)它們實際上是相通的。如何透過現(xiàn)象看本質(zhì),將不同場景融會貫通,才是值得鍛煉的高級能力。
同一個工具存在不同應(yīng)用的例子不勝枚舉:
凡此種種都說明,即使是不同的學(xué)科,使用的數(shù)學(xué)基礎(chǔ)也有著千絲萬縷的聯(lián)系,將基本的數(shù)學(xué)概念和充分的想象力結(jié)合起來,觸類旁通就變得輕而易舉。
總結(jié)起來,我對數(shù)學(xué)學(xué)習(xí)的幾點拙見是:把握數(shù)學(xué)的工具屬性,學(xué)習(xí)具體方法時先溯因再求果,勤于思考解決相同問題的不同方法,與解決不同問題的相同方法之間的聯(lián)系與區(qū)別。希望這幾條建議能夠在數(shù)學(xué)的學(xué)習(xí)中助你一臂之力。
好了,三位老師都分享完了自己的學(xué)習(xí)方法。其實他們有一個共同的觀點,那就是數(shù)學(xué)要是“實用”的,這和我的想法如出一轍。
首先我們來看最常用的數(shù)據(jù)結(jié)構(gòu)和編程語句,我想你對它們應(yīng)該非常熟悉。在我眼里,這些基礎(chǔ)的內(nèi)容,同樣富含了數(shù)學(xué)思維。例如,數(shù)組和鏈表就體現(xiàn)了迭代和遞歸的思想,判斷語句就是使用了邏輯(布爾)代數(shù)。
對于架構(gòu)在這些數(shù)據(jù)結(jié)構(gòu)和編程語句之上的算法(為了將這些算法和機器學(xué)習(xí)的算法區(qū)分,我稱其為通用算法),除了迭代和遞歸,也體現(xiàn)了排列、組合和動態(tài)規(guī)劃等思想。
對于機器學(xué)習(xí)的算法而言,我們更需要理解概率統(tǒng)計和線性代數(shù)的核心思想,包括什么是概率、貝葉斯定理、數(shù)據(jù)的統(tǒng)計分布、向量、矩陣、線性方程等等。
整個專欄我基本上都是從數(shù)學(xué)的角度出發(fā),逐步推進到這些知識在計算機中的應(yīng)用。不過在繪制這張應(yīng)用地圖的時候,我特意反其道而行之,從計算機編程的角度出發(fā),為你展示程序員應(yīng)該如何看待編程中的數(shù)學(xué)知識。
我覺得在開始學(xué)習(xí)之前,這個地圖會給你一個大體的認(rèn)識,告訴你計算機領(lǐng)域常用的數(shù)學(xué)思想有哪些。這時,你也許會產(chǎn)生一些疑惑,同時你可以帶著自己的思考和問題去逐篇學(xué)習(xí)。等你學(xué)完整個專欄之后,再回頭來看看這個地圖,應(yīng)該會有更深的感觸。我希望這種雙向打通,能夠進一步加強你的學(xué)習(xí)體驗。
-
程序員
+關(guān)注
關(guān)注
4文章
954瀏覽量
30420
發(fā)布評論請先 登錄
電機學(xué)19
學(xué)硬件好還是學(xué)軟件好?
阿里云升級通義靈碼AI程序員,全面上線
TMS320C55x DSP CPU程序員參考補充

UCD3138A64/UCD3138128程序員手冊

評論