自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

改進(jìn)舊代碼庫(kù)的推薦路線:走向可擴(kuò)展可維護(hù)系統(tǒng)的11條經(jīng)驗(yàn)

運(yùn)維 系統(tǒng)運(yùn)維
在開(kāi)始做任何事情之前,您需要備份所有可能相關(guān)的內(nèi)容,這樣可以確保不管發(fā)生什么情況不會(huì)丟失數(shù)據(jù)。我們很難記得每天修改了哪些東西,特別是配置數(shù)據(jù)容易受到這種問(wèn)題的影響,配置通常不會(huì)進(jìn)行版本控制,如果能夠進(jìn)行定期備份,那則可以規(guī)避很多麻煩。把所有東西復(fù)制到一個(gè)非常安全的地方,除非它是只讀模式,否則永遠(yuǎn)不會(huì)觸摸到。

每個(gè)程序員,項(xiàng)目經(jīng)理或團(tuán)隊(duì)負(fù)責(zé)人的生命周期中至少發(fā)生一次,你接手一坨超過(guò)百萬(wàn)行代碼的系統(tǒng),原來(lái)的程序員很久以前就離職,現(xiàn)在也許正在某個(gè)陽(yáng)光明媚的地方度假,文檔(如果有的話)最有可能的情況就是與現(xiàn)有的系統(tǒng)不同步。

[[193271]]

而你的工作則是帶領(lǐng)團(tuán)隊(duì)脫離這個(gè)混亂。

在經(jīng)歷逃離的本能回應(yīng)之后,您開(kāi)始對(duì)項(xiàng)目進(jìn)行了了解,公司高層領(lǐng)導(dǎo)是不能容忍項(xiàng)目失敗的情況。然而,通過(guò)你手頭現(xiàn)有的東西,失敗是大概率發(fā)生的事件。那么該如何應(yīng)對(duì)?

我有幸(或不幸)已經(jīng)經(jīng)歷過(guò)若干次類(lèi)似的經(jīng)歷,我和一小部分朋友發(fā)現(xiàn),如果能夠把這些垃圾代碼變成健康的可維護(hù)的項(xiàng)目,實(shí)際上是非常值得一試的事情。以下是我們總結(jié)改進(jìn)舊版代碼庫(kù)的一些經(jīng)驗(yàn)(或者叫軍規(guī))。

1、數(shù)據(jù)備份

在開(kāi)始做任何事情之前,您需要備份所有可能相關(guān)的內(nèi)容,這樣可以確保不管發(fā)生什么情況不會(huì)丟失數(shù)據(jù)。我們很難記得每天修改了哪些東西,特別是配置數(shù)據(jù)容易受到這種問(wèn)題的影響,配置通常不會(huì)進(jìn)行版本控制,如果能夠進(jìn)行定期備份,那則可以規(guī)避很多麻煩。把所有東西復(fù)制到一個(gè)非常安全的地方,除非它是只讀模式,否則永遠(yuǎn)不會(huì)觸摸到。

2、重要的先決條件,構(gòu)建一個(gè)真實(shí)的仿真環(huán)境

我之前的文章中錯(cuò)過(guò)了這一步,假設(shè)這個(gè)環(huán)境已經(jīng)存在了,但許多 HN 網(wǎng)友指出了這一點(diǎn),他們是絕對(duì)正確的。

***步是確保你知道現(xiàn)在正在生產(chǎn)環(huán)境運(yùn)行的是什么,這意味著您需要能夠構(gòu)建一個(gè)軟件版本 —— 和您的真實(shí)環(huán)境保持一致 —— 相同的軟件環(huán)境與二進(jìn)制版本。

如果你找不到一個(gè)方法來(lái)實(shí)現(xiàn)這一點(diǎn),那么如果你提交代碼到生產(chǎn)環(huán)境,就可能會(huì)遇到一些令人不快的意外。確保新的代碼在合適環(huán)境盡可能地被測(cè)試,然后你才會(huì)有足夠信心將其運(yùn)行到生產(chǎn)環(huán)境。上線時(shí)做好準(zhǔn)備可以隨時(shí)切換回老的代碼,并確保通過(guò)日志記錄了相關(guān)重要內(nèi)容,以便在后續(xù)排查問(wèn)題能派上用場(chǎng)。

3、凍結(jié) DB 修改

盡可能凍結(jié)數(shù)據(jù)庫(kù)修改,直到完成***階段的改進(jìn),直到團(tuán)隊(duì)對(duì)代碼庫(kù)已經(jīng)有了徹底的了解,遺留代碼已經(jīng)棄之身后時(shí),才考慮修改數(shù)據(jù)庫(kù)結(jié)構(gòu)。在此之前任何的數(shù)據(jù)庫(kù)修改可能會(huì)導(dǎo)致一些棘手的問(wèn)題,你失去了并行運(yùn)行舊系統(tǒng)和新的代碼庫(kù)的能力。保持 DB 完全不變,您可以比較新的業(yè)務(wù)邏輯代碼與舊的業(yè)務(wù)邏輯代碼,如果所有這些效果都與預(yù)期一樣,則應(yīng)該完全沒(méi)有區(qū)別。

4、編寫(xiě)測(cè)試

在進(jìn)行任何修改之前,編寫(xiě)盡可能多的端到端以及集成測(cè)試,確保這些測(cè)試能夠產(chǎn)生正確的輸出,并覆蓋所有潛在的情況。

這些測(cè)試將具有兩個(gè)重要功能:幫助在早期階段清除任何誤解,另外一方面,一旦您開(kāi)始編寫(xiě)新代碼來(lái)替換舊代碼,這些測(cè)試將可以更好保護(hù)您的系統(tǒng)。

自動(dòng)化您的所有測(cè)試,如果您已經(jīng)有 CI 的經(jīng)驗(yàn)則盡快使用它,并確保您的測(cè)試運(yùn)行足夠快,以便在每次提交后運(yùn)行全套測(cè)試。

5、Instrumentation 和日志

如果舊平臺(tái)仍然可以增加 Instrumentation,在一個(gè)全新的數(shù)據(jù)庫(kù)表中執(zhí)行此操作,為您可以考慮的每個(gè)事件添加一個(gè)簡(jiǎn)單的計(jì)數(shù)器,并添加一個(gè)單個(gè)函數(shù)來(lái)實(shí)現(xiàn)此功能,以根據(jù)事件的名稱(chēng)來(lái)增加這些計(jì)數(shù)器。

這樣,您可以使用一些額外的代碼行實(shí)現(xiàn)帶有時(shí)間戳的事件日志,您將了解到有多少事件導(dǎo)致另一種事件。一個(gè)例子:用戶打開(kāi)應(yīng)用程序,用戶關(guān)閉應(yīng)用程序。如果兩個(gè)事件應(yīng)該導(dǎo)致一些后端請(qǐng)求,那么這兩個(gè)計(jì)數(shù)器應(yīng)該在長(zhǎng)期上保持不變,差異是當(dāng)前打開(kāi)的應(yīng)用程序的數(shù)量。如果您看到更多的應(yīng)用程序打開(kāi),而不是應(yīng)用程序關(guān)閉,你知道必須有另一種應(yīng)用程序結(jié)束的方式(例如崩潰)。

這個(gè)簡(jiǎn)單的技巧可以將每個(gè)后端應(yīng)用程序變成一個(gè)類(lèi)似的簿記(bookkeeping)系統(tǒng),就像一個(gè)真正的簿記系統(tǒng)那樣,所有的數(shù)字必須匹配,確保它們?cè)谒杏玫降牡胤經(jīng)]有問(wèn)題。

隨著時(shí)間的推移,這個(gè)系統(tǒng)將監(jiān)控健康方面變得非常寶貴,并且將成為源代碼控制系統(tǒng)變更日志的一個(gè)很好的伴侶,您可以在其中確定每個(gè)錯(cuò)誤引入的時(shí)間點(diǎn),以及對(duì)各種情況產(chǎn)生影響的計(jì)數(shù)。

我通常保留這些計(jì)數(shù)器的分辨率為 5 分鐘(因此每小時(shí)記錄 12 次),但如果你的系統(tǒng)有更少或更多事件,則可能需要修改這個(gè)時(shí)間間隔。所有計(jì)數(shù)器使用同一個(gè)數(shù)據(jù)庫(kù)表,因此每個(gè)計(jì)數(shù)器只是該表中的一列。

6、每次只修改一個(gè)點(diǎn)

在添加新功能或修復(fù)錯(cuò)誤的同時(shí),不要陷入同時(shí)改進(jìn)代碼以及修改其運(yùn)行的平臺(tái)的陷阱。這會(huì)導(dǎo)致很多頭大的問(wèn)題。

7、平臺(tái)更改

如果您決定將應(yīng)用程序遷移到另一個(gè)平臺(tái),那么請(qǐng)先執(zhí)行此操作,但要保持一切功能完全一樣。你可以添加更多的文檔或測(cè)試,但不能超過(guò)這一點(diǎn),所有業(yè)務(wù)邏輯和相互依賴(lài)關(guān)系應(yīng)該保持原樣。

8、架構(gòu)變化

接下來(lái)要解決的是改變應(yīng)用程序的架構(gòu)(如果需要)。在這個(gè)時(shí)候,您可以隨意更改代碼的較高級(jí)別結(jié)構(gòu),通常通過(guò)減少模塊之間的水平鏈接數(shù)量,從而減少與最終用戶進(jìn)行任何交互時(shí)代碼活動(dòng)的范圍。如果舊代碼本質(zhì)上是一體的,現(xiàn)在將是一個(gè)很好的時(shí)機(jī)使其更加模塊化,將大型功能分解成較小的功能,但是保留變量和數(shù)據(jù)結(jié)構(gòu)的名稱(chēng)。

HN 網(wǎng)友 mannykannot 指出,架構(gòu)修改并不總是可行,如果特別不幸運(yùn),那么可能需要非常深入理解代碼才能進(jìn)行任何架構(gòu)更改。我同意這一點(diǎn),因此我做個(gè)小的補(bǔ)充,如果您同時(shí)進(jìn)行高級(jí)別更改和低級(jí)別更改,至少需要將其限制在一個(gè)文件,或最壞情況下限制在一個(gè)子系統(tǒng),以便盡可能限制更改的范圍。否則你可能很難調(diào)試剛才所做的更改。

9、低級(jí)重構(gòu)

到目前為止,您應(yīng)該對(duì)每個(gè)模塊的功能有很好的了解,并為實(shí)際工作做好準(zhǔn)備:重構(gòu)代碼以提高可維護(hù)性,并使代碼具備擴(kuò)展新的功能的能力。這很可能是項(xiàng)目中耗時(shí)最多的一部分,文檔需要隨之進(jìn)行,在完整編寫(xiě)文檔介紹并徹底了解一個(gè)模塊之前,不要隨意更改模塊。

這個(gè)階段也可以修改變量和函數(shù)命名、修改數(shù)據(jù)結(jié)構(gòu),以提高代碼清晰度和一致性。記得添加相關(guān)測(cè)試代碼(根據(jù)需要,可進(jìn)行單元測(cè)試)。

10、修復(fù) bug

現(xiàn)在你準(zhǔn)備好進(jìn)行一些最終用戶可見(jiàn)的變化,***件事情將是修復(fù)多年來(lái)積累在隊(duì)列中的 bug。像往常一樣,首先確認(rèn) bug 仍然存在,然后編寫(xiě)一個(gè)測(cè)試并修復(fù) bug,您的持續(xù)集成和端到端的測(cè)試應(yīng)幫您避免由于缺乏理解或某些錯(cuò)誤而導(dǎo)致的任何錯(cuò)誤及外圍問(wèn)題。

11、數(shù)據(jù)庫(kù)升級(jí)

如果上述工作都已經(jīng)完成,你可以再次擁有可靠且可維護(hù)的代碼庫(kù),您可以選擇更改數(shù)據(jù)庫(kù) schema 甚至替換數(shù)據(jù)庫(kù)。已經(jīng)完成的上述工作都將有助于您以無(wú)負(fù)擔(dān)的方式進(jìn)行變革,而無(wú)需擔(dān)心任何意外,您可以使用新的代碼和所有的測(cè)試來(lái)測(cè)試新的數(shù)據(jù)庫(kù),以確保您的遷移沒(méi)有任何問(wèn)題。

在路線圖上前行

恭喜,到這里您已經(jīng)走出了叢林,現(xiàn)在已經(jīng)準(zhǔn)備好可以實(shí)施任何新功能了。

不要嘗試徹底重寫(xiě)

徹底重寫(xiě)是一種幾乎保證會(huì)失敗的項(xiàng)目。一方面,你是在未知的領(lǐng)域開(kāi)始,你甚至?xí)恢酪貥?gòu)什么,另一方面,你也將所有的問(wèn)題推到***一天,就在你用新系統(tǒng)啟用之前的那一天。很悲劇的是,那也是你失敗的時(shí)刻。業(yè)務(wù)邏輯的假設(shè)最終會(huì)證實(shí)存在問(wèn)題,那時(shí)您將突然了解到為什么舊系統(tǒng)會(huì)用某種奇怪的方式來(lái)工作,最終也會(huì)意識(shí)到能將舊系統(tǒng)放在一起工作的人也不都是白癡。 如果你真的想要將公司(以及你自己的信譽(yù))帶向一個(gè)泥潭,就來(lái)一個(gè)徹底大重寫(xiě)吧,但如果你足夠聰明,徹底重寫(xiě)系統(tǒng)通常不會(huì)成為桌上的一個(gè)討論選項(xiàng)。

替代方案:迭代式改進(jìn)

要解開(kāi)這些線團(tuán)最快方法就是從你已經(jīng)理解的代碼入手(它可能是一個(gè)外圍設(shè)備,但也可能是一些核心模塊),并在它的舊的上下文的范圍內(nèi)嘗試逐步改進(jìn)。

如果舊的構(gòu)建工具不再可用,您將不得不使用一些技巧(見(jiàn)下文),但至少在您開(kāi)始更改時(shí),盡可能多地保持舊的系統(tǒng)工作。一個(gè)典型的提交通常只包含數(shù)行代碼。

發(fā)布!

所有修改盡可能發(fā)布到生產(chǎn)環(huán)境,即使修改的代碼是最終用戶不可見(jiàn)的,因?yàn)楫?dāng)你對(duì)系統(tǒng)了解不足時(shí),只有生產(chǎn)環(huán)境才會(huì)告訴你新的修改哪里會(huì)有問(wèn)題。如果這個(gè)問(wèn)題只是在小的改變之后出現(xiàn),你將獲得幾個(gè)優(yōu)勢(shì):

很容易弄清楚出了什么問(wèn)題

您將處于改善流程的良好狀態(tài)

您應(yīng)該立即更新文檔,以記錄獲得的新見(jiàn)解

合理使用代理服務(wù)器

如果您正在重構(gòu)一個(gè) Web 系統(tǒng),感謝上帝,你可以在最終用戶和舊系統(tǒng)之間部署一個(gè)代理服務(wù)器。您可以精確控制每個(gè) URL 哪些請(qǐng)求進(jìn)入舊系統(tǒng),哪些請(qǐng)求路由到新系統(tǒng),從而可以更輕松,更精細(xì)地控制運(yùn)行的內(nèi)容。

如果您的代理足夠強(qiáng)大,您甚至可以控制將某個(gè) URL 一定百分比的流量發(fā)送到新系統(tǒng),以便觀察新系統(tǒng)的運(yùn)行情況。如果您的集成測(cè)試也能夠連接到這個(gè)代理那就更好了。

很有道理,但這一切需要太多的時(shí)間!

那么這取決于你如何看待它。如果按照這些步驟確實(shí)存在不少工作,但是它的確有效,而且這個(gè)過(guò)程的任何優(yōu)化都讓你進(jìn)一步徹底了解整個(gè)系統(tǒng)。我個(gè)人在這方面也有一個(gè)很好的聲譽(yù),我真的不希望這樣的工作中出現(xiàn)任何負(fù)面的問(wèn)題。

有時(shí)候如果公司系統(tǒng)已經(jīng)出現(xiàn)問(wèn)題,而且可能會(huì)影響客戶時(shí),如果按照這個(gè)流程可能使事情好轉(zhuǎn),我寧愿完全控制和和使用這個(gè)過(guò)程,而不是為了表面的節(jié)省幾天或幾周的時(shí)間的方式。如果你更多地是牛仔的做事方式,你的老板也同意 —— 那么也許那是可以接受的高風(fēng)險(xiǎn)方式,但是大多數(shù)公司寧愿采取稍慢一點(diǎn),更穩(wěn)健的重構(gòu)之路。

責(zé)任編輯:武曉燕 來(lái)源: 運(yùn)維派
相關(guān)推薦

2013-04-15 09:02:43

JavaScriptJS

2021-08-08 08:23:45

SQL代碼編程

2023-11-08 13:55:27

2013-05-30 10:20:39

系統(tǒng)架構(gòu)

2023-01-27 14:53:03

2023-09-21 11:20:46

2023-07-13 12:27:04

2023-02-09 09:08:44

PaSca圖結(jié)構(gòu)數(shù)據(jù)處理

2017-07-04 10:16:37

舊代碼庫(kù)改進(jìn)

2024-02-01 00:13:28

React前端開(kāi)發(fā)

2023-09-25 12:13:00

Android架構(gòu)

2024-11-20 13:18:21

2023-12-12 08:00:00

2023-09-25 12:18:48

2021-09-22 11:05:19

JS代碼前端

2021-01-14 09:59:07

JS代碼編碼

2009-03-16 09:16:13

行為擴(kuò)展WCF.NET

2022-06-16 08:00:00

元數(shù)據(jù)數(shù)據(jù)中心數(shù)據(jù)架構(gòu)

2024-10-10 14:01:34

2024-04-18 14:19:39

UPS系統(tǒng)模塊化數(shù)據(jù)中心
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)