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