每個計算機系畢業(yè)的人,大都學(xué)過不少數(shù)學(xué)課,而且不少學(xué)校的計算機系的數(shù)學(xué)課,通常比一般的其他工科專業(yè)的數(shù)學(xué)要難一些,比如不上高等數(shù)學(xué),而是學(xué)數(shù)學(xué)分析,不上線性代數(shù)而去上高等代數(shù)。但是,大部分畢業(yè)了后去做程序員的人,即使是所謂的名校計算機系畢業(yè)的,大都工作中也基本完全用不上學(xué)的那些數(shù)學(xué),基本上,一半時間在CRUD,另一半時間在處理各類字符串、鏈表、Hash表,知道在面試中回答各種排序的時間復(fù)雜度是他們需要的數(shù)學(xué)的上線了。
而在念書的時候,雖然上大學(xué)之前,有不少內(nèi)行的外行的,年老的年輕的人告訴你,數(shù)學(xué)很重要啊。但是,通常來說,各個學(xué)校的計算機系的同學(xué)么,愛好學(xué)習(xí)的,可能重視的也是Thinking in Java,C++ Primer之類的語言書,或者設(shè)計模式之類的架構(gòu)書,抑或是算法與數(shù)據(jù)結(jié)構(gòu)這些玩意兒;而像我這樣天天偷懶放羊的,也不會把數(shù)學(xué)當作是什么重要的課程好好學(xué)習(xí)。所以,“數(shù)學(xué)真重要”,這句話,似乎對于大家來說,始終只是飄在天上的一句話,隨風(fēng)飄逝了。
于是,五年過去了,程序員們都有了不少的工作經(jīng)驗了,如果不是對工作毫無追求混吃等死的程序員的話,對于天天干活的語言,不論是Java還是C++應(yīng)該都熟能生巧了,所謂的設(shè)計模式、重構(gòu)、自動化測試等等也手到擒來了,大部分人的title上都加上了Senior了,牛一點的后面大概還跟上了一個Manager,然而,大家都開始考慮一個新的問題——“30歲以后怎么半?”,于是,轉(zhuǎn)PM的轉(zhuǎn)PM,考公務(wù)員的考公務(wù)員,像我這樣仍然抱定——“你看人家美國Rohit都50了還不是天天寫程序,別人想請還請不到的”的單純想法的人越來越少了。然后,就算這些人,時不時也會覺得,自己天天干的超越CRUD的,所謂寫點OO的框架,不也是很無聊的體力活么,寫程序的人干兩年誰都會干。于是,又有不少人下海創(chuàng)業(yè)了,多年以后,這些人中的大部分都會和我一樣悲催的沒有掙到前繼續(xù)回來給大大小小的公司寫程序。
其實,杯具往往發(fā)生在一開始,其實,要是咱們當年好好學(xué)習(xí),才會發(fā)現(xiàn),也許數(shù)學(xué)對于你當個不錯的程序員來說,沒那么重要,但是要再往上走一步,有一點點技術(shù)上的創(chuàng)新,就都是數(shù)學(xué)的事兒了。兩年前,我在T公司,用Configurator處理某個程序的時候,開始有點兒意識到這一點了,于是,那陣子還花了不少時間重新翻了翻數(shù)理邏輯。今年,換了新工作后為了工作看點兒機器學(xué)習(xí)的東西的時候,終于發(fā)現(xiàn),這全都是數(shù)學(xué)啊。當你要超越CRUD,做任何一點點有創(chuàng)新性的技術(shù)的時候(不說產(chǎn)品),最有機會遇到的問題,其實是數(shù)學(xué)問題。雖然從Spring到Hibernate到Rails之類的框架,或者Hadoop,HBase之類的分布式計算框架,也都是技術(shù)上的重大革新,但是這些框架類的程序,完善都是階段性的,一旦出現(xiàn)后,很快都會有相應(yīng)的Best Practice,又會成為熟練工種的活。而真正針對問題域的解答,反是每天都可以有些新鮮的想法、思路和方案的,這些,往往有個數(shù)學(xué)的門檻。所以如果你真是挺喜歡寫程序的,而且希望自己一直能寫更好玩更難的程序,總有一天,你要過了這一道坎兒。
所以我很是同意不知道是誰說得,如果你只想當個good programmer,那么數(shù)學(xué)不重要。但是如果你想當個great programmer,那么數(shù)學(xué)很重要。在你手里只有錘子的時候,你看什么東西都會是個釘子,想想你如果沒有學(xué)過算法和數(shù)據(jù)結(jié)構(gòu),可能你的大部分程序需要自己寫排序的話,都會是傻傻地冒泡吧,反正對于大部分程序來說,在現(xiàn)在這么快的PC下,這點時間差別,大部分情況下,也就是讓你等程序執(zhí)行測試的時候,多個倒杯水的時間。但是很多新鮮,好玩,有挑戰(zhàn)的問題,很多數(shù)學(xué)的概念沒有的話,恐怕不是多等個倒水的時間了。而如果你過了這個門檻,你又會發(fā)現(xiàn),一個嶄新的世界,又到了你的面前。
回過頭來,我說數(shù)學(xué)重要的話,那么重要的是哪些呢?大家常說的通常是離散數(shù)學(xué),不過最近比較熱門的機器學(xué)習(xí)這個方向,我目前看到的相關(guān)資料都大量依賴于線性代數(shù)和概率論,以及一點點微積分。所以,如果你和我一樣,希望做點有追求的技術(shù)工作的話,開始花點時間學(xué)習(xí)數(shù)學(xué)吧。其實萬事開頭難,也許你和我一樣,對著一堆公式符號,感到頭暈眼花,但是如果真得按下心來,看上一個小時,這么堅持個一周,其實就會發(fā)現(xiàn),這沒啥難的,就當學(xué)門新的編程語言得了。