一篇關(guān)于程序員性格的文章第2/3頁(yè)
更新時(shí)間:2008年04月19日 20:17:29 作者:
軟件開(kāi)發(fā)中人們很少注意個(gè)人性格問(wèn)題。自從 1965年Edsger Dijkstra的有里程碑意義的文章“程序開(kāi)發(fā)是一種人類活動(dòng)”發(fā)表以來(lái),程序員性格被認(rèn)為是合理的和有成效的研究領(lǐng)域,雖然有些題目如“大橋建筑者的心理”和“對(duì)律師行為的研究實(shí)驗(yàn)”看起來(lái)可能是荒唐的,而在計(jì)算機(jī)領(lǐng)域,“計(jì)算機(jī)編程中的心理”和“對(duì)程序員行為的研究實(shí)驗(yàn)”等題目則是常見(jiàn)的。
前二個(gè)方面——承認(rèn)你不知道一些事情或承認(rèn)你犯了一個(gè)錯(cuò)誤是你謙虛的反映。如果你不懂裝懂你又怎么能指望學(xué)到新東西呢?你最好是假裝自己知之甚少,聽(tīng)別人的解釋,向他們學(xué)習(xí)新的東西,并評(píng)估他們是否真正了解其正在談?wù)摰臇|西。
你應(yīng)對(duì)自己的能力作某種程度的估計(jì),如果你對(duì)自己的評(píng)價(jià)很完美,這可是一個(gè)不妙的信號(hào)。
拒絕承認(rèn)錯(cuò)誤是一個(gè)令人討厭的習(xí)慣,如果Sally拒絕承認(rèn)錯(cuò)誤,她看起來(lái)相信自己沒(méi)有錯(cuò),可能會(huì)使其它人相信她確實(shí)是無(wú)辜的,但是事實(shí)證明Sally出錯(cuò)誤了,這樣,每個(gè)人都知道她犯了錯(cuò)誤。錯(cuò)誤正如潮流一樣是一種復(fù)雜的活動(dòng),如果她在過(guò)去沒(méi)有發(fā)生過(guò)錯(cuò)誤,誰(shuí)也不
會(huì)將錯(cuò)誤歸咎于她。
如果她拒絕承認(rèn)錯(cuò)誤,到頭來(lái)她只能自食其果。其他人都知道他們?cè)谕粋€(gè)不誠(chéng)實(shí)的人工作。這比僅犯一個(gè)錯(cuò)誤更令人反感。如果你犯了一個(gè)錯(cuò)誤,你應(yīng)迅速主動(dòng)地承認(rèn)錯(cuò)誤。
對(duì)編譯器錯(cuò)誤信息不懂裝懂是另外一個(gè)常見(jiàn)錯(cuò)誤。如果你不理解某一編譯警告信息或你認(rèn)為時(shí)間太緊迫來(lái)不及檢查,你想想這是不是真正浪費(fèi)時(shí)間?編譯器將問(wèn)題明白無(wú)誤地向你展示出來(lái),而你卻不試圖解決問(wèn)題,我碰到過(guò)不少人在調(diào)試過(guò)程中請(qǐng)求幫助的事,我問(wèn)他們是否有一個(gè)完好的編譯器,他們回答是。于是開(kāi)始解釋問(wèn)題的癥狀,我說(shuō):“這看起來(lái)像是未對(duì)指針進(jìn)行初始比。但是編譯器應(yīng)對(duì)此給出了警告信息。”他們就說(shuō):“哦,編譯器確實(shí)給出了警告信息,我們以為它是指其它事情。”你自己所出的錯(cuò)誤難以蒙蔽別人,也更難以愚弄計(jì)算機(jī),所以你用不著浪費(fèi)時(shí)間這樣做。
另外一種疏忽是當(dāng)你并不完全了解程序時(shí),你“編譯它看是否能運(yùn)行”。在這種條件下,其實(shí)并不意味著程序能運(yùn)行,因?yàn)檫B你自己都不清楚程序的有關(guān)情況。請(qǐng)記住,測(cè)試僅能發(fā)現(xiàn)錯(cuò)誤的存在,而不能保證一定不存在某種錯(cuò)誤。如果你不理解程序,你就不能進(jìn)行深入的測(cè)試,你如果覺(jué)得應(yīng)編譯一下程序以便了解程序的運(yùn)算情況的話,這可是一個(gè)不妙的信號(hào),這可能意味著你不清楚在干些什么。在將你的程序編譯之前你應(yīng)對(duì)其有一個(gè)深刻的理解。
狀態(tài)報(bào)告也同樣是一個(gè)令人反感的領(lǐng)域。如果程序員在最后50%的項(xiàng)目時(shí)說(shuō),程序中 90%是完整可靠的,他們將聲名狼藉。問(wèn)題在于你對(duì)自己的進(jìn)度缺乏了解,你應(yīng)對(duì)你的工作加強(qiáng)了解。但是,你為了迎奉上司而不愿說(shuō)出真實(shí)情況的話,可就不同了。一般來(lái)說(shuō)上司都愿意聽(tīng)到對(duì)項(xiàng)目狀態(tài)的真實(shí)報(bào)告,即使不是他們所希望聽(tīng)到的,如果你的觀察和見(jiàn)解是中肯的,你應(yīng)客觀地將其說(shuō)出來(lái),上司需要有準(zhǔn)確的信息以便協(xié)調(diào)各種開(kāi)發(fā)活動(dòng),而充分的合作是必需的。
和不準(zhǔn)確的狀態(tài)報(bào)告有關(guān)的一個(gè)問(wèn)題是不正確的估計(jì)。典型的情況是這樣:上司問(wèn)Bert要花多少時(shí)間才能開(kāi)發(fā)出一個(gè)新的數(shù)據(jù)庫(kù)產(chǎn)品。Bert和一些程序員交談了一下,討論了一些問(wèn)題,最后認(rèn)為需8個(gè)程序員和6個(gè)月的時(shí)間,但是他的上司說(shuō):“這并不是我們所需要的,你能不能使用較少的程序員在短時(shí)間內(nèi)完成工作?”Bert考慮了一段時(shí)間,并認(rèn)為可以通過(guò)削減培訓(xùn)時(shí)間和假期以及讓每個(gè)人的工作時(shí)間稍微延長(zhǎng)一點(diǎn)來(lái)達(dá)到上司的要求。他于是作出了需6個(gè)程序員和4個(gè)月時(shí)間的估計(jì),他的上司說(shuō):“這就行了。這是一個(gè)相對(duì)較為低優(yōu)先級(jí)的項(xiàng)目。你應(yīng)及時(shí)完成它,因?yàn)轭A(yù)算不允許你超時(shí)?!盉ert所犯錯(cuò)誤在于,他沒(méi)有認(rèn)識(shí)到評(píng)估是不可商量的,他可以將估計(jì)作得更為準(zhǔn)確,但是他和老板的商量結(jié)果并不能改變開(kāi)發(fā)一個(gè)項(xiàng)目所需的時(shí)間。 IBM公司的 Bill Weimer說(shuō);“我們發(fā)現(xiàn)技術(shù)人員一般都能準(zhǔn)確地估計(jì)項(xiàng)目。問(wèn)題在于他們能否堅(jiān)持自己的決定;他們需要學(xué)會(huì)堅(jiān)持自己的意見(jiàn)?!盉ert許諾在4個(gè)月里交付產(chǎn)品而實(shí)際上6個(gè)月才交付產(chǎn)品,肯定會(huì)使他的老板不高興的。時(shí)間一長(zhǎng),他可能會(huì)因妥協(xié)而失去信任的。否則,他會(huì)因堅(jiān)持自己的估計(jì)而得到尊敬的。
如果上司施加壓力要改變你的估計(jì),你應(yīng)認(rèn)識(shí)到?jīng)Q定要怎樣作是上司職權(quán)范圍內(nèi)的事。你可以說(shuō):“看,這是項(xiàng)目的開(kāi)銷,我無(wú)法說(shuō)此開(kāi)支對(duì)本公司是否值得——這是你的工作。我不能和你‘商量”項(xiàng)目所花的時(shí)間,這正如我們不能協(xié)商確定一里究竟有多少英尺一樣——這是不可變更的。你不能商定自然界的規(guī)律,我們只能商定本項(xiàng)目中影響進(jìn)度的各方面,然后重新評(píng)估。我們能減少一些特征,降低性能,分階段開(kāi)發(fā)項(xiàng)目。或者是使用更少的人但時(shí)間延長(zhǎng)一點(diǎn),或者是使用稍多的人,而相應(yīng)地減少一些時(shí)間。”
我曾在一次軟件開(kāi)發(fā)管理討論會(huì)上聽(tīng)到一個(gè)奇怪的說(shuō)法。主講者是一本銷售很好的軟件工程管理書(shū)籍的作者。一個(gè)聽(tīng)眾問(wèn):“你的上司讓你評(píng)估某一項(xiàng)目,你知道當(dāng)你得出準(zhǔn)確的評(píng)估時(shí)你的上司可能認(rèn)為代價(jià)太高而放棄項(xiàng)目開(kāi)發(fā)。這時(shí)你認(rèn)為應(yīng)怎么辦?”主講者回答說(shuō),當(dāng)你說(shuō)服你的上司做出開(kāi)發(fā)項(xiàng)目的決定時(shí),他們就對(duì)整個(gè)情況了如指掌了。
這是一個(gè)錯(cuò)誤的回答。你的上司是負(fù)責(zé)整個(gè)公司的運(yùn)轉(zhuǎn)的。如果開(kāi)發(fā)某一軟件需10O000美元而你的估計(jì)是200000美元,你的公司就不會(huì)開(kāi)發(fā)軟件。這是要由上司做出決定的。上面這位主講者對(duì)項(xiàng)目的開(kāi)支說(shuō)假話,告訴上司將比實(shí)際的要少,他這是在損害上司的權(quán)威,如果你認(rèn)為項(xiàng)目是有前途的,它能為公司帶來(lái)新的重大突破,或能提供有價(jià)值的培訓(xùn),你應(yīng)將其說(shuō)出來(lái)。你的上司也會(huì)考慮這些因素的。你哄騙上司做出錯(cuò)誤的決定將會(huì)使公司蒙受損失。如果你失去了你的工作,你將會(huì)明白你最終得到了什么。
5 交流和合作
真正優(yōu)秀的程序員應(yīng)學(xué)會(huì)怎樣和別人工作和娛樂(lè),編寫(xiě)可讀代碼是對(duì)程序員作為組中一員的要求之一。
計(jì)算機(jī)也就同其它人一樣能讀懂你的代碼,但是它要比其它人更能閱讀質(zhì)量差的代碼。作為可讀性原則,你應(yīng)將修改你的代碼的人時(shí)刻記在心上。開(kāi)發(fā)程序首先應(yīng)同程序員交流,其次則是和計(jì)算機(jī)交流。
絕大多數(shù)高水平程序員喜歡使自己程序的可讀性強(qiáng),并抽出充足的時(shí)間這樣作。雖然只有一些人能堅(jiān)持到底,而且其中一些人還是高水平的代碼編寫(xiě)者,對(duì)開(kāi)發(fā)中程序員級(jí)別的了解,有助于解釋什么地方適合于此原則:
級(jí)別1:初學(xué)者
初學(xué)者是能使用一種語(yǔ)言基本能力的程序員,這樣的人能夠使用子程序、循環(huán)、條件語(yǔ)句和其它許多語(yǔ)言特征。
級(jí)別2:中間者
中間級(jí)程序員有使用多種語(yǔ)言的能力,并且至少非常熟悉某一種語(yǔ)言。
級(jí)別3:專家
編程專家對(duì)其語(yǔ)言或環(huán)境或?qū)@二者有著很深的造詣,這種級(jí)別的程序員對(duì)公司有價(jià)值的,而且有些程序員往往就停留在這個(gè)水平上。
級(jí)別4:大師
大師有著專家那樣的專業(yè)知識(shí),并能意識(shí)到編程只是15%和計(jì)算機(jī)交流,其余85%是和人打交道。一般程序員只有30%的時(shí)間甚至更少。大師所編寫(xiě)的代碼與其說(shuō)是給計(jì)算機(jī)看倒不如說(shuō)是給人看的。真正的大師級(jí)程序員所編寫(xiě)的代碼是十分清晰易懂的,而且他們注意建立有關(guān)文檔。他們也不想浪費(fèi)其精力去重建本來(lái)用一句注釋就能說(shuō)清楚的代碼段的邏輯結(jié)構(gòu)。
一位不強(qiáng)調(diào)可讀性的高水平代碼者可能停留在級(jí)別3的水平上,但是問(wèn)題還不止如此。依作者本人的經(jīng)驗(yàn),人們編寫(xiě)不可讀代碼的主要原因在于他們所編代碼質(zhì)量較差。他們并不是自言自語(yǔ)地說(shuō):“我所編代碼不好,所以我要使其難以讀懂”,而是他們并不能完整地理解自己的代碼以致于不能使其是可讀的,這就使他們只能停留在1或2級(jí)的水平上。我所見(jiàn)的最差的代碼是由一個(gè)任何人看了她的程序后都會(huì)望而生畏的人所編寫(xiě)的。最終,她的上司威脅說(shuō)如她再
不改正就要解雇她。她的代碼是不作注釋的,并且其程序中充滿了如x,xx,xxx,xx1和xx2這樣的全局變量。她的代碼給了她大量的機(jī)會(huì)顯示她的改錯(cuò)能力。
你不必為自己是初學(xué)者或中間者而內(nèi)疚,你同樣不必為自己是專家而不是大師自愧,在你知道怎樣提高自己的水平后,你倒是應(yīng)為自己停留在初學(xué)者或?qū)<业乃缴嫌卸嚅L(zhǎng)時(shí)間而內(nèi)疚。
6 創(chuàng)造力和紀(jì)律
當(dāng)我走出校門(mén)時(shí),我自認(rèn)為是世界上最好的程序員。我會(huì)編輯令人容忍的井字游戲程序,也能用 5種不同的計(jì)算機(jī)語(yǔ)言編寫(xiě)一個(gè) 1000行的WORKED程序。然后我進(jìn)了 Real World 公司。我在 Real World 公司的第一個(gè)任務(wù)是閱讀和理解一個(gè) 200000行的 Fortran程序,然后我使其運(yùn)行速度提高了2倍。任何真正的程序員將會(huì)告訴你所有結(jié)構(gòu)化編碼將無(wú)助于你解決問(wèn)題。
“Real Programmers Don't write Pascal”
向一位剛走出校門(mén)的計(jì)算機(jī)科學(xué)畢業(yè)生解釋為何需要約定和工程紀(jì)律是困難的。當(dāng)我還是一個(gè)大學(xué)生的時(shí)候,我所編寫(xiě)的最大的代碼是5O0行的可執(zhí)行代碼,作為一個(gè)專業(yè)程序員,我也已編寫(xiě)了許多小于500行的實(shí)用工具,但是一般項(xiàng)目的長(zhǎng)度為5000到25000行,并且我參加過(guò)超過(guò)50萬(wàn)行的項(xiàng)目的開(kāi)發(fā)工作,這種類型的工作不是需要較高的技巧,也不需要使用新的技巧。雖然一些有創(chuàng)造性的程序員將各種標(biāo)準(zhǔn)和約定視為對(duì)其創(chuàng)造力的阻礙,但是,對(duì)大項(xiàng)目來(lái)說(shuō),如果沒(méi)有標(biāo)準(zhǔn)和約定,項(xiàng)目的實(shí)現(xiàn)是不可能的,而此時(shí)要發(fā)揮創(chuàng)造性也是不可能的。不要在一些無(wú)關(guān)緊要的領(lǐng)域建立約定,這樣你就可在你認(rèn)為值得的地方集中發(fā)揮你的創(chuàng)造力。
McGarry和 Pajerski在對(duì)美國(guó)宇航局的軟件工程實(shí)驗(yàn)室過(guò)去15年的工作回顧中說(shuō),強(qiáng)調(diào)紀(jì)律的方法和工具是非常有效的。許多有很高創(chuàng)造力的人都能很好地遵守紀(jì)律,高水平的建筑師在材料的物理性能、時(shí)間和代價(jià)的限定范圍內(nèi)進(jìn)行工作。藝術(shù)家同樣如此,許多看過(guò)Lenoard的設(shè)計(jì)的人,都為他在細(xì)節(jié)上對(duì)約定的遵守產(chǎn)生由衷的敬重。當(dāng)米開(kāi)朗琪羅設(shè)計(jì)天花板時(shí),使用了各種均衡的幾何形式如三角形、圓周和正方形,他按一定層次將以上三種圖形安排在三個(gè)區(qū)域,如果沒(méi)有自我約束和結(jié)構(gòu),這300個(gè)人物的排列將是混亂的而不是有機(jī)地結(jié)合在一起的藝術(shù)杰作。
一個(gè)杰出的程序員需要遵守許多規(guī)則。如果你在開(kāi)始編碼之前不分析需求就進(jìn)行設(shè)計(jì),你將在編碼過(guò)程中學(xué)不到關(guān)于項(xiàng)目的許多東西,你工作的結(jié)果看起來(lái)更像一個(gè)三歲小孩的手指畫(huà),而不是一件藝術(shù)作品。
7 懶 惰
懶惰表面形式有以下幾種:
拖延自己討厭的工作
迅速地將自己討厭的任務(wù)做完以擺脫任務(wù)
編寫(xiě)一個(gè)工具來(lái)完成自己討厭的工作以解脫自己
當(dāng)然,有一些懶惰形式要比其它方式好一些。第一種方式是沒(méi)有任何益處的。你可能有這樣的體會(huì):你常?;ㄙM(fèi)幾小時(shí)來(lái)做一些沒(méi)必要作的工作,而不愿面對(duì)自己所無(wú)法避免的次要的
工作,我討厭數(shù)據(jù)輸入,但是許多程序需要少量的數(shù)據(jù)輸入。別人都知道我已拖延了數(shù)天的工作僅因?yàn)闉榱送涎訜o(wú)法擺脫的用手工輸入幾個(gè)數(shù)據(jù)的任務(wù),這種習(xí)慣是“真正的懶惰”,你編譯某一子程序以檢查有關(guān)情況,這樣你可以避免人工檢查程序同樣也是一種懶惰行為。
這些小任務(wù)并不像看起來(lái)那樣令人反感,如果你養(yǎng)成馬上完成這些任務(wù)的習(xí)慣你就能克服拖延這種懶惰。這種習(xí)慣叫“明懶惰”——懶惰的第二種方式,你仍然是懶惰,但是你是通過(guò)在自己所討厭問(wèn)題上花費(fèi)盡量少的時(shí)間來(lái)避開(kāi)問(wèn)題的。
第三種選擇是編寫(xiě)工具來(lái)做這令人討厭的工作。這是“長(zhǎng)期懶惰”。它無(wú)疑是懶惰中最有積極性的一種形式,只要你通過(guò)編寫(xiě)工具最終節(jié)省了時(shí)間,通過(guò)討論可知,一定程度的懶惰是有益的。
當(dāng)你不是透過(guò)玻璃看問(wèn)題的時(shí)候,你就看到了懶惰的另一方面。“趕著做”或“努力”并不能發(fā)出炫目的光芒。趕著做是一種多余和沒(méi)有必要的努力。它只是說(shuō)明你的焦急而不是你進(jìn)行工作的努力程度。在有效編程中最為重要的現(xiàn)象是人們?cè)谒伎贾型@得并不忙。如果我和一位看起來(lái)一直很忙的程序員一起工作,我將認(rèn)為他并不是一位好的程序員,因?yàn)樗⒉皇窃谑褂脤?duì)他來(lái)說(shuō)是最有價(jià)值的工具和自己的頭腦。
8 不是你想象中那樣起作用的性格
“趕著做”并不是唯一的一種看起來(lái)可能受敬重而實(shí)際上并不起多大作用的性格。
堅(jiān)持
依賴于環(huán)境,“堅(jiān)持”可能是一筆財(cái)富也可能是一種不利條件,和其它許多多義概念一樣,對(duì)它有不同的解釋,這取決于你認(rèn)為它是一種好的特性或壞的。如果你想將堅(jiān)持定義為壞的性質(zhì),你可能說(shuō)它是“頑固”,如果你認(rèn)為是一種好的品格,你可稱其為“堅(jiān)強(qiáng)”或“堅(jiān)持”。
在大多數(shù)情況下,軟件開(kāi)發(fā)中的堅(jiān)持是頑固的意思,在你碰到某段新代碼時(shí),你再固執(zhí)己見(jiàn)并不是什么好事。你應(yīng)試著用另一個(gè)子程序,用另一種編碼方法,或返回原來(lái)的地方,當(dāng)某種方法并不起作用時(shí),你應(yīng)換用另一種方法。
在調(diào)試中,當(dāng)你終于發(fā)現(xiàn)一個(gè)煩擾你達(dá)4小時(shí)之久的錯(cuò)誤時(shí),你一定感到非常滿意。但是如果你在一段時(shí)間——通常為15分鐘沒(méi)有取得任何進(jìn)展時(shí),你應(yīng)放棄找錯(cuò)。用你的潛意識(shí)去思考問(wèn)題,嘗試用別的方法解決問(wèn)題,重寫(xiě)全部令人厭煩的代碼段。當(dāng)你的精神有所恢復(fù)時(shí)重新回到原來(lái)的問(wèn)題上。和計(jì)算機(jī)錯(cuò)誤作斗爭(zhēng)是不明智的,你應(yīng)盡量避免它們。
知道在什么時(shí)候放棄是困難的,但是這是你必須面對(duì)的一個(gè)問(wèn)題。當(dāng)你覺(jué)得自己受挫折時(shí),你可向自己提出這個(gè)問(wèn)題,你問(wèn)問(wèn)自己并不意味著放棄,但可能意味著是對(duì)自己的行動(dòng)設(shè)置規(guī)范的時(shí)候了:“如果我不能用這種方法在30分鐘時(shí)間內(nèi)解決問(wèn)題,我將用幾分鐘時(shí)間考慮不同的方法,并在下一小時(shí)內(nèi)嘗試不同的方法。
經(jīng)驗(yàn)
相關(guān)文章
提示缺少“S2CSplash.DLL"的解決方法,下載此文件放到才程序目錄即可
提示缺少“S2CSplash.DLL"的解決方法,下載此文件放到才程序目錄即可...2007-08-08由于mysql運(yùn)行權(quán)限導(dǎo)致無(wú)法找到 Discuz! 論壇數(shù)據(jù)表! 的解決方法
由于mysql運(yùn)行權(quán)限導(dǎo)致無(wú)法找到 Discuz! 論壇數(shù)據(jù)表! 的解決方法...2007-11-11搶救你快報(bào)廢的壞硬盤(pán)!(死馬當(dāng)活馬醫(yī))
搶救你快報(bào)廢的壞硬盤(pán)?。ㄋ礼R當(dāng)活馬醫(yī))...2007-02-02搞定windows關(guān)機(jī)慢 等待時(shí)間過(guò)長(zhǎng)的問(wèn)題
長(zhǎng)期以來(lái),Windows 系統(tǒng)緩慢的關(guān)機(jī)速度一直為人詬病,用戶往往需要等待很長(zhǎng)時(shí)間才能把系統(tǒng)關(guān)閉,這一問(wèn)題在Windows Vista中也沒(méi)有得到很好的解決2008-08-08