2500行代碼的程序一定比500行代碼的程序好嗎?寫(xiě)出簡(jiǎn)潔、高效、高可用的程序的開(kāi)發(fā)者黯然離場(chǎng),搞出龐大、復(fù)雜又難用的程序的人倒能加薪升職?究竟開(kāi)發(fā)者的工作應(yīng)該如何進(jìn)行評(píng)價(jià)?來(lái)看看下面兩個(gè)程序員的故事吧。
兩個(gè)程序員的寓言
很久以前,有兩家公司,分別是"Automated Accounting Applications Association "和 "Consolidated Computerized Capital Corporatio",他們決定,需要一個(gè)程序來(lái)執(zhí)行自己公司的某項(xiàng)業(yè)務(wù),但這兩家公司并不知道,對(duì)于他們的業(yè)務(wù)需求來(lái)說(shuō),要開(kāi)發(fā)的程序是完全一樣的。
Automated雇用了一位程序員分析師Alan來(lái)解決他們的問(wèn)題。
與此同時(shí),Consolidated決定讓他們新招聘的一名初級(jí)程序員Charles來(lái)負(fù)責(zé)這項(xiàng)工作,看看他是否真的那么優(yōu)秀。
Alan曾經(jīng)有過(guò)操刀艱難的編程項(xiàng)目的經(jīng)驗(yàn),所以他決定使用PQR結(jié)構(gòu)化設(shè)計(jì)方法??紤]到這一點(diǎn),他要求部門(mén)經(jīng)理再指派三名程序員作為編程團(tuán)隊(duì)。然后,這個(gè)團(tuán)隊(duì)就開(kāi)始工作了,撲到了鋪天蓋地的初步報(bào)告和問(wèn)題分析上。
再看Consolidated這邊,Charles沒(méi)忙著動(dòng)手開(kāi)干,他花了一些時(shí)間思考這個(gè)問(wèn)題。Charles的同事們注意到,他經(jīng)常坐在桌前,把腳抬起來(lái)放在桌子上,喝著咖啡。偶爾也會(huì)看到他在電腦前忙活,但同事們從他敲擊鍵盤(pán)的節(jié)奏就能看出,他其實(shí)是在玩《太空侵略者》的游戲。
這時(shí),Automated的團(tuán)隊(duì)已經(jīng)開(kāi)始寫(xiě)代碼了。程序員們大約用了一半的項(xiàng)目時(shí)間來(lái)編寫(xiě)和編譯代碼,其余的時(shí)間都在開(kāi)會(huì),討論各種模塊之間的接口問(wèn)題。
而Charles的同事注意到,他終于不再沉迷《太空侵略者》了。他現(xiàn)在要么就是把腳架在辦公桌上喝咖啡,要么在小紙片上亂涂亂畫(huà)。他寫(xiě)在小紙片上的字跡很潦草,當(dāng)然看起來(lái)不是在玩Tic Tac Toe(一種游戲),但也沒(méi)有什么意義。
(推薦教程:JavaScript教程)
兩個(gè)月過(guò)去了,Automated公司的團(tuán)隊(duì)終于發(fā)布了項(xiàng)目實(shí)施時(shí)間表。再過(guò)兩個(gè)月,他們將發(fā)布一個(gè)測(cè)試版的程序。然后再經(jīng)過(guò)兩個(gè)月的測(cè)試和優(yōu)化,便會(huì)得到一個(gè)完整的最終版程序。
另一頭,Charles的經(jīng)理一直看著Charles上班摸魚(yú),已經(jīng)厭煩了,他對(duì)Charles失去了耐心,決定和他攤牌。但當(dāng)他走進(jìn)Charles的辦公室時(shí),卻驚訝地看到他在電腦前忙著輸入代碼。他決定等等看會(huì)發(fā)生什么,所以打了個(gè)哈哈,然后離開(kāi)了。他開(kāi)始密切關(guān)注Charles,以便抓住機(jī)會(huì)當(dāng)面好好教訓(xùn)他一番。但是預(yù)期中那令人不快的對(duì)話并沒(méi)有出現(xiàn),因?yàn)樗芨吲d地注意到,Charles似乎大部分時(shí)間都在忙碌,甚至有人看到Charles忙得連午餐都很晚去吃,而且一周有那么兩三天,下班后他還會(huì)留下來(lái)加班。
三個(gè)月結(jié)束時(shí),Charles宣布他已經(jīng)完成了這個(gè)項(xiàng)目。他提交了一個(gè)包含500行代碼的程序。程序似乎寫(xiě)得很清楚,經(jīng)過(guò)測(cè)試,它可以滿足項(xiàng)目既定的所有需求。事實(shí)上,它甚至還有一些額外的便利功能,可能會(huì)顯著提高程序的可用性。該程序投入實(shí)際測(cè)試使用后,除了發(fā)現(xiàn)一個(gè)可以快速糾正的疏忽外,表現(xiàn)良好。
到這時(shí),Automated的團(tuán)隊(duì)已經(jīng)完成了項(xiàng)目所需的四個(gè)主要模塊中的兩個(gè)。這些模塊目前正在進(jìn)行測(cè)試,而其它模塊已經(jīng)完成。
又過(guò)了三周,Alan宣布,初級(jí)版比原計(jì)劃提前一周完成。他提供了一份待糾正的缺陷列表。該程序開(kāi)始進(jìn)行實(shí)際測(cè)試使用。除了缺陷列表中列舉的問(wèn)題,用戶還發(fā)現(xiàn)了一些其它的錯(cuò)誤和缺陷。正如艾倫所解釋的那樣,這并不奇怪。畢竟這是一個(gè)初級(jí)版本嘛,有錯(cuò)誤是意料之中的。
又經(jīng)過(guò)大約兩個(gè)多月的時(shí)間,程序的正式版本開(kāi)發(fā)完畢。它由大約2500行代碼組成。測(cè)試時(shí),它似乎滿足了大部分項(xiàng)目需求。但是它削減了一兩個(gè)功能,而且對(duì)輸入數(shù)據(jù)的格式非常挑剔。然而,公司還是決定上馬該程序了。他們可以隨時(shí)對(duì)數(shù)據(jù)錄入人員進(jìn)行培訓(xùn),讓他們嚴(yán)格按照要求的格式輸入數(shù)據(jù)。此后該程序移交給了一些負(fù)責(zé)維護(hù)的程序員去補(bǔ)全缺失的功能。
(推薦教程:Java教程)
后記:
起初,Charles的上司對(duì)他在這個(gè)項(xiàng)目上的表現(xiàn)還是比較滿意的。但當(dāng)他通讀程序源代碼的時(shí)候,他發(fā)現(xiàn)這個(gè)項(xiàng)目真的比他最初想象的要簡(jiǎn)單得多。現(xiàn)在看來(lái),即使是對(duì)一個(gè)初學(xué)編程的人來(lái)說(shuō),這顯然也不是什么難事。
Charles每天確實(shí)產(chǎn)出了大約5行代碼,這或許是略高于業(yè)內(nèi)平均水平。然而,基于程序是這么簡(jiǎn)單,他的表現(xiàn)也就并沒(méi)有什么特別了,而且他的上司還記得他那兩個(gè)月的“摸魚(yú)劣跡”。
在下一次薪酬調(diào)整時(shí),Charles得到了加薪,加薪幅度約為這一時(shí)期通貨膨脹率的一半(很可憐吧),公司沒(méi)有給他升職。大約一年后,他變得心灰意冷,離開(kāi)了Consolidated。
在Automated公司,Alan因如期完成了項(xiàng)目而受到嘉獎(jiǎng)。他的上級(jí)看了看他們編寫(xiě)的程序,他瀏覽了幾分鐘,恩,是遵守公司關(guān)于結(jié)構(gòu)化編程的標(biāo)準(zhǔn)的。然后他很快就不再繼續(xù)嘗試往下看了,這程序看起來(lái)似乎很難理解。這時(shí)他意識(shí)到,這個(gè)項(xiàng)目確實(shí)比他原先設(shè)想的要復(fù)雜得多,他再次對(duì)Alan的成就表示祝賀。
Alan團(tuán)隊(duì)的每個(gè)程序員每天產(chǎn)出3行多的代碼。這在業(yè)內(nèi)大約是平均水平,但考慮到這個(gè)項(xiàng)目所要解決的問(wèn)題的復(fù)雜性,可以說(shuō)是很不錯(cuò)的產(chǎn)出啦。Alan因此獲得了豐厚的加薪,并被提升為系統(tǒng)分析師,以表彰他的成就。
(推薦教程:python教程)
來(lái)自Tim Mensch的評(píng)論:
我曾經(jīng)是一名年輕但是聰明的程序員,這個(gè)故事令我產(chǎn)生了強(qiáng)烈的共鳴。即使在我還是個(gè)職場(chǎng)新人的時(shí)候,我也能做到令很多資深開(kāi)發(fā)人員都感到有挑戰(zhàn)的事情。在我的第一份工作中(作為游戲開(kāi)發(fā)者),我的經(jīng)理說(shuō)我在幾天內(nèi)創(chuàng)建的代碼,感覺(jué)比一個(gè)更有經(jīng)驗(yàn)的開(kāi)發(fā)者經(jīng)過(guò)幾個(gè)月的推敲后完成的代碼都要好(從物理意義上講)。在我的第二份工作中,我對(duì)一個(gè)有十年以上經(jīng)驗(yàn)的高級(jí)開(kāi)發(fā)人員編寫(xiě)的工具程序進(jìn)行了優(yōu)化,使其只需幾分之一秒就能完成一個(gè)任務(wù),而不用花費(fèi)幾分鐘。我的整個(gè)職業(yè)生涯充斥了這樣一連串的奇聞?shì)W事。
在我從事編程以來(lái)的多年開(kāi)發(fā)和學(xué)習(xí)經(jīng)歷中,我意識(shí)到經(jīng)驗(yàn)確實(shí)很重要。但是,底層技能也同樣重要。實(shí)際上,就像上面講到的兩個(gè)程序員的寓言一樣,底層技能可能比經(jīng)驗(yàn)更重要,我認(rèn)為這個(gè)事實(shí)已經(jīng)被許多當(dāng)代的開(kāi)發(fā)者忽略了。
話雖如此,我也曾經(jīng)踩過(guò)坑,跟上文提到的第二個(gè)開(kāi)發(fā)者類似,創(chuàng)建了一個(gè)比實(shí)際所需要的復(fù)雜得多的系統(tǒng)。我知道一個(gè)復(fù)雜的解決方案,并且知道自己可以實(shí)現(xiàn)它,但這并不意味著它就是最好的解決方案,我需要時(shí)不時(shí)地提醒自己這個(gè)事實(shí)。
于是,我嘗試做出妥協(xié),甚至質(zhì)疑我自己的解決方案,持續(xù)尋找能夠改進(jìn)和簡(jiǎn)化的方法。我曾遭到指責(zé):因?yàn)槲覂A向于花費(fèi)更多的時(shí)間去思考一個(gè)問(wèn)題,而不是僅僅用顯而易見(jiàn)的方法去解決它;我希望能找到更簡(jiǎn)潔的方法去解決問(wèn)題。因?yàn)榛撕芏鄷r(shí)間思考,看起來(lái)好像不務(wù)正業(yè),但是充分地思考可以讓我產(chǎn)出更好的結(jié)果----代碼量更少,更健壯、更可擴(kuò)展而且更容易閱讀。
這就是為什么我認(rèn)為上面這個(gè)寓言如此重要的原因。開(kāi)發(fā)經(jīng)驗(yàn)固然重要,但在項(xiàng)目設(shè)計(jì)和實(shí)施上的技能都可以完勝經(jīng)驗(yàn),如果你同時(shí)具備經(jīng)驗(yàn)和技能,就可以實(shí)現(xiàn)相當(dāng)?shù)钠孥E。只要你持續(xù)質(zhì)疑自己的想法并持續(xù)思考如何更好地完善它,而不要一味地認(rèn)為自己的第一個(gè)設(shè)計(jì)構(gòu)思就是足夠完美的。
原文鏈接:realmensch.org/2017/08/25/the-parable-of-the-two-programmers/?