1. 程式人生 > >10年的老程式碼,動還是不動?

10年的老程式碼,動還是不動?

你入職一家新單位,被告知需要維護一個老產品,經理找質管給你開通了svn許可權,告訴你遷出哪個分支——就是那個十年前已經定型的分支,就是那個超過6代程式設計師維護過的分支——然後告訴你說,就在這個分支上改,新增一個新介面,以便支援H5 Video。

於是你開始看程式碼,雲山霧罩,各種痛苦,完全搞不懂業務邏輯和程式碼的關係,也鬧不明白這塊程式碼為什麼這麼寫那塊程式碼是幾個意思。你戰戰兢兢如履薄冰思前想後寸步難行。

你去問進來5個多月還沒轉正的老同事,他告訴你他也不懂,讓你湊合著加個新介面實現了功能就行。加了新功能就行。

你去問幹了快一年的資格更老的同事,他叮囑你千萬別動裡面的程式碼,千萬別管裡面什麼樣,就在外面包一層,先交付新功能,其它的有時間再說,裡面的邏輯十年沒人動過了,沒有一個人能說清楚怎麼回事,你要是改,一不留神就遍地狼煙。

你怎麼辦?

怎樣不讓猴子吃香蕉

我想起來猴子吃香蕉的實驗:

鐵籠裡關了五隻猴,實驗者放進一掛鮮嫩甜美的香蕉,五猴頓時興奮起來,環視了周圍,其中一隻率先伸手去抓。這時,實驗者以高壓水槍衝擊,包括那四隻僅有念頭尚未行動的,也受到了懲罰。

過了會兒,看看沒有動靜,水果香氣四溢,又一隻猴躍躍欲試竄到香蕉前,高壓水槍的集體懲罰再次啟動。如此這般幾個回合下來,猴都變得老實了,眼睜睜看著令之饞涎欲滴的果實,竟無一隻敢再嘗試——因集體受罰的經驗令之膽寒。

此時,實驗者撤出一隻水淋淋渾身發抖之猴,換進只新猴,這個不知天高地厚的傢伙一進籠就奔 香蕉而去;這時,一種現像出現了:四隻吃盡苦頭的猴一擁而上,撕扯、阻撓這冒失鬼,不讓它接近深具誘惑力的美味,以免大家跟著受罪。

至此,高壓水槍這專政手段暫且擱置,威懾效果依舊。等猴子一隻只置換完畢,五隻新猴面對香蕉皆不敢造次,個個循規蹈距,成就了“自律”的一群。

在這個籠裡一個奇異的景象出現了:猴們最愛吃的香蕉,成了“禁果”!

關於老程式碼的禁忌

程式碼

對程式設計師來講,維護老程式碼是最噁心的事兒之一。沒說的,就是噁心,公認的噁心,連我這種自認為隨意、靈活、程式碼適應性強、沒有原則的老程式設計師也覺得維護老程式碼是一種罪。如果你恨一個程式設計師,就讓他去維護年久失修搖搖欲墜的老程式碼吧。

然而,本文開始時提到的情況卻幾乎是每一個程式設計師都會碰見的。老程式碼啊,我們恨之厭之煩之遠之卻不可棄之。對一家軟體企業來講,老程式碼就是資產,是多年積累下來的核心資產和重要競爭力。尤其是軟體產品,一份程式碼先後幾波人維護過是常有的事。

這種時候,老程式碼就老而成精有了生命,每當有新人進來,它都會用特有的超出我們耳力邊界的高頻發出聲音:警告,警告,一波新程式設計師正在趕來,快給它們點厲害殺殺它們的士氣。

而且,部分熟悉老程式碼的老程式設計師也會諄諄告誡我們,這幾個檔案不要動,這幾個類不要動,這裡一改就奔潰,那裡一改就連不上伺服器,雷區標識很多。還有那一進來就因為被告誡而根本就沒看過老程式碼的程式設計師也會告誡我們,那程式碼誰也不懂,多少年沒人動過了,不動為妙,免惹麻煩……

故事就這樣發生了,禁忌就如此這般傳承下來。我們知道那裡可能有問題,可是沒人敢去動它,等最後一個熟悉一部分老程式碼的程式設計師悠然遠去,此地空餘嘆息,從此以後,新來的程式設計師就成了想吃香蕉的猴子。

動,還是不動?

老程式碼成了禁忌,我們往往被迫(沒時間或不願意或害怕或不屑)在漂浮海面的冰山的尖尖上修修補補,深入瞭解深層程式碼成了誰也不願言說的痛。

然而都不懂看程式碼都不動老程式碼,老程式碼只能越來越老越來越陳腐,越來越沒人敢動。越往後動的代價越高越沒人敢動。這對公司和團隊都不好。裹一層又一層,終將積重難返成為裹腳布,無人問津。

而一旦老程式碼沒人能夠把握,這些作為資產的程式碼實際上已經丟了,不再有價值增長了,原本領先的優勢隨著同行們百舸爭流的追趕漸漸失去了。

這是對企業是一種損失。讀程式設計師其實也是一種損失。

為什麼這般講?

程式碼

情人還是老的好

程式設計師有個毛病:自己不寫文件卻老抱怨別人的程式碼沒文件,而碰見了有文件的程式碼卻又往往棄文件如敝履。所以,業界流傳一句話:程式碼即文件。所以,業界的程式碼和文件,少見匹配的。

哇咔咔咔,對吧。

所以,我們只能接受這個現實:程式碼即文件。

所以,對維護老產品的程式設計師來講,要想弄明白老產品的邏輯,就只要如下兩個辦法:

  • 找到熟悉產品的前輩,讓他給你講講。如果你找了產品經理,他只能告訴產品設計上如何如何。如果你找了程式設計師,他通常會說就是這樣那樣,然後說一句高深莫測又拉仇恨的話:看看程式碼就明白了。
  • 自己啃程式碼,啃程式碼,啃程式碼。

Ok,維護舊產品,弄明白產品設計邏輯和程式碼實現邏輯是非常重要的。

對於本文一開始提到的問題,其實也可能有在外圍包裝的辦法,比如你封裝一個本地的HTTP Server,用舊API拿到資料作為HTTP流轉發一下就能支援H5 Video標籤了。也可能很多情況都存在折衷的替代辦法。

然而,能弄懂程式碼是如何實現產品和業務的,還是有非常重要的好處——對程式設計師來講很重要的好處:

文件是會過時的,程式碼是不會說謊的,讀懂程式碼,你就真真正正明白了業務是如何實現的。對於沒人敢動而又核心的老程式碼,你搞明白了,就佔領了戰略要地。

這裡我要引用格力空調的一句廣告詞:掌握核心科技。不管這是吹的還是怎的,話說得不錯,掌握核心科技才有競爭力,對程式設計師來講也是一樣,唯有掌握核心業務和程式碼,才能彰顯自己的價值

除此之外,讀程式碼也是非常重要的學習途徑,尤其是經歷過線上考驗的程式碼,必然尤其過人之處。在閱讀的過程中,我們可以學到很多東西,既可以學到業務,也可以學到設計。退一萬步講,即便你認為你水平遠超一般人屬於一針頂破天的那位,也還是可以從當時、當地的選擇中學到東西:見賢可以思齊,見過可以自省。

所以,我的主張是:老程式碼,動啊,為什麼不動!

不能拒絕時就接納,無需排斥,何時何地都可以修行,只要有心,處處都是成長的機會。最不濟,也鍛鍊了閱讀程式碼的能力,庖丁解牛之技成了,也可以在將來以無刃入有間,發揮用武之地。

來自foruok(簡書作者)