學(xué)?不同開發(fā)方向的數(shù)學(xué)需求與實(shí)戰(zhàn)應(yīng)對(duì))
作為一個(gè)帶過不少新人、也面試過不少候選人的開發(fā)者我?guī)缀趺總€(gè)月都會(huì)遇到同一個(gè)問題“我數(shù)學(xué)不好能學(xué)編程嗎”或者更具體一點(diǎn)像這個(gè)標(biāo)題問的——How Much Maths Do You Need?你到底需要多少數(shù)學(xué)先說我的答案如果你做的是Web開發(fā)、App開發(fā)、業(yè)務(wù)系統(tǒng)這類主流工作需要的高等數(shù)學(xué)比你想象中少得多但如果你去搞圖形學(xué)、機(jī)器學(xué)習(xí)、量化交易那數(shù)學(xué)就變成了核心門檻。問題從來不是“要不要數(shù)學(xué)”而是“你的方向需要哪類數(shù)學(xué)、學(xué)到什么程度”。這篇文章我不會(huì)跟你扯“數(shù)學(xué)是一切的基礎(chǔ)”這種正確的廢話而是直接拆開講不同開發(fā)方向?qū)?yīng)什么數(shù)學(xué)需求、實(shí)際項(xiàng)目中數(shù)學(xué)到底出現(xiàn)在哪里、遇到數(shù)學(xué)瓶頸時(shí)成熟開發(fā)者是怎么應(yīng)對(duì)的。希望能幫正在糾結(jié)“要不要補(bǔ)數(shù)學(xué)”的你省下幾個(gè)月盲目刷題的時(shí)間。1. 這個(gè)問題的正確問法不是“要不要學(xué)”而是“學(xué)哪些、學(xué)多深”1.1 先說個(gè)反直覺的結(jié)論業(yè)務(wù)開發(fā)用到的高等數(shù)學(xué)極少我見過太多人被大學(xué)里的高等數(shù)學(xué)、線性代數(shù)課程嚇住然后得出“我不適合編程”的結(jié)論。但說句實(shí)在話我寫后端寫了十來年日常用到最多的數(shù)學(xué)是四則運(yùn)算、百分比、比較大小偶爾來個(gè)平方根或絕對(duì)值加起來不超過小學(xué)高年級(jí)到初中水平。這種數(shù)學(xué)知識(shí)你不需要專門學(xué)編程過程中自然而然就會(huì)用。打個(gè)比方這就像問“當(dāng)廚師需要多少植物學(xué)知識(shí)”。你去切菜、炒菜、調(diào)味用到的更多是手感、經(jīng)驗(yàn)和流程把控你不需要知道葉綠體的光合作用機(jī)制才能炒好一盤青菜。當(dāng)然如果你想做分子料理、想研發(fā)新品種那就需要更深的食品科學(xué)。編程和數(shù)學(xué)的關(guān)系本質(zhì)上也是這樣分層的。1.2 為什么大學(xué)課程和實(shí)際工作有這么大斷層這個(gè)斷層是很多人焦慮的來源。大學(xué)里數(shù)學(xué)課是一套完整學(xué)科體系講究嚴(yán)謹(jǐn)?shù)耐茖?dǎo)和證明而軟件開發(fā)是工程實(shí)踐追求的是“能用、夠用、可靠”地解決問題。兩者目標(biāo)不同所以課程內(nèi)容和工作需要之間的映射關(guān)系非常弱。舉個(gè)具體例子微積分在算法分析里確實(shí)有影子比如你判斷一個(gè)遞歸算法的復(fù)雜度時(shí)會(huì)用到主定理那里面有對(duì)數(shù)、指數(shù)但實(shí)際工作中你不會(huì)真的去手動(dòng)證明復(fù)雜度更多是憑經(jīng)驗(yàn)和Profiling工具定位性能瓶頸。再比如線性代數(shù)你學(xué)的矩陣變換在3D圖形學(xué)里很關(guān)鍵但如果你一輩子寫業(yè)務(wù)管理系統(tǒng)你可能永遠(yuǎn)碰不到矩陣乘法。所以正確的思路是先定方向再倒推數(shù)學(xué)需求。而不是先花一年把數(shù)學(xué)學(xué)好再開始學(xué)編程。后者是學(xué)校思維不是工程思維。2. 按開發(fā)方向拆解數(shù)學(xué)需求別再拿一張清單嚇唬自己2.1 前端、移動(dòng)端開發(fā)需要的數(shù)學(xué)很少但必須扎實(shí)前端開發(fā)對(duì)數(shù)學(xué)的要求可以算是主流方向里最低的之一了。你寫頁面布局用到的是盒模型、百分比、flex和grid這些本質(zhì)上是簡(jiǎn)單的幾何和比例關(guān)系不需要微積分。做動(dòng)畫緩動(dòng)函數(shù)背后是貝塞爾曲線但你通常直接用CSS的 ease-in-out 或某個(gè)現(xiàn)成庫不需要自己推導(dǎo)曲線方程。不過有兩塊我建議你補(bǔ)一補(bǔ)坐標(biāo)系和變換Canvas繪圖、SVG操作里平移、旋轉(zhuǎn)、縮放都是矩陣變換。你不需要手寫矩陣乘法庫但得理解坐標(biāo)變換的含義否則做拖拽、縮放、碰撞檢測(cè)時(shí)會(huì)很痛苦。邏輯運(yùn)算和集合思維前端的交互邏輯經(jīng)常是“多個(gè)條件同時(shí)滿足”“這幾種情況取并集”之類的判斷。這就是離散數(shù)學(xué)里的布爾邏輯和集合論但你真的不需要用集合論的符號(hào)體系去表達(dá)只需要有清晰的邏輯。我做前端的朋友圈子里幾乎沒人后悔“數(shù)學(xué)沒學(xué)好”更多人后悔的是當(dāng)時(shí)沒把JavaScript的異步機(jī)制搞清楚。2.2 后端、系統(tǒng)開發(fā)算法思維比公式更重要后端是最容易被“數(shù)學(xué)焦慮”找上的方向因?yàn)槊嬖嚳偪妓惴}而算法題看起來全是數(shù)學(xué)。但這里有個(gè)關(guān)鍵認(rèn)知算法題考察的其實(shí)不是數(shù)學(xué)知識(shí)儲(chǔ)備而是抽象能力和邏輯推理能力。你把一個(gè)問題轉(zhuǎn)化為數(shù)學(xué)習(xí)題的能力比你會(huì)不會(huì)解某個(gè)積分重要得多。后端日常工作中真正會(huì)遇到的數(shù)學(xué)內(nèi)容大概是時(shí)間復(fù)雜度分析你要知道把一層循環(huán)改成兩層循環(huán)意味著什么在數(shù)據(jù)量從一萬漲到一百萬時(shí)你的接口會(huì)變慢多少。這個(gè)用到的不是什么復(fù)雜公式而是指數(shù)函數(shù)、對(duì)數(shù)函數(shù)的基本直覺。數(shù)據(jù)結(jié)構(gòu)背后的數(shù)學(xué)哈希表為什么查詢是O(1)二叉搜索樹為什么是O(log n)B樹為什么適合數(shù)據(jù)庫索引。這里面的核心是“分治”思想而不是數(shù)學(xué)定理。并發(fā)和排隊(duì)系統(tǒng)設(shè)計(jì)里經(jīng)常涉及限流、排隊(duì)、排隊(duì)時(shí)間預(yù)估。嚴(yán)格的排隊(duì)論是很深的數(shù)學(xué)但實(shí)際工程里你更多依賴壓測(cè)數(shù)據(jù)和經(jīng)驗(yàn)值來調(diào)整參數(shù)。所以后端方向我的建議是高中數(shù)學(xué)水平足夠入門大學(xué)離散數(shù)學(xué)和概率論的基礎(chǔ)概念值得補(bǔ)充但不需要去刷微積分題。2.3 數(shù)據(jù)科學(xué)、算法工程、游戲開發(fā)這才是數(shù)學(xué)的主場(chǎng)我得說句公道話如果你是奔著這幾個(gè)方向去的那數(shù)學(xué)就成了硬通貨別指望繞開。數(shù)據(jù)科學(xué)/機(jī)器學(xué)習(xí)概率統(tǒng)計(jì)是底層語言線性代數(shù)是空間變換的工具微積分中的梯度概念直接對(duì)應(yīng)模型訓(xùn)練里的梯度下降。你不需要成為數(shù)學(xué)家但你需要能看懂損失函數(shù)、理解過擬合的統(tǒng)計(jì)學(xué)解釋、明白特征向量的含義。沒有這些你調(diào)參調(diào)出來的模型就是碰運(yùn)氣。圖形學(xué)/游戲開發(fā)線性代數(shù)是絕對(duì)的核心。三維空間的坐標(biāo)變換、旋轉(zhuǎn)矩陣、四元數(shù)、光照計(jì)算全是線性代數(shù)的直接應(yīng)用。游戲物理引擎則是微積分特別是積分和微分方程的應(yīng)用現(xiàn)場(chǎng)。想做這行的朋友數(shù)學(xué)不是“要不要學(xué)”的問題而是“學(xué)多深都嫌不夠”。量化交易/音視頻處理前者涉及概率論、隨機(jī)過程后者涉及傅里葉變換、信號(hào)處理。這些方向更是數(shù)學(xué)主導(dǎo)的領(lǐng)域。下面這個(gè)表可以幫你快速定位開發(fā)方向數(shù)學(xué)需求等級(jí)主要涉及的數(shù)學(xué)領(lǐng)域?qū)嶋H工作中的常見場(chǎng)景前端/移動(dòng)端低基礎(chǔ)幾何、布爾邏輯布局、動(dòng)畫、Canvas變換后端/業(yè)務(wù)系統(tǒng)低-中離散數(shù)學(xué)、概率基礎(chǔ)算法復(fù)雜度、數(shù)據(jù)庫索引、并發(fā)估算數(shù)據(jù)科學(xué)/機(jī)器學(xué)習(xí)高概率統(tǒng)計(jì)、線性代數(shù)、微積分特征工程、模型評(píng)估、調(diào)參游戲/圖形學(xué)高線性代數(shù)、微積分、幾何坐標(biāo)變換、物理模擬、渲染音視頻/量化高傅里葉變換、隨機(jī)過程信號(hào)處理、行情建模3. 真正實(shí)用的數(shù)學(xué)知識(shí)清單與落地點(diǎn)不是為考試是為干活3.1 基礎(chǔ)代數(shù)與函數(shù)思維所有編程邏輯的影子說來也奇怪很多人覺得初中數(shù)學(xué)和編程無關(guān)但我在寫代碼時(shí)最常調(diào)用的恰恰是函數(shù)思維。你在代碼里定義一個(gè)個(gè)函數(shù)輸入進(jìn)去、處理、輸出這本身就是一個(gè)映射關(guān)系和數(shù)學(xué)里的函數(shù) y f(x) 如出一轍。你理解“一個(gè)函數(shù)不應(yīng)當(dāng)有不可預(yù)料的副作用”某種程度上就是理解數(shù)學(xué)里“一個(gè)確定的輸入對(duì)應(yīng)一個(gè)確定的輸出”。再比如接口設(shè)計(jì)里的分頁邏輯pageSize 是 20total 是 137你需要算出總頁數(shù)是 ceil(137/20) 7。這就是小學(xué)除法加一個(gè)向上取整但你要是不注意邊界很容易出現(xiàn)第 7 頁為空、或者永遠(yuǎn)顯示不出來最后一頁數(shù)據(jù)的bug。這類問題不需要你會(huì)微積分但需要你對(duì)數(shù)字有基本的敏感性。所以我對(duì)基礎(chǔ)代數(shù)的定位是不是“要不要學(xué)”而是你本來就會(huì)只是在編程里換了個(gè)形式在用。你缺的不是數(shù)學(xué)知識(shí)而是把數(shù)學(xué)符號(hào)翻譯成代碼邏輯的練習(xí)。3.2 概率統(tǒng)計(jì)與離散數(shù)學(xué)最被低估的兩塊基石如果說有一個(gè)數(shù)學(xué)分支最值得工作后補(bǔ)課我首推概率統(tǒng)計(jì)。不是因?yàn)榭荚囈级且驗(yàn)槟悻F(xiàn)在做的東西幾乎都離不開它。你做A/B測(cè)試判斷新功能是否真的有提升靠的是顯著性檢驗(yàn)這是假設(shè)檢驗(yàn)問題。你做推薦系統(tǒng)計(jì)算用戶相似度用的是余弦相似度或皮爾遜相關(guān)系數(shù)這是統(tǒng)計(jì)概念。你做異常檢測(cè)判斷某條交易是否可疑本質(zhì)上是在估算“這個(gè)事件在歷史分布中出現(xiàn)的概率”。你做系統(tǒng)監(jiān)控設(shè)置告警閾值你會(huì)遇到“抖動(dòng)”。一次兩次的CPU飆高是噪聲還是故障這里也有統(tǒng)計(jì)思維的影子。離散數(shù)學(xué)聽起來很理論但它其實(shí)就是編程邏輯的地基集合對(duì)應(yīng)數(shù)據(jù)歸屬判斷圖論對(duì)應(yīng)社交網(wǎng)絡(luò)和路徑搜索邏輯運(yùn)應(yīng)對(duì)應(yīng)條件分支和狀態(tài)機(jī)。你不需要用數(shù)學(xué)證明的方式來學(xué)只需要在做算法題、設(shè)計(jì)狀態(tài)機(jī)時(shí)慢慢建立起這些直覺。3.3 線性代數(shù)只在特定場(chǎng)景才真正出場(chǎng)但出場(chǎng)就是主角線性代數(shù)大概是普通人眼中“最沒用的數(shù)學(xué)課”不少人學(xué)完矩陣運(yùn)算就忘了。但它其實(shí)很特別它在主流業(yè)務(wù)開發(fā)里幾乎不用在特定領(lǐng)域卻是核心中的核心。做個(gè)簡(jiǎn)單的定位你的工作內(nèi)容里如果出現(xiàn)“坐標(biāo)”“向量”“矩陣”“特征”這些詞比如3D渲染、地圖導(dǎo)航、圖像處理、推薦系統(tǒng)那線性代數(shù)就是你繞不開的工具。這里的“工具”不是紙上算題而是你能理解一個(gè)向量乘一個(gè)矩陣意味著什么、為什么矩陣乘法不滿足交換律、怎么用矩陣表示旋轉(zhuǎn)。如果在這些領(lǐng)域之外我的建議很直接先不學(xué)把時(shí)間花在真正卡你脖子的事情上。等你工作中某天突然發(fā)現(xiàn)“我需要理解矩陣”你再去補(bǔ)也完全來得及。因?yàn)槟銕е鎸?shí)問題去學(xué)效率反而是漫無目的刷課的十倍以上。3.4 微積分聽起來高端但實(shí)際上離你非常遠(yuǎn)微積分是數(shù)學(xué)系和理工科的必修核心但普通軟件工程師工作中遇到它的概率極低。我只有一次在工作中認(rèn)真用了微積分概念那是在做某個(gè)性能優(yōu)化時(shí)用斜率的概念去判斷某段程序觸達(dá)瓶頸的趨勢(shì)變化。但說實(shí)話那種程度的理解不需要專門學(xué)微積分課也能get到。唯一需要強(qiáng)調(diào)的例外是機(jī)器學(xué)習(xí)里的梯度下降本質(zhì)是微積分里的偏導(dǎo)數(shù)和方向?qū)?shù)概念物理引擎、渲染器里的很多計(jì)算直接就是積分問題。如果不是這些方向你可以理直氣壯地暫時(shí)不看微積分。等面試時(shí)被問到“梯度下降的原理”你知道梯度的方向是函數(shù)上升最快的方向沿著反方向更新參數(shù)就是下降這就算過關(guān)了。4. 實(shí)戰(zhàn)經(jīng)驗(yàn)從實(shí)際項(xiàng)目倒推需要的數(shù)學(xué)知識(shí)4.1 我遇到過的幾次“數(shù)學(xué)危機(jī)”和真實(shí)解法前面說得有點(diǎn)抽象來講幾個(gè)我自己的真實(shí)經(jīng)歷。第一次是做一個(gè)優(yōu)惠券系統(tǒng)需要把“滿100減20”和“跨店滿300減50”疊加還要處理不同類目商品的不同抵扣規(guī)則。當(dāng)時(shí)我第一反應(yīng)是“這規(guī)則好亂得設(shè)計(jì)一個(gè)計(jì)算公式”結(jié)果寫出來的代碼又臭又長(zhǎng)全是if-else。后來重新梳理了一下把每張券抽象成一個(gè)輸入金額、輸出優(yōu)惠金額的函數(shù)再定義組合的優(yōu)先級(jí)和互斥關(guān)系問題立刻清晰了。這用到的數(shù)學(xué)知識(shí)是什么其實(shí)就是函數(shù)復(fù)合和集合關(guān)系。沒有一條公式需要查書但你需要一種“把規(guī)則抽象成可計(jì)算模型”的能力。第二次是做商家數(shù)據(jù)報(bào)表要給每條商品算一個(gè)“熱賣指數(shù)”用于排序。當(dāng)時(shí)的業(yè)務(wù)方給了很多維度銷量、瀏覽量、收藏?cái)?shù)、評(píng)價(jià)分、上架時(shí)長(zhǎng)。有人提議直接用加權(quán)平均。聽起來簡(jiǎn)單但權(quán)重要定多少不同類目之間怎么比后來我用了一個(gè)退而求其次的方法先把每個(gè)維度的原始值做 min-max 歸一化到 0-1再按人工經(jīng)驗(yàn)加權(quán)求和。這個(gè)過程背后的歸一化思想就是統(tǒng)計(jì)學(xué)基礎(chǔ)。你不懂歸一化也能照抄公式但懂了之后你就知道什么時(shí)候該用z-score、什么時(shí)候該用min-max而不是遇到所有數(shù)據(jù)都硬套同一個(gè)方法。第三次是最手忙腳亂的一次做一個(gè)類似排行榜的實(shí)時(shí)積分系統(tǒng)需要根據(jù)用戶行為動(dòng)態(tài)調(diào)整分?jǐn)?shù)。本來以為只是加減分結(jié)果產(chǎn)品經(jīng)理要求“用戶連續(xù)簽到要越簽越多”“間隔幾天不活躍要掉分”。這明顯需要設(shè)計(jì)一個(gè)增長(zhǎng)率/衰減率模型。我當(dāng)時(shí)翻了很多資料最后用了一個(gè)類似線性增長(zhǎng)加指數(shù)衰減的簡(jiǎn)化模型。這正是自然對(duì)數(shù) e 的應(yīng)用——但我其實(shí)是先寫出邏輯再去查概念才意識(shí)到那是指數(shù)衰減。這個(gè)經(jīng)歷讓我明白實(shí)際開發(fā)往往是先有需求、后有數(shù)學(xué)模型而不是反過來。4.2 遇到數(shù)學(xué)瓶頸時(shí)成熟開發(fā)者的應(yīng)對(duì)順序就算你數(shù)學(xué)基礎(chǔ)還行工作中也一定會(huì)遇到看不懂的數(shù)學(xué)概念。這時(shí)候最怕的是兩種反應(yīng)一種是死磕數(shù)學(xué)書從第一章開始看看了三個(gè)月還沒回到項(xiàng)目上另一種是直接復(fù)制網(wǎng)上的公式完全不管原理結(jié)果稍微改一下需求就崩。我自己的應(yīng)對(duì)順序是這樣的先把問題翻譯成數(shù)學(xué)語言。比如“用戶評(píng)分排序”翻譯成“在多個(gè)維度上做加權(quán)求和”“廣告點(diǎn)擊率預(yù)估”翻譯成“求條件概率”。這一步做的其實(shí)就是建模。查這個(gè)“翻譯”出來的數(shù)學(xué)對(duì)象是什么。不用深挖教科書直接搜“加權(quán)求和 歸一化”“余弦相似度 推薦”“指數(shù)衰減 排行榜”這種關(guān)鍵詞找到直覺性的解釋和一個(gè)最小可運(yùn)行例子。用代碼快速驗(yàn)證。寫一個(gè)最小demo用假數(shù)據(jù)跑一遍看結(jié)果是否符合直覺。理解關(guān)鍵參數(shù)的物理意義。比如衰減系數(shù)大一點(diǎn)兒排行榜會(huì)變成什么樣歸一化方法換了排序有沒有差。這個(gè)“參數(shù)調(diào)優(yōu)”的過程其實(shí)就是在理解數(shù)學(xué)對(duì)象的性質(zhì)。用完之后做個(gè)筆記。記下這個(gè)數(shù)學(xué)工具解決的是什么問題、有哪些坑。下次再遇到類似需求直接翻筆記。這個(gè)過程最核心的一點(diǎn)是以解決問題為圓心數(shù)學(xué)是半徑里的助力不是起點(diǎn)。大多數(shù)工程問題都不需要你先發(fā)明新數(shù)學(xué)而是需要你知道有現(xiàn)成的工具并且能把它安插到代碼里。5. 給不同階段開發(fā)者的數(shù)學(xué)學(xué)習(xí)優(yōu)先級(jí)建議5.1 入門階段先把寫代碼跑通別讓數(shù)學(xué)成為心理障礙如果你是編程零基礎(chǔ)正在猶豫要不要先學(xué)數(shù)學(xué)我的建議非常明確先直接開始學(xué)編程數(shù)學(xué)可以完全靠后。你寫第一個(gè)頁面、第一個(gè)接口、第一批測(cè)試都不需要任何超過小學(xué)水平的數(shù)學(xué)。真正重要的是盡快建立起“代碼能跑起來”的正反饋循環(huán)。很多半途而廢的人不是被編程難死的而是被“前置條件的恐懼”嚇?biāo)赖摹?shù)學(xué)在這里扮演了那個(gè)看起來很可怕的守門人角色。但事實(shí)是絕大多數(shù)編程入門階段需要的邏輯思維能力你每天生活中都在用——安排一天的優(yōu)先級(jí)是排序問題判斷要不要帶傘是條件判斷問題合并兩個(gè)購(gòu)物清單是集合操作問題。你會(huì)這些就已經(jīng)具備入門編程的基礎(chǔ)了。入門階段如果非要選一個(gè)數(shù)學(xué)方向培養(yǎng)我會(huì)選邏輯推理而不是解題能力。多做幾道簡(jiǎn)單的算法題試著把中文需求翻譯成代碼比刷一年高數(shù)題對(duì)編程幫助大得多。5.2 進(jìn)階階段按需補(bǔ)課用項(xiàng)目驅(qū)動(dòng)而不是按學(xué)科驅(qū)動(dòng)當(dāng)你真正進(jìn)入項(xiàng)目開發(fā)后你會(huì)很自然地發(fā)現(xiàn)自己缺哪塊數(shù)學(xué)。這時(shí)候你的學(xué)習(xí)方式應(yīng)該從“按學(xué)科體系”切換為“按需求驅(qū)動(dòng)”。我給你一個(gè)實(shí)操清單如果你發(fā)現(xiàn)自己處理的是格式化數(shù)據(jù)、算占比、算同比環(huán)比去找“統(tǒng)計(jì)學(xué)入門”“數(shù)據(jù)分析基礎(chǔ)”的資料重點(diǎn)看描述性統(tǒng)計(jì)。如果你在做用戶行為分析、推薦、風(fēng)控模型去找“概率論基礎(chǔ)”和“機(jī)器學(xué)習(xí)數(shù)學(xué)基礎(chǔ)”的資料重點(diǎn)理解分布、期望、方差、條件概率。如果你在做空間計(jì)算、動(dòng)畫、渲染去找“線性代數(shù)的幾何意義”這類資料重點(diǎn)理解向量和矩陣變換的幾何含義。如果你在做性能優(yōu)化、高并發(fā)去找“算法復(fù)雜度分析”“排隊(duì)論淺析”的資料重點(diǎn)建立數(shù)量級(jí)直覺。這里有個(gè)心法不要直接用英文原版數(shù)學(xué)教材當(dāng)?shù)谝皇仲Y料也不必從大一的課開始看。先在B站、各大技術(shù)社區(qū)找那種“用代碼講數(shù)學(xué)”的文章和視頻讓公式和代碼聯(lián)系起來。等你有了直覺再回頭翻教材去摳細(xì)節(jié)效率會(huì)高非常多。5.3 關(guān)于“數(shù)學(xué)天賦”的一點(diǎn)個(gè)人觀點(diǎn)別把抽象能力神化最后想聊一個(gè)很多人心里的疙瘩。我經(jīng)常聽到有人說“我數(shù)學(xué)就是不開竅所以邏輯思維不行所以編程肯定學(xué)不好。”這話聽著有道理其實(shí)是把“數(shù)學(xué)能力”和“抽象能力”劃了等號(hào)又進(jìn)一步把“抽象能力”看成了天生固定的屬性。但根據(jù)我這些年帶人的觀察所謂“編程需要的抽象能力”更像一種可以訓(xùn)練的習(xí)慣。比如看到一個(gè)復(fù)雜流程先拆成輸入、處理、輸出三個(gè)階段看到一段重復(fù)代碼先想想能不能抽成一個(gè)函數(shù)看到一個(gè)數(shù)據(jù)需求先想清楚最小單元是什么、聚合維度是什么。這些能力你在寫代碼的過程中就會(huì)反復(fù)練習(xí)不需要通過證明定理才能獲得。另外很多人高估了“數(shù)學(xué)好的人寫代碼也一定好”這件事。我見過數(shù)學(xué)系出身、但代碼寫得一團(tuán)糟的人也見過高中數(shù)學(xué)都不及格、但業(yè)務(wù)系統(tǒng)設(shè)計(jì)得無比精巧的工程師。數(shù)學(xué)基礎(chǔ)好確實(shí)是個(gè)加分項(xiàng)但不是必要條件。更公平地說它是特定方向的門檻而不是整個(gè)行業(yè)的天花板。5.4 最后分享一個(gè)實(shí)用技巧先學(xué)會(huì)“帶著數(shù)學(xué)查資料”這個(gè)動(dòng)作不管你現(xiàn)在基礎(chǔ)如何有一個(gè)動(dòng)作我強(qiáng)烈建議你練習(xí)遇到不懂的公式或概念不要跳過也不要恐慌而是花15分鐘把它翻譯成人話。做法很簡(jiǎn)單看到公式先圈出每個(gè)符號(hào)是什么含義。找一篇文章用實(shí)際數(shù)字代入公式手算一遍。問自己這個(gè)公式解決了什么問題如果不用它我會(huì)怎么做這樣做的代價(jià)是什么這個(gè)動(dòng)作練習(xí)多了你對(duì)數(shù)學(xué)的“過敏反應(yīng)”會(huì)越來越輕。你會(huì)發(fā)現(xiàn)大部分工程中出現(xiàn)的數(shù)學(xué)概念本身并不難難的是你過去從沒給過自己“用起來”的機(jī)會(huì)。老實(shí)說我并不是數(shù)學(xué)愛好者甚至可以說是典型的“數(shù)學(xué)一般但代碼還行”的工程師。但正因?yàn)檫@樣我特別能理解這個(gè)標(biāo)題背后那份不安怕自己因?yàn)閿?shù)學(xué)不好而被這個(gè)行業(yè)拒之門外。我想告訴你的是在你選定方向之前別讓“數(shù)學(xué)不夠”提前淘汰你在你選定方向之后再去認(rèn)真評(píng)估這個(gè)方向到底需要哪塊數(shù)學(xué)、你需要補(bǔ)到什么程度。大部分情況下答案是“比你想象得少”少數(shù)的例外是“確實(shí)很多”但那應(yīng)該是你主動(dòng)選擇的結(jié)果而不是一個(gè)莫名其妙的心理障礙。