轉(zhuǎn)自:http://blog.sina.com.cn/s/blog_682dc7810100kytu.html
對(duì)我來(lái)說(shuō),一個(gè)好的程序員的定義應(yīng)該是渴望更少錯(cuò)誤的代碼。 一些人也許認(rèn)為好的程序員是那些懂得多門編程語(yǔ)言,懂得很牛技術(shù)的程序員,是的,這在某些情況下是對(duì)的。但歸根到底,無(wú)論你用什么樣的技術(shù),什么樣的語(yǔ) 言,所有的程序被寫出來(lái),其功能都要盡可能地沒(méi)有錯(cuò)誤。 如果一個(gè)能力普通的程序員有足夠多的時(shí)間來(lái)做測(cè)試和發(fā)布程序,那么,其所有的代碼都會(huì)是沒(méi)有錯(cuò)誤的。
但是,很明顯,所有的已經(jīng)開(kāi)發(fā)出來(lái)項(xiàng)目都是在不完美的條件下開(kāi)發(fā)出來(lái)的,一般來(lái)說(shuō),幾乎所有的項(xiàng)目都是在壓榨程序員去盡可能地達(dá)到最大化軟件產(chǎn)品成 果。而且,軟件工業(yè)界對(duì)于深度測(cè)試和壓力測(cè)試并不關(guān)心,所以,我們總是期望那些趕工出來(lái)的代碼可以正常工作。 下面是是五個(gè)程序員可以在這種不完美的情況下做得更好的觀點(diǎn)(它們都和語(yǔ)言和技術(shù)沒(méi)什么關(guān)系,只不過(guò)是一種你的工作行為,能夠和所有的行業(yè)相通)
- 尋找不同觀點(diǎn):程 序員好像并不喜歡技術(shù)上有異見(jiàn)的人,他們特別喜歡爭(zhēng)論各自的技術(shù)觀點(diǎn)。但是,他們忽略了不同觀點(diǎn)的價(jià)值。任何事情都有好有壞,我們應(yīng)該學(xué)會(huì)在不同觀點(diǎn)中學(xué) 習(xí)和平衡。這樣才會(huì)更多的了解編程和技術(shù)。要經(jīng)常在做事之前問(wèn)自己和別人,這么做對(duì)不對(duì)?做完事后問(wèn)自己,還可不可以改進(jìn)?努力去尋找別一個(gè)觀點(diǎn)。程序員 應(yīng)該經(jīng)常上網(wǎng),經(jīng)常和同事討論不同的實(shí)現(xiàn)方法,不同的技術(shù)觀點(diǎn),這樣才能取長(zhǎng)補(bǔ)短。然而,在實(shí)際工作中,我發(fā)現(xiàn)程序員們并不喜歡互相請(qǐng)教,因?yàn)檎?qǐng)教的人怕 別人看不起他,而被請(qǐng)教的人總是先貶低對(duì)方的能力,哎……(參看《十個(gè)讓你變成糟糕的程序員的行為》), 如果有這樣的文化氛圍的話,那也沒(méi)有關(guān)系。上網(wǎng)吧,網(wǎng)上的人誰(shuí)也不認(rèn)識(shí)誰(shuí),可以盡情地問(wèn)一些愚蠢的問(wèn)題。呵呵。總之,一定要明白,如果某些事情只有一個(gè)觀 點(diǎn),那么你一定要懷疑一下了,沒(méi)有觀點(diǎn)和技術(shù)方案的比較,沒(méi)有百花齊放的情況,你就無(wú)法知道是否還有更好的東西。真正的和諧不是只有一種聲音,真正的和諧 而是在不同的觀點(diǎn)聲音下取長(zhǎng)補(bǔ)短,百家爭(zhēng)鳴(參看《十條不錯(cuò)的編程觀點(diǎn)》)。否則,你永遠(yuǎn)都不會(huì)接受到新的觀點(diǎn),也就無(wú)法進(jìn)步和成長(zhǎng)了。
- 千萬(wàn)別信自己的代碼: 在任何時(shí)候,一定要高度懷疑自己的代碼。很多時(shí)候,錯(cuò)誤總是自己造成的。所以,當(dāng)出現(xiàn)問(wèn)題的時(shí)候,要學(xué)會(huì)review代碼中所有的可疑點(diǎn),千萬(wàn)別覺(jué)得某段 代碼很簡(jiǎn)單,可以略過(guò)。事實(shí)證明,很多疏忽大意都是在陰溝里翻的船,都是那些很低級(jí)的錯(cuò)誤。在查錯(cuò)的過(guò)程中,切忌過(guò)早下結(jié)論,切忌四處亂改(參看《各種流行的編程風(fēng)格》), 停下來(lái),想一想,會(huì)是哪兒的代碼有重大嫌疑,然后查看一下代碼,捋一捋程序的邏輯,調(diào)試并驗(yàn)證一下程序的邏輯和變量在運(yùn)行時(shí)是否是正確的。很多時(shí)候,對(duì)于 那些難纏的問(wèn)題,最后解決了總是因?yàn)槲覀冮_(kāi)始認(rèn)真回頭審視所有的代碼。只有對(duì)自己的代碼保持著高度的懷疑,這樣我們才會(huì)想著如何讓其運(yùn)行得更好更穩(wěn)定,也 會(huì)讓我們?cè)趩卧獪y(cè)試中下更多的功夫,這樣才能更能在那忙碌的環(huán)境中節(jié)省時(shí)間。相信我,在集成測(cè)試中fix bug的成本要比在單元測(cè)試Fix bug的成本大得多的多。一個(gè)簡(jiǎn)單的例子就是memory leak。程序員對(duì)自己的程序需要有憂患意識(shí),這樣才會(huì)越來(lái)越成熟,而自己的能力也會(huì)越來(lái)越強(qiáng)。
- 思考和放松: 做事前多想一想,這樣做事的時(shí)候就不會(huì)不顧此失彼,手忙腳亂,一旦事情一亂,你的心情也會(huì)更亂,于是,事情也就會(huì)更亂。最后,你只得重寫,這種事情太多 了。而且,在工作中要學(xué)會(huì)享受,要學(xué)會(huì)放松心情,我并不是讓你工作的時(shí)候聊QQ,我只是說(shuō),有時(shí)候,心態(tài)過(guò)于緊張,壓力過(guò)大,你的工作成果反而更不好,從 而又反過(guò)來(lái)造成新一輪的焦慮和緊張。我個(gè)人認(rèn)為,思考和放松是可以完美統(tǒng)一的,思考其實(shí)就是一種放松,停下來(lái),休息一 下,回頭看看走過(guò)的路,喝口水,登個(gè)高,看看過(guò)去走的對(duì)不對(duì)?總體是個(gè)什么樣?總結(jié)一下,然后看看前路怎么樣好走,這會(huì)你才會(huì)越走越好,越走越快。好的程 序員都不是那種埋頭苦干的人,好的程序員總是那些善于總結(jié)成敗得失,善于思考,善于調(diào)整,善于放松的人(參看《優(yōu)秀程序員的十個(gè)習(xí)慣》)。不然,我能看到的情形是,你很快地把事干完,回到家剛坐下來(lái),老板或是客戶就打電話來(lái)告訴你你的程序出問(wèn)題了。總之,深思熟慮,動(dòng)作會(huì)很慢,但是你可以保證你工作成果的質(zhì)量,反而能讓你更多的節(jié)約時(shí)間。
- 學(xué)習(xí)歷史,跟上時(shí)代: 如果你是從十年前開(kāi)始編程的,那么,今天的這門語(yǔ)言或是技術(shù)會(huì)有很多很多的改進(jìn)和改善。你以前開(kāi)發(fā)一個(gè)功能或函數(shù),今天早已被集成時(shí)了語(yǔ)言中,而且做得比 你的版本要好得多。以前你需要100行代碼完成的事情,今天只需要1行代碼。這樣的事情在未來(lái)還會(huì)發(fā)生,所以,今天的你一定要學(xué)會(huì)如何跟上時(shí)代。但是,你 也不要放棄歷史,我現(xiàn)在看到很多程序員對(duì)一些現(xiàn)代的語(yǔ)言和技術(shù)使用的非常好,他們可以很容易地跟上時(shí)代。但不要忘了,計(jì)算機(jī)世界的技術(shù)更新和技術(shù)淘汰也是 非常猛的。所以,你一定要學(xué)習(xí)歷史,這些歷史不是產(chǎn)商的歷史,而是整個(gè)計(jì)算機(jī)文化的歷史(參見(jiàn)《Unix傳奇》)。只有通過(guò)歷史,你才能明白歷史上出現(xiàn)的問(wèn)題,新技術(shù)出來(lái)的原因,這樣才能夠?qū)裉斓倪@些新的技術(shù)更了解,也才能明白明天的方向在哪里。學(xué)習(xí)歷史和跟上時(shí)代都是相當(dāng)重要的。使用新型的技術(shù),停下來(lái)接受培訓(xùn),可以讓你工作得更快,更高效(參看《未來(lái)五年程序員需要掌握的10項(xiàng)技能》)。而學(xué)習(xí)和總結(jié)歷史,才會(huì)讓你在紛亂的世界中找到方向。
- 積極推動(dòng)測(cè)試活動(dòng): 只有測(cè)試才能保證軟件可以正常工作,只有測(cè)試才能保證軟件的質(zhì)量。無(wú)論什么產(chǎn)品,都需要經(jīng)過(guò)或多或少的測(cè)試。測(cè)試地充分的產(chǎn)品,你會(huì)發(fā)現(xiàn)其質(zhì)理總是那么 好,測(cè)試的不充的產(chǎn)品,質(zhì)量總是那么次。德系汽車,日系汽車質(zhì)量怎么樣,關(guān)鍵還是在于怎么去測(cè)試的,測(cè)試的是否充分。所以,在你開(kāi)發(fā)軟件的過(guò)程中,如果你 說(shuō)你的程序?qū)懙睾茫|(zhì)量高,那么請(qǐng)你拿出實(shí)實(shí)在在的測(cè)試報(bào)告。在整個(gè)軟件開(kāi)發(fā)過(guò)程中,做為一個(gè)好的程序員,你應(yīng)該積極地在各個(gè)環(huán)節(jié)推動(dòng)項(xiàng)目組進(jìn)行測(cè)試活 動(dòng)。不要以為技術(shù)需求階段和設(shè)計(jì)階段不需要測(cè)試,一樣的,只要你要release什么,release的這個(gè)東西都需要進(jìn)行測(cè)試。技術(shù)需求怎么做測(cè)試?用 戶案例就是測(cè)試案例。在軟件開(kāi)發(fā)的整個(gè)過(guò)程中,保證產(chǎn)品質(zhì)量有時(shí)候比實(shí)現(xiàn)需求更重要,尤其是那些非常重要甚至人命關(guān)天的產(chǎn)品。
十個(gè)讓你變成糟糕的程序員的行為
1) 情緒化的思維
如果你開(kāi)始使用不同顏色的眼光來(lái)看待這個(gè)世界的話,那么你可能會(huì)成為一個(gè)很糟糕的程序員。情緒化的思維或態(tài)度很有可能會(huì)把自己變成一個(gè)怪物。相信你經(jīng)常可以看到很多很糟糕的程序會(huì)使用下面的這些語(yǔ)句:
- 我的程序不可能有這種問(wèn)題。
- Java就是shit。
- 我最恨的就是使用UML做設(shè)計(jì)。
- 需求怎么老在變,沒(méi)辦干了。
- 受不了這些人,他們到底懂不懂啊。
- …… ……
這些帶著情緒化的思維和態(tài)度,不但可以讓你成為一個(gè)很糟糕的程序員,甚至可以影響你的前途。因?yàn)椋榫w化通常都是魔鬼,會(huì)讓你做出錯(cuò)誤的判斷和決定,錯(cuò)誤碼率的判斷和決定直接決定了你的人生。
2) 懷疑別人
糟糕的程序總是說(shuō):“我的代碼一定是正確的,我懷疑編譯器有問(wèn)題”,“我這應(yīng)該沒(méi)有問(wèn)題吧,STL庫(kù)怎么這么難用啊”。我曾經(jīng)見(jiàn)過(guò)有程序員這樣使用 STL類:map<char*, char*>,當(dāng)他發(fā)現(xiàn)這樣放入字符串后卻取不出來(lái),覺(jué)得那是STL庫(kù)的BUG,然后自己寫了一個(gè)map!我的天啊!
某些時(shí)候,過(guò)早的下結(jié)論是一個(gè)很不好的習(xí)慣,任何事情都有其原因,只有知道了原因,你才能知道是誰(shuí)的問(wèn)題。一般來(lái)說(shuō),總是自己出的問(wèn)題。
3) 過(guò)多關(guān)注實(shí)現(xiàn),陷入問(wèn)題細(xì)節(jié)
有些時(shí)候,當(dāng)我們面對(duì)一個(gè)問(wèn)題或是一個(gè)需求的時(shí)候,糟糕的程序員總是會(huì)馬上去找一個(gè)解決方案或是實(shí)現(xiàn),這是一個(gè)很不好的習(xí)慣。設(shè)計(jì)模式告訴我們,“喜歡接口,而不是實(shí)現(xiàn)”就是告訴我們,認(rèn)清問(wèn)題的本質(zhì)和特性要比如何實(shí)現(xiàn)更重要。
- 對(duì)于一個(gè)客戶的問(wèn)題來(lái)說(shuō),首先應(yīng)該想到的是如何先讓用戶正常工作,如何恢復(fù)正在“流血”的系統(tǒng),而不是把用戶放在一邊而去分析問(wèn)題的原因和解決方案。
- 對(duì)于解決一個(gè)bug來(lái)說(shuō),重現(xiàn)bug,了解原來(lái)程序的意圖是首先重要的事,而不是馬上去修改代碼,否則必然會(huì)引入更多的BUG。
- 對(duì)于一個(gè)需求來(lái)說(shuō),我們需要了解的需求后面的商業(yè)背景,use case和真實(shí)意圖,而不是去討論如何實(shí)現(xiàn)。只有了解了用戶的真實(shí)意圖,實(shí)際使用的方式和案例,你才能真正如果去做設(shè)計(jì)。
糟糕的程序總是容易陷入細(xì)節(jié),爭(zhēng)論于如何實(shí)現(xiàn)和實(shí)現(xiàn)難題,以及問(wèn)題的根本原因,而忽略了比這些更重要的東西。只有看懂了整個(gè)地圖,我們才知道要怎么去走。
4) 使用并不熟悉的代碼
糟糕的程序員最好的朋友是 Ctrl-C 和 Ctrl-V ,有些時(shí)候,他們并不知道代碼的確切含義,就開(kāi)始使用它,有證據(jù)表明,由拷貝粘貼引發(fā)的bug占了絕大多數(shù)。因?yàn)椋a總是只能在特定的環(huán)境下才能正常地 工作,如果代碼的上下文改變了,很有可能使得代碼產(chǎn)生很多你不知道的行為,當(dāng)你連代碼都控制不住了,你還能編出什么好的程序呢?
5) 拼命工作而不是聰明的工作
對(duì)于糟糕的程序員,我們總是能看到他們拼命地修正他們的bug,總是花非常多時(shí)間并重復(fù)地完成某一工作。而好的程序可能會(huì)花雙倍的時(shí)間來(lái)準(zhǔn)備一個(gè)有 效的開(kāi)發(fā)環(huán)境,工具,以及在開(kāi)發(fā)的時(shí)候花雙倍甚至10倍的時(shí)間來(lái)避免一些錯(cuò)誤。好的程序員總是會(huì)利用一切工具或手段來(lái)讓自己的工作變得更有效率,總是為在 開(kāi)發(fā)的時(shí)候盡可能得不出錯(cuò)。后期出錯(cuò)的成本將會(huì)是巨大的,而且那時(shí)改正錯(cuò)誤的壓力也是巨大的。所以,糟糕的程序通常會(huì)讓自己進(jìn)入一種惡性循環(huán),他們看上去 總是疲憊的,總是很辛苦的,所以更沒(méi)有時(shí)間來(lái)改善,越?jīng)]有時(shí)間來(lái)改善,就有越多的問(wèn)題。所以,拼命工作有些時(shí)候可能表明你不是一個(gè)好的程序員。
6) 總是在等待、找借口以及抱怨
當(dāng)需求不明確的時(shí)候,當(dāng)環(huán)境不是很滿意的時(shí)候,他們總是在等待別人的改善。出現(xiàn)問(wèn)題的時(shí)候,總是在找借口,或是抱怨這也不好,那也不好,所以自己當(dāng) 然就沒(méi)有做好。糟糕的程序員總是希望自己的所處的環(huán)境是最好的,有明確的需求,有非常不錯(cuò)的開(kāi)發(fā)環(huán)境,有足夠的時(shí)間,有不錯(cuò)的QA,還有很強(qiáng)的team leader,以及體貼自己的經(jīng)理,有足夠的培訓(xùn),有良好的討論,有別人強(qiáng)有力的支持……,這是一種“飯來(lái)張口,衣來(lái)伸手”的態(tài)度,這個(gè)世界本來(lái)就不完 美,一個(gè)團(tuán)隊(duì)需要所有人去奮斗,況且,如果什么都變得完美了,那么,你的價(jià)值何在嗎?driving instead of waiting, leading instead of following.
7) 滋生辦公室政治
有句話叫“丑女多作怪”,意思是說(shuō)如果一個(gè)自己沒(méi)有真實(shí)的能力的話,那么他一定會(huì)在其它方面作文章。糟糕的程序員也是這樣,如果他們程序編不好的 話,比不過(guò)別人的話,他們通常會(huì)去靠指責(zé)別人,推脫責(zé)任,或是排擠有能力的人,等等不正常的手段來(lái)保全自己。所以,糟糕的程序通常伴隨著辦公室政治。
8 ) 說(shuō)得多做得少
糟糕的程序員總是覺(jué)得自己什么都懂,他們并不會(huì)覺(jué)得自己的認(rèn)識(shí)和知識(shí)都是有限的。這就是所謂的夸夸其談,是的,什么都做不好的程序員能靠什么混日子呢?就是吹啊吹啊。
另一個(gè)表現(xiàn)方式是他們?cè)谠u(píng)論起別人的程序或是設(shè)計(jì),總是能挑出一堆毛病,但自己的程序?qū)懙靡埠軤€。總是批評(píng)抱怨,而沒(méi)有任何有建設(shè)性的意見(jiàn),或是提出可行的解決方案。
這些糟糕的程序員,總是喜歡以批評(píng)別人的程序而達(dá)到顯示自己的優(yōu)秀。
9) 頑固
當(dāng)你給出一打證據(jù)說(shuō)明那里有一個(gè)更好的方案,那里有一個(gè)更好的方向的時(shí)候,他們總是會(huì)倔強(qiáng)的認(rèn)為他們自己的做法才是最好的。一個(gè)我親身經(jīng)歷的事例就 是,當(dāng)我看到一個(gè)新來(lái)的程序員在解決一個(gè)問(wèn)題的時(shí)候走到了錯(cuò)誤的方向上時(shí),我提醒他,你可能走錯(cuò)了,應(yīng)該是另外那邊,并且我證明了給他看還有一個(gè)更為簡(jiǎn)單 的方法,有。然而,這位程序員卻告訴我,“那是我的方法,我一定要把之走下去,不然我會(huì)非常難受”,于是,在三天后的代碼評(píng)審中,在經(jīng)過(guò)頑固地解釋以及一 片質(zhì)疑聲中,他不得不采用了我最先告訴他的那個(gè)方法。
這些程序員,從來(lái)不會(huì)去想,也不會(huì)去找人討論還有沒(méi)有更好的方法,而是堅(jiān)持自己的想法,那怕是條死路都一往直前,不撞南墻永不回頭。
10) 寫“聰明”的代碼
他們寫出來(lái)的代碼需要?jiǎng)e的同事查看程序語(yǔ)言參考手冊(cè),或是其程序的邏輯或是風(fēng)格看上去相當(dāng)時(shí)髦,但卻非常難讀。代碼本應(yīng)該簡(jiǎn)潔和易讀,而他們喜歡在代碼中表現(xiàn)自己,并嘗試另類的東西,以顯示自己的才氣。是的,只有能力有問(wèn)題的程序員才需要借助這樣的顯示。
記得以前的一個(gè)經(jīng)歷,一位英語(yǔ)很不錯(cuò)的程序員加入公司,本來(lái)對(duì)我們這些英語(yǔ)二把刀來(lái)說(shuō),我們喜歡看到的是簡(jiǎn)單和易讀的英文文檔,然后,那位老兄為了 展示他的英語(yǔ)如何牛,使用了很多GRE中比較生僻的短語(yǔ)和詞匯。讓大家閱讀得很艱苦。最有諷刺意味的是,有一位native的美國(guó)人后來(lái)在其郵件中詢問(wèn)他 某個(gè)單詞的意思。呵呵。
你是一個(gè)糟糕的程序員嗎?歡迎你分享你的經(jīng)歷。