為什么程序員千萬(wàn)不要重寫(xiě)代碼?

你所做的事情的圆,也許暫時(shí)看不到成果检访,但不要灰心或焦慮汉柒,你不是沒(méi)有成長(zhǎng),而是在扎根悉患。

圖片來(lái)自網(wǎng)絡(luò)

0 前言

程序員都有一顆工程師的心,所以當(dāng)他們到一片新的場(chǎng)地想做的第一件事就是榆俺,將舊的一切推倒重來(lái)售躁。是的坞淮,他們決不會(huì)滿足于簡(jiǎn)單的增量勞動(dòng)。

或許這種微妙的心理定位可以解釋:為什么程序員進(jìn)入新項(xiàng)目組后寧愿丟掉舊代碼重新寫(xiě)陪捷,也不愿意修修補(bǔ)補(bǔ)回窘,他們認(rèn)為舊代碼簡(jiǎn)直一團(tuán)糟。

但是市袖,事實(shí)上真是這樣嗎啡直?你之所以認(rèn)為舊代碼一團(tuán)糟,其實(shí)是由編程的一個(gè)基本定律決定的苍碟,那就是:寫(xiě)代碼容易酒觅,讀代碼難。

1 為什么你覺(jué)得舊代碼異澄⒎澹混亂舷丹?因?yàn)樽x代碼更難

這大概就是代碼Reuse難以實(shí)現(xiàn)的原因,也可以解釋為什么你組里的每個(gè)人都喜歡用不同的功能將分割的字符串轉(zhuǎn)換成一個(gè)數(shù)組县忌。比起猜測(cè)舊的功能是怎樣實(shí)現(xiàn)的掂榔,重新寫(xiě)一個(gè)自己的功能要簡(jiǎn)單和有趣多了。

作為這個(gè)公理的推論症杏,你可以問(wèn)問(wèn)身邊的程序員他們正在奮戰(zhàn)的代碼怎么樣装获?“簡(jiǎn)直是一塌糊涂!”他們肯定會(huì)這樣說(shuō)厉颤⊙ㄔィ“我簡(jiǎn)直想推倒重來(lái)!”

為什么認(rèn)為代碼這么糟糕呢逼友?“額精肃,看看這個(gè)功能,竟然有兩頁(yè)長(zhǎng)帜乞!完全不知道這些東西為什么在這里司抱!完全不知道這些API是干什么的±枇遥”他們會(huì)這樣回答你习柠。

漫畫(huà):讀別人代碼是一種怎樣的體驗(yàn)?

曾經(jīng)照棋,Borland的創(chuàng)始人 Philippe Kahn當(dāng)初就是向記者們吹噓:Quattro Pro會(huì)比Microsoft Excel要好用得多资溃,因?yàn)樗菑念^開(kāi)始編寫(xiě)的,全部都是新的源代碼烈炭!

但是溶锭,認(rèn)為新代碼比舊代碼好簡(jiǎn)直就是荒謬。舊代碼是已經(jīng)運(yùn)行過(guò)的符隙,測(cè)試過(guò)的趴捅。無(wú)數(shù)的bug在被發(fā)現(xiàn)前都上線運(yùn)行過(guò)垫毙,發(fā)現(xiàn)之后程序員們可能在花了好些日子才修復(fù)了這些bug。這種修復(fù)可能是一行代碼驻售,也可能是幾個(gè)字符露久,無(wú)數(shù)的時(shí)間和精力都花在了這些bug修復(fù)上。

當(dāng)你決定拋棄這些舊代碼從零開(kāi)始的時(shí)候欺栗,你也丟掉全部前任努力的結(jié)果。

2?新代碼一定比舊代碼好征峦?NO迟几,重寫(xiě)可能會(huì)帶來(lái)更大的風(fēng)險(xiǎn)

對(duì)技術(shù)領(lǐng)導(dǎo)者來(lái)說(shuō),重寫(xiě)項(xiàng)目的代碼也是一個(gè)異常艱難的決定栏笆。因?yàn)閺墓緦用嬲f(shuō)类腮,重現(xiàn)代碼甚至?xí){產(chǎn)品的市場(chǎng)競(jìng)爭(zhēng)力。一旦決定重寫(xiě)代碼蛉加,那么與競(jìng)品相比蚜枢,你可能落后了2~3年——在軟件行業(yè),這時(shí)間可夠長(zhǎng)的针饥。

3?你理想中的新代碼會(huì)帶來(lái)產(chǎn)品功能的提升

但事實(shí)上厂抽,即便重寫(xiě)的新代碼可以實(shí)現(xiàn)舊代碼的所有功能和需求,但是為產(chǎn)品帶來(lái)的市場(chǎng)競(jìng)爭(zhēng)力只有邊際提升丁眼。因?yàn)橹貙?xiě)用的新技術(shù)筷凤、新語(yǔ)言、新框架并沒(méi)有給產(chǎn)品帶來(lái)質(zhì)的飛躍苞七。

更不用說(shuō)在重寫(xiě)的漫長(zhǎng)過(guò)程中可能會(huì)遇到一些意外情況藐守,比如:

1、缺錢:資金鏈的斷裂

2蹂风、缺人:核心程序員離職

最終導(dǎo)致效果不佳:達(dá)不到原產(chǎn)品應(yīng)有的所有功能和需求卢厂,白白浪費(fèi)了時(shí)間和金錢,也丟掉了市場(chǎng)競(jìng)爭(zhēng)力惠啄。

所以重寫(xiě)代碼意味著慎恒,你在把自己置身于非常危險(xiǎn)的境地,可能幾年后你也寫(xiě)不出比以前更好的代碼礁阁。你只是花了一大筆錢把已經(jīng)存在的代碼又寫(xiě)了一遍巧号。

4?當(dāng)你覺(jué)得眼前的舊代碼很爛時(shí),該怎么辦姥闭?

你覺(jué)得舊代碼寫(xiě)的很爛丹鸿,那又怎樣呢?它們已經(jīng)上線棚品,已經(jīng)在實(shí)際運(yùn)行中經(jīng)受住了考驗(yàn)靠欢。所以當(dāng)你發(fā)現(xiàn)前任留下的代碼亂七八糟的時(shí)候廊敌,不妨冷靜下來(lái),從以下三個(gè)方面入手理解代碼门怪、改善代碼:

1骡澈、代碼的結(jié)構(gòu)有問(wèn)題

如果一段網(wǎng)絡(luò)代碼突然彈出了自己的對(duì)話框,應(yīng)該是UI代碼需要被處理掷空。這些問(wèn)題可以被解決掉肋殴,你要一次次小心地移動(dòng)代碼,重構(gòu)坦弟,改變接口护锤。還需要一位細(xì)心的工程師立馬仔細(xì)地檢查這些改變是否有問(wèn)題,從而不打擾到其他人酿傍。事實(shí)上烙懦,甚至比較大的結(jié)構(gòu)變化也可以不扔掉代碼來(lái)完成。

大牛程序員Joel Spolsky回憶說(shuō)赤炒,曾經(jīng)在某個(gè)項(xiàng)目中氯析,他和他的團(tuán)隊(duì)花了好幾個(gè)月重新架構(gòu)在一點(diǎn)上:把代碼動(dòng)來(lái)動(dòng)去、清理莺褒、創(chuàng)建有意義的基類掩缓,并創(chuàng)建了模塊之間的完美接口。但是他們始終非常小心翼翼癣朗,并沒(méi)有產(chǎn)生新的bug拾因,也沒(méi)有丟掉任何舊代碼。

2旷余、代碼的效率不高

曾經(jīng)绢记,Netscape的渲染代碼被傳非常緩慢。但事實(shí)上正卧,這只會(huì)影響該項(xiàng)目的一小部分蠢熄,這部分是你可以優(yōu)化甚至重寫(xiě)的。你完全不必重寫(xiě)全部代碼炉旷。優(yōu)化速度的1%工作量签孔,會(huì)讓你獲得99%的爆炸性提高。

3窘行、代碼寫(xiě)得很丑

有些代碼真的寫(xiě)的很丑饥追,比如Joel曾參與一個(gè)項(xiàng)目,開(kāi)始用下劃線做開(kāi)始的成員變量約定罐盔,但后來(lái)改用更標(biāo)準(zhǔn)的“M_”但绕。所以一半的功能用“_”開(kāi)始,一半用“M”開(kāi)始,這看起來(lái)真的很丑陋捏顺。但這個(gè)問(wèn)題5分鐘就能解決六孵,而不用從頭開(kāi)始寫(xiě)全部的代碼。

最后幅骄,你要記住劫窒,從頭開(kāi)始再寫(xiě)一遍并不意味著你會(huì)寫(xiě)出比以前更好的代碼。因?yàn)槟銢](méi)有參與到上一個(gè)版本的創(chuàng)建拆座,所以你其實(shí)根本就不算有經(jīng)驗(yàn)主巍。一旦你準(zhǔn)備推倒重寫(xiě),你可能會(huì)再犯一遍版本一犯過(guò)的錯(cuò)懂拾,甚至?xí)a(chǎn)生更多的新問(wèn)題煤禽。

5?面對(duì)糟糕的舊代碼,Keep Calm & Carry On!

在大型商業(yè)項(xiàng)目中岖赋,推倒重來(lái)是非常危險(xiǎn)的行為。當(dāng)然瓮孙,如果你是在做實(shí)驗(yàn)唐断,想到新算法可以隨時(shí)重寫(xiě)。如果你剛接手一個(gè)新項(xiàng)目杭抠,面對(duì)看上去異沉掣剩混亂的舊代碼,請(qǐng)冷靜下來(lái)偏灿,忍住推倒重寫(xiě)的沖動(dòng)丹诀,想想上面這些經(jīng)驗(yàn)之談。

在這里順便給大家推薦一個(gè)架構(gòu)交流群:617434785翁垂,里面會(huì)分享一些資深架構(gòu)師錄制的視頻錄像:有Spring铆遭,MyBatis,Netty源碼分析沿猜,高并發(fā)枚荣、高性能、分布式啼肩、微服務(wù)架構(gòu)的原理橄妆,JVM性能優(yōu)化這些成為架構(gòu)師必備的知識(shí)體系。還能領(lǐng)取免費(fèi)的學(xué)習(xí)資源祈坠。相信對(duì)于已經(jīng)工作和遇到技術(shù)瓶頸的碼友害碾,在這個(gè)群里會(huì)有你需要的內(nèi)容。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赦拘,一起剝皮案震驚了整個(gè)濱河市慌随,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌另绩,老刑警劉巖儒陨,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件花嘶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蹦漠,警方通過(guò)查閱死者的電腦和手機(jī)椭员,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)笛园,“玉大人隘击,你說(shuō)我怎么就攤上這事⊙忻” “怎么了埋同?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)棵红。 經(jīng)常有香客問(wèn)我凶赁,道長(zhǎng),這世上最難降的妖魔是什么逆甜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任虱肄,我火速辦了婚禮,結(jié)果婚禮上交煞,老公的妹妹穿的比我還像新娘咏窿。我一直安慰自己,他們只是感情好素征,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布集嵌。 她就那樣靜靜地躺著,像睡著了一般御毅。 火紅的嫁衣襯著肌膚如雪根欧。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天亚享,我揣著相機(jī)與錄音咽块,去河邊找鬼。 笑死欺税,一個(gè)胖子當(dāng)著我的面吹牛侈沪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晚凿,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼亭罪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了歼秽?” 一聲冷哼從身側(cè)響起应役,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后箩祥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體院崇,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年袍祖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了底瓣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蕉陋,死狀恐怖捐凭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凳鬓,我是刑警寧澤茁肠,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站缩举,受9級(jí)特大地震影響垦梆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仅孩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一奶赔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧杠氢,春花似錦、人聲如沸另伍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)摆尝。三九已至温艇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堕汞,已是汗流浹背勺爱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留讯检,地道東北人琐鲁。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像人灼,于是被迫代替她去往敵國(guó)和親围段。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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