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