用“易于改編”原則,提升編程水平,寫出更好的代碼

無論新手還是資深開發(fā)者都會(huì)經(jīng)常問一個(gè)問題,“怎么寫好的代碼?”,要知道怎么寫好代碼,首先我們要知道怎么樣才是好的代碼。要有明確的目標(biāo),才能知道如何達(dá)成目標(biāo)。在《程序員修煉之道》中提到的“ETC Principle” -- 易于改編原則。這個(gè)原則看似簡單,但是我們?cè)绞巧钊胨伎荚绞怯X得“簡約而不簡單”。

這篇文章里會(huì)詳細(xì)解刨在實(shí)際產(chǎn)品研發(fā)中“易于改編”的原因和怎么做到“易于改編”, 從而讓我們編寫出更好的代碼。

「一」程序?yàn)楹涡枰耙子诟木帯保?/h1>

為何代碼必須要易于改編?因?yàn)橐粋€(gè)系統(tǒng)是會(huì)隨著一個(gè)產(chǎn)品的發(fā)展,每日有用戶增長就會(huì)有一直做不完的需求。只要公司一直在運(yùn)營著這個(gè)產(chǎn)品,需求就會(huì)隨著公司的發(fā)展而改變。只要我們開發(fā)者一直與時(shí)并進(jìn)專研新技術(shù),我們就需要一直升級(jí)優(yōu)化。

只有了解清楚一個(gè)系統(tǒng)在一個(gè)生命周期中,具體什么會(huì)推動(dòng)我們程序改變,從中我們才會(huì)更深刻明白為什么我們的代碼需要”易于改編“。

需求會(huì)變

無論我們是研發(fā)任何系統(tǒng),產(chǎn)品需求都是會(huì)一直變的。這個(gè)是永恒不變的命運(yùn)。為什么呢?

  1. 產(chǎn)品方向 --- 隨著產(chǎn)品的營銷,運(yùn)營,發(fā)展會(huì)推動(dòng)產(chǎn)品需求一直新增,修改,優(yōu)化。
  2. 使用量 --- 隨著產(chǎn)品的用戶量級(jí),數(shù)據(jù)量級(jí),并發(fā)量級(jí)也會(huì)推動(dòng)程序的架構(gòu)和策略上的變動(dòng)。
  3. 技術(shù)升級(jí)優(yōu)化 --- 甚至是我們使用的語言,框架,依賴包等升級(jí)也會(huì)引起我們的代碼需要適應(yīng)。
  4. 技術(shù)債 --- 可能是因?yàn)闀r(shí)間的限制,之前的代碼重于實(shí)現(xiàn)而質(zhì)量不佳。

所以我們的代碼會(huì)隨著歲月的流逝一直在迭代升級(jí)優(yōu)化。

“可快速更變”是一個(gè)軟件的核心

近幾年很多技術(shù)團(tuán)隊(duì)啟用了敏捷迭代開發(fā)模式。什么是敏捷迭代呢?

敏捷迭代就是把開發(fā)周期縮短到1-4周。小步快跑的迅速迭代交付功能上線。敏捷迭代的流程分別如下:

  1. 確定需求 - 與老板和市場(chǎng)確認(rèn)需求和流程
  2. 需求評(píng)審 - 與開發(fā)同頻需求里面的功能點(diǎn)和業(yè)務(wù)流程
  3. 技術(shù)反講 - 開發(fā)與產(chǎn)品同頻需求,保證雙方理解無誤區(qū),開發(fā)也需要評(píng)估開發(fā)難度和開發(fā)時(shí)間
  4. 研發(fā)周期 - 開發(fā)人員開始投入研發(fā)直接到功能和需求開發(fā)完畢,轉(zhuǎn)交給測(cè)試,在測(cè)試環(huán)境提測(cè)
  5. 測(cè)試周期 - 測(cè)試和開發(fā)人員開始排除缺陷,修復(fù)所有在開發(fā)過程產(chǎn)生的bug
  6. 驗(yàn)收/預(yù)發(fā)布周期 - 當(dāng)測(cè)試在測(cè)試環(huán)境把所有bug排除掉后,當(dāng)前迭代版本就會(huì)發(fā)布到預(yù)發(fā)布環(huán)境讓市場(chǎng)和產(chǎn)品驗(yàn)收功能
  7. 發(fā)布正式 - 當(dāng)驗(yàn)收通過后,當(dāng)前迭代版本就可以部署上線到正式環(huán)境
  8. 正式回歸測(cè)試 - 發(fā)布上線后,就會(huì)有正式回歸測(cè)試,最后一道防線,保證系統(tǒng)加入的所有新功能都無問題
  9. 迭代總結(jié) - 每一期迭代結(jié)束后都總結(jié)這次迭代遇到的問題,持續(xù)優(yōu)化,提高效率

你想想如果一個(gè)APP或者系統(tǒng),幾個(gè)月甚至一年才更新一次功能和升級(jí)。我們用起來其實(shí)很枯燥的,甚至我們會(huì)發(fā)現(xiàn)很多問題,還有很多功能可以便捷或者提升我們的使用體驗(yàn)。但是這么久才更新一次,我們還會(huì)對(duì)這個(gè)產(chǎn)品抱有希望嗎?(除了微信這種已經(jīng)很成熟的應(yīng)用,但是就算是微信也是有持續(xù)更新的)。

所以一個(gè)好的產(chǎn)品,是需要快速迭代,小步快跑的迅速迭代交付功能上線的。也是因?yàn)檫@樣,功能就需要持續(xù)更新、升級(jí)和優(yōu)化。自然我們研發(fā)的代碼就需要一直隨著產(chǎn)品的變化而改編。而且還是每1-4周就會(huì)升級(jí)優(yōu)化一次。

??小總結(jié)一下:

  • 一個(gè)系統(tǒng)會(huì)隨著產(chǎn)品的發(fā)展和迭代,一直走在改變和更新的道路上。
  • 因?yàn)橄到y(tǒng)一直在變,代碼就需要響應(yīng)系統(tǒng)的變化,持續(xù)的快速迭代升級(jí)優(yōu)化。
  • 既然代碼需要快速的更變和升級(jí),那程序的“易于改編”性就必須要高。

「二」如何做到“易于改編”?

我們深刻懂得為什么系統(tǒng)會(huì)一直在改變,那我們就要知道怎么寫代碼才能讓一個(gè)程序“易于改編”,然而在敏捷迭代中才能快速的響應(yīng)需求的變化。如果想讓我們編寫的程序更容易的響應(yīng)需求改變、業(yè)務(wù)改變和邏輯改變等,我們就要充分的給我們的程序解刨邏輯

說到邏輯與業(yè)務(wù)的分解,首先要根據(jù)需求和功能深入思考分析,然后對(duì)其進(jìn)行一個(gè)架構(gòu)的設(shè)計(jì)。最常用的方式就是把系統(tǒng)模塊化,組件化等的系統(tǒng)架構(gòu)設(shè)計(jì)。

模塊設(shè)計(jì) ---「Modular Design」

模塊設(shè)計(jì),就是以功能塊為單位進(jìn)行程序設(shè)計(jì),實(shí)現(xiàn)其求解算法的方法稱為模塊化。模塊化的目的是為了降低程序復(fù)雜度,使程序設(shè)計(jì)、調(diào)試和維護(hù)等操作簡單化。

不論是前端開發(fā)還是后端開發(fā),我們都有模塊化和組件設(shè)計(jì)模式。使用模塊設(shè)計(jì)來分解我們的功能和邏輯,目的是為了降低程序的復(fù)雜度、利于調(diào)試、維護(hù)、修改和新增功能。

比如現(xiàn)在我們要做個(gè)CMS(內(nèi)容管理系統(tǒng)),我們一起來嘗試使用模塊設(shè)計(jì)來分解這個(gè)系統(tǒng)的功能。


設(shè)計(jì)思路

首先我們要理解一個(gè)內(nèi)容管理系統(tǒng)有哪些功能,然后把每個(gè)功能劃入各個(gè)模塊里。但是很多童鞋一開始接觸一個(gè)系統(tǒng),然后開始瓜分模塊會(huì)覺得無從入手,可能花了半天坐在電腦前思考??,但是半天都吐不出一個(gè)所以然來。接下來讓我們一起來學(xué)習(xí)一套邏輯思維,讓我們以后更輕松架構(gòu)一套模塊設(shè)計(jì)吧!


一開始先思考這個(gè)系統(tǒng)的目的和使用場(chǎng)景,這個(gè)系統(tǒng)是用來做什么的?

一個(gè)內(nèi)容管理系統(tǒng),一般來說都是用來發(fā)發(fā)文章,新聞,或者是一個(gè)官方網(wǎng)站的內(nèi)容管理。那必定就有文章。那管理文章內(nèi)容,需要什么功能呢?

文章模塊 「Article 模塊」

  • 增刪查改文章
  • 文章草稿
  • 文章置頂

文章子模塊 --- 分類 「Article Category 模塊」

  • 增刪查改分類
  • 文章圖片

那這些與文章相關(guān)的功能是不是可以統(tǒng)一放在“Article”模塊中統(tǒng)一管理,然后文章的模塊中還有一個(gè)文章分類的子模塊叫做“Category”。


有文章了必定就需要有作者,那作者在系統(tǒng)中其實(shí)是一個(gè)用戶。那我們就需要有用戶模塊了。 加上一個(gè)管理系統(tǒng),必定就有管理員,作者,甚至是會(huì)員。走一波這個(gè)邏輯我們就發(fā)現(xiàn)應(yīng)該要有以下的功能點(diǎn)。

用戶模塊 「User 模塊」

  • 用戶增刪查改
  • 用戶身份管理
  • 用戶權(quán)限管理
  • 會(huì)員等級(jí)管理

這么一來我們就可以建立一個(gè)單獨(dú)的User模塊。這個(gè)模塊主要是管理用戶相關(guān)的信息和功能。


看到這里我們應(yīng)該對(duì)一個(gè)系統(tǒng)的模塊構(gòu)思有一點(diǎn)的概念了。這個(gè)時(shí)候產(chǎn)品經(jīng)理過來給我們提了一個(gè)需求,“我們現(xiàn)在要在這個(gè)系統(tǒng)添加一個(gè)標(biāo)簽體系,專門用來管理文章標(biāo)簽的?!?/strong>。

那童鞋們,你們覺得這個(gè)需求應(yīng)該放入那個(gè)模塊呢???
....

你們答對(duì)了!??這個(gè)是屬于文章的一個(gè)子模塊,Tag模塊 --- 專門管理文章的標(biāo)簽,然后和每一篇文章有多對(duì)多關(guān)系的。所以標(biāo)簽?zāi)K歸納入文章模塊中。如果我們的內(nèi)容管理系統(tǒng)做的很大,里面有視頻內(nèi)容,圖文文章等等。我們可以在一開始就把這些統(tǒng)一歸納入“內(nèi)容模塊”,也就是Content模塊中。


前端模塊設(shè)計(jì)

說到了這里前端的童鞋估計(jì)要舉手咯???♂?,前端的我們求關(guān)注呀!“前端是以頁面和交互為單位,不可能和后端一樣按功能邏輯來分解模塊吧?” --- 這個(gè)童鞋說的在理哈。其實(shí)前端和后端的設(shè)計(jì)上是有稍微的不一樣的。

后端會(huì)以業(yè)務(wù)邏輯來分解模塊,但是前端有頁面和數(shù)據(jù)邏輯兩塊的代碼。所以前端相對(duì)比后端就要分開兩種模塊分解思路了。

頁 (排) 面 (版) 的模塊設(shè)計(jì)

  • 前端的頁面模塊與產(chǎn)品定義的系統(tǒng)模塊會(huì)更加貼切一些。前端分解的模塊會(huì)跟用戶所看到的操作功能分組。
  • 簡單的模塊分解,可以利用產(chǎn)品童鞋給到我們的導(dǎo)航來分解,這樣會(huì)更合理的規(guī)整我們的頁面模塊。
  • 如果在頁面功能上再想細(xì)分,那就可以用組件設(shè)計(jì)來分解了。

前端邏輯模塊設(shè)計(jì)

  • 幾年前的前端就是個(gè)“切圖仔”,基本不用考慮什么業(yè)務(wù)邏輯,數(shù)據(jù)邏輯,數(shù)據(jù)交互這些技術(shù)領(lǐng)域。但是因?yàn)榍昂蠖朔蛛x現(xiàn)在已經(jīng)變成大多數(shù)公司的研發(fā)策略。慢慢前后端都各自分?jǐn)偭藰I(yè)務(wù)邏輯和數(shù)據(jù)交互等處理。

  • 因?yàn)榍岸艘灿写罅康臉I(yè)務(wù)邏輯和交互邏輯,所以在我們封裝和解耦的時(shí)候,也會(huì)遇到需要分解模塊來處理。現(xiàn)在最典型的例子就是在使用Vue的狀態(tài)管理Vuex的時(shí)候,需要用到模塊管理來分解邏輯,使后面維護(hù)和修改更容易。

  • 其實(shí)前端也是用后端同一套思維模式來分解業(yè)務(wù)就可以了,以功能為單位來分解你們的模塊就可以了。


解耦 - 「Decoupling」

解耦,就是把復(fù)雜繁瑣的邏輯拆分成更小的邏輯塊。從而讓復(fù)雜的邏輯分解成小的邏輯處理,使得邏輯變得更簡化,更易于調(diào)試和維護(hù)。

在一個(gè)功能眾多、業(yè)務(wù)復(fù)雜和系統(tǒng)模塊繁多的系統(tǒng)中,每一個(gè)模塊里面的代碼也會(huì)開始變得臃腫,越來越難調(diào)試、維護(hù)和管理。其實(shí)模塊化和解耦是一致的。模塊化也是為了解耦你的程序。這里我們重點(diǎn)講的是模塊之間和邏輯之間的解耦(Decouping)。

我分享一個(gè)經(jīng)歷讓大家深刻認(rèn)知到解耦的重要性。我遇到過最夸張的有一段邏輯處理寫了上5000行代碼的童鞋,然而更可怕的是,在相同功能的地方那5000行代碼被復(fù)制粘貼過來了。??我滴乖乖,這位童鞋在研發(fā)小組中有個(gè)花名叫“復(fù)制兄”。不過得到大家的幫忙和提點(diǎn)下,后面他也成為了這個(gè)小組中的一名優(yōu)秀的程序員。


如果我們不懂得解耦代碼,編寫的代碼會(huì)給我們后面帶來很重的“技術(shù)債”。假設(shè)一下,你的5000行處理邏輯,在上數(shù)十個(gè)地方使用了。我們要改一下這段邏輯就難過登天了。就算是這段邏輯沒有復(fù)用性,但當(dāng)你需要回頭去修改這段邏輯也是會(huì)讓你頭皮發(fā)麻,無從入手。修改一點(diǎn)這個(gè)邏輯都可能會(huì)導(dǎo)致出現(xiàn)10個(gè)bug的后果。

我們深刻知道解耦的重要性,那么我們應(yīng)該怎么去高效解耦代碼呢?

在《程序員修煉之道》中的 Design by Contract 里提到我們編寫“害羞”的代碼是很有益處的。“害羞”有兩個(gè)含義:“不要把自己暴露給別人”和“不要與過多的人相互影響”。 這個(gè)是什么意思?我們用書中的例子來理解一下。

在一個(gè)龐大的間諜組織中,特工們會(huì)分到各個(gè)小組,每個(gè)小組內(nèi)部的特工基本都互相認(rèn)識(shí),但是各個(gè)小組之間的特工就都互不相識(shí)。假設(shè)某個(gè)特工被俘虜了,一個(gè)小組可能會(huì)被摧毀,但是其他小組的特工是不會(huì)被暴露被影響的。因?yàn)楦鱾€(gè)小組之間的關(guān)系都是絕對(duì)隔離的。但是在任務(wù)中,各個(gè)小組之間都是會(huì)有合作和互相幫助,但是都互不相識(shí)。所以這么龐大的間諜組織才能長期安全存活下來。

這個(gè)種隔離模式用在編程中是非常好的。把我們的代碼解耦到相對(duì)獨(dú)立的模塊和方法中,讓它們之間的關(guān)聯(lián)性和影響性降到最低。如果一個(gè)模塊或者邏輯方法出了問題,我們可以獨(dú)立重構(gòu)或者修復(fù),而不會(huì)給其他模塊帶來巨大的影響。只要最終的結(jié)果是一致的,就可以完美優(yōu)化升級(jí)或者修復(fù)了。

在程序中,我們需要一個(gè)Service (服務(wù))給我們處理一個(gè)Object(對(duì)象),或者請(qǐng)求一個(gè)服務(wù)獲得一個(gè)Object,我們希望這個(gè)服務(wù)給到我們需要的結(jié)果,但是不需要我們?nèi)ゲ傩乃窃趺刺幚砼c獲得這個(gè)Object的。這個(gè)服務(wù)或者方法是獨(dú)立運(yùn)行的,里面的邏輯和代碼是與我們寫的代碼絕對(duì)隔離的。我們只需要在獲得結(jié)果的時(shí)候驗(yàn)證這個(gè)結(jié)果的可用性就可以了,如果結(jié)果與我們需要的不一致,那我們就可以拋出錯(cuò)誤。只要這個(gè)服務(wù)做對(duì)應(yīng)的修正,就可以繼續(xù)運(yùn)行了。

理論我們解說的差不多了,現(xiàn)在我們來個(gè)實(shí)戰(zhàn)例子吧:

案例:
假設(shè)現(xiàn)在我們需要寫一個(gè)獲取天氣預(yù)報(bào)數(shù)據(jù)的類,獲取天氣預(yù)報(bào)數(shù)據(jù)首先你需要提供Geolocation 定位信息參數(shù)。Geolocation對(duì)象中含有一個(gè)地址對(duì)象。里面有經(jīng)緯度,省市區(qū)等數(shù)據(jù)。我們需要獲取到地址中的經(jīng)緯度才能得到精準(zhǔn)定點(diǎn)的天氣預(yù)告信息。我們的代碼會(huì)這么寫:

/**
* 獲取天氣方法
*/
public function getWeather(Geolocation $geolocation) {
    // 假設(shè)我們已經(jīng)封裝了一個(gè)獲取定位的天氣的方法叫g(shù)etWeatherByGeo()
    return $this->getWeatherByGeo($geolocation->getLocation()->getLat());
}
  • 我們通過getLocation方法獲取到定位對(duì)象里面的地址對(duì)象
  • 然后通過getLat()方法獲取到定位地址的經(jīng)緯度信息

以上例子中,因?yàn)槲覀冃枰?code>geolocation對(duì)象中取到經(jīng)緯度,所以我們需要先經(jīng)過獲取地址對(duì)象,然后再通過這個(gè)對(duì)象獲取到經(jīng)緯度。其實(shí)這里面有不需要的關(guān)聯(lián)關(guān)系。無論是寫服務(wù),還是寫對(duì)象方法,我們都不要讓使用這個(gè)服務(wù)/對(duì)象的開發(fā)者去過度的理解和使用你關(guān)聯(lián)性很強(qiáng)的內(nèi)部方法。這樣會(huì)導(dǎo)致如果我們那天改變了這個(gè)關(guān)聯(lián)性,多處都需要修改代碼。

如果那天劉某改了Geolocation對(duì)象,里面不再含有Location對(duì)象,而且也沒有了getLocation()方法,經(jīng)緯度可以直接在Geolocation對(duì)象中直接取得。這個(gè)時(shí)候所有之前運(yùn)用這個(gè)對(duì)象的其他人都需要修改代碼了。很多時(shí)候開發(fā)者很難修改代碼,或者一改動(dòng)就會(huì)傷筋動(dòng)骨的,其實(shí)就是因?yàn)檫@種過多過度的關(guān)聯(lián)性關(guān)系導(dǎo)致而為的。

所以作為Geolocation對(duì)象的封裝者,我們應(yīng)該直接給到一個(gè)方法getLat(),讓調(diào)用這個(gè)對(duì)象的開發(fā)者直接能拿到所需要的信息:

/**
* 獲取天氣方法
*/
public function getWeather(Geolocation $geolocation) {
    // 假設(shè)我們已經(jīng)封裝了一個(gè)獲取定位的天氣的方法叫g(shù)etWeatherByGeo()
    return $this->getWeatherByGeo($geolocation->getLat());
}

這樣就剪斷了剛剛對(duì)象中的強(qiáng)關(guān)聯(lián)關(guān)系的缺陷。


服務(wù)化 --- 「Service」

服務(wù)定義:

角色:服務(wù)是系統(tǒng)架構(gòu)里面的業(yè)務(wù)處理層。
作用:主要是為了高度解耦和封裝不同場(chǎng)景的業(yè)務(wù)和功能到對(duì)應(yīng)的服務(wù),然而達(dá)到高度中心化的業(yè)務(wù)代碼。

理解服務(wù)

  • 假設(shè)是一個(gè)控制器,現(xiàn)在拿到了一個(gè)衣服對(duì)象參數(shù),然后人擁有一個(gè)洗衣服方法
  • 現(xiàn)在人需要洗衣服,但是手洗效率太低了,所以我們寫了一個(gè)多功能的洗衣機(jī)服務(wù)給到人去使用
  • 洗衣機(jī)這個(gè)服務(wù)里面有很多不同洗衣服的方法,但是其實(shí)具體洗衣機(jī)里面的每一個(gè)清洗方法人是不知道怎么實(shí)現(xiàn)的,人都是直接按照提供的功能直接使用。
  • 所以服務(wù)里面的所有方法都是解耦在服務(wù)里面,服務(wù)要提供的方法是可以方便人使用的。

這樣說是不是很好理解了?所以最簡單的理解就是:

服務(wù)是用來封裝業(yè)務(wù)邏輯代碼,是一個(gè)獨(dú)立的邏輯層,高度封裝解耦后提供給控制器或者其他需要用到這個(gè)服務(wù)的地方使用的。


編寫思路

? 錯(cuò)誤例子

把所有洗衣機(jī)的方法提供給人使用,那就等同于讓人來決定所有洗衣機(jī)的參數(shù)和清洗步驟。當(dāng)人放衣服到洗衣機(jī)后,要選擇先加水,加多少水,然后清洗開始,清洗多久,再甩干等等。

光想想,洗個(gè)衣服還那么多的選項(xiàng),還要想怎么樣的洗衣順序才是正確的! 我太難了!洗個(gè)雞腿哦!(?`□ ′)?⌒┻━┻

?? 正確例子

洗衣機(jī)服務(wù)實(shí)現(xiàn)了很多不同的常用洗衣服的模式, 比如快速清洗,毛衣清洗,地毯清洗,風(fēng)干,甩干等等。都是一些常用的功能。
每個(gè)功能方法里面其實(shí)調(diào)用了很多洗衣機(jī)封裝好的流程和方法。所以當(dāng)人使用洗衣機(jī)時(shí),根本就不需要知道這些功能是怎么實(shí)現(xiàn)的,只要知道自己要干嘛,洗衣機(jī)剛好也有這個(gè)模式,直接用就完事兒了。

(???)??哇! 介么人性化的么!這種洗衣機(jī)給我來一打謝謝!

我寫過一篇詳細(xì)關(guān)于編寫服務(wù)的文章《你真的懂怎么寫服務(wù)層嗎?》,有興趣的童鞋可以前往查看哦。這里我就不詳細(xì)解說了。

總結(jié)

這篇文章已經(jīng)到達(dá)尾聲了,到了這里我們已經(jīng)深刻知道何為易于改編原則,更懂得如何編寫易于改編的代碼。其實(shí)在開發(fā)的過程中,我們還是需要先思考,后設(shè)計(jì),再編寫。根據(jù)所拿到的的功能需求,做好程序的架構(gòu)設(shè)計(jì),從而寫出易于改編的程序。只有這樣我們編寫的代碼才能越來越好,走上技術(shù)巔峰!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在現(xiàn)在這個(gè)技術(shù)高速發(fā)展的時(shí)代,無論你是在校學(xué)生,還是技術(shù)職場(chǎng)中的精英,都會(huì)面臨需要持續(xù)提升。但是如果只知道提升技術(shù)...
    三鉆閱讀 393評(píng)論 0 2
  • javascript設(shè)計(jì)模式與開發(fā)實(shí)踐 設(shè)計(jì)模式 每個(gè)設(shè)計(jì)模式我們需要從三點(diǎn)問題入手: 定義 作用 用法與實(shí)現(xiàn) 單...
    穿牛仔褲的蚊子閱讀 4,441評(píng)論 0 13
  • 微服務(wù)拆分之道 ——Zhamak Dehghani 原文 解耦何物,何時(shí)解耦 當(dāng)單體系統(tǒng)龐大到無法應(yīng)付時(shí),大多企業(yè)...
    Anor9閱讀 1,452評(píng)論 0 3
  • (根據(jù)張大志老師的聽書錄音整理) 40歲之后的人生,如何過得更有意義,每個(gè)人的答案都不一樣。 松浦彌太郎...
    海洋之歌23閱讀 852評(píng)論 0 2
  • 戊猴年末,普天同慶之秋,然師者令吾等訴自傳哉! 吾于金秋佳節(jié)生,故名曰:佳,乃平昌土興人氏,吾者,學(xué)生也。前是...
    浮巷佳人閱讀 1,640評(píng)論 15 25

友情鏈接更多精彩內(nèi)容