多圖詳解:金字塔原理如何指導(dǎo)技術(shù)系統(tǒng)優(yōu)化
JAVA前線?
歡迎大家關(guān)注公眾號「JAVA前線」查看更多精彩分享,主要包括源碼分析、實際應(yīng)用、架構(gòu)思維、職場分享、產(chǎn)品思考等等,同時也非常歡迎大家加我微信「java_front」一起交流學(xué)習(xí)
0 文章概述
大家想一想工作中有沒有遇到以下情況:一位同事用了很長時間羅列了很多事實和數(shù)據(jù)向你說明一件事情,但是你聽完根本不知道他想要說什么。另一位同事用了大量筆墨編寫了技術(shù)方案,不僅有文字還有圖表,但是你看完也不知道這個方案到底要解決什么問題以及如何落地。
上述情況的出現(xiàn)大概率是因為表述者沒有使用結(jié)構(gòu)化方法進(jìn)行闡釋,信息看似非常豐富但是雜亂無章,讓人很難抓住重點,所以我們需要引入結(jié)構(gòu)化思維方法論。
金字塔原理就是一個由芭芭拉·明托女士提出的結(jié)構(gòu)化思維方法論,風(fēng)靡世界五十年并在各個行業(yè)都取得過很好的效果。本文我們就運用金字塔原理分析一個技術(shù)系統(tǒng)優(yōu)化方案,并看看如何落地執(zhí)行,最終總結(jié)出一個閉環(huán)工具。

1 怎么樣提好一個問題
我們在工作中做的所有事情,本質(zhì)上都是為問題提供解決方案。無論我們是提出一個方案,還是優(yōu)化一種場景,或者是本身就是在解決問題,所以想要闡釋清楚我們在做什么,第一步明確我們正在解決什么問題非常關(guān)鍵。
那么應(yīng)該如何闡釋清楚問題呢?我們可以使用金字塔原理提出的結(jié)構(gòu)化表達(dá)SCQA工具,這四個字母分別代表背景、沖突、疑問、回答。
背景(Situation)是這個問題出現(xiàn)的環(huán)境,我們對環(huán)境的描述必須是真實和樸素的,大家對這個描述都是認(rèn)可的,甚至是可以產(chǎn)生共鳴的。
沖突(Complication)是在上述背景下出現(xiàn)了哪些矛盾,常見的類型有三種:哪些預(yù)期未達(dá)標(biāo)、哪些流程不順暢、哪些隱患還存在。
疑問(Question)是根據(jù)背景和沖突自然而然提出的問題,常見的類型有四種:應(yīng)該做什么、應(yīng)該如何做、是否應(yīng)該做、為什么會發(fā)生。
回答(Answer)是針對上述四類問題給出的答案,而回答就是金字塔結(jié)構(gòu)的中心思想。
假設(shè)現(xiàn)在你想要向同事說明白技術(shù)方案應(yīng)該如何實施,那么第一步就應(yīng)該闡釋清楚到底是在解決什么問題,等到大家對問題達(dá)成一定共識之后再談技術(shù)方案:
背景:業(yè)務(wù)數(shù)據(jù)量越來越大
沖突:響應(yīng)經(jīng)常超時現(xiàn)有系統(tǒng)難以支撐
疑問:應(yīng)該做什么才能夠支撐后續(xù)業(yè)務(wù)
回答:我們應(yīng)該優(yōu)化系統(tǒng)
此時技術(shù)方案準(zhǔn)備解決什么問題就清楚了,而對這個問題的回答就是金字塔結(jié)構(gòu)的中心思想。下面我們就要對這個中心思想使用金字塔原理進(jìn)行結(jié)構(gòu)化組織。
2 結(jié)構(gòu)化方式組織回答
金字塔原理的核心思想并不復(fù)雜:一件事情可以總結(jié)出一個中心思想,這個中心思想可以由三至七個論點支持,每個論點再可以由三至七個論據(jù)支持,基本結(jié)構(gòu)圖如下:

對于金字塔原理僅僅分析到這里是不夠的,我們還應(yīng)該進(jìn)一步去分析金字塔原理的內(nèi)在結(jié)構(gòu),而內(nèi)在結(jié)構(gòu)可以從縱向和橫向兩個維度分析:縱向結(jié)構(gòu)體現(xiàn)了結(jié)論先行和以上統(tǒng)下兩個原則,橫向結(jié)構(gòu)體現(xiàn)了歸類分組和邏輯遞進(jìn)兩個原則。
2.1 縱向結(jié)構(gòu)
2.1.1 結(jié)論先行
結(jié)論先行是指開宗明義地展示中心思想,讓聽眾一開始就明白溝通主旨,而如果把中心思想隱藏在溝通過程中,聽眾可能因為走神或者溝通信息太多而失焦,根本不知道你在說什么。結(jié)論先行具體有以下六個方面:
先重要后次要
先框架后細(xì)節(jié)
先總體后細(xì)分
先論點后論據(jù)
先結(jié)論后原因
先結(jié)果后過程
我看監(jiān)控發(fā)現(xiàn)數(shù)據(jù)庫負(fù)載升高,可能是沒有加索引導(dǎo)致的。我又發(fā)現(xiàn)頻繁收到重復(fù)消息,是不是消息中間件有什么問題?監(jiān)控還顯示創(chuàng)建了大量線程,是不是線程池使用不當(dāng)導(dǎo)致的?問題排查很難短時間得到結(jié)論,我們還是先回滾代碼至上一個版本吧
這位同事中心思想是問題原因比較難排查,應(yīng)該先回滾代碼再分析問題,但是他把最重要的觀點放在最后,不聽到最后不知道他要做什么,而如果結(jié)論先行應(yīng)該怎么表述呢?
我們應(yīng)立即當(dāng)回滾代碼,因為問題排查比較復(fù)雜,還是先恢復(fù)系統(tǒng)再排查問題??赡艿膯栴}分三類:第一可能是索引使用不當(dāng)導(dǎo)致的數(shù)據(jù)庫問題,第二可能是中間件問題導(dǎo)致大量重復(fù)接收消息,第三可能是線程池使用不當(dāng)導(dǎo)致線程大量被創(chuàng)建。等到恢復(fù)正常之后我們依次排查這些問題
我們比較兩段表述不難發(fā)現(xiàn),第二段表述結(jié)構(gòu)清晰很多,信息傳達(dá)效率顯著提升,這就是結(jié)論先行的優(yōu)勢所在。
2.1.2 以上統(tǒng)下
以上統(tǒng)下是指任何一個層的思想必須是其下一層思想的總結(jié)概括,我們分析一個例子進(jìn)行說明:小王今天需要買牛肉、雞蛋、蘿卜、果汁、白菜、牛奶、青菜、雞肉、酸奶,但這么多菜品他記不住,請你想辦法幫助小王。
第一步我們要對菜品自下而上進(jìn)行聚合歸納,這是一個找規(guī)律的過程。第二步再以上統(tǒng)下進(jìn)行結(jié)構(gòu)化表達(dá)從而幫助記憶。

自下而上聚合我們不難發(fā)現(xiàn),牛肉、雞肉、雞蛋屬于肉蛋類,白菜、青菜、蘿卜屬于蔬菜類,牛奶、果汁、酸奶屬于飲品類,這樣聚合之后我們再以上統(tǒng)下進(jìn)行結(jié)構(gòu)化表達(dá)。
上述實例比較簡單,因為元素之間的關(guān)聯(lián)性比較容易尋找,但是真實場景是不會這么簡單的,元素之間關(guān)聯(lián)性并不容易建立,那么我們應(yīng)該如何從中心思想展開至第二層?
金字塔原理推薦使用疑問-回答式對話,通過設(shè)問的方式向下展開結(jié)構(gòu)。那么應(yīng)該問哪幾個問題從而涵蓋中心思想的要點?我們可以參考5W2H分析法,盡量做到要點不缺失:
What:是什么、做什么
Why:為什么、什么原因
Where:在哪里、從哪開始
When:開始結(jié)束時間、里程碑
Who:誰負(fù)責(zé)、誰來做、誰驗收
How:怎么做、什么方法、從哪切入
How Much:做多少、各項指標(biāo)是多少
在這個模型基礎(chǔ)上我們可以進(jìn)行簡化從而減少要素數(shù)量,這樣更加有利于結(jié)構(gòu)化表達(dá)和記憶。我們一般選取What、Why、How這三個核心要素組成2W1H模型。

2.1.3 實際應(yīng)用
我們看看結(jié)論先行和以上統(tǒng)下的實際應(yīng)用。根據(jù)第一章節(jié)我們使用SCQA工具得到了回答,這個回答就是金字塔結(jié)構(gòu)中心思想,根據(jù)結(jié)論先行原則在金字塔頂端就要開門見山地展示中心思想。

我們再用2W1H模型組織論點,劃分為什么、為什么和怎么做三個維度,這樣金字塔的縱向結(jié)構(gòu)就已經(jīng)搭建完成。

2.2 橫向結(jié)構(gòu)
2.2.1 歸類分組
(1) 歸納推理
我們一般用歸納推理和演繹推理兩種方法進(jìn)行歸類分組,我們先看歸納推理。
歸納推理是指把觀察到的事實、規(guī)律歸納總結(jié)為理論。這種推理方法是不嚴(yán)謹(jǐn)?shù)模驗橹灰^察事實和信息是有限的,那么歸納推理出來的結(jié)論就不一定是正確的。這就是邏輯錯誤中常見的一種:錯誤歸因。
歐洲人看到的天鵝都是白色的,那么他們就歸納總結(jié)說所有的天鵝都是白色的。當(dāng)一只黑天鵝出現(xiàn)時,這個結(jié)論就被證明是錯誤的,這就是黑天鵝事件。
當(dāng)然我們不可能觀察到所有事實,收集到所有信息,而一般是為了解決某個具體問題,我們會收集側(cè)重于某個角度的信息,建立特定模型去分析解決問題,這也不失為一種有效方法。
金字塔原理歸納推理一般有以下四種維度:時間維度、結(jié)構(gòu)維度、程度維度、經(jīng)驗維度。時間維度是根據(jù)天然時間線進(jìn)行歸納,結(jié)構(gòu)維度根據(jù)組織結(jié)構(gòu)進(jìn)行歸納,程度維度是根據(jù)程度級別進(jìn)行歸納,經(jīng)驗維度是根據(jù)已有經(jīng)驗進(jìn)行歸納。我們分別來看上述四種維度的幾種常見類型:
(1) 時間維度
事前、事中、事后
短期、中期、長期
(2) 結(jié)構(gòu)維度
信息部、行政部、人力部
開發(fā)組、測試組、運維組
(3) 程度維度
高級、中級、初級
重要、次要、不要
(4) 經(jīng)驗維度
市場戰(zhàn)略3C理論
市場決策4P理論
高擴(kuò)展、高可用、高性能


(2) 演繹推理
演繹推理是指根據(jù)公理、定理或者自己相信的觀念,做出推理或者判斷,得到結(jié)論。
這種方法從邏輯上來說是嚴(yán)謹(jǐn)?shù)?。命題A是真的,推理出命題B也是真的,那是因為命題B的真實性包含在命題A中。
需要注意在邏輯上嚴(yán)謹(jǐn),不是說結(jié)論一定是正確的。例如自己相信的觀念最終被證明是錯誤的,那么得到結(jié)論也就是錯誤的。
這是一種自上而下的推理方法,由已知的公理、定理或者觀念向下推理。使用這種方法,需要在出現(xiàn)問題的領(lǐng)域有一定的經(jīng)驗和積累。
標(biāo)準(zhǔn)式演繹推理分為大前提、小前提和結(jié)論:所有小鳥都會飛,這是一只小鳥,所以它會飛。
演繹推理還可以分為現(xiàn)象、原因和解決方案三個要素:現(xiàn)象是開發(fā)代碼質(zhì)量不高,原因是沒有統(tǒng)一代碼規(guī)約,解決方案是制定統(tǒng)一代碼規(guī)約。

2.2.2 邏輯遞進(jìn)
邏輯遞進(jìn)是指每種思想需要按照一定順序進(jìn)行排列,時間維度按照事前、事中、事后進(jìn)行排列,程度級別按照高級、中級、初級進(jìn)行排列。例如時間維度我們還可以繼續(xù)使用怎樣減少代碼上線故障案例,按照事前、事中、事后時間線進(jìn)行排列,這種順序更加符合理解和記憶習(xí)慣。

3 綜合實例
前面章節(jié)我們介紹了SCQA和金字塔原理,本章節(jié)我們用一個實例將結(jié)構(gòu)化思維方法論落地,并總結(jié)出一個閉環(huán)工具。
3.1 提出問題
我們還是以系統(tǒng)優(yōu)化案例進(jìn)行說明,第一步是使用SCQA提出問題從而引出回答。背景是業(yè)務(wù)數(shù)據(jù)量越來越大,沖突是響應(yīng)經(jīng)常超時現(xiàn)有系統(tǒng)難以支撐,疑問是應(yīng)該做什么才能夠支撐后續(xù)業(yè)務(wù),回答是我們應(yīng)該優(yōu)化系統(tǒng),而回答就是金字塔結(jié)構(gòu)的中心思想。

3.2 給出回答
第二步是使用金字塔原理組織回答,在縱向結(jié)構(gòu)上我們通過設(shè)問的方式提出2W1H三個問題。

在橫向結(jié)構(gòu)上我們按照一定維度去組織論據(jù),我選取了經(jīng)驗維度,在怎么做優(yōu)化這個問題上選取3H理論指導(dǎo)優(yōu)化工作,這個理論包含高擴(kuò)展、高可用、高性能三個維度。

高擴(kuò)展強(qiáng)調(diào)系統(tǒng)可擴(kuò)展性,包含劃分清晰的領(lǐng)域邊界,使用合適的設(shè)計模式,進(jìn)行合理的組件抽象,遵守統(tǒng)一的代碼規(guī)約。
高可用強(qiáng)調(diào)對系統(tǒng)的保護(hù),面對大流量可能帶來的非線性壓力,我們要做好降級、延時、隔離、冗余、告警和響應(yīng)防止系統(tǒng)崩潰。
高性能強(qiáng)調(diào)系統(tǒng)的性能表現(xiàn),我們首先通過分析時延、負(fù)載、壓測表現(xiàn)等指標(biāo)了解系統(tǒng)能力,再從數(shù)據(jù)層、緩存層、服務(wù)層、WEB層、前端層、客戶端、代理層等層級思考優(yōu)化方案。
因為需要組織和表達(dá)信息較多,我們可以選擇將金字塔旋轉(zhuǎn)90度,這樣做只是為了展示信息更加方便,在邏輯上并不改變金字塔結(jié)構(gòu)。

3.3 落地執(zhí)行
我們已經(jīng)將回答進(jìn)行了結(jié)構(gòu)化表達(dá),現(xiàn)在需要思考如何將回答落地執(zhí)行,我認(rèn)為可以從以下四個方面思考。
團(tuán)隊(Team):有多少人可以投入這個項目,人員構(gòu)成是什么,例如有幾個服務(wù)端和幾個前端,人力的投入直接影響執(zhí)行節(jié)奏。
切點(Pointcut):從哪里入手這是需要明確的,例如我們做系統(tǒng)優(yōu)化,可以先從一個耗時最長,性能最差的接口入手,用這個接口驗證技術(shù)方案的可行性。
節(jié)奏(Rhythm):受限于開發(fā)人數(shù)和項目排期等因素,系統(tǒng)優(yōu)化很難一步到位,所以我們可以設(shè)置多個里程碑節(jié)點,規(guī)劃短期、中期、長期目標(biāo),這樣大目標(biāo)就被拆成幾個小目標(biāo)逐一實現(xiàn)。
結(jié)果(Result):系統(tǒng)優(yōu)化的結(jié)果怎么樣,投入了這么多時間和精力到底產(chǎn)出是什么,這是必須要回答和面對的問題。我們可以把哪些預(yù)期未達(dá)標(biāo)、哪些流程不順暢、哪些隱患還存在等問題拿出來逐一檢視。
我們把SCQA和上述四個維度進(jìn)行合并,組成SCQATPRR閉環(huán)工具,這個工具可以幫助設(shè)計方案減少缺失環(huán)節(jié)從而形成閉環(huán)。

4 文章總結(jié)
本文首先分析了SCQA結(jié)構(gòu)化工具,提好一個問題是解決問題的第一步。在初步給出答案后我們可以進(jìn)行第二步使用金字塔結(jié)構(gòu)組織答案,縱向結(jié)構(gòu)要符合結(jié)論先行、以上統(tǒng)下原則,橫向結(jié)構(gòu)要符合歸納分組、邏輯遞進(jìn)原則。第三步在落地執(zhí)行層面,我們提出團(tuán)隊、切點、節(jié)奏和結(jié)果這四個維度,結(jié)合SCQA工具進(jìn)而組成閉環(huán)工具。
需要說明的是結(jié)構(gòu)化思考工具只是一個工具,解決問題的關(guān)鍵還是我們要在本專業(yè)領(lǐng)域鉆研和精進(jìn),也要在平時注意將零散的專業(yè)知識進(jìn)行歸納整理,這樣專業(yè)知識和工具相結(jié)合才會發(fā)揮更大的作用,希望本文對大家有所幫助。
JAVA前線?
歡迎大家關(guān)注公眾號「JAVA前線」查看更多精彩分享,主要包括源碼分析、實際應(yīng)用、架構(gòu)思維、職場分享、產(chǎn)品思考等等,同時也非常歡迎大家加我微信「java_front」一起交流學(xué)習(xí)
