編程需要多少數(shù)學(xué)知識(shí)?
1.從高考題談起
昨天大學(xué)同學(xué)群里發(fā)了一個(gè)鏈接, 點(diǎn)開一看,原來是當(dāng)年參加高考的數(shù)學(xué)試卷, 于是饒有興趣的又看了一遍, 讓我感到震驚的是,很多試題連題目都看不懂了!
比如這道題:
再比如這道題:
天吶, 這都是些什么啊, 我當(dāng)年到底是怎么考上大學(xué)的?
再聯(lián)想到大學(xué)學(xué)的微積分,線性代數(shù), 離散數(shù)學(xué), 除了一些基本概念之外,也忘的差不多了。
數(shù)學(xué)這么差 , 竟然在計(jì)算機(jī)行業(yè)待了10多年, 到底是怎么混的?
2.編程中的數(shù)學(xué)
于是我馬上回顧了下編程中用到的數(shù)學(xué)知識(shí), 好像少的可憐。
計(jì)數(shù)的能力: for循環(huán)中經(jīng)常用, 小學(xué)生都會(huì)。
數(shù)字的加減乘除 : 每種編程語言都會(huì)內(nèi)置支持, 都不需要你自己算
余數(shù)和模: 偶爾會(huì)用得到
集合運(yùn)算 : 交集、并集、差集 , 編程中用的不多。
布爾運(yùn)算: AND , OR, 非
各種進(jìn)制: 二進(jìn)制、十進(jìn)制、十六進(jìn)制
還有哪些? 我想不起來了, 歡迎補(bǔ)充。
當(dāng)然這和我從事的編程領(lǐng)域有極大關(guān)系, 如果我做的不是Web開發(fā), 而是搜索,游戲, 安全,算法,人工智能等, 那對數(shù)學(xué)的要求估計(jì)就開始飆升了。
其實(shí)計(jì)算機(jī)的基礎(chǔ)是數(shù)學(xué), 只是我們一直在應(yīng)用層編程, 體會(huì)不到罷了。
比如說我們?nèi)粘J褂玫挠?jì)算機(jī),絕大部分都是所謂馮諾依曼結(jié)構(gòu)(參見文章《馮·馮諾依曼計(jì)算機(jī)的誕生》) ,這個(gè)結(jié)構(gòu)可以說是圖靈機(jī)這個(gè)概念機(jī)器的具體實(shí)現(xiàn),而圖靈機(jī)就是一個(gè)純數(shù)學(xué)的東西啊 ,沒有圖靈機(jī)這么偉大的抽象作為數(shù)學(xué)基礎(chǔ), 現(xiàn)代的計(jì)算機(jī)是制造不出來的。
(如果對圖靈機(jī)和數(shù)學(xué)感興趣 可以看看《圖靈的秘密》這本書 》
再比如說密碼領(lǐng)域需要很多數(shù)論的知識(shí),RSA算法就涉及到大素?cái)?shù)的分解;
我們常用的Mysql, Oracle 等關(guān)系數(shù)據(jù)庫的底層基礎(chǔ)是離散數(shù)學(xué)的笛卡爾乘積;
通信系統(tǒng)中很重要的一個(gè)原理就是傅里葉變換。
編譯器會(huì)用到有限狀態(tài)機(jī);
數(shù)據(jù)的壓縮會(huì)用到各種數(shù)學(xué)的算法;
項(xiàng)目管理中的進(jìn)度管理,甘特圖數(shù)學(xué)基礎(chǔ)就是圖論。
.....
總之,數(shù)學(xué)在計(jì)算機(jī)科學(xué)(如果能稱之為科學(xué)的話) 扮演著非常重要的角色, 是整個(gè)學(xué)科的基礎(chǔ)。
3.不拼數(shù)學(xué)拼什么?
具體到應(yīng)用層編程, 尤其Web開發(fā)、企業(yè)信息化開發(fā), 整天折騰的是框架和類庫, 用不到這么多高大上的數(shù)學(xué)知識(shí), 那到底拼的是什么?
想想編程中常用的數(shù)組,如果是一維數(shù)組,做個(gè)循環(huán)和遍歷, 每個(gè)人都能輕松應(yīng)對。 如果要用數(shù)組來表示二叉樹,就需要把一個(gè)樹形結(jié)構(gòu)對應(yīng)到線性結(jié)構(gòu),那難度立刻上升。
如果在編程中需要自己實(shí)現(xiàn)鏈表, 就會(huì)發(fā)現(xiàn)把各個(gè)節(jié)點(diǎn)的鏈接關(guān)系維護(hù)好, 需要把指針(引用)調(diào)來調(diào)去,挪來挪去, 實(shí)在不是一件容易的事情。
這樣的能力就是邏輯思維的一種體現(xiàn)。
我們在做系統(tǒng)設(shè)計(jì)的時(shí)候,經(jīng)常需要總結(jié)、分析現(xiàn)實(shí)需求, 找到容易變化的部分和相對穩(wěn)定的部分, 把他們封裝起來,形成核心的概念, 支撐起整個(gè)系統(tǒng), 這是一個(gè)抽象的過程,雖然用不到多少數(shù)學(xué)知識(shí), 但是思維的過程也極不容易。
邏輯思維能力和抽象能力的差別, 能夠區(qū)分出程序員的優(yōu)秀和平庸。
一個(gè)優(yōu)秀程序員寫出的代碼, 接口清晰,容易擴(kuò)展,易于維護(hù); 一個(gè)差程序員寫出的代碼, 思路混亂,完全是一些計(jì)算機(jī)語句的堆砌, 別人看不明白, 過一段時(shí)間自己都看不明白了。
數(shù)學(xué)系的同學(xué)在這兩方面恰恰是長項(xiàng), 想想看, 數(shù)學(xué)系同學(xué)們整天折騰這么多“枯燥的”抽象概念, 再去看編程這樣大部分都是具體化的實(shí)現(xiàn), 簡直是分分鐘搞定! 這可能是數(shù)學(xué)系的轉(zhuǎn)到編程領(lǐng)域很厲害的原因吧。
邏輯思維能力通過學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法,做數(shù)據(jù)結(jié)構(gòu)的習(xí)題可以得到有效的提高, 抽象能力需要在實(shí)踐中不斷的練習(xí)、積累經(jīng)驗(yàn)。 對于初學(xué)編程的同學(xué),從現(xiàn)在就開始努力提升吧!
【本文為51CTO專欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號(hào)coderising獲取授權(quán)】