原始碼的壽命
看看你現在日常工作中的程式碼。已經執行了多久了?程式碼有多老了?有六個月?一年?可能都有五年這麼久了吧?十年?二十年呢?!這樣的程式碼有多老了?不到10%?還是一半?亦或者已經有90%了?為了瞭解這些問題的答案,我對程式碼的存活時間做了一些調查。
軟體考古
在已經存在很多年並且已經有自己的一系列原始碼運作的公司裡,編寫軟體就像是類似軟體學考古的一種磨練,深入研究應用就像在挖掘一個古老的城市,逐層的揭開過去種種的面紗。
一旦你開始鑽研一些封裝好的微型服務,就算是已經開始研究過去:也許殘留著有對公司面向服務體系架構的第一個嘗試;現在就是對伴隨著複雜業務邏輯的整體服務並且捆綁了Spring的總結。深入挖掘後我們回到了EJB的時代;由於開發者已經喪失了對它們理解的慾望,一些已經被遺忘好久的beans仍然依附於生活。再往下就是整體系統骨架的地方了。
如果沒有被打破,就不要去修理它
如此糟糕的程式碼是什麼?不用懷疑它帶有如此強烈的目的性。至少有一些是這樣的。
如果你檢視你一年期所寫的程式碼並且發現沒有什麼可以改變的,你這一年算是沒有成長。
我們一直在學習:更好的理解領域,更好的理解領域解決方案,新的架構方式,新的工具,新的方法,新的標準以及新的思路。你一年前的寫程式碼在某些地方可以進行改進這是很正常的,但是,有多少程式碼你回過頭去進行改進了呢?
舊程式碼是會變得越來越難修改的。如果一個業務需求的變更讓你必須回頭修改最原始的EJB,你會怎麼辦?你會去修改你十多年前寫的程式碼嗎?或者花時間去分析其中需要修改的部分?或者乾脆每次都新建一個新的小模組來解決?這些修改的代價是很昂貴的。
而現在的問題是:償還這種“技術債”是正確的事,但是修改以前的程式碼一般都會比你上週寫的或者上個月寫的東西慢。如果以前程式碼應該修改的地方你沒有及時去修改,這將影響你開發新的功能。最糟糕的是我們有時會明明知道有些地方我們做錯了,但是還是保持他長期執行。這些方法在當時我們認為是對的,只是現在看起來是錯了。
我們程式碼的壽命?
我對大量原始碼做過調查,其中包括商業以及開源的,設計各種語言(Java,C#,Ruby)。總體上,這些程式碼都遵循一個相似的規則:
大約70%的程式碼,在你寫後的12個月內一直在使用,沒有發生修改。
也許並不奇怪,程式碼完成之後的頭幾個月改動是最頻繁的。再往後似乎就進入了一種維護模式,改動量變得相對較少。
我發現這玩意兒實在太有趣了:大約75%的程式碼在我完成一年後仍然是原來的樣子。你可以設想一下我現在對於這個問題理解了多少,想像一下那些早就忘掉的設計思想,改變了的架構願景,新的工具和仍能重構使用的庫。想像一下當年寫下的那一行行程式碼在今天又能有多大的改進餘地。而且,在那些仍然遺留著類似技術債的程式碼庫裡,就算我們一直在孜孜不倦地償還,也沒見到老的程式碼新了多少。
我是怎麼做的這項分析?這要歸功於Git的魔力,它使這項分析變得很簡單。只要對整個倉庫做一次git blame的遞迴,就能夠列出針對分支中的每一行程式碼的commit號、提交人、提交時間。配合上一些shell指令碼技巧就能得出每月或每天的統計數字:
git ls-tree -r -rz --name-only HEAD -- | xargs -0 -n1 git blame -f HEAD | sed -e 's/^.* /([0-9]/{4/}-[0-9]/{2/}/)-[0-9]/{2/} .*$//1/g' | sort | uniq -c
按月份統計,截止到今天,以上輸出的這個表格是關於每一行程式碼最近被改動過的時間。不過,我也可以很容易地把時間往前推,比如把時間推到2015年的開始:
git checkout `git rev-list -n 1 --before="2015-01-01 00:00:00" master`
把時間往前推之後,重新遞迴執行一次git blame,通過比較每個月得出的結果,我就能知道有多少程式碼是在2015年之前寫的。經過更加詳細的分析,我也能得出某個月中最新修改的程式碼行數量怎樣隨著時間變化而變化,進而知曉程式碼衰退得有多快(多慢)。
結論
程式碼寫出來無非是為了實現某個意圖,遞送一些商業資料,但很快這就變成一種負債了。年代愈發久遠,原來的程式碼就越腐朽而越難以修改,根據上面的分析,你很容易明白為什麼一個程式碼倉庫能夠存在將近十年之久,裡面的程式碼為什麼都是些老古董:每年的改動量少之又少,它們就是躺在那兒沒人管,自始至終我們就只是在不斷地往裡面新增新的遺產——它們中的大多數即使到了下一個年頭你仍然還是可以找到的。
對於這種情況,我們可以做些什麼?過時的程式碼只會不斷堆積,這似乎就是軟體的自然法則,依我個人經驗來看,即使大家齊心協力對這些程式碼進行重構,似乎也收效甚微。我們還能做些別的麼?或者我們乾脆坦然接受越是年代久遠的程式碼就越難修改的這一事實?還是我們需要找到一個辦法,鼓勵軟體有一個更短的半衰期,以更快地得到重寫。
相關文章
- SSD固態硬碟使用壽命檢測方法 固態硬碟怎麼測剩餘壽命?硬碟
- 提高 MacBook 電池壽命的 9 種方法Mac
- 如何解決MRAM壽命問題
- 如何檢視ssd壽命?教你macOS 免安裝用指令即可查詢SSD健康度/壽命Mac
- App的戰國時代 15%壽命只有1周APP
- 壽命計算器測試結果
- 十個延長iPhone電池壽命的祕訣iPhone
- 如何檢查AirPods電池壽命?AI
- 如何讓筆記本使用壽命更長筆記
- YouGov:40%的消費者擔心手機使用壽命Go
- 延長不間斷供電系統壽命的方法
- 偷了『半條命2』原始碼的那小子原始碼
- 小身材有大作用——光模組壽命分析(二)
- CleanMyMac最佳化教程,使用CleanMyMac延長Mac的使用壽命Mac
- Vector Watch智慧手錶:最佳電池壽命的智慧手錶
- 抑制IL-11可延長哺乳動物25%壽命
- 普渡大學軟體延長16%的Android電池壽命 程式碼已開源Android
- 在 Linux 下使用 fstrim 延長 SSD 驅動器的壽命Linux
- AlDente Pro for Mac – 保護您的Mac電池,延長使用壽命Mac
- 油田開發專案經濟壽命期的確定方法(轉)
- 嵌入式系統使用壽命程式語言比較好
- 【電腦知識】BT下載是否會減少SSD壽命?
- 研究人員利用大資料分析預期壽命與收入的關係大資料
- [軟體人生]程式設計師的壽命和工作(一句話回答)程式設計師
- Google致力於解決macOS裝置上電池壽命問題GoMac
- 固態硬碟壽命檢測方法 怎麼看SSD還能用多久?硬碟
- 一款遊戲的壽命,其實往往在遊戲中期便已宣告終止遊戲
- 要想壽命長,還得社交廣!50萬人資料研究發現孤獨會縮短壽命,即使每月一次親朋好友相聚也能降低死亡風險!
- 《自然》:延壽新探索!科學家發現,年齡越大,基因轉錄越快、越隨意,或影響壽命
- 蘋果企業賬號回收平臺:iPhone壽命怎麼才能延長蘋果iPhone
- SSD固態硬碟能用多久 SSD固態硬碟壽命怎麼計算?硬碟
- 如果工作能保持健康延長壽命 那你還會選擇退休麼?
- uSwitch:電池壽命對智慧手機購買決定有最大影響
- 三星860 PRO與EOV固態硬碟釋出 SSD容量壽命猛增硬碟
- 物聯網要落地還需解決終端尺寸和壽命問題
- AlDente Pro如何延長mac電池壽命?AlDente Pro mac智慧充電管理Mac
- 手機正確的充電方法,保你的智慧手機壽命延長三年
- Non-Balance磨損平衡演算法,提升固態硬碟3倍以上壽命演算法硬碟