前言
你入職一家新單位镇饮,被告知需要維護(hù)一個(gè)老產(chǎn)品,經(jīng)理找質(zhì)管給你開通了SVN權(quán)限箕母,告訴你遷出哪個(gè)分支——就是那個(gè)十年前已經(jīng)定型的分支储藐,就是那個(gè)超過(guò)6代程序員維護(hù)過(guò)的分支——然后告訴你說(shuō),就在這個(gè)分支上改嘶是,添加一個(gè)新接口钙勃,以便支持H5 Video。
于是你開始看代碼聂喇,云山霧罩辖源,各種痛苦,完全搞不懂業(yè)務(wù)邏輯和代碼的關(guān)系希太,也鬧不明白這塊代碼為什么這么寫那塊代碼是幾個(gè)意思克饶。你戰(zhàn)戰(zhàn)兢兢如履薄冰思前想后寸步難行漩怎。
你去問(wèn)進(jìn)來(lái)5個(gè)多月還沒(méi)轉(zhuǎn)正的老同事乐横,他告訴你他也不懂奏司,讓你湊合著加個(gè)新接口實(shí)現(xiàn)了功能就行轩褐。加了新功能就行次哈。
你去問(wèn)干了快一年的資格更老的同事秩贰,他叮囑你千萬(wàn)別動(dòng)里面的代碼晓锻,千萬(wàn)別管里面什么樣专执,就在外面包一層奈偏,先交付新功能坞嘀,其它的有時(shí)間再說(shuō),里面的邏輯十年沒(méi)人動(dòng)過(guò)了惊来,沒(méi)有一個(gè)人能說(shuō)清楚怎么回事丽涩,你要是改,一不留神就遍地狼煙。
你怎么辦矢渊?
關(guān)于老代碼的禁忌
對(duì)程序員來(lái)講继准,維護(hù)老代碼是最惡心的事兒之一。沒(méi)說(shuō)的矮男,就是惡心移必,公認(rèn)的惡心,連我這種自認(rèn)為隨意毡鉴、靈活崔泵、代碼適應(yīng)性強(qiáng)、沒(méi)有原則的老程序員也覺(jué)得維護(hù)老代碼是一種罪猪瞬。如果你恨一個(gè)程序員憎瘸,就讓他去維護(hù)年久失修搖搖欲墜的老代碼吧。
然而陈瘦,本文開始時(shí)提到的情況卻幾乎是每一個(gè)程序員都會(huì)碰見的幌甘。老代碼啊,我們恨之厭之煩之遠(yuǎn)之卻不可棄之痊项。對(duì)一家軟件企業(yè)來(lái)講锅风,老代碼就是資產(chǎn),是多年積累下來(lái)的核心資產(chǎn)和重要競(jìng)爭(zhēng)力鞍泉。尤其是軟件產(chǎn)品皱埠,一份代碼先后幾波人維護(hù)過(guò)是常有的事。
這種時(shí)候塞弊,老代碼就老而成精有了生命漱逸,每當(dāng)有新人進(jìn)來(lái)泪姨,它都會(huì)用特有的超出我們耳力邊界的高頻發(fā)出聲音:警告游沿,警告,一波新程序員正在趕來(lái)肮砾,快給它們點(diǎn)厲害殺殺它們的士氣诀黍。
而且,部分熟悉老代碼的老程序員也會(huì)諄諄告誡我們仗处,這幾個(gè)文件不要?jiǎng)用泄矗@幾個(gè)類不要?jiǎng)樱@里一改就奔潰婆誓,那里一改就連不上服務(wù)器吃环,雷區(qū)標(biāo)識(shí)很多。還有那一進(jìn)來(lái)就因?yàn)楸桓嬲]而根本就沒(méi)看過(guò)老代碼的程序員也會(huì)告誡我們洋幻,那代碼誰(shuí)也不懂郁轻,多少年沒(méi)人動(dòng)過(guò)了,不動(dòng)為妙,免惹麻煩……
故事就這樣發(fā)生了好唯,禁忌就如此這般傳承下來(lái)竭沫。我們知道那里可能有問(wèn)題,可是沒(méi)人敢去動(dòng)它骑篙,等最后一個(gè)熟悉一部分老代碼的程序員悠然遠(yuǎn)去蜕提,此地空余嘆息,從此以后靶端,新來(lái)的程序員就成了想吃香蕉的猴子谎势。
動(dòng),還是不動(dòng)杨名?
老代碼成了禁忌它浅,我們往往被迫(沒(méi)時(shí)間或不愿意或害怕或不屑)在漂浮海面的冰山的尖尖上修修補(bǔ)補(bǔ),深入了解深層代碼成了誰(shuí)也不愿言說(shuō)的痛镣煮。
然而都不懂看代碼都不動(dòng)老代碼姐霍,老代碼只能越來(lái)越老越來(lái)越陳腐,越來(lái)越?jīng)]人敢動(dòng)典唇。越往后動(dòng)的代價(jià)越高越?jīng)]人敢動(dòng)镊折。這對(duì)公司和團(tuán)隊(duì)都不好。裹一層又一層介衔,終將積重難返成為裹腳布恨胚,無(wú)人問(wèn)津。
而一旦老代碼沒(méi)人能夠把握炎咖,這些作為資產(chǎn)的代碼實(shí)際上已經(jīng)丟了赃泡,不再有價(jià)值增長(zhǎng)了,原本領(lǐng)先的優(yōu)勢(shì)隨著同行們百舸爭(zhēng)流的追趕漸漸失去了乘盼。
這是對(duì)企業(yè)是一種損失升熊。讀程序員其實(shí)也是一種損失。
為什么這般講绸栅?
情人還是老的好
程序員有個(gè)毛布兑啊:自己不寫文檔卻老抱怨別人的代碼沒(méi)文檔,而碰見了有文檔的代碼卻又往往棄文檔如敝履粹胯。所以蓖柔,業(yè)界流傳一句話:代碼即文檔。所以风纠,業(yè)界的代碼和文檔况鸣,少見匹配的。
哇咔咔咔竹观,對(duì)吧镐捧。
所以,我們只能接受這個(gè)現(xiàn)實(shí):代碼即文檔。
所以愤估,對(duì)維護(hù)老產(chǎn)品的程序員來(lái)講帮辟,要想弄明白老產(chǎn)品的邏輯,就只要如下兩個(gè)辦法:
找到熟悉產(chǎn)品的前輩玩焰,讓他給你講講由驹。如果你找了產(chǎn)品經(jīng)理,他只能告訴產(chǎn)品設(shè)計(jì)上如何如何昔园。如果你找了程序員蔓榄,他通常會(huì)說(shuō)就是這樣那樣,然后說(shuō)一句高深莫測(cè)又拉仇恨的話:看看代碼就明白了默刚。
自己啃代碼甥郑,啃代碼,啃代碼荤西。
OK澜搅,維護(hù)舊產(chǎn)品,弄明白產(chǎn)品設(shè)計(jì)邏輯和代碼實(shí)現(xiàn)邏輯是非常重要的邪锌。
對(duì)于本文一開始提到的問(wèn)題勉躺,其實(shí)也可能有在外圍包裝的辦法,比如你封裝一個(gè)本地的HTTP Server觅丰,用舊API拿到數(shù)據(jù)作為HTTP流轉(zhuǎn)發(fā)一下就能支持H5 Video標(biāo)簽了饵溅。也可能很多情況都存在折衷的替代辦法。
然而妇萄,能弄懂代碼是如何實(shí)現(xiàn)產(chǎn)品和業(yè)務(wù)的蜕企,還是有非常重要的好處——對(duì)程序員來(lái)講很重要的好處:
文檔是會(huì)過(guò)時(shí)的,代碼是不會(huì)說(shuō)謊的冠句,讀懂代碼轻掩,你就真真正正明白了業(yè)務(wù)是如何實(shí)現(xiàn)的。對(duì)于沒(méi)人敢動(dòng)而又核心的老代碼轩端,你搞明白了放典,就占領(lǐng)了戰(zhàn)略要地。
這里我要引用格力空調(diào)的一句廣告詞:掌握核心科技基茵。不管這是吹的還是怎的,話說(shuō)得不錯(cuò)壳影,掌握核心科技才有競(jìng)爭(zhēng)力拱层,對(duì)程序員來(lái)講也是一樣,唯有掌握核心業(yè)務(wù)和代碼宴咧,才能彰顯自己的價(jià)值根灯。
除此之外,讀代碼也是非常重要的學(xué)習(xí)途徑,尤其是經(jīng)歷過(guò)線上考驗(yàn)的代碼烙肺,必然尤其過(guò)人之處纳猪。在閱讀的過(guò)程中,我們可以學(xué)到很多東西桃笙,既可以學(xué)到業(yè)務(wù)氏堤,也可以學(xué)到設(shè)計(jì)。退一萬(wàn)步講搏明,即便你認(rèn)為你水平遠(yuǎn)超一般人屬于一針頂破天的那位鼠锈,也還是可以從當(dāng)時(shí)、當(dāng)?shù)氐倪x擇中學(xué)到東西:見賢可以思齊星著,見過(guò)可以自省购笆。
所以,我的主張是:老代碼虚循,動(dòng)啊同欠,為什么不動(dòng)!
不能拒絕時(shí)就接納横缔,無(wú)需排斥行您,何時(shí)何地都可以修行,只要有心剪廉,處處都是成長(zhǎng)的機(jī)會(huì)娃循。最不濟(jì),也鍛煉了閱讀代碼的能力斗蒋,庖丁解牛之技成了捌斧,也可以在將來(lái)以無(wú)刃入有間,發(fā)揮用武之地泉沾。
至于怎么讀代碼改代碼捞蚂,相信比學(xué)宋仲基撩妹容易多了,一句話:多讀讀就好了跷究。