|
轉(zhuǎn)眼工作已經(jīng)四年多了,一直想找個時間總結(jié)一下,卻遲遲懶得動手。今天一定要強(qiáng)迫自己寫出來,不光是為了工作過的四年,也是為了和同樣作技術(shù)的朋友和即將工作的學(xué)友一起共勉。
2000年從大學(xué)畢業(yè),之前也想過考研,由于缺乏對國內(nèi)教育的信心,所以選擇了工作。工作雖然難找,但是那是的我卻對工作十分的挑剔,瞄準(zhǔn)的都是好公司的軟件開發(fā)的職位,這些信心源于大學(xué)時無數(shù)的逃課在圖書管鉆研計算機(jī)技術(shù)(雖然在沒有指導(dǎo)的情況下,很多東西都看不懂,但是強(qiáng)迫自己即使看不懂也要看完,當(dāng)時由于條件所限養(yǎng)成的這個習(xí)慣至今還影響著我的學(xué)習(xí)方式),下課寢室一通電就編程序(不過更多的是打星際爭霸)。憑著阿Q的自信和運氣,還有當(dāng)年計算機(jī)技術(shù)的火熱,我進(jìn)入了一個還不錯的軟件公司。不過遺憾的是不做軟件開發(fā),而是做測試。但是出于對技術(shù)的好奇和不錯的薪水,進(jìn)入了這家公司。
從此不再睡懶覺,每天啃著協(xié)議資料,如饑似渇的學(xué)習(xí)著一切不懂的知識。當(dāng)發(fā)現(xiàn)產(chǎn)品第一個BUG那一刻,終于打開了測試之門。于是開始一個破壞者的歷程,從各種角度摧殘著開發(fā)人員的成果。那時公司的代碼管理還不是很嚴(yán)格,通過說服上司把開發(fā)的產(chǎn)品代碼搞了一份過來,從此每天多了一項功課就是早上一到公司先讀半小時代碼。對于大學(xué)里寫過少許VC程序的我來說,投入到上百萬行的產(chǎn)品代碼中,如同進(jìn)入了一片汪洋大海。不過大學(xué)里方法又派上了用場,看不懂也看。從剛開始的一天讀懂幾行到后來一天讀懂一個函數(shù),再后來就是天馬行空了。大約7-8個月后,終于能把代碼在頭腦里跑了起來。于是,開始學(xué)習(xí)黑客思維,從代碼中尋找系統(tǒng)的缺陷和漏洞,于是我成了產(chǎn)品殺手,無盡的問題在我手下暴露了出來。這期間最大的收獲就是加強(qiáng)了逆向思維能力和代碼閱讀能力。現(xiàn)在,很多搞計算機(jī)的人都把重點放到看一本好書或者學(xué)習(xí)某個工具,如果這些都對你沒有問題,那么需要做的最重要的一件事就是讀代碼。找到該領(lǐng)域最優(yōu)秀代表的源代碼,然后開始像讀書或者看小說一樣去讀。剛開始可能發(fā)現(xiàn)什么都看不懂,沒關(guān)系,一句一句的去讀。再復(fù)雜的代碼都是由基本語法構(gòu)成的。每天堅持,一開始一天讀10行,然后100行,然后1000行,然后10000行。一定要堅持,把讀代碼看作是自己每天必做的功課,你會發(fā)現(xiàn)你的編程和思維能力不知不覺中提高。在讀過了上百萬的代碼之后,代碼在眼里會比任何文檔都清晰。就如同Neo在剎那間可以看到數(shù)字組成的世界。這是我的切身體會,希望能夠?qū)θ匀惶幱趯W(xué)習(xí)階段的XDJM們有所幫助。不過這期間對技術(shù)的鉆研過多,忽略了溝通和交流能力的培養(yǎng),有得就有失,看你如何取舍罷了。在這過程中,看的最多的書就是TCP/IP協(xié)議詳解卷1 (互聯(lián)網(wǎng)原理), TCP/IP協(xié)議詳解卷二(代碼實現(xiàn)),這兩本書到現(xiàn)在還隨時放在我的手邊。
給初學(xué)者的建議:
1. 不管是主攻計算機(jī)的哪個領(lǐng)域,一定要看該領(lǐng)域內(nèi)最權(quán)威的學(xué)習(xí)資料,不要浪費時間到無價值的所謂介紹各種新技術(shù)的泛濫手冊中。
2. 作為一個程序員,代碼是另一種溝通的語言。一定要練就閱讀代碼的能力和習(xí)慣,從代碼中學(xué)習(xí)和進(jìn)步。
測試的日子過得很快,但是終究埋沒不了對寫程序的熱愛,通過打報告,到抱怨,到準(zhǔn)備離職,終于調(diào)到了開發(fā)部分從事軟件開發(fā),從此開始一個真正程序員的生涯。由于讀代碼和測試積累的經(jīng)驗,以及對寫程序的強(qiáng)烈興趣,在軟件維護(hù)的過程中,如魚得水,對系統(tǒng)得理解能力上升到一個新得高度。除了軟件維護(hù),大部分的時間進(jìn)行了新項目的軟件開發(fā)。從一個新手,到理解軟件開發(fā)流程,到項目經(jīng)理,一切的過渡都是自然而然。開發(fā)期間,讀了Linxu內(nèi)核源代碼,F(xiàn)reeBSD內(nèi)核源代碼,GateD代碼,Snort代碼等等,我的開發(fā)領(lǐng)域從TCP/IP協(xié)議棧,到上層協(xié)議,到安全。兩年間寫了超過10萬行的C程序代碼,這些可都是用在網(wǎng)絡(luò)設(shè)備中的代碼。使用過的開發(fā)平臺有Win,pSOS,Vxworks,RtLinux,BSD等,其實不管在哪個平臺開發(fā),只要有一個好的代碼編輯工具,效率都是一樣的。我使用的SourceInsight,編輯和瀏覽代碼非常好用。隨著開發(fā)經(jīng)驗的增長,調(diào)試的時間越來越少,因為代碼調(diào)試前就在頭腦走跑了一遍。這和在學(xué)校的時候邊調(diào)試邊寫代碼完全不同。這里舉個例子,我指導(dǎo)過幾個剛畢業(yè)的學(xué)生做項目。開發(fā)時間過半了還沒有讓他們調(diào)試代碼,而是每天相互走讀各自的代碼。最后集成所有的代碼調(diào)試時間非常短(不到整個項目進(jìn)度的1/10),這幾個學(xué)生都不敢相信自己的代碼跑起來這么順暢和穩(wěn)定。
給初學(xué)者的建議:
軟件開發(fā)中,不要養(yǎng)成靠調(diào)試器去發(fā)現(xiàn)錯誤的習(xí)性。編寫代碼時一定要檢查再檢查,在頭腦中運行沒有問題,再進(jìn)行編譯調(diào)試。
這期間也走過彎路,寫出來和大家一起探討。這兩年來,國內(nèi)很多公司在學(xué)習(xí)印度的CMM軟件開發(fā)流程。開發(fā)時我也深受其影響,如果真的按照其業(yè)界的開發(fā)能力基線水平,我覺得Linux永遠(yuǎn)無法完成。為何微軟不需要CMM,思科不需要CMM。作為一個做軟件外包型的公司,使用CMM沒有任何問題。但是作為一個創(chuàng)新的技術(shù)型公司,沒有任何必要。為了驗證到底可以超出所謂的業(yè)界基線每天幾十行的開發(fā)能力,我在項目開發(fā)中不斷突破自己的能力,最高記錄一天寫了2000行正式代碼,整個項目過程中平均每天達(dá)到300行以上,后來的缺陷率也是遠(yuǎn)遠(yuǎn)低于公司平均水平。再舉個例子,我曾經(jīng)3個月完成的一個功能,后來使用另外的人在另外一個平臺開發(fā),花了兩年的時間還沒有完成。舉這些例子,并不是想說明我有多牛,只是想讓大家明白實際開發(fā)中程序員的差距。看看一個公司的程序員,就知道這個公司有多牛。
給初學(xué)者的建議:
不要受教條的影響,不斷提高自己的能力,超越自己,才是最重要的。
在開發(fā)期間,看過很多關(guān)于代碼的書,有比較爛的,也有好的,現(xiàn)在把看過的覺得不錯的書籍列出來,供大家選擇。
《編程精粹》——很老的一本書,非常好,但一直不明白在國內(nèi)為何還沒有一些非常爛的所謂高手寫的書流行。
《代碼大全(Code Complete)》——結(jié)構(gòu)化編程中的經(jīng)典。
上面這兩本書是進(jìn)入我項目組新員工的必修功課。作為一個程序員,必須要求對代碼向和自己母語一樣的熟練,我認(rèn)為國內(nèi)的技術(shù)水平低下,和優(yōu)秀程序員太少有密切關(guān)系。當(dāng)然,這樣的結(jié)果和國內(nèi)流行的把寫代碼看成低級工作的惡劣風(fēng)氣是密不可分的。為何我們寫的代碼這么多錯誤需要去修改,如果讓大家去寫作文,肯定沒有這么多錯誤,最多也是風(fēng)格和語調(diào)的問題。把計算機(jī)語言練成和母語一樣的熟練,就不會產(chǎn)生那么多的錯誤,但是國內(nèi)又有幾個公司能夠做到這點呢?為了所謂的節(jié)約成本,使用初級的程序員,而后續(xù)無窮無盡的痛苦維護(hù)卻無人關(guān)心,國外公司在這點上就非常的明智,很多都使用編程超過五年的優(yōu)秀程序員。要達(dá)到一個真正程序員,只有靠自己,平和的心態(tài)和清晰的目標(biāo)。
給初學(xué)者的建議:
程序員的大部分時間都在和機(jī)器交流,要求自己使用計算機(jī)語言和使用母語一樣熟練。
不管在哪個領(lǐng)域,寫代碼完成的只是實現(xiàn)每個功能,作為一個程序員,了解本領(lǐng)域的最新動向和技術(shù),也是必修功課之一。不管是不是崗位的需要,都要試著去分析本領(lǐng)域內(nèi)的優(yōu)秀產(chǎn)品實現(xiàn),擴(kuò)大自己的技術(shù)視野。如果你在實現(xiàn)一個模塊,就要去關(guān)注和整個系統(tǒng)的關(guān)系。另外就是和業(yè)界的高手交流,不要說你的周圍沒有高手。找到自己領(lǐng)域內(nèi)知名的技術(shù)論壇,加入感興趣的郵件列表,獲取新的知識,不要成了井底之蛙。
雖然我工作中使用C語言寫程序,但是我學(xué)過Java,C++,Perl等語言,并且嘗試過在結(jié)構(gòu)化語言中使用面向?qū)ο蟮乃枷朐O(shè)計。作為一名技術(shù)工作者,我認(rèn)為要保持開放的心態(tài),接受一切新技術(shù)的優(yōu)秀特征,才能保持進(jìn)步。常看到這樣的信息:計算機(jī)領(lǐng)域技術(shù)進(jìn)步太快,需要不斷學(xué)習(xí)新技術(shù),這句話不要太信以為真。世界最先進(jìn)的產(chǎn)品和軟件,都在使用大量二三十年前的技術(shù)。學(xué)習(xí)任何一種新技術(shù),一定要花點時間追溯其源,否則很容易就亂花漸欲迷人眼了。
在軟件開發(fā)過程中,隨著經(jīng)驗的豐富,不知不覺中就到了項目管理和系統(tǒng)設(shè)計的層次。和其他人不同,我并沒有迷戀于非技術(shù)的管理,而是關(guān)注于真正的技術(shù)。因為我看到周圍太多的人,做完一個項目,就開始往上升,做項目經(jīng)理,并迷戀于管人的工作,不再編程。我?guī)状巫鲰椖拷?jīng)理,又都主動要求去做程序員,去寫程序,我覺得自己的技術(shù)能力還需要鍛煉。這些在短期看來,是有所失的,但是從長期的職業(yè)道路來看,每一步都打扎實,是最大的收獲。項目經(jīng)理,系統(tǒng)工程師這些在我看來都是空有的頭銜,至始至終,我就認(rèn)為要做好一個程序員。今年我主持開發(fā)了產(chǎn)品,從系統(tǒng)設(shè)計,到軟件設(shè)計到實現(xiàn),從技術(shù)到管理,工作起來游刃有余,我這真正體會到幾年的努力沒有白費。如果過早的離開技術(shù)路線,今天就不會有這么高的能力。
給初學(xué)者的建議:
看準(zhǔn)目標(biāo),就要一步一個腳印去實現(xiàn),不要太看重眼前的得失。今天的失去,在明天看來或許就是寶貴的財富。
四年不多也不長,從測試,到維護(hù),到實現(xiàn)一個模塊,到做產(chǎn)品設(shè)計;做過測試工程師,軟件工程師,項目經(jīng)理,系統(tǒng)工程師,技術(shù)專家,現(xiàn)在回想起來,路線十分清晰。但是當(dāng)初在若干個選擇點都有過猶豫,現(xiàn)在慶幸都堅持了下來。現(xiàn)在,別人問我的工作,我會毫不猶豫的回答:我是一個程序員。
后記
斷斷續(xù)續(xù)寫了三天,才寫完這篇文章,其實還有很多東西無法表達(dá),已經(jīng)融入到平時的習(xí)慣中。我現(xiàn)在的目標(biāo)就是做世界最好的產(chǎn)品,寫優(yōu)秀的代碼。寫下這些文字,希望對初學(xué)者有所幫助,同時也鞭策自己永不言棄。
it知識庫:一個程序員的學(xué)習(xí)歷程,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。