软件设计的第一性原理:结构化抽象
軟件設(shè)計(jì)的第一性原理,是結(jié)構(gòu)化抽象。術(shù)生于道,技術(shù)生于原理。
引語(yǔ)
所謂的第一性原理,就是無(wú)論使用什么方法論,都無(wú)法繞過(guò)的那最最基礎(chǔ)的部分。無(wú)論是 DDD 設(shè)計(jì),還是面向模式的架構(gòu)設(shè)計(jì),或 微服務(wù)架構(gòu),均建基于結(jié)構(gòu)化抽象。
何為結(jié)構(gòu)化抽象 ?先回答 “何為抽象” 與 “何為結(jié)構(gòu)化” 兩個(gè)問(wèn)題。
何為抽象 ??“編程漫談(三):抽象”?一文闡述了什么是抽象及在編程與計(jì)算中的意義;?“代碼抽象與分層”?則列舉了從代碼中提煉出來(lái)的六類(lèi)抽象,涵蓋了編程開(kāi)發(fā)中常見(jiàn)的實(shí)體及處理。
何為結(jié)構(gòu)化 ?結(jié)構(gòu),是事物的組成元素及關(guān)聯(lián)和作用。?“編程漫談(十一):編程概要”?一文闡述了編程中的各種數(shù)據(jù)結(jié)構(gòu)及控制結(jié)構(gòu),“軟件的組合結(jié)構(gòu):從指令到軟件”?則闡述了組合元素的方法與結(jié)構(gòu)。結(jié)構(gòu)化,分為數(shù)據(jù)結(jié)構(gòu)化和控制結(jié)構(gòu)化。數(shù)據(jù)結(jié)構(gòu)化指海量數(shù)據(jù)的組織和存儲(chǔ)及需要滿(mǎn)足的約束(比如一致性、完整性等);控制結(jié)構(gòu)化,是指,操作的組織和執(zhí)行以及需要滿(mǎn)足的約束。
軟件,本質(zhì)上是一種可動(dòng)態(tài)而彈性變化的邏輯裝置。結(jié)構(gòu)化,即是將邏輯進(jìn)行抽象、提煉、分離、聚合,構(gòu)建成更加縝密、動(dòng)態(tài)、彈性的結(jié)構(gòu)流。
邏輯,是思維意識(shí)的一種形式。軟件設(shè)計(jì)與開(kāi)發(fā),是與自己的思維意識(shí)進(jìn)行抗?fàn)幣c和解。
理念
設(shè)計(jì)與開(kāi)發(fā)
軟件設(shè)計(jì)與開(kāi)發(fā)工作滲透著結(jié)構(gòu)化抽象的思想。譬如:
- 軟件建模。是對(duì)大量原始數(shù)據(jù)進(jìn)行結(jié)構(gòu)化組織,使之更加有序、有意義、可交互。 
- 數(shù)據(jù)存取。在建立對(duì)數(shù)據(jù)的組織抽象之后,就要進(jìn)行數(shù)據(jù)的存取操作。數(shù)據(jù)是規(guī)則的還是不規(guī)則的 ?數(shù)據(jù)量有多少及增長(zhǎng)速度如何 ?是否要進(jìn)行緩存 ?選取合適的數(shù)據(jù)存儲(chǔ)組件。數(shù)據(jù)存儲(chǔ)組件是對(duì)海量數(shù)據(jù)存儲(chǔ)和訪問(wèn)的結(jié)構(gòu)化抽象。 
- 流程構(gòu)造。在確定數(shù)據(jù)存取方案后,需要構(gòu)建完整的流程。流程可以使用時(shí)序圖來(lái)表示。流程包含前置、操作與契約。前置,是進(jìn)行操作需要滿(mǎn)足的條件;操作則是獲取數(shù)據(jù)或請(qǐng)求某種執(zhí)行;契約,是在完成操作之后,必須滿(mǎn)足的一系列斷言。完整流程通常是:“前置-操作-契約”的子流程的有序組合。 
- 編程實(shí)現(xiàn)。需要評(píng)估潛在變化的部分,將通用的部分與易變化的部分相分離。 
設(shè)計(jì)模式
設(shè)計(jì)模式是對(duì)象職責(zé)及交互的結(jié)構(gòu)化抽象,是體現(xiàn)結(jié)構(gòu)化抽象思想的基本單元。可參閱:“軟件設(shè)計(jì)要素初探:基礎(chǔ)設(shè)計(jì)模式概覽”?。
架構(gòu)模式是基于設(shè)計(jì)模式的更高層次的結(jié)構(gòu)化抽象。可參閱:“軟件設(shè)計(jì)要素初探:架構(gòu)模式”?。
設(shè)計(jì)模式和架構(gòu)模式主要應(yīng)對(duì)軟件的業(yè)務(wù)可擴(kuò)展性難題。
技術(shù)機(jī)制
在軟件設(shè)計(jì)中,技術(shù)是繞不開(kāi)的一道檻。技術(shù)的作用在于,在指定的場(chǎng)景下,所執(zhí)行的操作效果必須滿(mǎn)足某種約束。技術(shù)機(jī)制,是將多個(gè)相關(guān)聯(lián)的結(jié)構(gòu)化抽象進(jìn)行聚合后的成品。
異步
比如先快速響應(yīng)客戶(hù)端,再進(jìn)行請(qǐng)求處理。其結(jié)構(gòu)化抽象是,操作相對(duì)于主進(jìn)程的執(zhí)行耗時(shí)與實(shí)際執(zhí)行耗時(shí)無(wú)關(guān)。
冪等
比如處理資金問(wèn)題,必須考慮冪等問(wèn)題,即同一個(gè)請(qǐng)求,執(zhí)行多次的效果必須與執(zhí)行一次的效果等同。冪等的結(jié)構(gòu)化抽象是,操作的主效果與操作次數(shù)無(wú)關(guān)。
事務(wù)
比如多個(gè)關(guān)聯(lián)數(shù)據(jù)的插入、更新和刪除,必須保證原子性。要么全部執(zhí)行,要么一個(gè)都不執(zhí)行。需要使用事務(wù)來(lái)保證。事務(wù)的特性是ACID,結(jié)構(gòu)化抽象是關(guān)聯(lián)數(shù)據(jù)集合在操作前后必須滿(mǎn)足某種一致性約束。確定“關(guān)聯(lián)數(shù)據(jù)集的一致性約束”是關(guān)鍵,其實(shí)現(xiàn)是還原點(diǎn)、快照與回滾日志。
并發(fā)
大量請(qǐng)求或數(shù)據(jù)集的處理,使用串行的方式效率難以滿(mǎn)足性能或吞吐量要求,需使用并發(fā)的方式,充分利用多核CPU資源。結(jié)構(gòu)化抽象是,多個(gè)相互獨(dú)立的執(zhí)行單元。這些執(zhí)行單元擁有獨(dú)立的CPU和緩存,所使用的內(nèi)存可以為共享內(nèi)存型和獨(dú)立內(nèi)存型。
同步
在并發(fā)場(chǎng)景下,要保證多個(gè)執(zhí)行單元(比如線程、進(jìn)程等)能夠看到共享內(nèi)存的最新更新值。同步的本質(zhì)是確保指定順序執(zhí)行,避免不確定的執(zhí)行順序帶來(lái)不確定性的結(jié)果。其結(jié)構(gòu)化抽象是臨界區(qū)。臨界區(qū)是約束執(zhí)行順序的一種結(jié)構(gòu)。
框架
應(yīng)用的組件、配置與啟動(dòng),可以做成通用的框架和腳手架反復(fù)使用,快速啟動(dòng)和部署一項(xiàng)工程,減少不必要的重復(fù)工作量。框架的結(jié)構(gòu)化抽象是,將工程中的配置、部署與啟動(dòng)、運(yùn)行結(jié)構(gòu)、通用任務(wù)進(jìn)行提煉并形成固定的模式,應(yīng)用只需要關(guān)注可變的業(yè)務(wù)部分。
限流
突發(fā)的峰值流量,為了避免瞬間占滿(mǎn)和擊垮服務(wù)器的資源和服務(wù)能力,需要進(jìn)行限流。其結(jié)構(gòu)化抽象是,在指定時(shí)間間隔內(nèi)的通過(guò)許可數(shù)必須滿(mǎn)足指定規(guī)格。
緩存
對(duì)于熱點(diǎn)數(shù)據(jù),為了避免反復(fù)從源存儲(chǔ)獲取,增大對(duì)存儲(chǔ)的訪問(wèn)壓力,可以使用緩存來(lái)存儲(chǔ)熱點(diǎn)數(shù)據(jù),增大命中率,提升性能,減少對(duì)存儲(chǔ)的不必要的訪問(wèn)壓力。緩存的結(jié)構(gòu)化抽象是,使用少而精的空間優(yōu)先于大而全的空間的搜索。“少而精”是指聚焦應(yīng)用的經(jīng)常被訪問(wèn)的熱點(diǎn)數(shù)據(jù)。緩存的衡量指標(biāo)是命中率和過(guò)期時(shí)間,操作是緩存與源存儲(chǔ)的讀寫(xiě)同步。
降級(jí)
當(dāng)非核心的依賴(lài)不可用時(shí),可以及時(shí)切斷依賴(lài),舍小取大,保證整體服務(wù)正常運(yùn)行,不受局部影響。降級(jí)的結(jié)構(gòu)化抽象是,是主備策略的設(shè)計(jì)與切換機(jī)制。
重試
當(dāng)處理數(shù)據(jù)發(fā)生錯(cuò)誤時(shí),可以進(jìn)行重試來(lái)進(jìn)行補(bǔ)償和恢復(fù)。重試的結(jié)構(gòu)化抽象是,至少(且通常只需)保證一次操作成功。
切面
比如耗時(shí)統(tǒng)計(jì)。耗時(shí)統(tǒng)計(jì)與操作的執(zhí)行內(nèi)容無(wú)關(guān),僅關(guān)注操作的耗時(shí)。切面的結(jié)構(gòu)化抽象是,操作的非功能屬性與功能本身的解耦。
代理
比如請(qǐng)求的負(fù)載均衡。不是直接執(zhí)行目標(biāo)操作,而是創(chuàng)建一個(gè)代理,由這個(gè)代理轉(zhuǎn)發(fā)請(qǐng)求和執(zhí)行目標(biāo)操作。代理的結(jié)構(gòu)化抽象是,隱藏目標(biāo)操作。
版本號(hào)
版本號(hào)通常用于實(shí)現(xiàn)非阻塞式并發(fā),即樂(lè)觀鎖。其結(jié)構(gòu)化抽象是,一個(gè)嚴(yán)格保證特征數(shù)值單調(diào)遞增的機(jī)制。
實(shí)踐
示例分析
要對(duì)問(wèn)題進(jìn)行結(jié)構(gòu)化抽象,需要先提取問(wèn)題的結(jié)構(gòu)特征。可以分別從數(shù)據(jù)結(jié)構(gòu)化和操作結(jié)構(gòu)化兩個(gè)角度來(lái)思考。
分頁(yè)
比如分頁(yè)功能是大多數(shù)信息系統(tǒng)管理的必備功能之一。怎么實(shí)現(xiàn)一個(gè)通用的分頁(yè)功能呢 ?
從數(shù)據(jù)結(jié)構(gòu)化來(lái)思考,其結(jié)構(gòu)要素為:偏移量、頁(yè)大小、起始和結(jié)束位置。分頁(yè)本身和獲取何種對(duì)象無(wú)關(guān)。
從操作結(jié)構(gòu)化來(lái)思考,其結(jié)構(gòu)要素為:1. select columns from table where condition limit offset, size ; 2. count distinct(id) from table where condition limit offset, size .
columns , table, condition 都是可以根據(jù)具體業(yè)務(wù)來(lái)動(dòng)態(tài)生成的,而整個(gè) SQL 的骨架是固定的。table 不一定指 DB , select , count 也不一定是 DB 的 sql ,它只是表示在指定搜索條件下進(jìn)行對(duì)象選擇與統(tǒng)計(jì)的操作語(yǔ)義。columns , table, cond 的動(dòng)態(tài)生成,可以使用泛型和回調(diào)函數(shù)來(lái)傳入和處理。
限購(gòu)
限購(gòu),是指定時(shí)間內(nèi),指定 key 的實(shí)體允許通過(guò)的許可數(shù)量。與限流是同一類(lèi)結(jié)構(gòu)化抽象。許可數(shù)量,是一個(gè)全局性約束。
假設(shè)去掉“指定時(shí)間”的約束,只限制許可數(shù)量, 其結(jié)構(gòu)化抽象是,dec if total - count(key) > 0. 并發(fā)的場(chǎng)景下,total - count(key) > 0 的值需要進(jìn)行全局同步。
如果加上“指定時(shí)間”的約束,還需要考慮高并發(fā)場(chǎng)景下 dec if total - count(key) > 0 的操作耗時(shí)。如果指定時(shí)間內(nèi)不允許超過(guò)限購(gòu)數(shù)量(強(qiáng)約束),則必須對(duì) dec if total - count(key) > 0 進(jìn)行加鎖,吞吐量取決于操作耗時(shí)而不是指定的限購(gòu)數(shù);如果指定時(shí)間內(nèi)可允許暫時(shí)地超過(guò)限購(gòu)數(shù)量(弱約束),則可參考限流算法。
數(shù)據(jù)同步
數(shù)據(jù)同步的結(jié)構(gòu)化抽象是,將源存儲(chǔ) S1, S2, ..., Sn 的數(shù)據(jù)復(fù)制到目標(biāo)存儲(chǔ) D 。
數(shù)據(jù)同步分為兩種不同的場(chǎng)景,有實(shí)時(shí)同步和離線同步。實(shí)時(shí)同步對(duì)數(shù)據(jù)延遲性容忍非常低,離線同步則要求更快的吞吐量。
實(shí)時(shí)同步通常采用流式同步,通過(guò)接收消息流來(lái)處理。操作的結(jié)構(gòu)化是,Receiver (msg) -> Format(msg) -> Save for each msg . msg 是源存儲(chǔ)中的一條數(shù)據(jù)或一個(gè)單位數(shù)據(jù)集。
離線同步通常采用批量處理,實(shí)現(xiàn)方式是批量獲取數(shù)據(jù)并批量格式化后存儲(chǔ)。操作的結(jié)構(gòu)化是,Divide(S) into N part(S) ; Select part(S) Then Format part(S) and Save for each part(S) 。可以根據(jù)業(yè)務(wù)唯一 ID 實(shí)現(xiàn)一個(gè)通用的 Divide 算法。
離線同步要注意 format 的超時(shí)和健壯性處理,記錄下異常以便重試,同時(shí)不因單個(gè)數(shù)據(jù)處理失敗而中斷整體流程;流式同步則要注意控制好并發(fā)情形下的準(zhǔn)確性。由于對(duì)吞吐量要求比較高,往往采用樂(lè)觀鎖的方式,找到某種能夠控制全局版本號(hào)單調(diào)遞增的機(jī)制,或者盡量避免“多表同步到單表”的場(chǎng)景【并發(fā)場(chǎng)景下會(huì)帶來(lái)更多復(fù)雜性】。
積累抽象
在實(shí)際工作中,可以反思和提煉設(shè)計(jì)中所用到的結(jié)構(gòu)化抽象。如果現(xiàn)有的結(jié)構(gòu)化抽象及組合難以解決問(wèn)題,是否需要新的結(jié)構(gòu)化抽象 ?創(chuàng)建新的結(jié)構(gòu)化抽象,并使之與已有的進(jìn)行組合和集成。
規(guī)模化挑戰(zhàn)
如果程序媛猿面對(duì)的是幾萬(wàn)的數(shù)據(jù)量,那是可以夜夜笙歌的。然而,現(xiàn)實(shí)情況是,面對(duì)的是億級(jí)以上規(guī)模的數(shù)據(jù)量,且數(shù)據(jù)量仍然在指數(shù)級(jí)增長(zhǎng)。為了人類(lèi)社會(huì)的無(wú)理性發(fā)展,程序媛猿們真是費(fèi)盡了心思花白了頭。
為了應(yīng)對(duì)億級(jí)規(guī)模的數(shù)據(jù)量,并發(fā)、分布式等方案層出不窮,結(jié)合變化的業(yè)務(wù)場(chǎng)景,又衍生出更多的撓人燒腦的復(fù)雜問(wèn)題。如何應(yīng)對(duì)呢?
規(guī)模化挑戰(zhàn)的結(jié)構(gòu)化抽象是,在指定時(shí)間內(nèi),每秒處理的請(qǐng)求/單位數(shù)據(jù)集的吞吐量,處理一個(gè)請(qǐng)求或單位數(shù)據(jù)集的平均響應(yīng)時(shí)間,以及在流量劇烈變化時(shí)的彈性擴(kuò)展能力。
并發(fā)
并發(fā)和并行機(jī)制取代了串行機(jī)制。單CPU和單機(jī)的性能基本抵達(dá)瓶頸,只能從多核CPU和多機(jī)上想辦法。將要處理的數(shù)據(jù)量分解為多個(gè)相互獨(dú)立的子數(shù)據(jù)集,并在不同的執(zhí)行實(shí)體里相互獨(dú)立地執(zhí)行。比如線程池,Fork/Join , Map-Reduce 執(zhí)行模型。并發(fā)和并行雖然解決了單機(jī)性能不足的問(wèn)題,卻引發(fā)了更多的問(wèn)題。
同步
有了并發(fā)執(zhí)行之后,由于有些資源是共享的,而一些熱點(diǎn)數(shù)據(jù)往往被多個(gè)執(zhí)行實(shí)體同時(shí)讀取和修改,又產(chǎn)生了競(jìng)爭(zhēng)問(wèn)題。為了解決競(jìng)爭(zhēng),引入了同步機(jī)制。大量對(duì)同一資源、數(shù)據(jù)的操作進(jìn)行同步,引起性能問(wèn)題。
緩存
對(duì)于熱點(diǎn)數(shù)據(jù)的讀取和操作,通過(guò)“空間換時(shí)間”的策略,使用緩存來(lái)提升性能,降低對(duì)源存儲(chǔ)的訪問(wèn)壓力。
限流
由于允許并發(fā)請(qǐng)求進(jìn)入,則必須應(yīng)對(duì)瞬間的峰值流量(可見(jiàn)世態(tài))。限流必須有度,不能因噎廢食。需要對(duì)系統(tǒng)承載的負(fù)荷及極限負(fù)荷進(jìn)行測(cè)量,根據(jù)測(cè)量值來(lái)確定一個(gè)可動(dòng)態(tài)調(diào)整的限流值。極限負(fù)荷測(cè)量即是壓測(cè)。
降級(jí)
由于業(yè)務(wù)特性的不同,環(huán)境的不穩(wěn)定波動(dòng),以及采用方案的局限性,依賴(lài)服務(wù)有可能出現(xiàn)部分失敗,對(duì)于調(diào)用極其頻繁的服務(wù)來(lái)說(shuō),依賴(lài)服務(wù)的少許失敗可能導(dǎo)致上層的雪崩效應(yīng)。因此在依賴(lài)服務(wù)出現(xiàn)問(wèn)題時(shí),必須進(jìn)行適當(dāng)?shù)慕导?jí)熔斷。
測(cè)量
為了避免大流量或大數(shù)據(jù)結(jié)構(gòu)導(dǎo)致軟件運(yùn)行出現(xiàn)問(wèn)題,降低維護(hù)成本,不能僅僅停留在定性分析上,還要進(jìn)行量化。需要對(duì)系統(tǒng)進(jìn)行仔細(xì)的測(cè)量。服務(wù)接口的 RT 和 吞吐量 如何 ?存取操作耗時(shí)如何 ?消息處理耗時(shí)和吞吐量如何 ?內(nèi)存占用如何 ?大數(shù)據(jù)對(duì)象占用內(nèi)存多大 ?能夠承載的極限流量有多大 ?能夠承載的極限對(duì)象大小是多大 ?指定時(shí)間段的失敗數(shù)和失敗率有多大 ?
集群
若以單機(jī)視角去考慮問(wèn)題,就會(huì)殫精竭慮地在“并發(fā)、同步、緩存、限流、降級(jí)”等上做到極致,就像在單核時(shí)代將CPU主頻做到極致一樣。然而,即使做到極致,為了峰值流量所構(gòu)建的機(jī)器資源,在平均流量場(chǎng)景下會(huì)造成很大的浪費(fèi);并且,很難預(yù)估峰值流量會(huì)在什么時(shí)候來(lái)到。如果有一個(gè)超級(jí)大的聚合的池化資源,總可以提供足夠強(qiáng)大而彈性的CPU計(jì)算能力、內(nèi)存能力、磁盤(pán)空間,那么以上規(guī)模化引起的問(wèn)題也將迎刃而解。這個(gè)超級(jí)大的聚合的池化資源,就來(lái)自于構(gòu)成集群的分布式系統(tǒng)的資源虛擬化后的能力,即云計(jì)算能力。
可視化
為了從數(shù)據(jù)集中發(fā)現(xiàn)整體性的規(guī)律和趨勢(shì),通過(guò)將大量數(shù)據(jù)集進(jìn)行可視化,擁有一個(gè)簡(jiǎn)明的全局視角。
AI
以數(shù)據(jù)為基礎(chǔ),以規(guī)則集為準(zhǔn)繩,訓(xùn)練機(jī)器通過(guò)基本的規(guī)則集與數(shù)據(jù)的計(jì)算而獲得某種“學(xué)習(xí)”能力,從而能夠分析更多的數(shù)據(jù)集,調(diào)整現(xiàn)實(shí)活動(dòng)和方式,獲得人力所無(wú)法得到的見(jiàn)解和經(jīng)濟(jì)效益。
經(jīng)驗(yàn)與洞見(jiàn)
招聘或找工作的人,常常說(shuō)要“工作經(jīng)驗(yàn)多少年才行”,然而,在軟件設(shè)計(jì)中,卻容易“有經(jīng)驗(yàn)而無(wú)洞見(jiàn)”。
經(jīng)驗(yàn)是什么?經(jīng)驗(yàn)是工作中遇到的問(wèn)題及解決方案。有些問(wèn)題,只有在規(guī)模達(dá)到足夠大的時(shí)候才會(huì)出現(xiàn);而大多數(shù)問(wèn)題,只要根據(jù)原理就能推導(dǎo)出來(lái)。在軟件世界里,并沒(méi)有一成不變的最佳經(jīng)驗(yàn)。
洞見(jiàn)是什么?洞見(jiàn)來(lái)自于究根追源,從最基本的公理進(jìn)行推導(dǎo)得出定理和定律,從而能夠預(yù)知問(wèn)題。邏輯,本質(zhì)上是一種數(shù)學(xué)結(jié)構(gòu),而數(shù)學(xué)正是能夠進(jìn)行推導(dǎo)的嚴(yán)密思維體系。
軟件設(shè)計(jì)的洞見(jiàn)來(lái)自哪里 ?究根追源,軟件邏輯建始于兩條公理:
- 1 + 1 = 2 
- 機(jī)器的字長(zhǎng)有限,內(nèi)存有限;執(zhí)行指令需要 CPU 時(shí)鐘周期 
幾乎所有軟件問(wèn)題都是這兩個(gè)基本要素的組合和疊加而產(chǎn)生的。軟件設(shè)計(jì)崇尚“自頂向下”的方式,然而,要獲得洞見(jiàn),卻需要“自底向上”的思考和推導(dǎo),通過(guò)多個(gè)層次的結(jié)構(gòu)化抽象來(lái)建立。萬(wàn)變不離其宗。
注意到,第二條公理描述了現(xiàn)實(shí)系統(tǒng)的局限性。局限性,正是經(jīng)驗(yàn)的用武之地。
在初期,可以 80% 依據(jù)經(jīng)驗(yàn),20% 依據(jù)原理;而在后期,則應(yīng)該 80% 依靠原理,20% 依靠經(jīng)驗(yàn)。那么,不依靠經(jīng)驗(yàn)應(yīng)該怎么做呢 ?舉一個(gè) API 調(diào)用的例子。可以測(cè)量這個(gè) API 的平均耗時(shí),耗時(shí)分布,大體了解這個(gè) API 的對(duì)外輸出指標(biāo)。API 超時(shí)是因?yàn)槭裁茨??可能是網(wǎng)絡(luò)環(huán)境波動(dòng)導(dǎo)致。很難通過(guò)設(shè)計(jì)和開(kāi)發(fā)優(yōu)化環(huán)境的波動(dòng)。如果不是,從 API 的實(shí)現(xiàn)層面來(lái)說(shuō),很可能是因?yàn)椴l(fā)的大流量導(dǎo)致了競(jìng)爭(zhēng)加劇,線程死鎖或者大量線程阻塞。API 超時(shí)又會(huì)導(dǎo)致多個(gè)子系統(tǒng)間數(shù)據(jù)不一致。可見(jiàn),并發(fā)與大流量,是系統(tǒng)必須要面對(duì)的“對(duì)手”。并發(fā)與大流量一定需要通過(guò)工作經(jīng)驗(yàn)來(lái)獲得嗎?非也。并發(fā)與大流量的場(chǎng)景是可以模擬的。
可以通過(guò)原理推導(dǎo),結(jié)合實(shí)驗(yàn),來(lái)模擬各種現(xiàn)實(shí)場(chǎng)景,測(cè)量數(shù)據(jù), 并制訂應(yīng)對(duì)方案。?這是細(xì)功夫,也是洞見(jiàn)的產(chǎn)生之源。
小結(jié)
本文闡述了軟件設(shè)計(jì)中的結(jié)構(gòu)化抽象的理念及實(shí)踐方法,涉及設(shè)計(jì)與開(kāi)發(fā)、設(shè)計(jì)模式、技術(shù)機(jī)制、示例分析、規(guī)模化挑戰(zhàn),及設(shè)計(jì)中的經(jīng)驗(yàn)與洞見(jiàn)。結(jié)構(gòu)化,即是將邏輯進(jìn)行抽象、提煉、分離、聚合,構(gòu)建成更加縝密、動(dòng)態(tài)、彈性的結(jié)構(gòu)流。
做軟件設(shè)計(jì),要同時(shí)看到骷髏與美人。論理,要看到骷髏;論情,要看到美人。理,即是結(jié)構(gòu)化抽象。
原文鏈接:https://www.cnblogs.com/lovesqcc/p/11220727.html
.NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總?http://www.csharpkit.com?
總結(jié)
以上是生活随笔為你收集整理的软件设计的第一性原理:结构化抽象的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 依赖注入在 dotnet core 中实
- 下一篇: 基于.NetCore结合docker-c
