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