今天偶爾翻出了大一時候使用的譚浩強《C語言程序設計習題集和上機指導》,發現裏面的代碼格式真的不敢恭維。原來咱們就是看着這些書原本學習成長過來的,固然,他的《c語言程序設計》我以爲還很不錯的,大一的時候,就是這本書帶領我進入了程序設計的世界。這裏我想強調的是,在學習編程的過程當中,若是能閱讀一些高質量的代碼,那將是很是有益的。而高質量代碼的一個最基本的特徵,就是有很是規範的代碼格式。c++
有人可能以爲,代碼格式有什麼重要性,只要程序邏輯正確便可---這是典型的初級人員的特徵。在實際軟件開發中堅持規範的代碼格式,可讓你很是認真嚴謹地對待每一行代碼,對待每個變量、每一行語句、每個函數、類等等的程序構件,這種認真的一絲不苟的精神,是一個優秀的程序員的最基本特徵,它可使你避免不少潛在的犯錯,而且使得程序的可讀性大大加強,讓別人讀你的代碼不只不是一種痛苦,並且是一種享受----這正是我閱讀Berkeley DB的代碼時候的感受。不是我爲咱們的產品吹牛,事實上,優美的讓人賞心悅目的代碼是諸如Apache, Berkeley DB, Linux等等無數優秀開源軟件的共同特徵,閱讀這類代碼,經常是我有一種相見恨晚的感受----爲何大一大二學編程的時候,沒有看這些項目的代碼呢?即便當時沒有所有看完或所有看懂,也會讓我有一種薰陶和感染,對個人程序設計能力有很大的提升!程序員
學習編程語言,和學習人類天然語言很是相似,要多讀多寫。不一樣是,編程語言沒必要聽和說,而且要簡單而規範的多,因此學習起來容易得多。想要成爲一個編程高手,就和想要成爲一個優秀的做家相似,首要的任務就是深入地理解和掌握你的語言,它是你表達思想、描述解決問題的方法的工具。而要想深入掌握一門編程語言,就須要閱讀大量優秀的同語言代碼,學習別人使用這門語言的方法和技巧、對各類語言構造的用法、編程範式、程序設計思想等等。同時伴隨着本身的實踐 ---寫代碼,解決一些實際問題,把你在閱讀優秀代碼中領悟到的應用到本身的程序設計當中去。這種良好的通過實踐驗證有效的使用語言的習慣和方法,會成爲你的寶貴財富,是你的技術能力的重要組成部分,你會少犯不少錯,少走不少彎路,少浪費不少個本能夠呼呼大睡的通宵去調試你那充滿bug的代碼!算法
學習編程,要邊學邊用。程序設計是一個實踐性很是強的工做,若是你沒有寫過一行代碼,而是把c++語言規範滾瓜爛熟,你也未必能寫出優秀的軟件,你很可能成爲趙括之流,只能紙上談兵。當你把C++語言規範滾瓜爛熟的時候,你就好象手中拿到一件超級無敵武器,你知道它有多少種炮管、每種炮管每秒鐘能發射多少枚炮彈,每種炮彈的出口速度、射程、這件武器最高時速是多少,續航有多遠等等,你也知道如何啓動它,加速、減速、剎車、瞄準、發射等等,可是在實際戰場上面當你前方一公里處出現大量可疑的移動物體的時候,你該怎麼辦?要發射呢仍是先觀察,發射會暴露自身目標,更況且多是己方人員或者一羣動物等;可是若是不抓緊時機發射炮彈粉碎那些多是敵人的物體,你可能會被敵人炸成碎片。歸根結底,你只知道這件武器的各類技術性能,可是並不會用它解決實際問題。要知道,不管哪一個職業,你從事這個職業就是要解決實際當中的問題,這樣你才能創造價值。數據庫
因此,學習程序設計,就要學會如何使用你學習的語言來解決實際問題,而且是在解決實際問題的過程當中,逐漸加深對語言的理解和應用能力。好比,C++ 的泛型編程支持,我之前只涉及到使用STL類庫,使用其中的容器和算法,因此對於缺省類模板參數、成員函數模板、成員函數模板重載、部分特化等等的機制,雖然在書本上看到過,可是以爲不容易理解掌握和熟練運用,因此翻完書本以後,也基本上忘記了。而當我不得不使用這些語言機制來解決實際問題的時候,我須要在實際用例下使用這些機制,因而很容易理解他們的用法、用途、以及限制。若是你不面臨解決實際問題,你永遠不知道,在一大堆類模板中有複雜的繼承關係時,同時這個類樹中又有大量虛函數以及虛函數重載的時候,會發生什麼問題,如何解決;或者爲何STL的類庫當中,有不少traits類,而它們的代碼又是那麼簡單而統一,等等。這些複雜的機制和技術,我在這裏不屑說起,由於若是你不須要解決實際問題,你根本不必知道它們,與其花時間記住它們,你不如看一場電影;而當你有解決問題的實際需求的時候,你會不得不查資料,搜網絡,分析如何用C++的各類強大功能解決你的問題,達到你的目的等等,因而你天然對這些機制會很理解。編程
經過上面的文字,我想強調的是,實踐對於學習程序設計過重要了!! 不只如此,實踐對於學習其餘的學問、其餘的「科學和技術」也是極其重要的。之前我經常想:爲何歐美的科技實力老是比咱們強呢,難道他們就比咱們聰明? 爲何咱們老是落後呢?如今我知道了,他們實踐的機會、實踐的意識很是強,他們的政府、NPO、高校、科研機構、企業都在不失時機的創做實踐機會給科研人員,雖然有很多資金投入是浪費了,可是他們學到了經驗和教訓,而更多的項目成功了,得到了巨大的回報;而近二十年,我國至關一部分決策者妄想要走捷徑,用市場換技術,犯了至關大的錯誤。若是咱們本身不去解決實際問題,即便人家把技術資料放在你的案頭,你也仍是比人家落後,由於這個技術你也仍是沒有掌握!因此到如今,咱們的先進飛機、汽車、發動機等等的製造技術,仍是比國外前沿落後不少。遺憾的是,如今的高校計算機教育,對實踐的重視程度還遠遠不夠!學習程序設計、數據結構等課程,平常編程練習題加上一個像樣的大做業就算是所有實踐了,而諸如操做系統、數據庫等課程,有幾個學校會組織學生分組開發一個微型的操做系統或者數據庫呢?網絡
既然實踐很重要,那麼怎麼實踐呢?特別是,在你的計算機教師不那麼重視實踐的時候,在你沒人指導的時候。首先,你能夠下載我上面所說的開源項目的源代碼,和文檔。先閱讀使用文檔,安裝軟件而且使用它,作到可以熟練使用基本功能。而後閱讀附帶的開發者文檔(若是你研究Linux,你會有更大量的資源,有不少源代碼分析之類的書籍),同時在文檔幫助下閱讀代碼,研究這個軟件的設計思想、使用語言工具的方法、使用各類數據結構和算法的方法等等;同時你能夠到這類開源項目的論壇(幾乎都有,我沒見過例外),向開發者提出問題。或者有相關的學習論壇,上面也有不少高手,回答你的問題。當你對這個產品的源代碼有較多理解的時候,你能夠試着給它增長些新功能(它們的論壇上經常有功能請求),或者更改已有功能的實現(根據對性能的抱怨或者錯誤報告)或者修改它的bug,等等。對於一個大三大四的本科生,研究Linux仍是太大了些,操做系統方面你能夠研究一些小型、微型的系統,好比Minix, ecos之類;數據庫你能夠研究Sqlite, Berkeley DB等。若是多我的分組研究系統的各個部分,把結果、經驗、技術信息記錄下來共享,而且在有了必定基礎以後,試着加入本身的想法---別怕犯錯---那麼一個學期的學習以後,你對操做系統、數據庫的原理必定會認識的更加深刻和細緻,而不是一些粗淺的概念。經過這樣增強實踐的學習,我想你對計算機軟件技術會有深入的理解和應用能力。另外,諸如Sourceforge, google code上面有很多開源項目,你能夠組織幾個同窗建立這樣一個項目來完成它,哪怕徹底模仿上面已有項目的設計目標也行,這也是一個極好的鍛鍊的機會。數據結構
遺憾的是,本人也是在後來才認識到了上面所說,而不是在本科學習期間就這樣作了,因此走了很多彎路,經驗不少,教訓也不少。因此,當我認識到這些的重要性以後,我以爲分享給將來的同行是很是值得的,但願對你有所幫助。數據結構和算法