1. 程式人生 > >作為一個程序員,數學對你到底有多重要

作為一個程序員,數學對你到底有多重要

問題 般的 情況下 離散 重構 tle 情況 單純 重新

 每個計算機系畢業的人,大都學過不少數學課,而且不少學校的計算機系的數學課,通常比一般的其他工科專業的數學要難一些,比如不上高等數學,而是學數學分析,不上線性代數而去上高等代數。但是,大部分畢業了後去做程序員的人,即使是所謂的名校計算機系畢業的,大都工作中也基本完全用不上學的那些數學,基本上,一半時間在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下,這點時間差別,大部分情況下,也就是讓你等程序執行測試的時候,多個倒杯水的時間。但是很多新鮮,好玩,有挑戰的問題,很多數學的概念沒有的話,恐怕不是多等個倒水的時間了。而如果你過了這個門檻,你又會發現,一個嶄新的世界,又到了你的面前。

  回過頭來,我說數學重要的話,那麽重要的是哪些呢?大家常說的通常是離散數學,不過最近比較熱門的機器學習這個方向,我目前看到的相關資料都大量依賴於線性代數和概率論,以及一點點微積分。所以,如果你和我一樣,希望做點有追求的技術工作的話,開始花點時間學習數學吧。其實萬事開頭難,也許你和我一樣,對著一堆公式符號,感到頭暈眼花,但是如果真得按下心來,看上一個小時,這麽堅持個一周,其實就會發現,這沒啥難的,就當學門新的編程語言得了。

作為一個程序員,數學對你到底有多重要