5年程序人生路:從新手到項目管理
本人普通院校,非計算機專業(yè)本科畢業(yè)。從畢業(yè)到現(xiàn)在也工作有五年了?;貞浧鸪绦蛉松?,也頗有一翻滋味。
本人是從大三上學期開始學習計算機的,因為那時電腦突然一下比較普及,本人家里也有能力買臺電腦。買了電腦后,***看的是C語言的數(shù)據(jù)結構。用電腦調試書里面的各種程序,那時***次看數(shù)據(jù)結構,我接近全力去看,但是沒看懂多少東西。只是把書里面的代碼敲了一遍,運行后看看是否和書里面說的結果是一樣。但很多時候,***次都是沒通過調試的,發(fā)現(xiàn)不是這里抄錯了,就是那里抄錯了。通過不斷的查找,***才能運行正確,那時心里就會才生少許的成就感,感覺自己寫的程序調通了(雖然只是照著抄了一遍)。看完數(shù)據(jù)結構(其實有很多東西還是不懂),我去找了本計算機組成原理來看。結果看得自己更加模糊。因為這本書里沒有代碼,只有一些抽象概念,當時好像只記得CPU有幾個寄存器尋址,還有些補碼,反碼什么的。那個書又厚,硬著頭皮翻了一遍后就沒看了。接著買了本操作系統(tǒng)原理來看。也是很難看,都是些概念的東西,又沒代碼調試。比如什么GDT,虛擬內存分段,分頁,實模式,保護模式,中斷等等。也是硬著頭皮翻一遍,能懂多少是多少??赐旰?,接著就看那個編譯原理,因為網(wǎng)上都說懂編譯原理的人都很牛,我也希望變成牛人所以也去搞了本回來看。結果發(fā)現(xiàn),能懂編譯原理的人,確實比較牛。里面涉及到自動機的概念。屬于用計算機來做人工自能的范疇。我也很想成為牛人,硬著頭皮看,結果還是有心無力。經(jīng)過這樣一個過程,雖說很多都不懂,但卻使我對編程從一無所知到有了一種模糊的認識。大概懂得了什么叫做內存分配,還有程序的那些字母符號是怎么被計算機執(zhí)行的。這時回頭把原來的數(shù)據(jù)結構翻出來再讀一遍,突然發(fā)現(xiàn)這本書比起其他三本都容易,也很好懂。明白了什么叫做算法,并且可以嘗試去實現(xiàn)自己想的一些算法。當時的自豪感油然而生。感覺電腦可以按照我的想法去工作了,非常興奮。雖然那時我并不懂得多少C語言,對指針也只大概知道是什么東西,實際中還是不會應用。但至少可以利用我所知道的,來實現(xiàn)我所想到的。在當時一股沖動之下,寫了幾個自己記憶由心的算法:
1,從1到100,每數(shù)到7的時候,把該數(shù)字提出來,剩下的數(shù)字繼續(xù)循環(huán),問***剩下的一個數(shù)字是多少。我記得好像是50。
2,任意輸入數(shù)字,和“+ - * / ( )”幾個符號組成一個算術表達式,計算出值是多少。
3,記得看過計算機組成原理里面有個磁盤調度算法,用的是現(xiàn)在電梯常用的電梯算法。感覺這個算法很好,就去用C語言實現(xiàn)了一遍。
剛開始寫程序,都是一個main函數(shù)全部搞定。慢慢的,在算法實現(xiàn)的過程中發(fā)現(xiàn),如果一個算法太大,一路寫下去,代碼會很長,并且很容易想了前面就忘后面該怎么寫,或者寫到后面,忘了前面寫的是什么。 這時,就產生了一種想法,就是剛開始設計算法的時候,想好哪幾步,然后每一步用一個函數(shù)代替。main函數(shù)中只是分步函數(shù)的流程控制。這樣main函數(shù)的代碼就大大的減少,邏輯變得非常清晰。然后可以像填空一樣把每個分部函數(shù)完成。接著在子函數(shù)里面還可以分成子函數(shù),分到后來,發(fā)現(xiàn)很多函數(shù)可以被其他的函數(shù)調用。達到重用的目的。記得當時發(fā)現(xiàn)這個方法后,也是異常的興奮。這種方法居然被自己想到了,感覺自己真是個人才。因為自己是非計算機專業(yè),想找編程的工作,起碼要有一個東西證明自己是學過計算機的。所以在這期間報考了那個高級程序員(高程),因為要考試,所以學習了一些匯編之類亂七八糟的東西??荚嚭孟穹譃楣P試和上機,但是現(xiàn)在已經(jīng)忘記是哪一個沒過了。郁悶!沒過之后,不甘心,就去報了個計算機等級考試(3級,互聯(lián)網(wǎng)技術),結果不出意外,將證書收入囊中(不過現(xiàn)在想想,一點都沒用上。拿回來后,從來都沒給人看過,現(xiàn)在都不知道放到哪里去了)。
搞完這些,自己大三也差不多結束了。自己也知道到了大四要開始找工作,所以不能自己專門去研究什么算法。那個東西當不了飯吃。所以要搞一些比較流行的東西,起碼需要混到一個工作。所以那時就搞了一本“C#入門經(jīng)典”。因為那時聽說.NET比較流行,好找工作。并且對于一個新的東西,我比較喜歡找一些名字上有“入門”兩個字的書(這樣的書里面一般都會很詳細的告訴你如何搭建調試環(huán)境)。因為程序這個東西,你首先要能夠搭建一個調試環(huán)境,光靠看是看不出什么東西來的。后來感覺這本書還不錯,不枉費我100塊大洋。從中學到了一些.NET的基本用法。并且對面向對象講得比較詳細?!懊嫦驅ο蟆蹦且徽挛乙埠苷J真的反復看了好幾遍,因為那時03年面向對象非常熱門,網(wǎng)絡上面到處是“面向對象”幾個字,感覺編程高手都是會面向對象。我也想成為高手,所以我就抱著一種不搞懂不罷休的氣勢去看。結果,只是記住了面向對象的語法。書中和網(wǎng)上舉得例子也很簡單,多半是些動物是抽象類,然后,分什么雞,鴨,鵝之類的去繼承,然后動物都有吃飯的接口,鴨子有游泳的接口, 此類等等的例子??戳税胩欤矝]弄明白這些對于我寫程序有多大的作用。后來,從書上抄了一份網(wǎng)站購物車的程序,認識到了WEB的開發(fā)流程,感覺自己也可以上路了。因為當時才大四上學期,也沒有到處發(fā)簡歷。只是在網(wǎng)上留意一些招聘信息。當時也是在CSDN里面,看到一個本地的公司在招人的帖子,公司很小,剛起步。我想應該不會要求很多,我也就去應聘試試,希望自己能夠應聘上,這樣至少能夠證明自己有資格成為程序員。應聘的時候,老板問了一些問題,多半是WEB開發(fā)方面的技術問題。由于那時我對WEB只是剛剛接觸,懂的不多。好像當時有一半以上都沒回答上來。走的時候,我把我從書上抄的那份程序放到電腦里運行出來給他看了看。大言不慚的說者是我寫的。他看了看,點了點頭,然后就回去等消息。我是星期五去面試的,星期天公司打電話讓我星期一去上班。聽到這個消息后,心里莫名的激動。請同寢室的哥們大吃了一頓。大家也都為我能這么早找到工作感到高興。后來,就是白天到公司實習,晚上回寢室睡覺。工作后慢慢的,那種興奮感就消失了,取而代之的是工作壓力,由于做WEB開發(fā),服務端的C#還好說一點,但是前臺用到很多的是HTML和JAVASCRIPT,當時對這個知道的很少,只能一邊翻書,一邊做事。要達到老板的要求,每天都八點左右才能搞完下班。
工作漸漸展開之后,就是平靜如水的生活,每天上班,吃飯,睡覺,日子也過得很快。剛開始,由于懂得東西少,所以每次任務下來后,都是積極的去完成,因為害怕自己做不完。但是漸漸的,當自己清楚該怎么做的時候,人會產生疲倦,因為每天都做一些差不多的勞動。慢慢的,做事情就喜歡拖拉了。當分配一個任務后,自己先估量一下這個工作自己大概需要多久,一般老板給的時間會多很多。所以喜歡把工作先放著,去看看網(wǎng)頁,逛逛論壇什么的,等到剩下的時間差不多了,需要開始工作了,就懶洋洋的進入工作狀態(tài),但是往往完成工作質量都不怎么好,很多提交后會有些BUG。不過我也沒怎么在意。因為和老板關系好嘛,像我這樣,再怎么說也屬于元老級別的。就這樣慢慢的工作了幾年。因為小公司什么都要做,技術也積累了很多。包括各種主流數(shù)據(jù)庫的用法,.NET,CSS,JAVASCRIPT,PHP,JAVA,perl,FLASH, 等等,其間,自己獨立開發(fā)項目的時候,總想找出一種架構,加快自己下一個項目的開發(fā)進度。但是每次開發(fā)完后,發(fā)現(xiàn)上次設計的架構真垃圾。開發(fā)過很多項目,每次都想了一些新的架構方法。到現(xiàn)在沉淀下來的還值得用的架構思想也沒多少。記得在做JSP的時候,感覺JSP里面服務端代碼和HTML混在一起,很難看。不如.NET的事件驅動好用。就去寫個模塊,讓JSP也實現(xiàn)事件驅動的模式。結果寫到后來,也沒得到什么好處,并且感覺有點不倫不類,
后來項目慢慢做大了,才漸漸明白面向對象的用意。當一個項目很小,邏輯很簡單的時候,用面向對象的方法設計用處不大,反倒是組件用處更大。因為項目小,基本上都是建幾張表,改改HTML的工作。但是項目一大,邏輯變復雜了,如果你要理清楚邏輯,這里就需要一種方法論。我一開始寫算法的那種方法有點不適用了。原來那種是從頂層開始,向下細分。是一種至上而下的設計方法。而面向對象不是,它是一種由點及面的設計方法。面向對象是先找出一個個對象點,然后再找出每個點之間的關系。在實際的項目中,你很難從上至下的設計。因為項目需求往往剛開始很不全面,很多項目后來改得都是面目全非。從上至下的設計不適合這種平凡的修改。并且當需求很大時,他涉及東西太多,你也很難從一個俯視的角度去全面的看這個系統(tǒng)。所以從上至下的設計不能滿足要求。打個比方,記得一個項目已經(jīng)做了80%,結果客戶覺得用得不方便,要改一下。很多原來做的功能都不需要,并且提了幾個新功能。但這幾個功能也只是對原來的功能稍加改動。但是邏輯上看卻是大相徑庭。人腦不是電腦,如果想著這個代碼,去改那個代碼,勢必到后來讓自己也搞糊涂了。所以需要抽象出幾個對象出來,是按照客戶的思維方式。然后抽象出來的對象里面包含原來的功能。這樣做起來就事半功倍。
在工作的磨練中,慢慢的發(fā)現(xiàn)了普通的程序員與優(yōu)秀的程序員的一些差別:
1, 普通的程序員遇到問題喜歡張口就問別人,問之前沒經(jīng)過大腦想想。這是一個不好的習慣。其一,自己都沒仔細想想,就算別人幫你把問題解決了,你自己不多久就會忘記。下次遇到,照樣是不會。因為這個問題你沒有經(jīng)過大腦。其二,能夠回答你問題的人,多半是有一定經(jīng)驗了。他們或許很會安排好自己的事情,管理好自己的時間。如果時常去打斷他們,他們會覺得你很煩。
優(yōu)秀的程序員多半會先到網(wǎng)上查找一下相關問題,看看網(wǎng)上有沒有相關解決方法。經(jīng)過一翻查找,他會把這個問題記得比較牢。
2,在一個項目的合作開發(fā)中,普通程序員往往只了解自己開發(fā)那方面的東西。項目做完后往往對整個項目有哪些功能都不太清楚??赡軙腥吮г?,自己工作都做不完,哪有時間去了解整個系統(tǒng)。但現(xiàn)實多半是,花大量的時間去網(wǎng)上閑逛,卻不愿花時間去增進知識。 如果總認為項目的設計是設計者的工作,自己沒必要去了解。那么這樣的程序員只能是手工勞動者。
優(yōu)秀的程序員會對整個項目有認識,對一些自己感興趣的功能會去做一下了解,更優(yōu)秀一點的,會去對整個項目的架構設計做一下了解。自問如果他是項目設計者該怎么做? 去學習項目設計的優(yōu)秀之處,去發(fā)現(xiàn)設計的不足之處。觸類旁通,把優(yōu)秀的地方用在自己將來的工作當中。
3,普通程序員往往有很大的惰性。不能自覺的去學習知識,增進能力。所以每天耗費大量的時間在一些消遣狀態(tài)中。所以時間往往白白的浪費掉。
優(yōu)秀的程序員往往會安排好自己的工作和學習。在工作中學習,在學習中工作。能夠感覺到自己每天都向著自己的目標在前進,狀態(tài)佳,動力足。他們因為每天工作情緒很高,所以研究的東西也多,時間比較寶貴。因此他們會善于利用一些工具來操作自己的電腦,大大來的減少瑣碎的電腦操作時間。更有勝者,會開發(fā)一些符合自己的操作習慣的小程序,來提高自己的效率。說不定這些小程序放到網(wǎng)上共享,可能還會有意想不到的收獲。
我現(xiàn)在做項目管理員,看著手下的程序員,時常也讓我想起原來做程序員時候的壞毛病。比如,上班遲到啊,工作時間上網(wǎng)閑逛啊,交上來的程序BUG成堆啊...!看到這些,我時常都是會心的笑笑,可以理解! 不過我也時常提醒他們,如果你們想將來成為IT界的精英,而不是等到30歲感覺自己無路可走,那么請你們珍惜自己的時間。如果你們自己都不珍惜自己的時間,那么別人更不會去珍惜你的時間。
今天花了兩個多小時,寫了一篇短篇自敘。感覺值得,把自己五年多的光陰回顧了一遍。從前的故事歷歷在目。寫下來過五年后再來回顧一下,說不定會是另一番感受。
【編輯推薦】