編程需要多少數學知識?

數學 數據結構 大學 離散數學 PHP愛好者 2017-04-16

1、從高考題談起

昨天大學同學群裡發了一個鏈接, 點開一看,原來是當年參加高考的數學試卷, 於是饒有興趣的又看了一遍, 讓我感到震驚的是,很多試題連題目都看不懂了!

比如這道題:

編程需要多少數學知識?

再比如這道題:

編程需要多少數學知識?

天吶, 這都是些什麼啊, 我當年到底是怎麼考上大學的?

再聯想到大學學的微積分,線性代數, 離散數學, 除了一些基本概念之外,也忘的差不多了。

數學這麼差 , 竟然在計算機行業待了10多年, 到底是怎麼混的?

2編程中的數學

於是我馬上回顧了下編程中用到的數學知識, 好像少的可憐。

計數的能力: for循環中經常用, 小學生都會。

數字的加減乘除 : 每種編程語言都會內置支持, 都不需要你自己算

餘數和模: 偶爾會用得到

集合運算 : 交集、並集、差集 , 編程中用的不多。

布爾運算: AND , OR, 非

各種進制: 二進制、十進制、十六進制

還有哪些? 我想不起來了, 歡迎補充。

當然這和我從事的編程領域有極大關係, 如果我做的不是Web開發, 而是搜索,遊戲, 安全,算法,人工智能等, 那對數學的要求估計就開始飆升了。

其實計算機的基礎是數學, 只是我們一直在應用層編程, 體會不到罷了。

比如說我們日常使用的計算機,絕大部分都是所謂馮諾依曼結構(參見文章《馮·馮諾依曼計算機的誕生》) ,這個結構可以說是圖靈機這個概念機器的具體實現,而圖靈機就是一個純數學的東西啊 ,沒有圖靈機這麼偉大的抽象作為數學基礎, 現代的計算機是製造不出來的。

(如果對圖靈機和數學感興趣 可以看看《圖靈的祕密》這本書 》

再比如說密碼領域需要很多數論的知識,RSA算法就涉及到大素數的分解;

我們常用的Mysql, Oracle 等關係數據庫的底層基礎是離散數學的笛卡爾乘積;

通信系統中很重要的一個原理就是傅里葉變換。

編譯器會用到有限狀態機;

數據的壓縮會用到各種數學的算法;

項目管理中的進度管理,甘特圖數學基礎就是圖論。

.....

總之,數學在計算機科學(如果能稱之為科學的話) 扮演著非常重要的角色, 是整個學科的基礎。

3不拼數學拼什麼?

具體到應用層編程, 尤其Web開發、企業信息化開發, 整天折騰的是框架和類庫, 用不到這麼多高大上的數學知識, 那到底拼的是什麼?

想想編程中常用的數組,如果是一維數組,做個循環和遍歷, 每個人都能輕鬆應對。 如果要用數組來表示二叉樹,就需要把一個樹形結構對應到線性結構,那難度立刻上升。

如果在編程中需要自己實現鏈表, 就會發現把各個節點的鏈接關係維護好, 需要把指針(引用)調來調去,挪來挪去, 實在不是一件容易的事情。

這樣的能力就是邏輯思維的一種體現。

我們在做系統設計的時候,經常需要總結、分析現實需求, 找到容易變化的部分和相對穩定的部分, 把他們封裝起來,形成核心的概念, 支撐起整個系統, 這是一個抽象的過程,雖然用不到多少數學知識, 但是思維的過程也極不容易。

邏輯思維能力和抽象能力的差別, 能夠區分出程序員的優秀和平庸。

一個優秀程序員寫出的代碼, 接口清晰,容易擴展,易於維護; 一個差程序員寫出的代碼, 思路混亂,完全是一些計算機語句的堆砌, 別人看不明白, 過一段時間自己都看不明白了。

數學系的同學在這兩方面恰恰是長項, 想想看, 數學系同學們整天折騰這麼多“枯燥的”抽象概念, 再去看編程這樣大部分都是具體化的實現, 簡直是分分鐘搞定! 這可能是數學系的轉到編程領域很厲害的原因吧。

邏輯思維能力通過學習數據結構和算法,做數據結構的習題可以得到有效的提高, 抽象能力需要在實踐中不斷的練習、積累經驗。 對於初學編程的同學,從現在就開始努力提升吧!

相關推薦

推薦中...