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