十八年開發(fā)經(jīng)驗(yàn)分享:學(xué)習(xí)篇
作為本系列的第一篇,想談?wù)劤绦騿T的學(xué)習(xí)問題。之所以第一個(gè)要談的問題就是學(xué)習(xí),是因?yàn)槲矣X得這個(gè)問題最重要,也是最讓相當(dāng)一部分程序員比較犯愁發(fā)憷的問題。本文如果能給這部分程序員帶來一點(diǎn)幫助或者啟發(fā),那么目的就達(dá)到了。學(xué)習(xí)問題在那篇小結(jié)中寫了一小段,這次可以相對(duì)較為詳細(xì)的談?wù)勥@個(gè)問題了。
既然要談學(xué)習(xí),那么首先需要明確一個(gè)問題,我們打算學(xué)什么?這里先對(duì)這個(gè)紛繁世界中的知識(shí)做一個(gè)分類:
A.教材上的知識(shí)
這部分內(nèi)容來自計(jì)算機(jī)專業(yè)的課程教材。也有可能會(huì)涉及一部分來自其他相關(guān)專業(yè)或者相關(guān)課程的內(nèi)容。
B.編程語言
每一個(gè)程序員只有在會(huì)使用一門語言的情況下才有可能從事開發(fā)工作,所以學(xué)習(xí)并掌握一門語言是最低要求了。
C.SDK
光有一門語言是不夠的,從事任何實(shí)際的軟件開發(fā)都需要一個(gè)類庫(kù)或者開發(fā)包才可以完成。比如C語言中的庫(kù)函數(shù),C#中的.NetFramework類庫(kù),Windows的API等等就屬于這個(gè)范疇。
D.開發(fā)工具
以如今的情況來說,沒有開發(fā)工具理論上也是可以開發(fā)軟件的,但效率就是一個(gè)問題,所以掌握并使用一個(gè)開發(fā)工具完成開發(fā)任務(wù)應(yīng)該也是一個(gè)最低要求。
E.領(lǐng)域知識(shí)
軟件總有用戶,于是開發(fā)這些用戶使用的軟件,那么程序員就需要了解用戶所在行業(yè)的知識(shí),至少需要知道一些基本的必須的知識(shí)。還有一部分的內(nèi)容也劃分為領(lǐng)域知識(shí),比如從事Photoshop這類軟件的開發(fā)那么圖形相關(guān)的知識(shí)就必須了解一些,從事工控軟件的開發(fā),那么對(duì)控制方面的知識(shí)也要有所了解。
以上的分類是在本文中我對(duì)知識(shí)的理解,一個(gè)程序員知道這些知識(shí)后從事一個(gè)軟件的開發(fā)應(yīng)該是沒有問題了。下面分別來討論一下這些知識(shí)的學(xué)習(xí)問題。
一.教材知識(shí)的學(xué)習(xí)
做為一個(gè)已經(jīng)從業(yè)的程序員來說,我不認(rèn)為計(jì)算機(jī)專業(yè)的所有專業(yè)課程(包括專業(yè)基礎(chǔ)課,我在讀大學(xué)的時(shí)候還有這個(gè)說法)都是有用的。實(shí)際上對(duì)于大部分程序員來說,只需要很少的一部分知識(shí)就足夠了。這些知識(shí)主要由三門課程組成:數(shù)據(jù)結(jié)構(gòu),編譯原理,操作系統(tǒng)。對(duì)于大部分的程序員來說,其他課程的內(nèi)容不是沒用,而是在實(shí)際工作中用不上。
數(shù)據(jù)結(jié)構(gòu)這門課程的重要性,可以理解為是程序員的圣經(jīng),怎么如何形容其重要性都是不過過分的。這門課程中需要掌握的內(nèi)容,我個(gè)人觀點(diǎn)如下:
1. 掌握所有線性數(shù)據(jù)結(jié)構(gòu)的知識(shí),比如表,棧,隊(duì)列等(廣義表可以不作要求)
2. 二叉樹的基本操作和基本使用
3. 圖中需要知道遍歷和了解最短路徑算法,以及相關(guān)的一些概念
當(dāng)然對(duì)于某些程序員來說,這是不夠的,因?yàn)閺氖碌木唧w的軟件開發(fā)工作會(huì)有不同的要求。但是對(duì)于大部分從事MIS軟件開發(fā)的程序員來說,這些知識(shí)夠了。掌握這些知識(shí)可以有兩個(gè)層面的要求。第一個(gè)是完成足夠的習(xí)題,從而可以熟練的答題,第二個(gè)是能夠在實(shí)際工作中使用數(shù)據(jù)結(jié)構(gòu)描述實(shí)際的事物。做到這兩點(diǎn)要求應(yīng)該說不算太高,注意多加練習(xí)就可以了。目前來說這門課程的經(jīng)典教材也不少,相信只要按部就班的學(xué)習(xí)完就是合格的了。
編譯原理這門課程主要是學(xué)習(xí)方法和思想而不是課程中的知識(shí)本身。因?yàn)楫厴I(yè)出來能從事編譯器開發(fā)的人實(shí)在是太少太少了。這門課程需要掌握了解的東西不多,我個(gè)人的觀點(diǎn)主要是以下幾個(gè):
1. 確定有限自動(dòng)機(jī)和非確定有限自動(dòng)機(jī)的使用
2. 詞法分析程序的實(shí)現(xiàn)
3. 語法分析的方法
自動(dòng)機(jī)在實(shí)際應(yīng)用中的體現(xiàn)就相當(dāng)于是狀態(tài)轉(zhuǎn)換圖,這個(gè)工具非常的重要,希望能夠務(wù)必掌握。我們?cè)陂_發(fā)EntityModelStudio時(shí),設(shè)計(jì)界面交互部分的內(nèi)容就是先設(shè)計(jì)出狀態(tài)轉(zhuǎn)換圖然后再寫代碼的,否則直接開發(fā)的話就會(huì)面臨開發(fā)失去控制的風(fēng)險(xiǎn),同時(shí)重構(gòu)和維護(hù)也會(huì)相當(dāng)麻煩。所以這個(gè)工具極其強(qiáng)大,非常實(shí)用。另外提一下,非確定有限自動(dòng)機(jī),這個(gè)工具的能力和確定的有限自動(dòng)機(jī)是等價(jià)的。但是由于它的不確定性,更符合人的自然思維習(xí)慣,從而在某些設(shè)計(jì)場(chǎng)合相對(duì)會(huì)方便很多。這一點(diǎn)是很實(shí)用的,也是很吸引人的。
掌握詞法分析程序的實(shí)現(xiàn),可以大幅度拓展開發(fā)能力和思考能力。這部分東西理論上描述可能比較麻煩,但是實(shí)際使用時(shí)還是很容易上手的,所以非常值得學(xué)習(xí)一下。語法分析程序不需要掌握了,畢竟開發(fā)編譯器的機(jī)會(huì)是微乎其微的。但是相關(guān)的方法和思想希望能夠了解,這可以幫助程序員用電腦的思維來思考問題。
操作系統(tǒng)需要掌握的東西只有兩個(gè):
1. 五大管理的基本方法,尤其是涉及內(nèi)存管理的策略
2. 線程或者進(jìn)程的同步技術(shù)
操作系統(tǒng)是復(fù)雜的,但是教材中介紹的這些管理方法相對(duì)來說是簡(jiǎn)單易懂很多了。這一難一簡(jiǎn)之間體現(xiàn)了基本知識(shí)的重要性,基本知識(shí)在實(shí)際開發(fā)中的應(yīng)用的廣泛性。好好的體會(huì),就可以明白用簡(jiǎn)單方法解決復(fù)雜問題的技巧。線程進(jìn)程的同步,這個(gè)就不用多說了,大家都知道它的作用,如果實(shí)在不想掌握的話那我也非常愿意相信你的理由一定是充分的,否則你絕對(duì)不會(huì)那么做。
最后我想強(qiáng)調(diào)的是,無論你如何看待這些知識(shí):可能覺的沒用,可能覺的太難,可能是不感興趣,但是如果你想做程序員的話,那么請(qǐng)你務(wù)必最大可能牢固,最大可能熟練的掌握它。
二.編程語言
對(duì)于一個(gè)程序員來說,一般需要掌握2,3門語言是基本的,并且學(xué)習(xí)一門新的編程語言也是基本功級(jí)別的能力,所以這部分主要談?wù)効焖賹W(xué)習(xí)一門新的編程語言的方法。我學(xué)過的語言有這些(這里編譯器和語言的概念等同了并且不按先后次序):Foxbase,C,C++,匯編,Visual C++,Delphi,F(xiàn)oxPro,VB,C#。就我個(gè)人的體會(huì)來說,這些語言可以分為三種類別:非面向?qū)ο蟮?,面向?qū)ο笠约爸С挚梢暬O(shè)計(jì)的。
這三種類別的語言有一些共同的內(nèi)容,而這些內(nèi)容也是我們?cè)趯W(xué)習(xí)一門新的編程語言時(shí)首先需要知道的,可以說是關(guān)鍵的知識(shí)點(diǎn)。這些內(nèi)容大致如下:
1.常量,變量,數(shù)組,不同的數(shù)據(jù)類型
這部分需要掌握常量,變量,數(shù)組的定義,初始化,不同數(shù)據(jù)類型的使用。數(shù)組中元素的讀寫,作為參數(shù)如何定義,作為返回值如何定義。有些語言還支持?jǐn)?shù)組大小的重新定義。
2.函數(shù)(或者叫子程序)
函數(shù)如何定義(比如參數(shù)和返回值),如何調(diào)用(這里存在異步調(diào)用和同步調(diào)用的問題),全局的還是非全局的。
3.流程控制
分支結(jié)構(gòu):if語句,if else語句,switch語句;循環(huán)結(jié)構(gòu):for語句,while語句,do…while語句,有些語言可能是Loop。
4.最基本的輸入輸出和文件操作
最基本的輸入輸出語句可以幫助你在學(xué)習(xí)語言的過程中完成簡(jiǎn)單程序的練習(xí)任務(wù),比如:輸出到控制臺(tái),dos操作系統(tǒng)中輸出到屏幕等等。文件操作也要知道,至少以后寫個(gè)程序生成日志文件就會(huì)了。
以上內(nèi)容在學(xué)習(xí)一門新的編程語言時(shí),希望能首先掌握,這能讓你很快的入門,并盡快使用新語言寫出代碼。另外還可以關(guān)注一下其他方面的內(nèi)容,比如:
1.了解語言的新特性
這個(gè)階段只需要了解,不需要掌握,記住有這些新特性,在需要用的時(shí)候想起它們就可以了。
2.了解一下幫助文檔中,該語言的所有關(guān)鍵字
這部分內(nèi)容有可能讓你發(fā)現(xiàn)一些很有用的東西。
好了,知道這些內(nèi)容差不多一門新的語言就算入門了。當(dāng)然還有其他很多東西,但是這些內(nèi)容可以在具體開發(fā)中遇到時(shí)再去找例子就可以了。下面談?wù)勥@些語言的差異。對(duì)于面向?qū)ο蟮恼Z言來說,需要知道面向?qū)ο笕筇卣鳎悍庋b,繼承,多態(tài)在具體的一門編程語言中是如何表達(dá)的或者等價(jià)表達(dá)的。對(duì)于支持可視化設(shè)計(jì)的語言來說,還需要知道如何設(shè)計(jì)窗體,以及常用控件的使用。按照這個(gè)方法,從一門已經(jīng)會(huì)的編程語言到學(xué)習(xí)另一門新的編程語言應(yīng)該是比較快的。對(duì)于還在大學(xué)中學(xué)習(xí)的人來說,我的建議是C++或者Pascal中的一個(gè),VB或者C#中的一個(gè)或者其它可視化開發(fā)語言中的一個(gè)學(xué)習(xí)一下。如果可能學(xué)習(xí)一下匯編是最好的。
三.SDK
掌握一個(gè)SDK才能使程序員在掌握一門語言的基礎(chǔ)上進(jìn)行實(shí)際的開發(fā),如果僅僅是一門語言那是不夠的。所謂SDK舉例子來說就是Foxbase的命令和函數(shù),C的庫(kù)函數(shù),C++的類庫(kù)(比如微軟的MFC),Windows的API,.NetFramework,這些都是我所說的SDK。程序員可以根據(jù)自己的實(shí)際開發(fā)需要,有選擇的學(xué)習(xí)相關(guān)的內(nèi)容。我的建議是,可以先google,然后查文檔,一般的問題都可以很快解決的,慢慢的也就逐步掌握了。比如說我不知道C#如何使用線程,那么我就用google查找,關(guān)鍵詞是“C# 線程”,然后從結(jié)果中找到需要的內(nèi)容。很多時(shí)候結(jié)果中的代碼是可以直接使用的。然后再去看一下MSDN的幫助文檔,了解一下相關(guān)的類和方法的說明,這樣這部分的知識(shí)就可以認(rèn)為是掌握了。下次使用時(shí)就知道怎么用了。我的C#就是這么入門的,大概google問了二三十個(gè)問題左右。
另外一個(gè)建議是買一本書學(xué)習(xí)也是可以考慮的,這也是一個(gè)不錯(cuò)的方法,只是買到好的書需要緣分。就我個(gè)人來說,絕大部分的情況下是看電子書,直接從網(wǎng)上下載的。
四.開發(fā)工具
除非你只用獨(dú)立的文本編輯器寫代碼,并且用命令行編譯,否則你一定需要一個(gè)開發(fā)工具,尤其是一個(gè)帶IDE的開發(fā)工具。對(duì)于你使用的開發(fā)工具而言,需要了解的基本內(nèi)容如下:
1. 項(xiàng)目或者工程的創(chuàng)建,屬性修改,打開關(guān)閉等基本操作
2. 具體開發(fā)時(shí)的環(huán)境設(shè)置
3. 項(xiàng)目中的文件組織及管理
4. 常用功能的使用,比如:編譯,執(zhí)行,斷點(diǎn)設(shè)置,代碼跟蹤,調(diào)試信息輸出,實(shí)用的快捷鍵,調(diào)試時(shí)變量查看,查找/替換等等
5. 從幫助文檔中了解IDE的新功能。因?yàn)檫@些功能有可能對(duì)你是非常有幫助的。
6. 幫助文檔的獲取
如果有自己的使用習(xí)慣的話,還可以了解一下如何定制IDE環(huán)境以滿足自己的開發(fā)習(xí)慣。首先了解這些內(nèi)容可以幫助你相對(duì)快一點(diǎn)適應(yīng)一個(gè)新的IDE。
五.領(lǐng)域知識(shí)
一個(gè)從事技術(shù)工作的程序員需要了解與技術(shù)不相干的領(lǐng)域知識(shí),確實(shí)有點(diǎn)無奈。但是在具體的開發(fā)中,不了解這些知識(shí)就無法更好的理解用戶的需求,也無法更好的完成開發(fā)任務(wù)以及與同事領(lǐng)導(dǎo)的溝通。所以這個(gè)步驟是重要的必要的,有時(shí)候有可能還會(huì)帶來更嚴(yán)重的后果。在有些項(xiàng)目中如果不能很好的了解這些領(lǐng)域知識(shí),項(xiàng)目中的成員有可能會(huì)被替換掉,我個(gè)人就有過這樣的經(jīng)歷。所以這里特別列出來強(qiáng)調(diào)一下。
差不多這些知識(shí)應(yīng)該夠用了,下面再提幾個(gè)額外的內(nèi)容,這幾點(diǎn)雖然和開發(fā)不是太直接相關(guān),但是確實(shí)也很重要。它們是英語,數(shù)學(xué),讀源代碼和讀書,有余力的程序員可以盡量提高這幾方面的水平,這是很有用的學(xué)習(xí)途徑和方法。對(duì)于英語而言主要是讀和寫,這樣就可以閱讀英文資料并用郵件,論壇或者聊天工具和老外溝通。由此獲得的幫助是非常顯著而高效的。這里要說明一下,微軟論壇上的回復(fù)的質(zhì)量非常之高。
對(duì)于數(shù)學(xué)我的理解主要是三個(gè)部分,都是很具體的:
1.中學(xué)里學(xué)過的知識(shí)
這部分知識(shí)很重要,這是我們用簡(jiǎn)單方法解決復(fù)雜問題的基礎(chǔ),同時(shí)使用的幾率也非常高。如果全部忘記的話,建議多少?gòu)?fù)習(xí)一下,或者用到的時(shí)候回顧一下。
2.離散數(shù)學(xué)
我需要承認(rèn)在開發(fā)中直接使用離散數(shù)學(xué)知識(shí)的場(chǎng)合我一次都沒有遇到,但是如果沒有離散數(shù)學(xué)的知識(shí),那么我就無法思考,很多問題就無法解決。
3.組合數(shù)學(xué)
這門課程屬于研究生級(jí)別了,相對(duì)難度會(huì)大一些。我的觀點(diǎn)是你不需要全部掌握,知道一部分就可以了,比如:鴿巢原理,母函數(shù),以及常用的計(jì)數(shù)方法和技巧。尤其是技術(shù)方法這部分在問題的分析簡(jiǎn)化,工作量的評(píng)估,算法設(shè)計(jì)以及軟件測(cè)試方面都有非常實(shí)用和具體的應(yīng)用價(jià)值,是很值得掌握的。是否可以使用這部分知識(shí),在實(shí)際工作中表現(xiàn)出來的效果至少相差一個(gè)等級(jí)。
一個(gè)好的源代碼具有不可估量的價(jià)值,潛心學(xué)習(xí)一下可以讓你從一個(gè)門外漢變成一個(gè)開發(fā)老手,所以注重培養(yǎng)從讀源代碼學(xué)習(xí)編程知識(shí)的能力。我的體會(huì)是,閱讀源代是一個(gè)非常有效(有用并且高效率)的方法來提高自己的開發(fā)水平或者解決實(shí)際問題的能力。我第一次認(rèn)真學(xué)習(xí)的源代碼來自當(dāng)初的程序員大本營(yíng)。一個(gè)例子是實(shí)現(xiàn)Visual Studio 6.0中Workspace的界面,另一個(gè)是如何實(shí)現(xiàn)給主菜單加入圖標(biāo)。兩個(gè)例子大概花了我一個(gè)半月的時(shí)間并且寫了幾篇心得,記錄下學(xué)習(xí)的內(nèi)容。應(yīng)該說收獲很大。再比如,下一個(gè)版本的EntityModelStudio中會(huì)加入代碼編輯器,這個(gè)支持語法高亮和行號(hào)的編輯器就是在讀懂開源代碼后我們自己獨(dú)立重新開發(fā)的。在閱讀源代碼的時(shí)候希望能注意兩點(diǎn):
1. 最好能配置好環(huán)境可以單步跟蹤代碼,這樣理解代碼的速度和效果會(huì)好很多。
2. 快速的定位那些自己想看的代碼。這里建議可以使用IDE提供的查找功能,看文件名,類名等方式來定位。如果實(shí)在不行,考慮注釋代碼,來快速定位。
第四個(gè)內(nèi)容是讀書,閱讀是學(xué)習(xí)的一個(gè)最基本和最重要的途徑。在這里我不想列出任何需要閱讀的書目,這是因?yàn)楫?dāng)下流行的所謂經(jīng)典或者著名的開發(fā)書籍我讀得很少,所以也說不出體會(huì)。我看過的書都比較老了,比如:
1. BorlandC++4.5使用及開發(fā)指南
這是我的C++的教材,C++部分先后看了不下6次
2. 一本1970年發(fā)行的軟件工程的書,這是我第一次接觸軟件工程
3. 代碼大全第一版,我覺得第二版沒有第一版好
4. 用于面向?qū)ο蟮脑O(shè)計(jì)和分析方法,這是美國(guó)哥倫比亞大學(xué)的一個(gè)教授寫的。是清華大學(xué)原版教材中的一本,非常好,是OOD的絕好教材。
目前有印象的就這些,以后想到了再補(bǔ)充吧。其他讀過的書還有很多,都是具體的編碼的書就不再一一列舉了。有些書需要仔細(xì)閱讀的,比如講設(shè)計(jì),講方法的書,有些書需要很快的瀏覽完,比如講具體編程的書。我的體會(huì)是,一本幾百頁(yè)的書,你應(yīng)該花1,2小時(shí)就能過一遍,最好是20分鐘到40分鐘就能過完。在實(shí)際開發(fā)中,用到的時(shí)候再看書,查找需要的內(nèi)容。如果你需要花很長(zhǎng)一段時(shí)間全部學(xué)完一本書的話,那么你看的第一本書可以這樣,否則我覺得你的學(xué)習(xí)方法就有問題了。至少一本書中不可能所有的東西都是你馬上要用到的,你沒有必要立刻學(xué)習(xí),所以應(yīng)該學(xué)會(huì)快速閱讀的技巧。當(dāng)然這是個(gè)人觀點(diǎn),取舍對(duì)錯(cuò)自行判斷吧。
你不能寄希望于一次就能買到一本理想的書,也不能希望在一本書中學(xué)到自己需要的所有內(nèi)容。遇到一本好書是需要點(diǎn)運(yùn)氣和緣分的。我的總體感覺是,外國(guó)知名出版社的圖書的質(zhì)量明顯好一些,還有臺(tái)灣一些出版社的圖書也還不錯(cuò)。建議大家可以買一些絕對(duì)知名和權(quán)威的書籍,這樣相對(duì)風(fēng)險(xiǎn)會(huì)小一些。對(duì)于那些書名為XXX大全,XXX寶典,精通XXX,XXX權(quán)威這樣的書,我是很不看好的,當(dāng)然這是自己的看法,僅供參考。
最后說一下不要學(xué)習(xí)的東西,這是在本文發(fā)布前剛發(fā)現(xiàn)的問題。幾天前在群里聊天,一個(gè)人說想解析暗黑的通信協(xié)議,然后做外掛。我對(duì)這方面很不在行,但是這明顯是一個(gè)非常耗費(fèi)時(shí)間,難度也非常大的事情。我在這里給出的建議是,一個(gè)職業(yè)的程序員需要知道自己的價(jià)值,自己的知識(shí)和精力應(yīng)該花在能夠創(chuàng)造實(shí)際價(jià)值的地方。不要僅僅出于愛好或者熱情去做一些成本很大的事情,與其炫耀自己的能力,不如踏實(shí)的做好本職工作。如果實(shí)在想做可以作為業(yè)余愛好,適可而止。
好了這次就寫到這里了,感覺還是有點(diǎn)倉(cāng)促。再次聲明以上內(nèi)容都是一些個(gè)人的看法,限于本人的經(jīng)歷和知識(shí)面,不妥或疏漏之處在所難免,希望同行們能指出來,讓我也提高一下。下一篇的題目暫定為“問題解決篇”,主要介紹如何在工作中使用這些知識(shí)解決實(shí)際問題的方法和心得。
原文鏈接:http://blog.csdn.net/binarytreeex/article/details/8174445