為什麼要學CS理論呢?成天研究MSO=MSO0一類的問題對一個程式員的職業發展到底有什麼好處呢?知道Ranked Tree Automata和Unranked Tree Automata的互換又怎麼樣呢? 不知不覺學習形式化方法一年多了,學了一大堆數理邏輯和自動機理論,可計算性和複雜性理論也多學了不少。 這些理論除了有趣,有沒有什麼實用的價值呢?我不過是一小小程式員,沒有能力也沒有打算在CS理論方面一展身手。既然這樣,難道這一年多來在工作之餘狂讀論文不過是出於個人興趣?我好像還沒有那麼純潔吧? 還好,隨著學習的逐漸深入,我好像悟到了一些理論的現實意義:
1。學習理論能拓展我們總結一般規律的能力。一個優美的理論總能用很少的元素涵蓋廣泛的現象,包括理論產生時還沒有出現的情況(實際上,合格的理論必須有預見能力)。比如雖然Lambda Calculus只有7條公理,但它的表達能力和圖靈機等價。換句話說,實現了Lambda Calculus的程式設計語言(比如LISP)儘管句法簡單,卻能和基於圖靈機的語言(比如C++)一樣強大。而在程式設計方面,一個好的設計也應該能處理一般情況,而不是一堆特例。比如如果一個程式裡有大量分散而臃腫的case..switch或者if..else,這個程式多半有問題。進一步說,理論學習能訓練我們抽象的能力。關於抽象能力和理論的關係,這篇文章說得很清楚。
2。學習理論能訓練我們洞察不同事物間聯絡的能力。很多時候,我們編程的目的無非是把一種形式的資訊轉化為另一種形式的資訊,而且這種轉換往往受到計算資源的限制。理論恰恰關注事物間的聯絡。比如討論樹的時候,能不能只討論二叉樹,或者NFA是否很DFA等價。
3。學習理論讓我們能迅速掌握電腦的前沿動態。沒辦法,現在發表的論文往往用形式化的方法表達研究結果。沒有一定的理論只是,還真看不懂,更不用說和論文的作者討論了。別告訴我看論文不重要。要開發出別人開發不出的軟體,廣看Dr. Dobb's Journal 是遠遠不夠的。
嗯,能想到就這麼多了。哪位高人來指點一下迷津就好了。