0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

架構(gòu)設(shè)計:為什么說復(fù)用是邪惡的?

jf_ro2CN3Fa ? 來源:芋道源碼 ? 作者:芋道源碼 ? 2022-12-02 14:29 ? 次閱讀

為什么我們喜歡復(fù)用呢?

認(rèn)為復(fù)用可以提高效率的推理邏輯是怎樣的?

你說復(fù)用帶來了這么多問題,那我們平時使用各種框架,基礎(chǔ)算法庫都要自己寫一份嗎?

那我設(shè)計系統(tǒng)時,盡量將我的設(shè)計通用化就好了(例如拆很多個 CRUD 的微服務(wù)),這樣就能更多的進(jìn)行復(fù)用,提高生產(chǎn)效率對嗎?

那系統(tǒng)設(shè)計好的標(biāo)準(zhǔn)是什么?衡量的維度有優(yōu)先級嗎?

總結(jié)

在系統(tǒng)設(shè)計和寫代碼的過程中,我經(jīng)常會聽到「復(fù)用」這個詞,以「復(fù)用」為目的來設(shè)計技術(shù),業(yè)務(wù),組織架構(gòu)。例如:

抽象出一個類,函數(shù),UI 組件,用于不同的場景

抽象出一個微服務(wù),越細(xì)越好,這樣可以靈活的組合

抽象出一個業(yè)務(wù)中臺,沉淀各種基礎(chǔ)業(yè)務(wù)功能,供全公司使用

組織(管理)架構(gòu)中,抽象出一個職能豎井(后端,前端,QA,財務(wù)),被不同的產(chǎn)品使用

產(chǎn)品設(shè)計中要完成一個性能功能,發(fā)現(xiàn)跟之前一個功能相似,就復(fù)用之前的功能設(shè)計,改改繼續(xù)用

為什么我們喜歡復(fù)用呢?

主要目的:既然一部分功能已經(jīng)存在,為什么還要自己造呢?直接拿來用,這樣我可以做得更少,所以能夠提升個人的生產(chǎn)效率。

接受的教育:一直以來的教育,大部分工程師都學(xué)習(xí)過 DRY principle;《設(shè)計模式》的的英文書名就是 《可復(fù)用面向?qū)ο筌浖幕A(chǔ)》,都在強調(diào)復(fù)用。

編程習(xí)慣:在面向?qū)ο笳Z言里,工程師習(xí)慣了繼承,而繼承對于大部分人來說的目的就是復(fù)用

基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://github.com/YunaiV/ruoyi-vue-pro

視頻教程:https://doc.iocoder.cn/video/

認(rèn)為復(fù)用可以提高效率的推理邏輯是怎樣的?

如果我們要寫一個系統(tǒng)的所有代碼,我們需要寫大量的代碼。

如果我們能從其他地方重用一些以前寫過的代碼,我們就能寫更少的代碼。

我們能重用的代碼越多,我們寫的代碼就越少。

我們寫的代碼越少,我們就會越早完成系統(tǒng)!

這樣的推理邏輯是存在如下誤區(qū):

所有的代碼(功能)需要相同的時間來寫

寫代碼是完成系統(tǒng)的最主要工作

如果你要寫得代碼依賴很多其他的「復(fù)用」模塊,你就要去理解不同的「復(fù)用」模塊提供的接口,很多時候只看文檔都不行;如果「復(fù)用模塊」的接口不是正好是適用你的場景,你就必須在講究使用接口和對方排期之間進(jìn)行選擇。

此外對于如何抽象出一個公共業(yè)務(wù)模塊,大部分人都沒什么標(biāo)準(zhǔn),公共業(yè)務(wù)模塊的負(fù)責(zé)人成了業(yè)務(wù)的外包,效率更低。

另一點是任何維護(hù)生產(chǎn)環(huán)境系統(tǒng)的人都知道寫代碼只是整個工作中一小步,而且是確定性最高的一步,之后維護(hù)才是最占用時間的。我們需要不斷地進(jìn)行調(diào)試,部署,再調(diào)試,部署。一個用于很多依賴的模塊相對依賴少的模塊做這些工作的難度是高很多的。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://github.com/YunaiV/yudao-cloud

視頻教程:https://doc.iocoder.cn/video/

你說復(fù)用帶來了這么多問題,那我們平時使用各種框架,基礎(chǔ)算法庫都要自己寫一份嗎?

肯定不需要自己再寫一份,我們平時會使用各種編程語言(Java,Go),框架,庫。我們使用這些沒有任何問題,因為這是共識和標(biāo)準(zhǔn),他們是足夠「通用,一般化」,并不是為了某個業(yè)務(wù)或者某個公司定制的。先有「共識,標(biāo)準(zhǔn)」,再談復(fù)用,絕對不是隨意的拿過來用。

那我設(shè)計系統(tǒng)時,盡量將我的設(shè)計通用化就好了(例如拆很多個 CRUD 的微服務(wù)),這樣就能更多的進(jìn)行復(fù)用,提高生產(chǎn)效率對嗎?

復(fù)用不是系統(tǒng)要追求的目標(biāo)。很多人認(rèn)為更多模塊的「復(fù)用」,就可以做到像樂高一樣快速搭建系統(tǒng),但是很多復(fù)用并不是樂高,而是器官移植,不僅不能提高效率,要不斷面對各種各樣的排異反應(yīng),降低了速度和穩(wěn)定性。很多創(chuàng)業(yè)公司快速發(fā)展時系統(tǒng)腐化的主要問題就出現(xiàn)在了強行復(fù)用上。強行復(fù)用的案例很常見,例如:

上百個字段的數(shù)據(jù)表(例如訂單表,數(shù)據(jù)表),不清楚哪個字段在哪個場景下有效

根據(jù)名詞來設(shè)計系統(tǒng),出現(xiàn)業(yè)務(wù)中臺,例如訂單中臺,電商中臺,各部門之間不斷地扯皮

出來無數(shù)個小的微服務(wù),然后搞個統(tǒng)一的業(yè)務(wù)編排調(diào)度層(所謂的 gateaway)來處理業(yè)務(wù),可能還抽象 DSL;上線十分復(fù)雜,需要發(fā)布 N 各模塊;調(diào)度模塊是系統(tǒng)大單點,穩(wěn)定性迭代速度都是問題

如果有一個好的設(shè)計,我們需要謹(jǐn)記《Hints for Computer System Design》中的「Use a good idea again instead of generalizing it. A specialized implementation of the idea may be much more effective than a general one.」

那系統(tǒng)設(shè)計好的標(biāo)準(zhǔn)是什么?衡量的維度有優(yōu)先級嗎?

兩個評價標(biāo)準(zhǔn)自治性和一致性:

自治性:受其他模塊的影響程度,觀測模塊的接口是否穩(wěn)定。可以使用AutonomyMetrics[1] 進(jìn)行衡量

一致性:應(yīng)該使用一個模塊的地方使用一個模塊的程度,也可以衡量是否過早,過度抽象了??梢允褂?ConsistencyMetrics[2]

在業(yè)務(wù)層次是否要從多個業(yè)務(wù)模塊中抽象出一個底層模塊,可以通過多個業(yè)務(wù)模塊的這部分公共邏輯部分是否要一起進(jìn)行改變進(jìn)行判斷,如果不是需要一起變化的就不要抽象出公共模塊。

根據(jù)個人經(jīng)驗如果你在要從各個業(yè)務(wù)模塊進(jìn)行抽象出一個模塊保持一致與保持在模塊保持自治之間猶豫時,要毫不猶豫優(yōu)先選擇「自治」。

總結(jié)

大部分情況下系統(tǒng)的核心復(fù)雜度不會減少, 只是轉(zhuǎn)移;不會因為所有代碼一個人寫,會比分成兩個人寫更快,分工是應(yīng)該且必須的。但是請注意的是:

不要為了復(fù)用隨意通用化,抽象化,復(fù)用不是目的。如果要通用化就拿ConsistencyMetrics[2] 來判斷是否是抽象合理的。

不要隨意復(fù)用其他的模塊,自治優(yōu)先,用 AutonomyMetrics[1] 衡量;如果要復(fù)用一定要確保共識和標(biāo)準(zhǔn)優(yōu)先,形不成共識和標(biāo)準(zhǔn)就不用復(fù)用。

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2655

    瀏覽量

    47293
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4277

    瀏覽量

    62323
  • 架構(gòu)設(shè)計
    +關(guān)注

    關(guān)注

    0

    文章

    31

    瀏覽量

    6916

原文標(biāo)題:架構(gòu)設(shè)計:為什么說復(fù)用是邪惡的?

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    深入理解 Llama 3 的架構(gòu)設(shè)

    在人工智能領(lǐng)域,對話系統(tǒng)的發(fā)展一直是研究的熱點之一。隨著技術(shù)的進(jìn)步,我們見證了從簡單的基于規(guī)則的系統(tǒng)到復(fù)雜的基于機(jī)器學(xué)習(xí)的模型的轉(zhuǎn)變。Llama 3,作為一個假設(shè)的先進(jìn)對話系統(tǒng),其架構(gòu)設(shè)計融合了
    的頭像 發(fā)表于 10-27 14:41 ?461次閱讀

    邊緣計算架構(gòu)設(shè)計最佳實踐

    邊緣計算架構(gòu)設(shè)計最佳實踐涉及多個方面,以下是一些關(guān)鍵要素和最佳實踐建議: 一、核心組件與架構(gòu)設(shè)計 邊緣設(shè)備與網(wǎng)關(guān) 邊緣設(shè)備 :包括各種嵌入式設(shè)備、傳感器、智能手機(jī)、智能攝像頭等,負(fù)責(zé)采集原始數(shù)據(jù)
    的頭像 發(fā)表于 10-24 14:17 ?308次閱讀

    頻分復(fù)用是如何實現(xiàn)多路通信的

    頻分復(fù)用(FDM)是一種經(jīng)典的多路通信技術(shù),它允許多個信號在同一傳輸媒介上同時傳輸,而互不干擾。
    的頭像 發(fā)表于 05-07 15:21 ?826次閱讀

    交換芯片架構(gòu)設(shè)

    交換芯片的架構(gòu)設(shè)計是網(wǎng)絡(luò)設(shè)備性能和功能的關(guān)鍵。一個高效的交換芯片架構(gòu)能夠處理大量的數(shù)據(jù)流量,支持高速數(shù)據(jù)傳輸,并提供先進(jìn)的網(wǎng)絡(luò)功能。
    的頭像 發(fā)表于 03-21 16:28 ?481次閱讀

    交換芯片架構(gòu)設(shè)

    交換芯片架構(gòu)設(shè)計是網(wǎng)絡(luò)通信中的關(guān)鍵環(huán)節(jié),它決定了交換機(jī)的性能、功能和擴(kuò)展性。
    的頭像 發(fā)表于 03-18 14:12 ?613次閱讀

    多路復(fù)用的原理 為什么要多路復(fù)用?多路復(fù)用技術(shù)的應(yīng)用

    在計算機(jī)網(wǎng)絡(luò)中,多路復(fù)用是一種重要的通信技術(shù),它允許多個信號通過同一個通信信道進(jìn)行傳輸。
    的頭像 發(fā)表于 03-05 15:09 ?2516次閱讀
    多路<b class='flag-5'>復(fù)用</b>的原理 為什么要多路<b class='flag-5'>復(fù)用</b>?多路<b class='flag-5'>復(fù)用</b>技術(shù)的應(yīng)用

    【RISC-V開放架構(gòu)設(shè)計之道|閱讀體驗】匯編語言和擴(kuò)展指令集

    【RISC-V開放架構(gòu)設(shè)計之道|閱讀體驗】匯編語言和擴(kuò)展指令集 匯編語言 將C語言翻譯成可執(zhí)行的機(jī)器語言的重要步驟包括編譯過程,匯編過程,鏈接過程。 函數(shù)調(diào)用約定過程分為六個階段: 1)將參數(shù)存放
    發(fā)表于 02-03 13:29

    華為企業(yè)架構(gòu)設(shè)計方法及實例

    企業(yè)架構(gòu)是一項非常復(fù)雜的系統(tǒng)性工程。公司在充分繼承原有架構(gòu)方法基礎(chǔ)上,博采眾家之長,融合基于職能的業(yè)務(wù)能力分析與基于價值的端到端流程分析,將”傳統(tǒng)架構(gòu)設(shè)計(TOGAF)”與“領(lǐng)域驅(qū)動(DDD)”方法相結(jié)合。
    發(fā)表于 01-30 09:40 ?818次閱讀
    華為企業(yè)<b class='flag-5'>架構(gòu)設(shè)</b>計方法及實例

    【RISC-V開放架構(gòu)設(shè)計之道|閱讀體驗】學(xué)習(xí)處理器體系架構(gòu)的一本好書

    感謝電子發(fā)燒友論壇和電子工業(yè)出版社提供的試讀機(jī)會。 《RISC-V開放架構(gòu)設(shè)計之道》由RISC-V架構(gòu)的作者、著名的計算機(jī)體系架構(gòu)專家David Patterson親自主筆撰寫。David
    發(fā)表于 01-23 20:08

    邪惡PLC攻擊技術(shù)的關(guān)鍵步驟

    今天我們來聊一聊PLC武器化探秘:邪惡PLC攻擊技術(shù)的六個關(guān)鍵步驟詳解。
    的頭像 發(fā)表于 01-23 11:20 ?990次閱讀
    <b class='flag-5'>邪惡</b>PLC攻擊技術(shù)的關(guān)鍵步驟

    【RISC-V開放架構(gòu)設(shè)計之道|閱讀體驗】 RISC-V設(shè)計必備之案頭小冊

    有幸參加發(fā)燒友電子的論壇評測,這兩天收到了這本需要評測的書籍《RISC-V開放架構(gòu)設(shè)計之道》,全書簡單講了RISC-V指令集中目前已經(jīng)完善的幾個指令集部分,并展望了未來可能會在指令集
    發(fā)表于 01-22 16:24

    智能座艙主流音頻架構(gòu)設(shè)計方案

    蔚來汽車NT1/NT2平臺座艙音頻系統(tǒng)的軟件架構(gòu)設(shè)計和研發(fā)工作都由我負(fù)責(zé),涉及到Android、QNX、Hypervisor等系統(tǒng)的音頻設(shè)計。今
    發(fā)表于 12-28 16:54 ?1149次閱讀
    智能座艙主流音頻<b class='flag-5'>架構(gòu)設(shè)</b>計方案

    揭秘GPU: 高端GPU架構(gòu)設(shè)計的挑戰(zhàn)

    在計算領(lǐng)域,GPU(圖形處理單元)一直是性能飛躍的代表。眾所周知,高端GPU的設(shè)計充滿了挑戰(zhàn)。GPU的架構(gòu)創(chuàng)新,為軟件承接大模型訓(xùn)練和推理場景的人工智能計算提供了持續(xù)提升的硬件基礎(chǔ)。GPU架構(gòu)設(shè)
    的頭像 發(fā)表于 12-21 08:28 ?830次閱讀
    揭秘GPU: 高端GPU<b class='flag-5'>架構(gòu)設(shè)</b>計的挑戰(zhàn)

    虹科方案 |?汽車電子電氣架構(gòu)設(shè)計仿真解決方案

    本文將介紹面向服務(wù)(SOA)的汽車TSN網(wǎng)絡(luò)架構(gòu),并探討RTaW-Pegase仿真與設(shè)計軟件在TSN網(wǎng)絡(luò)設(shè)計中的應(yīng)用。通過RTaW將設(shè)計問題分解,我們可以更好地理解汽車電子電氣架構(gòu)設(shè)計的過程。
    的頭像 發(fā)表于 11-20 10:59 ?609次閱讀
    虹科方案 |?汽車電子電氣<b class='flag-5'>架構(gòu)設(shè)</b>計仿真解決方案

    汽車電子電氣架構(gòu)設(shè)計仿真解決方案

    本文將介紹面向服務(wù)(SOA)的汽車TSN網(wǎng)絡(luò)架構(gòu),并探討RTaW-Pegase仿真與設(shè)計軟件在TSN網(wǎng)絡(luò)設(shè)計中的應(yīng)用。通過RTaW將設(shè)計問題分解,我們可以更好地理解汽車電子電氣架構(gòu)設(shè)計的過程。
    的頭像 發(fā)表于 11-13 15:08 ?1190次閱讀
    汽車電子電氣<b class='flag-5'>架構(gòu)設(shè)</b>計仿真解決方案