從Dash iOS開(kāi)源說(shuō)起,不要過(guò)于追求完美代碼
(Dash iOS源碼截圖)
前段時(shí)間知名的蘋果平臺(tái)文檔工具Dash作者開(kāi)源了它的iOS版本,這是Dash被突然從App Store下架,雙方扯皮,直到現(xiàn)在的后續(xù)結(jié)果。對(duì)于這件事情我們不多做評(píng)價(jià),不過(guò)開(kāi)源是人們樂(lè)于見(jiàn)到的。Dash iOS版本開(kāi)源后,獲得了一些開(kāi)發(fā)者的贊美,但沒(méi)想到的是,它的代碼引起了一些爭(zhēng)議。
在以往開(kāi)發(fā)者的印象里,開(kāi)源意味著展示自己,意味著對(duì)代碼有追求,Dash可以說(shuō)粉碎了這個(gè)看法。但就像圖拉鼎所說(shuō),代碼寫得如何,并不妨礙它在商業(yè)上的成功。
你對(duì)追求***代碼有什么看法呢?
我們找到倫敦一位資深程序員Daniel Irvine分享的文章,他認(rèn)為不應(yīng)該追求***代碼。
引言
***主義者***的特點(diǎn)就是過(guò)度追求一件事情的***,他們看什么東西都不會(huì)完全滿意,因此經(jīng)常陷入深深的矛盾之中,殊不知這個(gè)世界上根本就沒(méi)有絕對(duì)的***,將精力投注到工作中、生活中各個(gè)方面,努力改善,樂(lè)此不疲。程序員中的***主義者又會(huì)怎樣呢?
許多程序員文化是建立在***代碼的理想上:代碼不僅能夠運(yùn)行,而且也必須是干凈、優(yōu)雅的。我們以巧妙地構(gòu)建解決難題的對(duì)策為傲。然而這種***主義可能不利于團(tuán)隊(duì)的成功,因?yàn)?**主義常常導(dǎo)致個(gè)人分歧。
然而能得到所有人公認(rèn)的***代碼標(biāo)準(zhǔn)并不存在。對(duì)于***代碼,每個(gè)人都有一個(gè)略微不同的審美觀點(diǎn),這意味著我們每個(gè)人都有自己的想法:什么樣的代碼看起來(lái)***。如果我們都是由***主義來(lái)驅(qū)動(dòng)——希望我們的代碼看起來(lái)像我們想要的樣子,那么我們最終會(huì)與隊(duì)友發(fā)生分歧,因?yàn)槲覀兠總€(gè)人互相反對(duì),只是為了讓代碼庫(kù)看起來(lái)像我們所想看到的樣子。
當(dāng)我成長(zhǎng)為一個(gè)程序員時(shí),我發(fā)現(xiàn)有一些小技巧,可以讓團(tuán)隊(duì)避免因?yàn)?**代碼而發(fā)生沖突。下面就讓我們來(lái)看一看。
不要被教條束縛
對(duì)代碼庫(kù)的唯一要求就是,它是可用的。通過(guò)一個(gè)簡(jiǎn)單的方法來(lái)驗(yàn)證,如果它經(jīng)過(guò)完全覆蓋測(cè)試并通過(guò),就可以證明是可用的。除此之外,每個(gè)測(cè)量都是主觀的。
當(dāng)你閱讀其他人的代碼,不要去想如果是你寫的話會(huì)怎樣。不要試圖在你腦海中重寫這段代碼,讓它存在就是它的方式。
減少你對(duì)代碼設(shè)立的標(biāo)準(zhǔn)
用制表定位鍵(Tab)還是空格鍵(Space)?兩個(gè)還是四個(gè)空格?為你的左括號(hào)設(shè)置同一行呢,還是另起一行呢?不知道如果只有一個(gè)單一的編程語(yǔ)言的話,是不是就不會(huì)有這種爭(zhēng)論?解決這個(gè)問(wèn)題的標(biāo)準(zhǔn)方法就是為團(tuán)隊(duì)設(shè)立編碼標(biāo)準(zhǔn),這會(huì)為團(tuán)隊(duì)的代碼帶來(lái)一致性。
不幸的是,很難形成完整的編碼標(biāo)準(zhǔn)。總是會(huì)有灰色區(qū)域?qū)е铝藵撛诘姆制?,如命名、模式、?duì)象建模技術(shù)等。
而且,他們團(tuán)隊(duì)定下的規(guī)則有時(shí)會(huì)引火燒身。
我曾經(jīng)所在的團(tuán)隊(duì),對(duì)編碼標(biāo)準(zhǔn)有過(guò)如下規(guī)則:“功能不得超過(guò)7行代碼”。事后看來(lái),這個(gè)規(guī)則,還不如沒(méi)有。雖然我仍然贊同這個(gè)觀點(diǎn),但這一規(guī)則還是激起了很多混亂和爭(zhēng)辯。人們需要不斷地想著它。團(tuán)隊(duì)里的一些人從不相信這個(gè)規(guī)則??傊?,我們團(tuán)隊(duì)花了大量時(shí)間和精力,來(lái)維持這個(gè)規(guī)則。
你想想啊,那些時(shí)間如果用來(lái)結(jié)對(duì)編程或是一起改進(jìn)代碼該是多好啊。所有的規(guī)則都有一定的代價(jià),盡管有了這些規(guī)則,你可能仍然會(huì)有意見(jiàn)分歧。
雖然我仍然按照簡(jiǎn)短代碼的規(guī)則來(lái)寫代碼——通常少于七行——但我不屑于依照這些規(guī)則來(lái)寫代碼。
讓代碼庫(kù)成為自己的標(biāo)準(zhǔn),而不是寫出什么規(guī)則。
不要被pull請(qǐng)求套牢
我通常會(huì)迅速合并pull請(qǐng)求,即使它對(duì)代碼有很大的改動(dòng)。這樣做有兩個(gè)原因。***是等待PR修改十分煎熬,會(huì)打消團(tuán)隊(duì)成員的積極性。第二點(diǎn)更微妙,基本代碼保持可延展性是非常重要的:意義、準(zhǔn)備和期待去改變。但是,“***pull需求”文化阻礙了這一點(diǎn)。它促進(jìn)了代碼在主分支是“黃金”,并不應(yīng)該再次改變的概念。如果我們?cè)试S不***代碼成為主干,那我們會(huì)鼓勵(lì)更高的變化率。團(tuán)隊(duì)學(xué)會(huì)總是提出:“我看的代碼足夠干凈嗎?”
這有點(diǎn)違背直覺(jué):允許主程序?qū)懭氩?**的代碼。實(shí)際上,它可以提升程序的質(zhì)量。
那么,審查pull請(qǐng)求的更好的方法是什么?
我的策略是這樣的。我會(huì)首先通讀整套變更,標(biāo)注任何可能重要的事情。然后優(yōu)先排列他的反饋,限制最多三條建議。其它的就不管了。
我很少就風(fēng)格問(wèn)題進(jìn)行評(píng)論,比如放錯(cuò)的空格或縮進(jìn)參數(shù)列表。如果代碼是可延展的,有人可能在以后會(huì)清理它。同時(shí),這些風(fēng)格問(wèn)題并不會(huì)給任何人帶來(lái)傷害。
放眼望世界
對(duì)于任何多于幾十行的代碼,***只是旁觀者的感覺(jué)。如果你期望每個(gè)人以完全相同的方式解決問(wèn)題,那么你就犯了錯(cuò)誤。如果你對(duì)代碼有著宏偉的愿景,那么你將會(huì)感到失望。
為你的隊(duì)友提供他們認(rèn)可的設(shè)計(jì)和代碼的空間,并鼓勵(lì)每個(gè)人在系統(tǒng)設(shè)計(jì)時(shí)平等的發(fā)揮作用。
當(dāng)你的團(tuán)隊(duì)寫出的代碼與你想要的不一樣時(shí),不要與他們爭(zhēng)論。要記住,在團(tuán)隊(duì)中保持健康工作關(guān)系,長(zhǎng)遠(yuǎn)來(lái)看是有價(jià)值的。所以也許你要犧牲你個(gè)人對(duì)質(zhì)量的愿景。
程序員應(yīng)該每天花一些時(shí)間,回顧并反思自己的開(kāi)發(fā)技術(shù)的發(fā)展。為自己和團(tuán)隊(duì),思考每天的效率。這個(gè)月的工作可能下個(gè)月不再做。團(tuán)隊(duì)技能的增長(zhǎng)是從新手到專家,這一點(diǎn)尤為如此。所以,要確保你少走彎路,因?yàn)樽畛醯膹澛芬人颂峁┑膸椭级唷?/p>