為什么重寫代碼良姆?

碼農(nóng)的絕大部分工作精力是在維護(hù)代碼上肠虽,至少在我所工作的部門是這樣的。由此觀點(diǎn)出發(fā)玛追,碼農(nóng)界形成了如下共識(shí):

代碼首先是寫給人看的税课。

這就要求碼農(nóng)們?cè)诰幋a時(shí),可讀性/可維護(hù)性要放在重要的位置進(jìn)行考量痊剖,使用簡(jiǎn)單的設(shè)計(jì)韩玩,通用的方法,統(tǒng)一的風(fēng)格陆馁。

每個(gè)碼農(nóng)心目中都有一個(gè)代碼的伊甸園啸如,在那里,代碼的設(shè)計(jì)良好氮惯,實(shí)現(xiàn)優(yōu)雅叮雳,賞心悅目。代碼所要表達(dá)的意思很明晰妇汗,注釋恰到好處帘不,無需猜測(cè)就能理解編寫者的意圖。即使有Bug出現(xiàn)杨箭,通過檢查代碼就能容易找到錯(cuò)誤處寞焙,無需復(fù)雜的調(diào)試過程。不再懼怕需求的增加和變化互婿,因?yàn)榇a有很好的可擴(kuò)展性捣郊。

但實(shí)際上,絕大部分碼農(nóng)維護(hù)的代碼慈参,卻是兩外一番景象:代碼質(zhì)量慘不忍睹呛牲,錯(cuò)誤百出,碼農(nóng)面對(duì)蜂擁而至的Bug和新需求驮配,加班加點(diǎn)娘扩,疲于奔命着茸。不得不承認(rèn),碼農(nóng)是追求完美的一個(gè)群體琐旁,碼農(nóng)們懷著激動(dòng)的心情涮阔,按捺不住重寫的沖動(dòng),在碼農(nóng)心中灰殴,重新實(shí)現(xiàn)一套系統(tǒng)敬特,將極大的提高代碼質(zhì)量,消滅Bug牺陶。需求變更時(shí)擅羞,也不再懼怕,因?yàn)檩p而易舉就可修改和擴(kuò)展义图,做到了擁抱變化。碼農(nóng)時(shí)不時(shí)的幻想召烂,系統(tǒng)如果重寫過碱工,以后的維護(hù)工作是多么的幸福和美好。實(shí)際上奏夫,每一個(gè)碼農(nóng)都有怕篷、或至少有過這樣的沖動(dòng),我們不得不深入思考一下其原因酗昼,重寫真的能帶來想象中的美好結(jié)局嗎廊谓?

客觀原因

經(jīng)過前輩開發(fā)者們前仆后繼嘔心瀝血的堆砌,擺在我們面前的代碼庫麻削,就如同瓦力在末日世界執(zhí)著搭建的垃圾大廈蒸痹,表面上看非常整齊,仔細(xì)看去呛哟,就是一塊塊垃圾拼湊而成叠荠,代碼庫中充斥著爛代碼。

代碼質(zhì)量

好的代碼大致相同扫责,爛的代碼各式各樣榛鼎。隨便舉一些例子:

  • 設(shè)計(jì)復(fù)雜,或者干脆沒有設(shè)計(jì)鳖孤,無法理解
  • 耦合嚴(yán)重者娱,各個(gè)模塊、功能間相互交織苏揣,無法分離
  • 代碼重復(fù)黄鳍,邏輯重復(fù)嚴(yán)重的代碼,遍地Ctrl+C平匈、Ctrl+V的代碼
  • 風(fēng)格雜亂际起,前輩碼農(nóng)前仆后繼拾碌,都留下自己獨(dú)有的代碼性格和印記
  • 廢棄代碼,有用街望,或者沒用校翔,代碼就在那里,只增不減
  • 注釋失效灾前,過時(shí)的注釋不是好注釋防症,誤導(dǎo)碼農(nóng)的注釋是流氓注釋

一般認(rèn)為,代碼質(zhì)量差哎甲,是產(chǎn)品Bug頻發(fā)的罪魁禍?zhǔn)啄枨谩H魏未a,無論質(zhì)量高低炭玫,都隱藏著Bug奈嘿,質(zhì)量低的代碼,尤為嚴(yán)重吞加。

一旦出現(xiàn)Bug裙犹,碼農(nóng)的一般反應(yīng)是:這不是我寫的代碼,這是老代碼衔憨,一直就有問題叶圃。即使Bug是自己新引入的,也可以輕而易舉的找出理由:“老代碼太爛了践图,誰改都會(huì)出錯(cuò)”掺冠。沒錯(cuò),在碼農(nóng)眼中码党,代碼庫中的代碼是如此之爛德崭,以至于所有的問題,都可以歸罪于老代碼揖盘。

敏捷傳說

需求是在不斷變化的接癌,碼農(nóng)們?yōu)榇似S诒济S幸环N傳說扣讼,叫做敏捷缺猛,據(jù)說可以解決這個(gè)問題。值得一提的是椭符,目前我司的敏捷事業(yè)取得了可喜的成果荔燎。敏捷了,就不再懼怕Bug销钝,因?yàn)橛型陚涞臏y(cè)試有咨,把Bug消滅在萌芽狀態(tài);敏捷了蒸健,就不再懼需求的變化座享,因?yàn)槲覀儞肀ё兓裆蹋幻艚萘耍筒辉賾峙麻_發(fā)人員的變動(dòng)渣叛,因?yàn)槊艚菀竺總€(gè)人都是全才丈秩,要掌握;敏捷了淳衙,我們不再懼怕爛代碼蘑秽,因?yàn)槲覀冋莆樟酥貥?gòu)代碼的神技。

敏捷是鼓勵(lì)進(jìn)行代碼重構(gòu)箫攀,提高代碼質(zhì)量的肠牲。敏捷倡導(dǎo),代碼應(yīng)該擁抱變化靴跛,為了適應(yīng)新的需求和變化缀雳,應(yīng)不斷的重構(gòu)代碼。敏捷認(rèn)為:好的代碼質(zhì)量帶來好的產(chǎn)品質(zhì)量梢睛。這就鼓勵(lì)碼農(nóng)進(jìn)行代碼測(cè)試和重構(gòu)肥印,代碼測(cè)試給了碼農(nóng)信心,重構(gòu)不用再擔(dān)心和猶豫扬绪。

既然提到敏捷,多說點(diǎn)題外話裤唠。毫無疑問挤牛,敏捷實(shí)踐是軟件開發(fā)的最佳實(shí)踐,但是把敏捷引入到管理流程中時(shí)种蘸,一定要萬分小心墓赴。敏捷不是銀彈,需要認(rèn)清其本質(zhì)航瞭,才能利用敏捷诫硕,提高開發(fā)效率,提高產(chǎn)品質(zhì)量刊侯。而不是為敏捷所用章办,反而使得團(tuán)隊(duì)變得“不敏捷”。

主觀原因

重寫代碼是碼農(nóng)內(nèi)心萌生的欲望滨彻,是碼農(nóng)對(duì)優(yōu)美代碼的追求的正面體現(xiàn)藕届。重寫代碼可能的動(dòng)機(jī)有哪些呢?

  • 代碼潔癖亭饵,代碼整潔很重要休偶,但是過猶不及
  • 優(yōu)雅強(qiáng)迫癥,設(shè)計(jì)要優(yōu)雅辜羊,要抽象踏兜,為了適應(yīng)未來的變化词顾,可是未來在哪里?
  • 眼高手低碱妆,認(rèn)為可以輕而易舉的重寫代碼肉盹,把既有代碼替換掉
  • 先苦后甜的心里預(yù)期,認(rèn)為在一番努力之后山橄,后續(xù)的維護(hù)工作將更加輕松
  • 內(nèi)心泛濫的對(duì)后代碼農(nóng)的責(zé)任心垮媒,希望留下優(yōu)秀的代碼遺產(chǎn),和一段傳說

每個(gè)碼農(nóng)都有自己的代碼審美觀航棱,愛美之心睡雇,人皆有之,碼農(nóng)希望能寫出優(yōu)雅的代碼饮醇,維護(hù)優(yōu)雅的代碼它抱,無可厚非,而且是應(yīng)當(dāng)鼓勵(lì)的朴艰。

重寫代碼的阻力

但是代碼重寫這件事观蓄,至少在使用時(shí)間相對(duì)長(zhǎng)的系統(tǒng)中,卻鮮有發(fā)生祠墅。

外部原因

領(lǐng)導(dǎo)的三個(gè)終極問題

領(lǐng)導(dǎo)和碼農(nóng)的相同點(diǎn)是侮穿,都關(guān)注代碼的質(zhì)量,不同點(diǎn)是毁嗦,領(lǐng)導(dǎo)關(guān)注Bug的數(shù)量和嚴(yán)重程度等KPI指標(biāo)亲茅,碼農(nóng)關(guān)心代碼的好壞和優(yōu)雅程度。碼農(nóng)認(rèn)為愈優(yōu)雅的代碼狗准,就帶來愈高質(zhì)量的產(chǎn)品克锣,碼農(nóng)每每向領(lǐng)導(dǎo)游說,既有代碼如何如何爛腔长,重寫之后如何如何能提高代碼袭祟、產(chǎn)品的質(zhì)量。領(lǐng)導(dǎo)總是很淡定捞附,然后拋出三個(gè)終極問題:

  1. 會(huì)不會(huì)引入新問題巾乳?
  1. 對(duì)哪些功能有影響?有多大的影響鸟召?
  2. 工程上有多大的風(fēng)險(xiǎn)想鹰?

重寫當(dāng)然會(huì)引入新問題,當(dāng)然會(huì)對(duì)現(xiàn)有功能有影響药版,影響有多大辑舷,碼農(nóng)深思許久,依然沒有把握槽片,只好郁郁而歸何缓。

這個(gè)原因肢础,是絕大部分碼農(nóng)經(jīng)常提起的,也是最為碼農(nóng)們憤慨的碌廓,仿佛沒有了這個(gè)阻力传轰,將是一片廣闊的天空,可以盡情施展自己的才華谷婆。

玄機(jī)暗藏

那些年慨蛙,前輩碼農(nóng)和Bug們決戰(zhàn)光明頂,為了改好Bug纪挎,使出了渾身解數(shù)期贫。在爛代碼上改Bug,用更爛的方式去修改异袄,是一種快速討巧通砍,深受領(lǐng)導(dǎo)喜愛的方式。因?yàn)榭就桑椒m爛封孙,但是很好的解決了當(dāng)前問題。事實(shí)證明讽营,使用爛上加爛的方式虎忌,解決了Bug,而沒有引入新問題橱鹏,沒有影響到既有的功能膜蠢,將工程的風(fēng)險(xiǎn)控制到最小,圓滿的回答領(lǐng)導(dǎo)的三個(gè)終極問題蚀瘸。

每個(gè)改過無數(shù)Bug的碼農(nóng)狡蝶,都素有謙卑之心庶橱,深藏功與名贮勃,不著痕跡,以至于后代碼農(nóng)看到一段讓人驚訝無比的代碼苏章,卻不知這里暗藏玄機(jī)寂嘉,封印了系統(tǒng)的大Bug。代碼也成了一個(gè)寶藏枫绅,富含前輩碼農(nóng)積累下來的寶貴財(cái)富泉孩,可是隱藏的太深,無數(shù)的淘金者都失敗而歸并淋。這些隱藏的知識(shí)寶藏寓搬,逐漸的成為歷史,慢慢的县耽,歷史成為傳說句喷,傳說成為神話镣典。

在冒冒失失亂改一通,載了跟頭唾琼,被領(lǐng)導(dǎo)臭罵之后兄春,我們這些后世碼農(nóng),在審視和修改代碼時(shí)锡溯,始終懷著敬畏之心赶舆。時(shí)常用身臨其境的代入感,去感受前輩碼農(nóng)內(nèi)心的糾結(jié)和矛盾祭饭,體會(huì)他們審時(shí)度勢(shì)芜茵,不得不忍痛寫出如此令人不解的代碼時(shí)的復(fù)雜心情。于是我們處處謹(jǐn)慎甜癞,不敢隨意改動(dòng)夕晓,總是左思右想,謹(jǐn)防喚醒沉睡中的Bug Boss悠咱。

內(nèi)部原因

1984

工程風(fēng)險(xiǎn)蒸辆、領(lǐng)導(dǎo)的要求,擔(dān)心改出Bug析既,碼農(nóng)被重重包圍躬贡,工作中每一步都慎之又慎,不敢越雷池半步眼坏。注意拂玻!老大哥一直在盯著你!

爛代碼不但帶來糟糕的產(chǎn)品質(zhì)量宰译,也帶來大的代碼變更成本檐蚜,修改一句代碼往往都意味著工程風(fēng)險(xiǎn),領(lǐng)導(dǎo)的責(zé)罵沿侈,自身的惶恐闯第。更嚴(yán)重的是,爛代碼將一步步浸染開發(fā)者追求“美”的初心缀拭。為了熟悉業(yè)務(wù)咳短,不得不順著既有代碼的思路;為了新增功能蛛淋,不得不堆砌更多的爛代碼咙好;為了解決Bug,不得不浸泡在爛代碼中褐荷,無法自拔勾效。潛移默化是最厲害、最徹底的變化方式,不知不覺間层宫,開發(fā)者找到了成本最低的工作方法:以爛代碼的思考方式解決問題绘迁,堆砌更多的爛代碼。

失去了“初心”的碼農(nóng)卒密,一邊在掙扎缀台,一邊繼續(xù)沉淪,沉淪于“舒適區(qū)”哮奇。碼農(nóng)已經(jīng)完全忘卻了曾經(jīng)擁有的“初心”膛腐,沒有了掙扎,并在徹夜未眠終于解決一個(gè)故障后露出了欣慰的笑容鼎俘。終于哲身,碼農(nóng)沒有了抱怨,他在享受贸伐。

代碼江湖

代碼就是江湖勘天。碼農(nóng)是江湖中行走的劍客,劍客們心懷天下捉邢,行俠仗義脯丝、快意恩仇,夢(mèng)想著有朝一日一統(tǒng)江湖伏伐〕杞可是,江湖險(xiǎn)惡藐翎,危機(jī)暗藏材蹬。初入江湖的新手劍客,學(xué)藝不精吝镣,卻心比天高堤器,不畏艱險(xiǎn)。浪跡江湖多年的老道劍客末贾,往往知道水深而不敢涉險(xiǎn)闸溃,因?yàn)樗麄円褲u漸讀懂江湖。

新手劍客未舟,讓其路見不平圈暗,拔刀相助是一件很容易的事情掂为;但是讓其謙虛謹(jǐn)慎裕膀,靜待時(shí)機(jī)卻非易事。仗劍江湖比讀懂江湖要來的容易勇哗,這是一個(gè)知難行易的典型例子昼扛,我們也喜歡這樣的故事。碼農(nóng)何嘗不是?新手碼農(nóng)路見Bug抄谐,便想祭出重寫之劍渺鹦,可是卻不愿意去讀懂既有代碼。

可是蛹含,重寫代碼真的比讀懂代碼容易嗎毅厚?新手劍客是否已經(jīng)劍術(shù)精湛,內(nèi)功深厚浦箱,認(rèn)清了江湖吸耿,才能仗劍江湖。新手碼農(nóng)是否夯實(shí)了技能酷窥,深入理解了要解決的問題咽安,無法駕馭既有代碼蓬推,便不可能重寫出理想的代碼妆棒。

江湖老鳥老羅,在其Rom發(fā)布會(huì)開頭的發(fā)問:“大家準(zhǔn)備好了嗎沸伏?”糕珊,我們要時(shí)常問自己:對(duì)于徹底革新整個(gè)系統(tǒng)或者模塊,真的準(zhǔn)備好了嗎毅糟?

總結(jié)

面對(duì)阻力時(shí)放接,我們的注意力往往集中在外因上,碼農(nóng)經(jīng)常抱怨的也是留特,如果領(lǐng)導(dǎo)同意纠脾,代碼早已經(jīng)重寫,而不會(huì)造成現(xiàn)在的這樣一個(gè)爛攤子蜕青。卻往往忽視了自身的原因苟蹈,碼農(nóng)往往寧愿躲在“舒適區(qū)”內(nèi)哭泣,也不愿意折騰之后滿足的笑右核。

重寫代碼的沖動(dòng)是應(yīng)當(dāng)珍視的慧脱,沒有推翻陳舊的勇氣和行為,就沒有大的進(jìn)步贺喝×馀福可是,我們是否就可以大膽的對(duì)代碼進(jìn)行重寫呢躏鱼?對(duì)系統(tǒng)/模塊是否真正掌握了氮采?如何獲取隱藏的知識(shí)?敏捷是不是萬能的良藥染苛?測(cè)試能帶來多大程度的保證鹊漠?

帶著這些問題,我們還需要做進(jìn)一步的思考。

本碼農(nóng)四年碼歷躯概,經(jīng)驗(yàn)尚淺登钥,以上所述,空閑時(shí)的一點(diǎn)思考娶靡,不當(dāng)之處牧牢,歡迎批評(píng)指正!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末姿锭,一起剝皮案震驚了整個(gè)濱河市结执,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌艾凯,老刑警劉巖献幔,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異趾诗,居然都是意外死亡蜡感,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門恃泪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來郑兴,“玉大人,你說我怎么就攤上這事贝乎∏榱” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵览效,是天一觀的道長(zhǎng)却舀。 經(jīng)常有香客問我,道長(zhǎng)锤灿,這世上最難降的妖魔是什么挽拔? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮但校,結(jié)果婚禮上螃诅,老公的妹妹穿的比我還像新娘。我一直安慰自己状囱,他們只是感情好术裸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著亭枷,像睡著了一般袭艺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奶栖,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天匹表,我揣著相機(jī)與錄音,去河邊找鬼宣鄙。 笑死袍镀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的冻晤。 我是一名探鬼主播苇羡,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鼻弧!你這毒婦竟也來了设江?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤攘轩,失蹤者是張志新(化名)和其女友劉穎叉存,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體度帮,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡歼捏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笨篷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞳秽。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖率翅,靈堂內(nèi)的尸體忽然破棺而出练俐,到底是詐尸還是另有隱情,我是刑警寧澤冕臭,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布腺晾,位于F島的核電站,受9級(jí)特大地震影響辜贵,放射性物質(zhì)發(fā)生泄漏丘喻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一念颈、第九天 我趴在偏房一處隱蔽的房頂上張望泉粉。 院中可真熱鬧,春花似錦榴芳、人聲如沸嗡靡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讨彼。三九已至,卻和暖如春柿祈,著一層夾襖步出監(jiān)牢的瞬間哈误,已是汗流浹背哩至。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜜自,地道東北人菩貌。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像重荠,于是被迫代替她去往敵國(guó)和親箭阶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,190評(píng)論 25 707
  • 先說項(xiàng)目開發(fā)過程中團(tuán)隊(duì)人員的分工協(xié)作戈鲁。 一 人員安排 畢業(yè)至今的大部分項(xiàng)目都是獨(dú)立完成仇参,雖然也有和其他同事協(xié)作的時(shí)...
    SnowflakeCloud閱讀 10,773評(píng)論 3 59
  • 我找了很久的圖片婆芦,最終選擇了這一張抓谴。一只碗,一雙捂臉的手寞缝,一個(gè)蜷曲的側(cè)面癌压。它也是為數(shù)不多的不露臉的乞討圖。 每天我...
    可思軼閱讀 723評(píng)論 6 7
  • 五點(diǎn)多荆陆,被一只堅(jiān)強(qiáng)的蚊子溫柔地“吻醒”滩届,我就再也難以入眠了。睡不著被啼,就看書吧帜消!讀到了余世存的《今日何人才配...
    我是希瑞2017閱讀 203評(píng)論 0 2
  • 不信善勸遇麻煩,鬼鬼祟祟利欲牽 碰到石頭迷不覺浓体,苦果到時(shí)悔已晚
    了塵_d868閱讀 171評(píng)論 0 0