作者 | 黃申
“程序員不需要學(xué)數(shù)學(xué)诉植,因?yàn)楣ぷ髦懈居貌坏较楣S心枪Ψ颍€不如認(rèn)真把設(shè)計(jì)模式晾腔、計(jì)算機(jī)網(wǎng)絡(luò)舌稀、操作系統(tǒng)等硬知識(shí)學(xué)好∽评蓿” 這是很多人的觀點(diǎn)壁查,是的,作為程序員剔应,你不需要任何數(shù)學(xué)知識(shí)睡腿,也能寫代碼。
但是峻贮,編程的世界不止條件和循環(huán)語(yǔ)句席怪,程序員的人生應(yīng)該是創(chuàng)造的舞臺(tái),只要想在這個(gè)領(lǐng)域持續(xù)深耕纤控,學(xué)好數(shù)學(xué)就是充分必要條件挂捻,會(huì)決定一個(gè)程序員未來(lái)的發(fā)展?jié)摿Α?/p>
往大了說(shuō),數(shù)學(xué)是一種思維模式船万,考驗(yàn)的是一個(gè)人歸納刻撒、總結(jié)和抽象的能力,放到程序員的世界耿导,就是解決問(wèn)題的能力声怔。往小了說(shuō),不管是數(shù)據(jù)結(jié)構(gòu)與算法舱呻,還是程序設(shè)計(jì)醋火,其底層原理和思路大都源自數(shù)學(xué)。
所以狮荔,很多大公司在招人時(shí)胎撇,都會(huì)優(yōu)先考慮數(shù)學(xué)專業(yè)的畢業(yè)生,因?yàn)閿?shù)學(xué)基礎(chǔ)好殖氏,編程會(huì)更容易上手晚树。在大數(shù)據(jù)和智能化的時(shí)代,學(xué)好數(shù)學(xué)更是門檻本身雅采。
學(xué)習(xí)數(shù)學(xué)的正確姿勢(shì)爵憎,聽(tīng)聽(tīng)他們?cè)趺凑f(shuō)慨亲?
劉超 | 《趣談網(wǎng)絡(luò)協(xié)議》作者:“學(xué)數(shù)學(xué)就像學(xué)一門新技術(shù)”
程序員是否需要學(xué)好數(shù)學(xué)?原本學(xué)數(shù)學(xué)分析宝鼓、概率論刑棵、線性代數(shù)的時(shí)候,我也沒(méi)想到數(shù)學(xué)和寫程序有啥關(guān)系愚铡,但是隨著研究的開(kāi)源軟件越來(lái)越多蛉签,我發(fā)現(xiàn)很多技術(shù)深入下去,本質(zhì)就是數(shù)學(xué)沥寥。
程序員應(yīng)該怎么學(xué)習(xí)數(shù)學(xué)呢碍舍?我不建議你將大學(xué)的數(shù)學(xué)書(shū)拿出來(lái)啃一遍,一來(lái)耗費(fèi)大量時(shí)間邑雅,二來(lái)和實(shí)際應(yīng)用結(jié)合不起來(lái)片橡,往往該看的忽略了,不該看的費(fèi)了半天勁用不上淮野,過(guò)一陣又忘了捧书。
我們了解一個(gè)新技術(shù)有三個(gè)階段,第一階段是骤星,怎么使用经瓷;第二階段是,如何實(shí)現(xiàn)洞难,原理是什么了嚎;第三階段是,為什么這樣實(shí)現(xiàn)廊营。學(xué)數(shù)學(xué)和學(xué)一門新技術(shù)一樣,也有這樣三個(gè)階段萝勤,先用起來(lái)露筒,了解原理,然后了解為什么敌卓。
用一句話來(lái)說(shuō)慎式,我們不能為了數(shù)學(xué)而學(xué)數(shù)學(xué),學(xué)數(shù)學(xué)要和具體的應(yīng)用結(jié)合在一起趟径。
徐文浩 | bothub.ai創(chuàng)始人:“先廣度瘪吏,再深度”
隨著過(guò)去幾年深度學(xué)習(xí)成為程序員界的顯學(xué),不少程序員開(kāi)始回頭復(fù)習(xí)微積分蜗巧、概率論和線性代數(shù)這樣的基礎(chǔ)數(shù)學(xué)課掌眠,乃至開(kāi)始學(xué)習(xí)最優(yōu)化、博弈論這樣的應(yīng)用數(shù)學(xué)課幕屹。我自己則是因?yàn)閺?010年一頭扎入了計(jì)算廣告的大坑之后蓝丙,重新開(kāi)始學(xué)習(xí)數(shù)學(xué)级遭。
可以說(shuō),這次重新學(xué)習(xí)數(shù)學(xué)渺尘,為我自己推開(kāi)了程序世界中另一扇門挫鸽,使得我在埋頭寫代碼之外,有機(jī)會(huì)重新從另一個(gè)角度鸥跟,去認(rèn)識(shí)和理解“程序”和“問(wèn)題的解決方案”這兩件事情丢郊。
- 我為什么要學(xué)點(diǎn)數(shù)學(xué)?
投入時(shí)間學(xué)習(xí)數(shù)學(xué),于我來(lái)說(shuō)主要是兩個(gè)原因医咨,一來(lái)枫匾,在工作中用得上;二來(lái)腋逆,學(xué)數(shù)學(xué)原本就是個(gè)好玩兒的事婿牍。
譬如說(shuō),過(guò)去幾年火起來(lái)的深度學(xué)習(xí)惩歉,以及之前沒(méi)那么火等脂,但是實(shí)際上早早就在搜索、廣告這些領(lǐng)域撑蚌,應(yīng)用的機(jī)器學(xué)習(xí)和推薦算法上遥。這里面其實(shí)就是結(jié)合了微積分、線性代數(shù)争涌、概率論之后的最優(yōu)化問(wèn)題粉楚。
事實(shí)上,大部分應(yīng)用領(lǐng)域的核心解決方案亮垫,都是把應(yīng)用領(lǐng)域的問(wèn)題模软,形式化為一個(gè)個(gè)數(shù)學(xué)問(wèn)題。在找到數(shù)學(xué)問(wèn)題的“解法”之后饮潦,用寫程序的方式翻譯成實(shí)際應(yīng)用的“算法”燃异。而能夠應(yīng)用“數(shù)學(xué)”的方式來(lái)解決問(wèn)題,是從一個(gè)只能套用現(xiàn)成方案的“碼農(nóng)”继蜡,向能夠?qū)⑿聠?wèn)題形式化回俐、并找出創(chuàng)新解決方案的“研發(fā)工程師”邁出的第一步。
很多問(wèn)題當(dāng)你知道如何用數(shù)學(xué)來(lái)解決的時(shí)候稀并,常常會(huì)有醍醐灌頂?shù)母杏X(jué)仅颇。譬如當(dāng)我第一次搞明白,廣告中的競(jìng)價(jià)問(wèn)題碘举,居然能夠變成一個(gè)博弈論中“尋找上策均衡”的問(wèn)題忘瓦,并且能夠通過(guò)簡(jiǎn)簡(jiǎn)單單的公式表示出來(lái)的時(shí)候,我是很有滿足感的殴俱。
此外政冻,一旦熟悉了機(jī)器學(xué)習(xí)中用到的數(shù)學(xué)知識(shí)枚抵,很多想要解決的系統(tǒng)問(wèn)題,都能通過(guò)定義更好的數(shù)學(xué)優(yōu)化目標(biāo)明场,變成一個(gè)能夠找到最優(yōu)解的程序算法汽摹,最后通過(guò)寫個(gè)程序,翻譯成數(shù)學(xué)問(wèn)題來(lái)解決苦锨,這個(gè)過(guò)程帶給我巨大的身心愉悅逼泣。
- 我是如何學(xué)數(shù)學(xué)的?
數(shù)學(xué)整個(gè)領(lǐng)域很大舟舒,如果想要學(xué)點(diǎn)什么拉庶,我建議從工作相關(guān)的領(lǐng)域開(kāi)始,先廣度秃励,再深度氏仗。
從工作相關(guān)的領(lǐng)域開(kāi)始,是讓自己一是能有實(shí)際用得上學(xué)到的知識(shí)的機(jī)會(huì)夺鲜,二是日常工作中容易耳濡目染皆尔,相當(dāng)于常常在復(fù)習(xí)。而先有廣度币励,是讓自己在心中有一個(gè)問(wèn)題到解決方法的“地圖”慷蠕,遇到具體的問(wèn)題能夠?qū)Φ蒙希菀撰@得正反饋食呻;然后再有深度流炕,具體去對(duì)一個(gè)特定的主題學(xué)習(xí)應(yīng)用。
當(dāng)開(kāi)始深入學(xué)一個(gè)特定問(wèn)題的時(shí)候仅胞,最好的方式是每辟,追一門在線課程,譬如Coursera干旧、TEDx影兽,或者在極客時(shí)間上找一門課程來(lái)學(xué)習(xí)。
這是因?yàn)槔掣铮诰€課程有明確的節(jié)奏,通常還會(huì)提供作業(yè)和測(cè)驗(yàn)讹开。通過(guò)作業(yè)和測(cè)驗(yàn)盅视,讓自己對(duì)自己的學(xué)習(xí)有一個(gè)聯(lián)系和反饋的過(guò)程。即使實(shí)踐中沒(méi)有足夠的應(yīng)用旦万,過(guò)一段時(shí)間有些知識(shí)沒(méi)有那么熟悉了闹击,但是也容易建立自己很快可以“撿”回來(lái)的信心,降低“復(fù)習(xí)”的啟動(dòng)成本成艘。跟隨在線課程的節(jié)奏赏半,可以有效避免“三天打漁兩天曬網(wǎng)”的惡習(xí)贺归,讓學(xué)習(xí)有始有終。
最后断箫,給你介紹一個(gè)有程序員特色的學(xué)習(xí)方法拂酣,針對(duì)學(xué)習(xí)的內(nèi)容寫一點(diǎn)程序。把正在學(xué)習(xí)的問(wèn)題的解法仲义,寫一個(gè)算法實(shí)現(xiàn)出來(lái)婶熬。這是一個(gè)非常有效的練習(xí)方式。譬如學(xué)習(xí)線性代數(shù)埃撵,理解仿射赵颅,反復(fù)讀書(shū)的效率對(duì)我來(lái)說(shuō),就不如找來(lái)Coding The Matrix暂刘,通過(guò)寫程序饺谬,讓學(xué)習(xí)、理解變得更深入谣拣。
王天一 | 《人工智能基礎(chǔ)課》《機(jī)器學(xué)習(xí)40講》作者:“數(shù)學(xué)是工具而非問(wèn)題募寨,是手段而非目的”
在數(shù)學(xué)的學(xué)習(xí)中,首要的問(wèn)題是明確需求芝发。作為非數(shù)學(xué)專業(yè)出身的“外行”绪商,我們使用數(shù)學(xué)的目的不是頂天,而是立地;不是上下求索艱深的理論問(wèn)題凌唬,而是將生活中的具體問(wèn)題抽象化羊赵,進(jìn)而加以解決。
因此例书,對(duì)于我們這些票友來(lái)說(shuō),學(xué)習(xí)數(shù)學(xué)的基礎(chǔ)在于經(jīng)驗(yàn)而非哲學(xué)刻炒,比較實(shí)際的思路是秉持功利主義的原則决采,用多少學(xué)多少。掌握基本的線性代數(shù)與矩陣論坟奥、概率論與數(shù)理統(tǒng)計(jì)知識(shí)足以應(yīng)付日常的使用树瞭,盲目地好高騖遠(yuǎn)通常有害無(wú)益。理論化和公理化這些比較深邃的嘗試固然讓人著迷爱谁,但它們可能并沒(méi)有肉眼可見(jiàn)的實(shí)用性晒喷,對(duì)于絕大部分計(jì)算機(jī)從業(yè)者恐怕過(guò)于陽(yáng)春白雪。
其次访敌,在學(xué)習(xí)時(shí)還要理解數(shù)學(xué)的本質(zhì)凉敲。數(shù)學(xué)是工具而非問(wèn)題,是手段而非目的。探索世界奧秘的學(xué)科是“格物窮理”的物理學(xué)爷抓,相形之下势决,數(shù)學(xué)更像是個(gè)任人打扮的小姑娘,它存在的意義就是通過(guò)合理的設(shè)計(jì)簡(jiǎn)化物理學(xué)的研究蓝撇。
正因如此果复,在數(shù)學(xué)中存在著各種各樣在現(xiàn)實(shí)中不可能出現(xiàn)的理想化模型(比如無(wú)窮小和極限的誕生),也存在著對(duì)同一個(gè)物理過(guò)程不同的建模方式(比如矩陣力學(xué)和波動(dòng)力學(xué))唉地。充分理解數(shù)學(xué)的人造特質(zhì)据悔,可以在學(xué)習(xí)中少走很多無(wú)謂的彎路。
理解數(shù)學(xué)的工具屬性就會(huì)自然而然地引出了數(shù)學(xué)學(xué)習(xí)中的另一個(gè)關(guān)鍵點(diǎn)耘沼,那就是工具設(shè)計(jì)的出發(fā)點(diǎn)极颓,也就是所謂的數(shù)學(xué)思想與數(shù)學(xué)邏輯。
任何一個(gè)工具都不是平白無(wú)故地設(shè)計(jì)出來(lái)的群嗤,它必然要解決某個(gè)特定的問(wèn)題菠隆,比如線性代數(shù)與矩陣論是對(duì)具體對(duì)象的抽象表示與運(yùn)算,比如概率論和數(shù)理統(tǒng)計(jì)是對(duì)不確定性及其定型定量表示的建模狂秘。因此骇径,在掌握每一種數(shù)學(xué)工具的微觀技巧之前,理解它們的宏觀目標(biāo)是更加重要的者春。只有掌握了工具誕生的背景與目的破衔,才有可能有效地使用它們。
在這里還要多說(shuō)一句钱烟,數(shù)學(xué)絕不僅僅是算術(shù)晰筛,把主要精力放在計(jì)算上未免因小失大。在經(jīng)典科幻片《銀河系漫游指南》中拴袭,超級(jí)計(jì)算機(jī)告訴人們读第,世界的終極答案是“42”——這更像是對(duì)數(shù)字主義者善意嘲諷的一個(gè)梗。但對(duì)算術(shù)的過(guò)度強(qiáng)調(diào)并不鮮見(jiàn)拥刻,在相當(dāng)數(shù)量的現(xiàn)行數(shù)學(xué)教材中怜瞒,講解線性代數(shù)時(shí)開(kāi)篇便給出行列式的計(jì)算方法,這種編排著實(shí)讓人費(fèi)解般哼。
具體到數(shù)學(xué)每個(gè)子學(xué)科的學(xué)習(xí)方法上吴汪,相關(guān)的經(jīng)驗(yàn)教訓(xùn)已然汗牛充棟,很多內(nèi)容都無(wú)需在此贅言蒸眠。但在我看來(lái)浇坐,學(xué)習(xí)時(shí)值得突出強(qiáng)調(diào)的一點(diǎn)是舉一反三的能力。同一種工具及其背后的思想可以出現(xiàn)在不同的場(chǎng)景下黔宛,解決不同的問(wèn)題,但是一旦深入到本質(zhì)層面,就會(huì)發(fā)現(xiàn)它們實(shí)際上是相通的臀晃。如何透過(guò)現(xiàn)象看本質(zhì)觉渴,將不同場(chǎng)景融會(huì)貫通,才是值得鍛煉的高級(jí)能力徽惋。
同一個(gè)工具存在不同應(yīng)用的例子不勝枚舉:
特征向量計(jì)算的是系統(tǒng)的不動(dòng)點(diǎn)案淋,在數(shù)據(jù)降維中有舉足輕重的作用,但如果熟悉電子通信的話你就會(huì)知道险绘,對(duì)線性時(shí)不變系統(tǒng)的分析(也就是各種變換)都是基于特征向量展開(kāi)的踢京;
在給定隱馬爾可夫模型的觀測(cè)序列時(shí),可以利用維特比算法求解后驗(yàn)概率最大的狀態(tài)序列宦棺,將這一方法應(yīng)用在信道編碼中瓣距,就是最經(jīng)典的卷積碼譯碼算法;
在分類問(wèn)題中代咸,以類間方差最大化為標(biāo)準(zhǔn)蹈丸,可以推導(dǎo)出線性判別分析和決策樹(shù)等模型,應(yīng)用在圖像處理中呐芥,類間方差最大化原理給出的就是圖像分割中的Otsu方法逻杖。
凡此種種都說(shuō)明,即使是不同的學(xué)科思瘟,使用的數(shù)學(xué)基礎(chǔ)也有著千絲萬(wàn)縷的聯(lián)系荸百,將基本的數(shù)學(xué)概念和充分的想象力結(jié)合起來(lái),觸類旁通就變得輕而易舉滨攻。
總結(jié)起來(lái)够话,我對(duì)數(shù)學(xué)學(xué)習(xí)的幾點(diǎn)拙見(jiàn)是:把握數(shù)學(xué)的工具屬性,學(xué)習(xí)具體方法時(shí)先溯因再求果铡买,勤于思考解決相同問(wèn)題的不同方法更鲁,與解決不同問(wèn)題的相同方法之間的聯(lián)系與區(qū)別。希望這幾條建議能夠在數(shù)學(xué)的學(xué)習(xí)中助你一臂之力奇钞。
綜合三位老師的觀點(diǎn)澡为,其中的共性就是:學(xué)習(xí)數(shù)學(xué),“實(shí)用”優(yōu)先景埃。因此媒至,我繪制了一張“程序員的數(shù)學(xué)應(yīng)用地圖”,包含四個(gè)部分:數(shù)據(jù)結(jié)構(gòu)谷徙、編程語(yǔ)句拒啰、通用算法和機(jī)器學(xué)習(xí)算法。
數(shù)據(jù)結(jié)構(gòu)和編程語(yǔ)句完慧,你肯定非常熟悉谋旦,這些基礎(chǔ)的內(nèi)容涵蓋的數(shù)學(xué)思維毋庸置疑。例如,數(shù)組和鏈表就體現(xiàn)了迭代和遞歸的思想册着,判斷語(yǔ)句使用了邏輯(布爾)代數(shù)拴孤。
架構(gòu)在數(shù)據(jù)結(jié)構(gòu)和編程語(yǔ)言之上的算法(為了將這些算法和機(jī)器學(xué)習(xí)的算法區(qū)分開(kāi),我稱其為通用算法)甲捏,除了迭代和遞歸演熟,也體現(xiàn)了排列、組合和動(dòng)態(tài)規(guī)劃等思想司顿。
對(duì)于機(jī)器學(xué)習(xí)的算法芒粹,我們更需要理解概率統(tǒng)計(jì)和線性代數(shù)的核心思想,包括什么是概率大溜、貝葉斯定理化漆、數(shù)據(jù)的統(tǒng)計(jì)分布、向量猎提、矩陣获三、線性方程等。
在繪制這張應(yīng)用地圖的時(shí)候锨苏,我特意反其道而行疙教,從計(jì)算機(jī)編程的角度出發(fā),為你展示程序員應(yīng)該如何看待編程中的數(shù)學(xué)知識(shí)伞租。
我有充足的信心贞谓,通過(guò)加深對(duì)數(shù)學(xué)的理解,你在分析問(wèn)題時(shí)就可以追本溯源葵诈,快裸弦、準(zhǔn)、穩(wěn)地找到解決方案作喘。這樣理疙,今后在面對(duì)系統(tǒng)框架設(shè)計(jì)、性能優(yōu)化泞坦、準(zhǔn)確率提升等難題時(shí)窖贤,你就會(huì)從更高更廣的角度出發(fā)思考問(wèn)題,而不只是以“熟練工”的視角增刪改查贰锁。
來(lái)源 | 極客時(shí)間《程序員的數(shù)學(xué)基礎(chǔ)課》