|
想成為一名優(yōu)秀的軟件開(kāi)發(fā)人員需要很長(zhǎng)時(shí)間的培訓(xùn)和實(shí)踐。但是如果不遵循合適的原則,即便是再好的程序員也會(huì)成為失敗的犧牲品。不經(jīng)意間你就會(huì)養(yǎng)成一些可怕的壞習(xí)慣,它們可能會(huì)一而再再而三地出現(xiàn),甚至對(duì)于經(jīng)驗(yàn)最為豐富的程序員而言也是如此。我認(rèn)為軟件開(kāi)發(fā)至少存在七宗罪。那么,就請(qǐng)看看欲望、暴食、貪婪、懶惰、憤怒、嫉妒和驕傲?xí)槟愕淖钚戮幊添?xiàng)目帶來(lái)哪些意想不到的損失吧。
軟件開(kāi)發(fā)七宗罪,你有幾條?
軟件開(kāi)發(fā)第一宗罪:欲望(過(guò)度設(shè)計(jì))
現(xiàn)代編程語(yǔ)言趨向于不斷增加更新的功能讓其臻于成熟。程序員們一層一層地往上堆疊抽象的代碼,用新設(shè)計(jì)的關(guān)鍵字和結(jié)構(gòu)來(lái)增加代碼的可讀性和可重用性只要你肯花時(shí)間去學(xué)習(xí)如何正確地使用它們。
與此同時(shí),編程的原則在這些年里有所改變。今天,你可以飽覽到成千上萬(wàn)的設(shè)計(jì)方案和模式,而且每幾個(gè)月就會(huì)有人想出新的開(kāi)發(fā)方案。此外,開(kāi)發(fā)人員總是信誓旦旦地宣稱(chēng)這些開(kāi)發(fā)方案會(huì)讓你成為程序員中們眼中的佼佼者。
但是紙上談兵往往不見(jiàn)得在實(shí)際操作中奏效,這個(gè)道理很簡(jiǎn)單,打個(gè)比方來(lái)說(shuō)就是你可以去做某些事情但是并不意味著你應(yīng)該去這么做。就像編程大師Joel Spolsky所說(shuō)的,那些盲目迷戀自己工具的程序員們都不可避免地忽略了這一點(diǎn),甚至于最簡(jiǎn)單的項(xiàng)目也可能葬送進(jìn)開(kāi)發(fā)的地獄。所以,必須抵制這種不可取的沖動(dòng),那么首先要做到的就是堅(jiān)持你最初的設(shè)計(jì)方案。
軟件開(kāi)發(fā)第二宗罪:暴食(不進(jìn)行重構(gòu))
沒(méi)有比開(kāi)發(fā)軟件更令人可喜的事情了。一旦你有一個(gè)正在開(kāi)發(fā)的產(chǎn)品,就會(huì)很容易受到開(kāi)始籌劃下一次迭代的引誘。新產(chǎn)品應(yīng)該具備什么樣的新特征呢?我們?cè)诘谝惠唽?shí)施的時(shí)候沒(méi)有注意到哪些問(wèn)題?
人們總是很容易忘記代碼很少能在運(yùn)行的時(shí)候保持最佳狀態(tài)。然后,當(dāng)新功能不斷地累積直至幾個(gè)輪回的發(fā)展之后,程序員們往往會(huì)傾向于復(fù)合過(guò)去發(fā)生的錯(cuò)誤,這樣就導(dǎo)致了一個(gè)臃腫、脆弱的代碼基礎(chǔ),難以進(jìn)行有效地維持。
所以,在添加新功能之前盡量克制自己,對(duì)現(xiàn)有代碼的質(zhì)量和可維護(hù)性進(jìn)行評(píng)估。對(duì)于每一次新一輪的開(kāi)發(fā),都必須將代碼重構(gòu)列入預(yù)算范圍之內(nèi)。用戶(hù)可能只會(huì)關(guān)心每一個(gè)版本的新功能,但是從長(zhǎng)遠(yuǎn)來(lái)看,他們一定會(huì)更希望你保持產(chǎn)品的精煉性。
軟件開(kāi)發(fā)第三宗罪:貪婪(團(tuán)隊(duì)之間的競(jìng)爭(zhēng))
對(duì)于財(cái)富和權(quán)利的過(guò)度欲望要不然如何解釋程序員與自己同僚之間競(jìng)爭(zhēng)的動(dòng)機(jī)?當(dāng)一個(gè)團(tuán)隊(duì)得到了其他團(tuán)隊(duì)泄露出來(lái)的電子郵件,就開(kāi)始進(jìn)行閉門(mén)會(huì)議和開(kāi)發(fā)。接下來(lái)的事情你應(yīng)該知道,這個(gè)團(tuán)隊(duì)編寫(xiě)了一個(gè)代碼庫(kù),它已經(jīng)超越了其他團(tuán)隊(duì)已經(jīng)完成的編碼庫(kù)功能的一半以上。
開(kāi)發(fā)團(tuán)隊(duì)很少會(huì)出于惡意來(lái)進(jìn)行重復(fù)的工作,但是他們往往缺乏明確的目標(biāo)和責(zé)任感。得到的結(jié)果則是多余、無(wú)力的代碼庫(kù),更不要說(shuō)預(yù)算的損失和之前付之一炬的努力。經(jīng)營(yíng)開(kāi)發(fā)項(xiàng)目的首要任務(wù)之一應(yīng)該是了解其他團(tuán)隊(duì)正在做什么,然后所有的團(tuán)隊(duì)都朝著一個(gè)共同的目標(biāo)去努力。分享與共享應(yīng)該成為開(kāi)發(fā)人員的座右銘。
軟件開(kāi)發(fā)第四宗罪:懶惰(不驗(yàn)證輸入)
基本編程容易犯的錯(cuò)誤清單很長(zhǎng),但是沒(méi)有驗(yàn)證輸入這樣的錯(cuò)誤非常低級(jí)以至于不能不從別的角度來(lái)思考犯這類(lèi)錯(cuò)誤的原因。這個(gè)看似低級(jí)的錯(cuò)誤仍舊出現(xiàn)在許多經(jīng)驗(yàn)豐富的程序員編寫(xiě)的代碼中,這一點(diǎn)十分令人費(fèi)解。然而,很多普通的安全漏洞,從緩沖區(qū)泛濫成SQL注入攻擊,卻可以直接追溯到用戶(hù)輸入的代碼沒(méi)有進(jìn)行正確格式驗(yàn)證這一點(diǎn)。
現(xiàn)代編程語(yǔ)言提供了許多工具來(lái)幫助程序員來(lái)避免類(lèi)似情況的發(fā)生,但是他們必須對(duì)其使用得當(dāng)。切記,一個(gè)JavaScript的Web表單驗(yàn)證輸入可能很容易被在瀏覽器中禁用的JavaScript回避,或者干脆不使用瀏覽器進(jìn)行訪問(wèn)。輸入驗(yàn)證應(yīng)該是你應(yīng)用程序的核心部分,而不是在用戶(hù)界面上煞費(fèi)苦心。如果做不到這一點(diǎn)只能歸咎于程序員的懶惰了。
程序開(kāi)發(fā)第五宗罪:憤怒(不對(duì)你的代碼進(jìn)行注釋?zhuān)?/strong>
對(duì)于你的同僚而言,有什么行為能比不對(duì)你的代碼做出任何注釋這種行為更具敵意?我自己寫(xiě)的我當(dāng)然知道:精心編寫(xiě)的代碼是它本身最好的文檔資料。那么,你知道嗎,其他人能看懂嗎?其實(shí)這些你自認(rèn)為值得驕傲的代碼可能并非天衣無(wú)縫。
程序員們自己很可能很快就會(huì)遺忘他們現(xiàn)在所寫(xiě)的代碼,但是這些代碼將在他們離開(kāi)以后繼續(xù)存在很長(zhǎng)一段時(shí)間。對(duì)于取代他們的程序員而言,要想搞清楚每一個(gè)代碼真正代表什么是一件吃力不討好的工作。鑒于此,在你編寫(xiě)程序的時(shí)候,行行好吧,多給他們留下一些暗示。
但是請(qǐng)記住,難以理解的注釋或者注釋過(guò)多都與不做任何注釋的性質(zhì)同樣惡劣。類(lèi)似于這已經(jīng)損壞或者不要碰這個(gè)的注釋對(duì)于任何人都沒(méi)有什么幫助。也不要做多余的評(píng)論來(lái)解釋簡(jiǎn)單的操作,比如變量初始化。代碼就是其本身最好的文件材料,所以出現(xiàn)的注釋評(píng)論應(yīng)該盡可能解釋原因和本質(zhì)。
軟件開(kāi)發(fā)第六宗罪:嫉妒(不使用版本控制)
也許你有理由對(duì)于你的項(xiàng)目不推行版本控制。也許一開(kāi)始你的項(xiàng)目很小。但是今天,功能強(qiáng)大并且高效的版本控制系統(tǒng)已經(jīng)可以免費(fèi)進(jìn)行使用。服務(wù)供應(yīng)商甚至可以對(duì)分布式項(xiàng)目提供價(jià)格低廉的托管代碼服務(wù)。所以沒(méi)有理由不在一開(kāi)始就使用一個(gè)代碼庫(kù),即便是再小的項(xiàng)目也是如此除非,你無(wú)法容忍除了你以外的任何人實(shí)施代碼變化。
軟件開(kāi)發(fā)第七宗罪:驕傲(不進(jìn)行單元測(cè)試)
你往往會(huì)認(rèn)為自己的編程工作相當(dāng)出色,但是你又如何知道自己做的到底是否唯美無(wú)缺呢?有什么指標(biāo)來(lái)對(duì)你的工作好壞進(jìn)行衡量嗎?
除非你已經(jīng)在特定的測(cè)試環(huán)境下對(duì)你的代碼進(jìn)行了驗(yàn)證和測(cè)試,否則你就不能證明它能像廣告中說(shuō)的那樣完美無(wú)瑕。但是太多的開(kāi)發(fā)人員并不對(duì)他們的代碼進(jìn)行單元測(cè)試。他們聲稱(chēng)花時(shí)間進(jìn)行測(cè)試就沒(méi)有時(shí)間推行新功能了。事實(shí)上,一些開(kāi)發(fā)人員甚至不將質(zhì)量測(cè)試寫(xiě)入他們項(xiàng)目的預(yù)算范圍。
那么我又能說(shuō)什么呢?只能期待他們?cè)谄穱L失敗的滋味之前將這股傲氣拋之腦后。一旦存在缺陷的代碼抵達(dá)客戶(hù)手中的時(shí)候,再撤銷(xiāo)它們就未免太遲了。在進(jìn)行代碼傳輸之前,進(jìn)行越多的單元測(cè)試,就能在今后越多地避免不必要的損失。
原文標(biāo)題:The 7 deadly sins of software development
it知識(shí)庫(kù):軟件開(kāi)發(fā)七宗罪,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。