計師知識地圖:面向?qū)ο?、設(shè)計模式與算法速查)
簡介面向軟件設(shè)計師中級考試的系統(tǒng)化知識點(diǎn)整理文檔適合備考軟考的考生及需要梳理計算機(jī)基礎(chǔ)理論的學(xué)習(xí)者使用聚焦面向?qū)ο笤O(shè)計、UML建模、樹與二叉樹、線性表及排序算法等高頻考點(diǎn)。包內(nèi)僅含1個docx文件壓縮包約31.83MB文檔以目錄化筆記形式組織涵蓋面向?qū)ο蠡靖拍钆c七大設(shè)計原則、創(chuàng)建型/結(jié)構(gòu)型/行為型模式分類、UML關(guān)系辨析以及樹的概念、查找二叉樹、平衡二叉樹、特殊樹、各種排序算法對比與情景選擇等內(nèi)容。已有894人學(xué)習(xí)下載便于讀者按目錄快速定位薄弱章節(jié)對照概念與特性做重點(diǎn)記憶也可作為考前串聯(lián)知識框架、查漏補(bǔ)缺的復(fù)習(xí)材料。1. 軟考中級到底在考什么一張知識地圖先看懂很多人第一次翻開軟件設(shè)計師中級考試的目錄會有種打開別人家抽屜的感覺里面什么都有擺得也整齊但就是不知道該先拿哪一樣。軟考中級這份知識點(diǎn)整理做的事情其實(shí)就是把這個抽屜按用途重新歸了一遍類——面向?qū)ο蟆ML、數(shù)據(jù)結(jié)構(gòu)、算法、軟件工程、網(wǎng)絡(luò)、數(shù)據(jù)庫十幾個大格子每個格子里再分小格。打個比方它更像一張城市地圖而不是一本詞典詞典告訴你某個詞怎么解釋地圖告訴你這些地方彼此怎么走通。搞懂這張地圖的意義在于你不必背下所有細(xì)節(jié)但得知道「設(shè)計模式」和「面向?qū)ο笤瓌t」住在同一條街上「關(guān)鍵路徑」和「進(jìn)度管理」說的其實(shí)是同一件事的兩種口徑。方向?qū)α撕竺婷恳徽虏挪恢劣谧兂尚W(xué)。2. 面向?qū)ο竽切┟~類、封裝、多態(tài)到底在解決什么問題2.1 從「一堆函數(shù)」到「一群對象」封裝封的是變化的邊界先想象一個沒有面向?qū)ο蟮挠唵蜗到y(tǒng)。所有邏輯都寫成函數(shù)共享一批全局變量訂單號、金額、狀態(tài)、收貨地址。剛開始很順手等到某天要加一個「部分退款」功能你會發(fā)現(xiàn)改一個字段另外七八個函數(shù)的行為全跟著變誰調(diào)用了誰全靠記憶。這類代碼的痛感不是「難寫」而是「不敢改」。面向?qū)ο蟮牡谝坏毒褪前堰@些散落的數(shù)據(jù)和操作它們的方法捆成一個整體。類是這個整體的模板規(guī)定了有哪些屬性、能做哪些動作對象是按這個模板造出來的具體實(shí)例。更通俗地說類是月餅?zāi)W訉ο笫强某鰜淼脑嘛災(zāi)W又挥幸粋€月餅可以有無數(shù)個每個的餡還能不一樣。封裝指的是對象的狀態(tài)不直接暴露給外面外面只能通過它提供的方法來讀寫。好處是修內(nèi)部實(shí)現(xiàn)時只要方法簽名不變外面的調(diào)用方完全不用動。繼承表達(dá)的是「是一種」的關(guān)系。子類拿到父類的屬性和方法再補(bǔ)上自己特有的部分。多態(tài)則是同一個調(diào)用在不同對象身上給出不同結(jié)果同樣是「計算運(yùn)費(fèi)」普通用戶、會員、大客戶走的是三套算法但調(diào)用方只寫一次order.calculateShipping()。抽象是把共性抽出來、把差異留給子類組合是「有一個」把一個對象放進(jìn)另一個對象里當(dāng)零件用。這五個詞之所以總被一起講是因為它們本來就是同一件事的五個側(cè)面——讓變化被關(guān)在盡量小的盒子里。提示封裝不等于「把字段寫成 private 就完事」。判斷有沒有真正做到封裝看的是外部能不能繞過方法直接改動內(nèi)部狀態(tài)而不只是看修飾符。2.2 七大設(shè)計原則每一條背后都對應(yīng)一種「改不動」的痛苦這些原則不是憑空立的規(guī)矩每一條都對應(yīng)一類真實(shí)項目里反復(fù)出現(xiàn)的翻車現(xiàn)場。把它們當(dāng)成七種「病」的「對癥藥」來記比死背定義牢固得多。單一職責(zé)原則說的是一個類只有一個引起它變化的原因。反例很好找一個類既負(fù)責(zé)算錢又負(fù)責(zé)發(fā)通知還負(fù)責(zé)寫數(shù)據(jù)庫。結(jié)果是財務(wù)規(guī)則一變要動它通知渠道一變還要動它誰都不敢碰。開閉原則說的是對擴(kuò)展開放、對修改關(guān)閉。最典型的違規(guī)是那條越寫越長的 if-else 支付分支每接一家新渠道就要往里加一個 else改到最后沒人敢動這段代碼。里氏替換原則說的是任何出現(xiàn)父類的地方換成子類都應(yīng)該不出問題。教科書級的反面例子是讓「正方形」繼承「長方形」長方形的 setWidth 和 setHeight 是獨(dú)立的正方形里只要改寬高就得跟著改替換之后行為就壞了。依賴倒置原則說的是高層模塊和低層模塊都依賴抽象而不是高層直接依賴具體實(shí)現(xiàn)。業(yè)務(wù)層里直接 new 一個具體的數(shù)據(jù)庫訪問類就是最典型的違規(guī)換庫的時候只能全篇替換。接口隔離原則說的是別逼一個類去實(shí)現(xiàn)它根本用不上的方法。那種十幾個方法的大接口實(shí)現(xiàn)類里塞滿空實(shí)現(xiàn)和拋異常的占位代碼就是接口太肥的信號。迪米特法則叫「最少知識原則」一個對象應(yīng)該盡量少地跟陌生對象打交道a.getB().getC().doSomething()這種鏈?zhǔn)酱┩妇褪堑湫瓦`規(guī)中間任何一環(huán)改了都會波及。合成復(fù)用原則說的是優(yōu)先用組合而不是繼承來復(fù)用。為了拿到父類的兩個工具方法就繼承一整個類屬于用大炮打蚊子代價是永久綁死了繼承鏈。原則一句話概括典型違規(guī)現(xiàn)場單一職責(zé)一個類只為一個變化負(fù)責(zé)一個類同時管賬、管通知、管存儲開閉加功能靠新增不靠改老代碼每接一個渠道就加一個 if-else 分支里氏替換子類能無縫替換父類正方形繼承長方形后行為錯亂依賴倒置雙方都依賴抽象業(yè)務(wù)層直接 new 具體實(shí)現(xiàn)類接口隔離接口要小而專大接口下掛一堆空實(shí)現(xiàn)迪米特少跟陌生人說話層層 get 穿透調(diào)用合成復(fù)用優(yōu)先組合慎用繼承為復(fù)用兩個方法繼承整個基類注意這七條在實(shí)踐中會互相拉扯。把類拆到極致類的數(shù)量會爆炸接口切得太碎調(diào)用方要拼裝一堆接口。原則是用來權(quán)衡的坐標(biāo)不是用來打卡的清單。2.3 為什么這一塊總在考題目里它們長什么樣考試對這塊的考法很少直接問「開閉原則的定義是什么」更多是給一段場景讓你判斷它違反了哪一條或者給出一個設(shè)計問你怎么改才更符合原則。這類題的通用解法是兩步先找出場景里的「變化點(diǎn)」在哪再對照七條原則里哪一條正對著這個變化點(diǎn)。變化點(diǎn)在「新增功能要改老代碼」上就往開閉上想變化點(diǎn)在「高層直接依賴了具體類」上就往依賴倒置上想變化點(diǎn)在「實(shí)現(xiàn)類被迫寫了一堆空方法」上答案基本就是接口隔離。另一類常見問法是讓你區(qū)分原則和模式。原則是方向模式是這套方向下被總結(jié)出來的具體套路。比如「策略模式」之所以存在就是開閉原則和依賴倒置在「算法可替換」這個場景里的落地「裝飾器模式」對應(yīng)的是開閉原則下「不改原類但要加功能」的需求。把原則當(dāng)成原因、模式當(dāng)成結(jié)果去看兩邊的知識就能串成一條線而不是兩塊互不相干的背誦材料。3. 設(shè)計模式與 UML為什么這兩塊總被綁在一起考3.1 三種模式分類的依據(jù)創(chuàng)建型、結(jié)構(gòu)型、行為型怎么一眼分開二十多種模式如果硬背必然記混。真正好用的分法只有一句話創(chuàng)建型管「對象怎么生」結(jié)構(gòu)型管「對象怎么拼」行為型管「對象怎么動」。創(chuàng)建型模式關(guān)心的是把對象的創(chuàng)建過程從使用方手里拿開讓調(diào)用方不必關(guān)心具體造的是哪個類。工廠方法把「造什么」推遲到子類抽象工廠處理的是「一整族相關(guān)產(chǎn)品」的成套創(chuàng)建建造者把「一步步組裝復(fù)雜對象」和「最終產(chǎn)物」分開原型靠克隆已有對象來造新的單例保證全局只有一個實(shí)例。它們的共同點(diǎn)是都在解決 new 這件事帶來的耦合。打個比方創(chuàng)建型就像零件車間你只說要什么規(guī)格不用管車床怎么轉(zhuǎn)。結(jié)構(gòu)型模式關(guān)心的是把已有的類和對象組合出更大的結(jié)構(gòu)。適配器解決接口對不上橋接把抽象和實(shí)現(xiàn)拆成兩條獨(dú)立的繼承線組合把「整體—部分」做成樹形結(jié)構(gòu)裝飾器在不改原類的前提下動態(tài)加職責(zé)外觀給一堆子系統(tǒng)配一個統(tǒng)一入口享元把大量細(xì)粒度對象里可共享的部分抽出來代理在前面擋一層控制訪問。它們像裝配車間零件本身不變變的是拼裝方式。行為型模式關(guān)心的是對象之間的職責(zé)分配和通信。策略把可替換的算法獨(dú)立成一族類狀態(tài)讓對象在內(nèi)部狀態(tài)改變時改變行為觀察者建立一對多的通知關(guān)系責(zé)任鏈把請求沿鏈傳遞直到有人處理命令把請求封裝成對象以便排隊和撤銷模板方法把算法骨架固定、把可變步驟留給子類。它們是機(jī)器運(yùn)轉(zhuǎn)時的協(xié)作規(guī)則。分類解決的問題典型成員一句話記憶創(chuàng)建型對象創(chuàng)建與使用解耦工廠方法、抽象工廠、建造者、原型、單例只管生不管用結(jié)構(gòu)型類與對象的組合方式適配器、橋接、組合、裝飾器、外觀、享元、代理只管拼不管動行為型職責(zé)分配與對象通信策略、狀態(tài)、觀察者、責(zé)任鏈、命令、模板方法只管動不管生3.2 UML 的圖與關(guān)系類圖上那條線為什么有那么多種畫法UML 是描述軟件系統(tǒng)結(jié)構(gòu)和行為的統(tǒng)一建模語言。圖分兩大類結(jié)構(gòu)圖描述「系統(tǒng)長什么樣」包括類圖、對象圖、組件圖、部署圖、包圖等行為圖描述「系統(tǒng)怎么動」包括用例圖、活動圖、狀態(tài)機(jī)圖、時序圖、通信圖等??荚?yán)锍霈F(xiàn)頻率最高的是類圖、用例圖和時序圖。類圖里那些線考的是關(guān)系強(qiáng)弱。從弱到強(qiáng)大致是依賴、關(guān)聯(lián)、聚合、組合另外還有兩條不算在強(qiáng)弱序列里的——泛化和實(shí)現(xiàn)。依賴是「用一下就走」一個類的方法參數(shù)或局部變量里出現(xiàn)了另一個類關(guān)聯(lián)是長期的結(jié)構(gòu)性聯(lián)系通常體現(xiàn)為成員變量聚合是「有但可以分開」比如部門和員工部門沒了員工還在組合是「有且同生共死」比如訂單和訂單明細(xì)訂單刪了明細(xì)也不該單獨(dú)存在。泛化就是繼承表達(dá)「是一種」實(shí)現(xiàn)是類對接口的兌現(xiàn)表達(dá)「能做到」。這個強(qiáng)弱順序之所以重要是因為它直接影響代碼里的耦合程度。依賴最松改起來最容易組合最緊但語義最強(qiáng)。判斷題里常給出一個場景問「這兩個類之間是什么關(guān)系」判斷依據(jù)其實(shí)就一條生命周期是否綁定。綁定的往組合上靠不綁定的往聚合上靠。關(guān)系語義代碼里的常見形態(tài)生命周期依賴臨時使用方法參數(shù)、局部變量不綁定關(guān)聯(lián)長期聯(lián)系成員變量各自獨(dú)立聚合整體與部分成員變量可從外部傳入部分可獨(dú)立存在組合強(qiáng)整體與部分成員變量內(nèi)部創(chuàng)建同生共死泛化是一種extends強(qiáng)耦合實(shí)現(xiàn)能做到implements面向接口3.3 把模式和圖對上一道題里兩邊怎么互相驗證模式和 UML 之所以總綁在一起是因為它們本來就是同一件事的兩種表達(dá)模式是文字描述的設(shè)計經(jīng)驗類圖是這種經(jīng)驗的圖形化??吹揭粚Χ嗟耐ㄖY(jié)構(gòu)中間那個抽象主題持有一組觀察者接口幾乎可以直接判斷是觀察者模式看到一個上下文類里持有一個算法接口的引用并且這個接口可以由外部替換進(jìn)去基本就是策略模式看到一個類的方法里調(diào)用另一個類的模板方法、自己只填幾個鉤子那是模板方法。反過來的題也存在給出一個模式的名稱問它在類圖上應(yīng)該體現(xiàn)為什么關(guān)系。這時候應(yīng)該抓住「誰持有誰、誰繼承誰」這兩個問題。策略模式是上下文持有策略接口屬于關(guān)聯(lián)或聚合裝飾器是裝飾器繼承抽象構(gòu)件并持有一個抽象構(gòu)件屬于既泛化又聚合適配器是適配器實(shí)現(xiàn)目標(biāo)接口并持有一個被適配者屬于實(shí)現(xiàn)加關(guān)聯(lián)。把這幾組固定搭配記住圖和模式之間的翻譯就不再靠猜。提示做這類題時先別急著數(shù)類名先看箭頭的方向。箭頭指向接口通常是實(shí)現(xiàn)指向父類通常是泛化菱形出現(xiàn)在整體那一端表示聚合或組合。4. 數(shù)據(jù)結(jié)構(gòu)與算法樹、排序、分治貪心動態(tài)規(guī)劃的邊界在哪4.1 樹與二叉樹為什么非要區(qū)分「查找二叉樹」和「平衡二叉樹」樹是一種非線性結(jié)構(gòu)只有根節(jié)點(diǎn)沒有父節(jié)點(diǎn)每個節(jié)點(diǎn)可以有零個或多個子節(jié)點(diǎn)沒有子節(jié)點(diǎn)的叫葉子。幾個必背的量包括節(jié)點(diǎn)的度子節(jié)點(diǎn)個數(shù)、樹的深度最大層數(shù)和層次從根開始數(shù)。二叉樹是每個節(jié)點(diǎn)最多兩個子節(jié)點(diǎn)的特例它的幾條性質(zhì)在題里出現(xiàn)得極頻繁第 i 層最多 2^(i-1) 個節(jié)點(diǎn)深度為 k 的二叉樹最多 2^k ? 1 個節(jié)點(diǎn)葉子節(jié)點(diǎn)數(shù)總比度為 2 的節(jié)點(diǎn)數(shù)多一個。完全二叉樹還有一套編號規(guī)律父子節(jié)點(diǎn)的下標(biāo)關(guān)系可以直接算出來堆排序就是靠這個規(guī)律落地的。查找二叉樹也叫二叉排序樹加了一條約束左子樹所有節(jié)點(diǎn)小于根右子樹所有節(jié)點(diǎn)大于根。它帶來的好處是中序遍歷出來天然有序查找時能一路比較著往下走。但它有個致命短板如果按從小到大依次插入整棵樹會退化成一條鏈查找從對數(shù)級掉回線性級。平衡二叉樹AVL 樹就是為了堵這個窟窿——它要求任意節(jié)點(diǎn)左右子樹高度差不超過 1一旦插入或刪除破壞了這個條件就通過 LL、RR、LR、RL 四種旋轉(zhuǎn)把樹掰回來。所以兩者的關(guān)系不是并列的兩種樹而是「理想很豐滿」和「防止它退化」的關(guān)系。紅黑樹是平衡策略的另一種折中它不追求嚴(yán)格平衡用顏色約束換取更少的旋轉(zhuǎn)次數(shù)堆是滿足父節(jié)點(diǎn)與子節(jié)點(diǎn)大小關(guān)系的完全二叉樹哈夫曼樹則是帶權(quán)路徑長度最短的樹壓縮編碼里用得多。4.2 線性表與串順序存儲和鏈?zhǔn)酱鎯Φ降自趽Q什么順序存儲是拿一段連續(xù)空間依次擺開好處是按下標(biāo)訪問是常數(shù)時間壞處是插入刪除要挪一串元素而且容量得提前估。鏈?zhǔn)酱鎯κ前言厣⒃诟魈幱弥羔槾饋砗锰幨遣迦雱h除只改幾個指針壞處是不能隨機(jī)訪問要找第 k 個必須從頭數(shù)另外每個節(jié)點(diǎn)還要額外空間存指針。這兩者的取舍本質(zhì)上是在「讀多」還是「寫多」之間做選擇沒有絕對優(yōu)劣??荚?yán)锍?嫉倪€有存儲密度這個指標(biāo)它衡量的是數(shù)據(jù)本身占的空間和整個節(jié)點(diǎn)占的空間之比鏈?zhǔn)酱鎯σ驗橐嬷羔樏芏缺厝恍∮?1。串是特殊的線性表元素只能是字符。串的模式匹配里樸素算法在主串和子串失配時要把主串指針回退最壞情況下復(fù)雜度到 O(m×n)。KMP 的思路是讓主串指針永不回退靠一個 next 數(shù)組記錄「失配時子串該跳到哪一位」把復(fù)雜度壓到 O(mn)。這個 next 數(shù)組的含義常被誤解成「記錄前綴和后綴的最長公共長度」其實(shí)它更準(zhǔn)確的作用是告訴匹配過程已經(jīng)匹配上的這一段里有多大一截可以繼續(xù)復(fù)用。4.3 四類算法思想分治、回溯、貪心、動態(tài)規(guī)劃的分水嶺這四種思想在題目里經(jīng)?;熘霈F(xiàn)但它們的邊界其實(shí)很清楚判斷的關(guān)鍵有兩個問題子問題能不能獨(dú)立求解以及能不能反悔。分治是「把大問題切成互不相交的小問題解完再合并」。它成立的前提是子問題獨(dú)立、規(guī)??s小后結(jié)構(gòu)不變。二分查找、歸并排序、快速排序都是這個路子?;厮菔恰冈囈徊讲恍芯屯嘶貋頁Q一條」。它在一棵隱式的解空間樹上做深度優(yōu)先搜索走不通就撤銷選擇。八皇后、迷宮路徑都屬于這一類特征是解需要滿足一堆約束且必須整體滿足。貪心是「每一步都拿當(dāng)前看起來最好的拿了就不回頭」。它能成立需要兩個條件貪心選擇性質(zhì)和最優(yōu)子結(jié)構(gòu)。部分背包問題可以用貪心因為物品可以切分0-1 背包就不能因為切不動。動態(tài)規(guī)劃是「把子問題的解記下來避免重復(fù)計算」。它適用于有重疊子問題和最優(yōu)子結(jié)構(gòu)的問題本質(zhì)是用空間換時間。一句話把它們分開分治的子問題互不重疊動態(tài)規(guī)劃的子問題會重復(fù)貪心不回頭回溯必須能回頭。下面這段二分查找是分治思想最樸素的落地邊界處理是它最容易踩坑的地方。def binary_search(nums, target): # nums 必須是有序數(shù)組這是二分成立的前提 left, right 0, len(nums) - 1 while left right: # 用 保證區(qū)間只剩一個元素時仍會檢查 mid left (right - left) // 2 # 這樣寫避免 leftright 溢出 if nums[mid] target: return mid # 命中直接返回下標(biāo) elif nums[mid] target: left mid 1 # 目標(biāo)在右半?yún)^(qū)左邊界右移 else: right mid - 1 # 目標(biāo)在左半?yún)^(qū)右邊界左移 return -1 # 循環(huán)結(jié)束仍未命中這段代碼里nums是待查的有序數(shù)組target是要找的值返回值是下標(biāo)或 ?1。關(guān)鍵在于兩個邊界循環(huán)條件用left right而不是以及更新時用mid ± 1而不是mid。前者的區(qū)別是「區(qū)間內(nèi)只剩一個元素時要不要再比一次」后者的區(qū)別是「會不會死循環(huán)」。這兩個地方任意一處寫錯程序在特定輸入下就會翻車而且往往只在邊界數(shù)據(jù)上暴露。遞歸和動態(tài)規(guī)劃的差別也可以用斐波那契說明直接遞歸會把同一個子問題算無數(shù)遍復(fù)雜度指數(shù)級加一個記憶化的表復(fù)雜度立刻降到線性。這個「加表」的動作就是動態(tài)規(guī)劃最核心的一步。5. 易混概念辨析這幾組知識點(diǎn)看著像其實(shí)完全不同5.1 階段式與連續(xù)式CMMI 的兩個模型不是新舊關(guān)系易混點(diǎn)在于兩個模型都帶「等級」這個詞很容易被當(dāng)成同一套東西的兩種叫法。之所以會混是因為它們都用來衡量軟件過程改進(jìn)的水平而且都分等級光看名字根本分不出來。區(qū)分的關(guān)鍵是「衡量對象」不同。階段式模型衡量的是整個組織的成熟度它把組織作為一個整體來評級回答的是「這家組織整體走到了哪一步」。連續(xù)式模型衡量的是單個過程域的能力它不給你一個組織的總等級而是逐個過程域打分回答的是「這個具體環(huán)節(jié)做到了什么程度」。打個比方階段式像學(xué)校的綜合排名連續(xù)式像每門課的單科成績。一個組織可能總體排在某個級別但某個過程域的單科水平明顯更高這兩件事并不矛盾。5.2 主動攻擊與被動攻擊一刀切在「數(shù)據(jù)有沒有被改動」易混點(diǎn)在于兩種攻擊都發(fā)生在網(wǎng)絡(luò)通信過程中目的都是獲取信息光看「攻擊」兩個字分不出來。之所以會混是因為現(xiàn)實(shí)中一次完整的攻擊往往兩種手段都用。區(qū)分的標(biāo)準(zhǔn)只有一條攻擊過程中數(shù)據(jù)本身有沒有被改動。被動攻擊是「只看不動」包括竊聽通信內(nèi)容、分析通信雙方的流量特征它不修改數(shù)據(jù)也不影響系統(tǒng)正常運(yùn)行所以極難被發(fā)現(xiàn)防御思路主要靠加密而不是靠檢測。主動攻擊是「動手改了」包括篡改數(shù)據(jù)、重放舊消息、偽造身份、中斷服務(wù)它會改變數(shù)據(jù)或系統(tǒng)狀態(tài)因此可以被檢測出來防御思路側(cè)重于完整性校驗和身份認(rèn)證。做題時只要問一句「數(shù)據(jù)被動過嗎」答案就出來了。5.3 關(guān)鍵路徑與 Gantt 圖一個算時間一個看排布易混點(diǎn)在于兩者都是進(jìn)度管理里的工具都用來表示任務(wù)和工期在題目里經(jīng)常同時出現(xiàn)。之所以會混是因為它們描述的是同一批任務(wù)的同一種屬性——時間。關(guān)鍵路徑法算的是一張網(wǎng)絡(luò)圖里從起點(diǎn)到終點(diǎn)的最長路徑這條路徑的長度就是項目的最短總工期路徑上的活動沒有半點(diǎn)浮動時間任何一個延遲都會直接推遲整個項目。Gantt 圖則是把任務(wù)畫成橫條排布在時間軸上直觀展示每個任務(wù)什么時候開始、什么時候結(jié)束、哪幾段在并行。前者擅長表達(dá)依賴關(guān)系和找出瓶頸后者擅長表達(dá)時間占用和并行情況但它對任務(wù)之間的依賴關(guān)系表達(dá)得比較弱。一句話關(guān)鍵路徑回答「哪幾個活動拖不得」Gantt 圖回答「這段時間大家在忙什么」。5.4 對稱加密與數(shù)字簽名一個保機(jī)密一個保身份易混點(diǎn)在于兩者都用到了加密算法名字里都帶「密」字很容易被當(dāng)成同一類技術(shù)。之所以會混是因為數(shù)字簽名確實(shí)建立在非對稱加密的數(shù)學(xué)基礎(chǔ)上。區(qū)分要看它們保護(hù)的東西不同。對稱加密用同一把密鑰加密和解密解決的是「內(nèi)容別被別人看見」特點(diǎn)是快適合大批量數(shù)據(jù)難點(diǎn)是密鑰怎么安全地送到對方手里。數(shù)字簽名用私鑰對摘要簽名、用公鑰驗證解決的是「這條消息確實(shí)是你發(fā)的、而且你賴不掉」它不負(fù)責(zé)保密只負(fù)責(zé)身份和完整性。舉個反例就清楚了一份文件用對稱加密發(fā)出去能保證別人看不到但沒法證明是誰發(fā)的加了數(shù)字簽名能證明是誰發(fā)的但如果不用額外手段文件內(nèi)容本身還是明文。兩者經(jīng)常搭配使用各管一頭。注意數(shù)字簽名不提供保密性這一點(diǎn)在各種判斷題里被反復(fù)設(shè)置陷阱??吹健负灻髢?nèi)容不可見」這種表述基本可以直接判錯。6. 什么時候該用這份整理、什么時候別死磕它這份按目錄組織的知識點(diǎn)整理最合適的用法是「先定位、再精讀」。拿到它之后別從第一頁開始順讀先花二十分鐘把目錄過一遍在紙上畫出自己的薄弱區(qū)域——如果你對「里氏替換」只有一個模糊印象那第 2 章那一段就該重點(diǎn)看如果你分不清主動攻擊和被動攻擊就直接跳到辨析那一節(jié)。它的價值在于結(jié)構(gòu)清晰、條目對齊考點(diǎn)適合當(dāng)查詢手冊和查漏補(bǔ)缺的清單不適合當(dāng)唯一的入門教材。具體來說三種場景下它特別順手。第一種是復(fù)習(xí)到某個名詞突然卡殼翻目錄定位到對應(yīng)小節(jié)三五分鐘就能把定義、特征和易混點(diǎn)一次看全。第二種是考前做錯題回顧把錯題按章節(jié)歸類很快就能看出自己是集中在某幾塊失分還是全盤都不牢。第三種是面試或工作中臨時要用到某個概念比如突然需要說清聚合和組合的差別翻到關(guān)系對比那一節(jié)表格看一眼就夠。反過來有三種情況別指望它。一是完全沒有編程和項目經(jīng)驗時直接啃設(shè)計模式那幾章會很痛苦因為模式本身就是從大量真實(shí)代碼里總結(jié)出來的沒有代碼量打底那些「為什么這么設(shè)計」的動機(jī)是感受不到的。二是別把它當(dāng)成唯一的題源知識點(diǎn)整理只回答「是什么」不回答「題目怎么繞」還需要配合真題去體會出題角度。三是別陷入抄寫式背誦七大原則、二十幾種模式、各種算法復(fù)雜度抄十遍不如自己用一個具體場景復(fù)述一遍。場景建議用法不建議的做法初次接觸某個概念定位到小節(jié)讀定義加類比從第一章順讀到最后一章錯題復(fù)盤按章節(jié)歸類錯題找集中失分區(qū)只記答案不記原因考前沖刺只看對比表和易混辨析重新逐字背誦全部內(nèi)容零項目經(jīng)驗先補(bǔ)代碼實(shí)踐再看模式章節(jié)硬背模式名稱和類圖從那以后我每次拿到一份知識點(diǎn)整理都會強(qiáng)制走一遍「先看目錄畫地圖、再挑三章精讀、最后用一張表把易混點(diǎn)收口」的流程寧可少看兩章也不讓知識停在似懂非懂的狀態(tài)。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取