日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > > 架構(gòu)師社區(qū)
[導(dǎo)讀]重構(gòu),著實(shí)是一件讓程序員興奮的事情。今年年初,我們團(tuán)隊(duì)完成了一個(gè)復(fù)雜項(xiàng)目的重構(gòu)工作,它屬于廣告系統(tǒng)最核心的引擎部分,大概有300多個(gè)文件,3萬(wàn)多行代碼。 從技術(shù)方案設(shè)計(jì)到最終全量上線僅僅花了1個(gè)月左右的時(shí)間,而且沒(méi)有產(chǎn)生事故。 這應(yīng)該是我8年程序生涯中,經(jīng)歷過(guò)的最大型的同時(shí)最成功的一次重構(gòu)項(xiàng)目:速度足夠快、計(jì)劃比較周全、質(zhì)量過(guò)關(guān)。

經(jīng)典著作《重構(gòu)》這本書(shū)中有這么一段話:

一開(kāi)始,我所做的重構(gòu)都停留在細(xì)枝末節(jié)上。隨著代碼趨向簡(jiǎn)潔,我發(fā)現(xiàn)自己可以看到一些設(shè)計(jì)層面的東西了,這些是我以前理解不到的,如果沒(méi)有重構(gòu),我達(dá)不到這種高度。
重構(gòu),著實(shí)是一件讓程序員興奮的事情。
今年年初,我們團(tuán)隊(duì)完成了一個(gè)復(fù)雜項(xiàng)目的重構(gòu)工作,它屬于廣告系統(tǒng)最核心的引擎部分,大概有 300 多個(gè)文件,3 萬(wàn)多行代碼。
從技術(shù)方案設(shè)計(jì)到最終全量上線僅僅花了 1 個(gè)月左右的時(shí)間,而且沒(méi)有產(chǎn)生事故。
這應(yīng)該是我 8 年程序生涯中,經(jīng)歷過(guò)的最大型的同時(shí)最成功的一次重構(gòu)項(xiàng)目:速度足夠快、計(jì)劃比較周全、質(zhì)量過(guò)關(guān)。

01 先聊聊這個(gè)系統(tǒng)的歷史包袱

我們的廣告引擎在這次重構(gòu)前大概經(jīng)歷了1年半時(shí)間的迭代,初期針對(duì)的是搜索場(chǎng)景,業(yè)務(wù)單一,流程清晰。

2019年開(kāi)始,公司的廣告業(yè)務(wù)開(kāi)始快速擴(kuò)張,收入幾乎是指數(shù)級(jí)的增長(zhǎng)。在這個(gè)過(guò)程中,我們的廣告引擎面臨了兩個(gè)挑戰(zhàn):

1、業(yè)務(wù)場(chǎng)景開(kāi)始變得復(fù)雜,除了搜索廣告,還需要支持信息流推薦以及相似推薦場(chǎng)景。

2、廣告流量開(kāi)始快速增加,除了滿足功能性需求,還需要兼顧好性能。

經(jīng)過(guò)梳理,整個(gè)引擎有大部分邏輯是可以公用的,因此我們定義了一個(gè)主體框架,同時(shí)將可擴(kuò)展部分進(jìn)行了抽象。這樣,各個(gè)場(chǎng)景能夠根據(jù)自身業(yè)務(wù)的特殊性實(shí)現(xiàn)某些公共接口即可。另外,從性能角度考慮,我們犧牲了一些代碼可讀性,把某些邏輯并行化了。

隨著業(yè)務(wù)的發(fā)展,搜索場(chǎng)景開(kāi)始進(jìn)入快速迭代期,新增策略越來(lái)越多,我們的主體框架也是在這個(gè)時(shí)候逐漸變得不靈活。

如果動(dòng)主體框架,搜索以外的場(chǎng)景都需要跟著重構(gòu)。 在業(yè)務(wù)的快速發(fā)展期,工期根本不允許,因此我們只能在現(xiàn)有框架上進(jìn)行補(bǔ)丁式的開(kāi)發(fā)。 這樣,帶來(lái)了兩個(gè)很明顯的問(wèn)題:

1、為了兼容搜索的特殊邏輯,我們需要在其他場(chǎng)景中增加各種 if 判斷來(lái)繞過(guò)這些邏輯。

2、廣告策略越來(lái)越多,累計(jì)了幾十個(gè),當(dāng)框架失去清晰的結(jié)構(gòu)后,有些策略的實(shí)現(xiàn)開(kāi)始變得定制化,缺少層次化的劃分和可插拔式的抽象設(shè)計(jì)。

在這樣的背景下,隨著改動(dòng)的積累,代碼開(kāi)始偏離了設(shè)計(jì)的初衷,技術(shù)債務(wù)越來(lái)越重。但是,我們又始終找不到合適的時(shí)機(jī)進(jìn)行重構(gòu)。
實(shí)戰(zhàn)篇:一個(gè)核心系統(tǒng)3萬(wàn)多行代碼的重構(gòu)之旅

轉(zhuǎn)機(jī)出現(xiàn)在 2019 年年底,由于廣告業(yè)務(wù)的特殊性,流量開(kāi)始自然走低,另外產(chǎn)品運(yùn)營(yíng)團(tuán)隊(duì)將重心放在了第 2 年的工作規(guī)劃上,因此給了我們非常好的窗口期開(kāi)始此次重構(gòu)。

我們將工期定成了 1 個(gè)月,最終僅比預(yù)期晚上線了一天,雖然出現(xiàn)了兩個(gè)線上問(wèn)題,但是在灰度期都及時(shí)發(fā)現(xiàn)和修復(fù)了,并沒(méi)有造成線上事故。

總體來(lái)說(shuō),這是一次難度頗大并且比較成功的重構(gòu)項(xiàng)目,下面詳細(xì)說(shuō)一下我從這個(gè)項(xiàng)目中吸取到的寶貴經(jīng)驗(yàn)。

02 重構(gòu)前,我們做了哪些準(zhǔn)備工作?

這次重構(gòu)的代碼量很大,3 萬(wàn)多行,而且是廣告系統(tǒng)最核心的引擎部分。啟動(dòng)前,我們能預(yù)期到下面這些困難:

1、業(yè)務(wù)側(cè)的阻力:廣告是極其以業(yè)務(wù)為導(dǎo)向的,本次重構(gòu)雖然能帶來(lái)長(zhǎng)期研發(fā)效率的提升,但是沒(méi)法直接提升業(yè)務(wù)收益,而且開(kāi)發(fā)周期不會(huì)太短,如何才能得到業(yè)務(wù)同學(xué)的支持?

2、技術(shù)側(cè)的顧慮 :重構(gòu)一旦引起線上事故,公司是有處罰制度的,如何讓大家輕裝上陣?同時(shí),重構(gòu)過(guò)程中如果還有非常重的業(yè)務(wù)迭代穿插,交付時(shí)間沒(méi)人敢保證,質(zhì)量也很難得到控制。

實(shí)戰(zhàn)篇:一個(gè)核心系統(tǒng)3萬(wàn)多行代碼的重構(gòu)之旅

針對(duì)這兩方的顧慮,我認(rèn)為下面這幾項(xiàng)工作起到了很關(guān)鍵的作用。

▍讓所有人看到痛點(diǎn)

前面提到:隨著業(yè)務(wù)迭代,我們廣告引擎的主體框架已經(jīng)變得模糊不清,另外幾十個(gè)廣告策略散落在不同的業(yè)務(wù)場(chǎng)景中,配置凌亂。

針對(duì)這兩個(gè)痛點(diǎn),我們提前1個(gè)月啟動(dòng)了現(xiàn)有業(yè)務(wù)的梳理,走讀舊代碼、同時(shí)翻閱以前的需求文檔,最終我們將不同場(chǎng)景的核心流程以及廣告策略歸類成了一張清晰的表格。

正是這一張表格,讓技術(shù)和產(chǎn)品第一次很清晰地看到了我們引擎部分的全貌,體會(huì)到了業(yè)務(wù)的復(fù)雜度以及當(dāng)前技術(shù)上的瓶頸。

▍明確重構(gòu)的目標(biāo)和價(jià)值

讓所有人感受到痛點(diǎn)后,我們規(guī)劃了本次重構(gòu)的兩個(gè)核心目標(biāo):

1、主體框架的重構(gòu):將主流程模塊化,重新定義上下層協(xié)議,確保接口清晰;各層級(jí)內(nèi)部也需要做好抽象,具備良好的擴(kuò)展性。

2、策略靈活可配置:將廣告策略按照業(yè)務(wù)意圖進(jìn)行歸類抽象,策略的執(zhí)行條件動(dòng)態(tài)可配置,同時(shí)策略可任意插拔。

此外,我們將這兩個(gè)核心目標(biāo)完成后可帶來(lái)的預(yù)期收益進(jìn)行了細(xì)化:

1、技術(shù)收益:代碼結(jié)構(gòu)更清晰,更容易理解和維護(hù);可擴(kuò)展性增強(qiáng),引擎的開(kāi)發(fā)效率將進(jìn)一步提升。

2、業(yè)務(wù)收益:策略能做到更細(xì)粒度的配置和擴(kuò)展,對(duì)業(yè)務(wù)支持更友好;研發(fā)提效后能進(jìn)一步加快業(yè)務(wù)的迭代速度。

將重構(gòu)的價(jià)值同步給大家后,進(jìn)一步提升了所有人的興奮度,讓大家有了更強(qiáng)的動(dòng)力參與進(jìn)來(lái)。

▍整體節(jié)奏的把控

整體節(jié)奏的把控也是非常重要的一環(huán),能讓所有人對(duì)這件事情有一個(gè)時(shí)間上的預(yù)期。

首先,我們將工期定成了 1 個(gè)月,一方面考慮了業(yè)務(wù)側(cè)可以接受的最大周期,技術(shù)上也希望速戰(zhàn)速?zèng)Q;另一方面,春節(jié)即將來(lái)臨,我們必須趕在公司封網(wǎng)前上線,同時(shí)預(yù)留出1-2周的 buffer 以防意外情況發(fā)生。

此外,我們和業(yè)務(wù)側(cè)達(dá)成了一致:重構(gòu)期間,引擎部分的非緊急需求一律不接,這樣可最大限度地減少并行開(kāi)發(fā)和代碼沖突,讓團(tuán)隊(duì)精力更集中。

03 執(zhí)行過(guò)程中有哪些可分享的經(jīng)驗(yàn)?

這次重構(gòu)能夠?qū)嵤┑萌绱隧樌?4 點(diǎn)我認(rèn)為很有價(jià)值的經(jīng)驗(yàn)跟大家分享下。

1. 高質(zhì)量的技術(shù)設(shè)計(jì)方案

這一點(diǎn)得益于日常的要求,針對(duì)開(kāi)發(fā)周期超過(guò)3天的項(xiàng)目我們都會(huì)進(jìn)行技術(shù)方案設(shè)計(jì),本次重構(gòu)當(dāng)然也不例外。

框架部分的整體架構(gòu)、模塊之間的協(xié)議設(shè)計(jì)、以及策略的可擴(kuò)展性設(shè)計(jì)是本次技術(shù)方案的重點(diǎn),團(tuán)隊(duì)前后討論了不下3次。

在大方案定稿后,團(tuán)隊(duì)進(jìn)一步對(duì)數(shù)據(jù)庫(kù)、接口字段、緩存結(jié)構(gòu)、日志埋點(diǎn)等公共部分進(jìn)行了細(xì)化,因?yàn)樯婕暗蕉嗳藚f(xié)作開(kāi)發(fā),團(tuán)隊(duì)約定以文檔作為溝通界面,文檔始終保持和代碼同步。

在這樣的高要求下,團(tuán)隊(duì)產(chǎn)出了 5000 多字的技術(shù)方案文檔,合計(jì) 36 頁(yè),這些為整體質(zhì)量的保障打下了很好的基礎(chǔ)。

2. 預(yù)重構(gòu)出框架性代碼

這一個(gè) PR 非常關(guān)鍵,是我們從技術(shù)方案落地到代碼最重要的一步。我們把重構(gòu)后的包結(jié)構(gòu)、模塊劃分、各層之間的API定義、不同廣告策略的抽象進(jìn)行了梳理,先忽略實(shí)現(xiàn)的細(xì)節(jié)。

這樣主體代碼基本成型,能很清楚地描繪出我們理想中的框架。然后,我們組織了多次集中代碼審查,最終形成了統(tǒng)一意見(jiàn)。

這一步能很好地避免過(guò)早陷入實(shí)現(xiàn)細(xì)節(jié),導(dǎo)致主體框架關(guān)注不夠、代碼不穩(wěn)固,后期再返工反而會(huì)拖累效率。

3. 頻繁溝通和成對(duì)代碼 Review 機(jī)制

進(jìn)入到細(xì)節(jié)實(shí)現(xiàn)階段后,很重要的一點(diǎn)是:對(duì)現(xiàn)有邏輯的理解。引擎代碼經(jīng)過(guò)一年半的迭代,歷史上被很多人開(kāi)發(fā)過(guò),但是本次只有 3 個(gè)同學(xué)參與重構(gòu)。

整個(gè)過(guò)程中,我們遇到任何代碼邏輯不明確的地方,都是反復(fù)溝通和求證,不主觀猜想,這一份謹(jǐn)慎其實(shí)很關(guān)鍵。

另外在代碼審查上,我們按模塊分配了對(duì)這塊業(yè)務(wù)比較熟悉的同學(xué)來(lái)負(fù)責(zé),成對(duì)搭配,機(jī)制靈活。

4. 有效的測(cè)試方案

重構(gòu)未動(dòng),測(cè)試先行。這個(gè)原則是《重構(gòu)》一書(shū)中重點(diǎn)強(qiáng)調(diào)的,也是我們本次技術(shù)方案討論的重點(diǎn),我這里單獨(dú)拎出來(lái)詳細(xì)展開(kāi)下。

首先,我們前期便約定好:不動(dòng)任何老代碼,完全建新的 package 進(jìn)行重構(gòu)。這樣方便比對(duì)重構(gòu)前后的結(jié)果,同時(shí)進(jìn)行線上灰度實(shí)驗(yàn)。

測(cè)試方案上,以下 4 點(diǎn)值得借鑒:

1、端到端測(cè)試:本次重構(gòu)不涉及功能性的調(diào)整,因此外層API的行為是不會(huì)有任何變化的,這樣端到端的測(cè)試方法最為有效,這個(gè)是研發(fā)和QA測(cè)試最主要的手段。

2、冒煙測(cè)試:QA同學(xué)提供冒煙 Case,由研發(fā)同學(xué)進(jìn)行冒煙,研發(fā)提測(cè)前必須保證所有冒煙 Case 執(zhí)行通過(guò)。這一點(diǎn)在大部分互聯(lián)網(wǎng)公司都不常見(jiàn),但是對(duì)于大型項(xiàng)目絕對(duì)有效。

3、沙箱環(huán)境雙流程驗(yàn)證:前面提到我們重構(gòu)前后的代碼都保留了,因此可以通過(guò)腳本抓取線上環(huán)境的入?yún)⒆鳛閏ase,然后用自動(dòng)化的方式對(duì) API 的返回字段進(jìn)行逐一比對(duì)。

4、線上環(huán)境灰度實(shí)驗(yàn):灰度對(duì)于重構(gòu)非常重要,我們利用已有的ABTest平臺(tái),逐步放開(kāi)灰度流量,從5%、到10%、到30%、最后到100%,制定了很謹(jǐn)慎的放量節(jié)奏,然后通過(guò)日志以及業(yè)務(wù)指標(biāo)監(jiān)控進(jìn)行驗(yàn)證。

寫(xiě)在最后


回顧整個(gè)重構(gòu)的過(guò)程,總結(jié)成下面 7 個(gè)關(guān)鍵點(diǎn):

1、把握好重構(gòu)時(shí)機(jī)
2、前期梳理很重要,先找到痛點(diǎn)
3、明確出目標(biāo)和價(jià)值,讓大家興奮起來(lái)
4、不宜長(zhǎng)線作戰(zhàn),不宜和業(yè)務(wù)并行
5、需要高質(zhì)量的技術(shù)方案
6、重構(gòu)未動(dòng),測(cè)試先行

7、小心求證,為每行代碼負(fù)責(zé)

當(dāng)然,最關(guān)鍵的因素還是人,大型項(xiàng)目重構(gòu)極其考驗(yàn)團(tuán)隊(duì)的協(xié)作能力,如果每個(gè)人都很靠譜,重構(gòu)就已經(jīng)成功了一半。

特別推薦一個(gè)分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒(méi)關(guān)注的小伙伴,可以長(zhǎng)按關(guān)注一下:

實(shí)戰(zhàn)篇:一個(gè)核心系統(tǒng)3萬(wàn)多行代碼的重構(gòu)之旅

實(shí)戰(zhàn)篇:一個(gè)核心系統(tǒng)3萬(wàn)多行代碼的重構(gòu)之旅

實(shí)戰(zhàn)篇:一個(gè)核心系統(tǒng)3萬(wàn)多行代碼的重構(gòu)之旅

長(zhǎng)按訂閱更多精彩▼

實(shí)戰(zhàn)篇:一個(gè)核心系統(tǒng)3萬(wàn)多行代碼的重構(gòu)之旅

如有收獲,點(diǎn)個(gè)在看,誠(chéng)摯感謝

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉