長文圖解:詳解金字塔原理如何應用於架構設計

来源:https://www.cnblogs.com/javafront/archive/2023/05/14/17398792.html
-Advertisement-
Play Games

0 文章概述 大家想一想工作中有沒有遇到以下情況:一位同事用了很長時間羅列了很多事實和數據向你說明一件事情,但是你聽完根本不知道他想要說什麼。一位同事用了大量筆墨編寫了技術方案,不僅有文字還有圖表,但是你看完也不知道這個方案到底要解決什麼問題以及如何落地。 上述情況的出現大概率是因為表述者沒有使用結 ...



0 文章概述

大家想一想工作中有沒有遇到以下情況:一位同事用了很長時間羅列了很多事實和數據向你說明一件事情,但是你聽完根本不知道他想要說什麼。一位同事用了大量筆墨編寫了技術方案,不僅有文字還有圖表,但是你看完也不知道這個方案到底要解決什麼問題以及如何落地。

上述情況的出現大概率是因為表述者沒有使用結構化方法進行闡釋,信息看似非常豐富但是雜亂無章,讓人很難抓住重點,所以我們需要引入結構化思維方法論。

金字塔原理就是一個由芭芭拉·明托女士提出的結構化思維方法論,風靡世界五十年併在各個行業都取得過很好的效果。本文我們就運用金字塔原理分析一個技術系統優化方案,並看看如何落地執行,最終總結出一個閉環思考工具。



1 怎麼樣提好一個問題

我們在工作中做的所有事情,本質上都是為問題提供解決方案。無論我們是提出一個方案,還是優化一種場景,或者是本身就是在解決問題,所以想要闡釋清楚我們在做什麼,第一步明確我們正在解決什麼問題非常關鍵。

那麼應該如何闡釋清楚問題呢?我們可以使用金字塔原理提出的結構化表達SCQA工具,這四個字母分別代表背景、衝突、疑問、回答。

背景(Situation)是這個問題出現的環境,我們對環境的描述必須是真實和朴素的,大家對這個描述都是認可的,甚至是可以產生共鳴的。

衝突(Complication)是在上述背景下出現了哪些矛盾,常見的類型有三種:哪些預期未達標、哪些流程不順暢、哪些隱患還存在。

疑問(Question)是根據背景和衝突自然而然提出的問題,常見的類型有四種:應該做什麼、應該如何做、是否應該做、為什麼會發生。

回答(Answer)是針對上述四類問題給出的答案,而回答就是金字塔結構的中心思想。

假設現在你想要向同事說明白技術方案應該如何實施,那麼第一步就應該闡釋清楚到底是在解決什麼問題,等到大家對問題有一定共識之後再談技術方案:

背景:業務數據量越來越大

衝突:響應經常超時現有系統難以支撐

疑問:應該做什麼才能夠支撐後續業務

回答:我們應該優化系統

此時技術方案准備解決什麼問題就清楚了,而對這個問題的回答就是金字塔結構的中心思想。下麵我們就要對這個中心思想使用金字塔原理進行結構化組織。


2 結構化方式組織回答

金字塔原理的核心思想並不複雜:一件事情可以總結出一個中心思想,這個中心思想可以由三至七個論點支持,每個論點再可以由三至七個論據支持,基本結構圖如下:



對於金字塔原理僅僅分析到這裡是不夠的,還應該進一步去分析金字塔原理的內在結構,而內在結構我們可以從橫向和縱向兩個維度去分析。


2.1 縱向結構

金字塔的縱向結構體現了兩個原則:結論先行和以上統下,我們分別進行分析。

2.1.1 結論先行

結論先行是指開宗明義地展示中心思想,讓聽眾一開始就明白溝通主旨,而如果把中心思想隱藏在溝通過程中,聽眾可能因為走神或者溝通信息太多而失焦,根本不知道你在說什麼。結論先行具體有以下六個方面:

  • 先重要後次要
  • 先框架後細節
  • 先總體後細分
  • 先論點後論據
  • 先結論後原因
  • 先結果後過程

假設一個同事代碼發佈上線後導致系統故障,如果不使用結構化方法是這麼表述的:

我看監控發現資料庫負載升高,可能是沒有加索引導致的。我又發現頻繁收到重覆消息,是不是消息中間件有什麼問題?監控還顯示創建了大量線程,是不是線程池使用不當導致的?問題排查很難短時間得到結論,我們還是先回滾代碼至上一個版本吧

這位同事中心思想是問題原因比較難排查,應該先回滾代碼再分析問題,但是他把最重要的觀點放在最後,不聽到最後不知道他要做什麼,而如果結論先行應該怎麼表述呢?

我們應立即當回滾代碼,因為問題排查比較複雜,還是先恢復系統再排查問題。可能的問題分三類:第一可能是索引使用不當導致的資料庫問題,第二可能是中間件問題導致大量重覆接收消息,第三可能是線程池使用不當導致線程大量被創建。等到恢復正常之後我們依次排查這些問題

我們比較兩段表述不難發現,第二段表述結構清晰很多,信息傳達效率顯著提升,這就是結論先行的優勢所在。


2.1.2 以上統下

以上統下是指任何一個層的思想必須是其下一層思想的總結概括,我們分析一個例子進行說明:小王今天需要買牛肉、雞蛋、蘿蔔、果汁、白菜、牛奶、青菜、雞肉、酸奶,但這麼多菜品他記不住,請你想辦法幫助小王。

第一步我們要對菜品自下而上進行聚合歸納,這是一個找規律的過程。第二步再以上統下進行結構化表達從而幫助記憶。



自下而上聚合我們不難發現,牛肉、雞肉、雞蛋屬於肉蛋類,白菜、青菜、蘿蔔屬於蔬菜類,牛奶、果汁、酸奶屬於飲品類,這樣聚合之後我們再以上統下進行結構化表達。

上述實例比較簡單,因為元素之間的關聯性比較容易尋找,但是真實場景是不會這麼簡單的,元素之間關聯性並不容易建立,那麼我們應該如何從中心思想展開至第二層?

金字塔原理推薦使用疑問-回答式對話,通過設問的方式向下展開結構。那麼應該問哪幾個問題從而涵蓋中心思想的要點?我們可以參考5W2H分析法,儘量做到要點不缺失:

  • What:是什麼、做什麼

  • Why:為什麼、什麼原因

  • Where:在哪裡、從哪開始

  • When:開始結束時間、里程碑

  • Who:誰負責、誰來做、誰驗收

  • How:怎麼做、什麼方法、從哪切入

  • How Much:做多少、各項指標是多少

在此模型基礎上我們可以進行簡化,從而減少要素的數量,這樣更加易於結構化表達和記憶。我們一般選取What、Why、How這三個核心要素組成2W1H模型。


2.1.3 實際應用

我們看看結論先行和以上統下的實際應用。根據第一章節我們使用SCQA工具得到了回答,這個回答就是金字塔結構中心思想,那麼根據結論先行原則在金字塔頂端就要開門見山地展示中心思想。然後我們再用2W1H模型組織論點,到這裡一個金字塔的基本結構就已經搭建完成:



2.2 橫向結構

現在我們需要思考如何組織論據,這就要使用橫向結構的兩個原則:歸類分組和邏輯遞進。我們分別進行分析。

2.2.1 歸類分組

(1) 歸納推理

我們一般用歸納推理和演繹推理兩種方法進行歸類分組,我們先看歸納推理。

歸納推理是指把觀察到的事實、規律歸納總結為理論。這種推理方法是不嚴謹的,因為只要觀察事實和信息是有限的,那麼歸納推理出來的結論就不一定是正確的。這就是邏輯錯誤中常見的一種:錯誤歸因。

歐洲人看到的天鵝都是白色的,那麼他們就歸納總結說所有的天鵝都是白色的。當一隻黑天鵝出現時,這個結論就被證明是錯誤的,這就是黑天鵝事件。

當然我們不可能觀察到所有事實,收集到所有信息,而一般是為瞭解決某個具體問題,我們會收集側重於某個角度的信息,建立特定模型去分析解決問題,這也不失為一種有效方法。

金字塔原理歸納推理一般有以下四種維度:時間維度、結構維度、程度維度、經驗維度。時間維度是根據天然時間線進行歸納,結構維度根據組織結構進行歸納,程度維度是根據程度級別進行歸納,經驗維度是根據已有經驗進行歸納。我們分別來看上述四種維度的幾種常見類型:

時間維度
  • 事前、事中、事後
  • 短期、中期、長期
結構維度
  • 信息部、行政部、人力部
  • 開發組、測試組、運維組
程度維度
  • 高級、中級、初級
  • 重要、次要、不要
經驗維度
  • 市場戰略3C理論
  • 市場決策4P理論
  • 高擴展、高可用、高性能

我們選取時間維度和結構維度分析一個實例:怎樣減少代碼上線錯誤。從時間維度分析事前需要做好代碼測試,事中需要監控關鍵指標,事後需要進行分析復盤。從結構維度分析開發人員需要做好單元測試,測試人員需要做好邊界測試,運維人員需要完善監控平臺。


(2) 演繹推理

演繹推理是指根據公理、定理或者自己相信的觀念,做出推理或者判斷,得到結論。

這種方法從邏輯上來說是嚴謹的。命題A是真的,推理出命題B也是真的,那是因為命題B的真實性包含在命題A中。

需要註意在邏輯上嚴謹,不是說結論一定是正確的。例如自己相信的觀念最終被證明是錯誤的,那麼得到結論也就是錯誤的。

標準式演繹推理分為大前提、小前提和結論:所有小鳥都會飛,這是一隻小鳥,所以它會飛。

演繹推理還可以分為現象、原因和解決方案三個要素:現象是開發代碼質量不高,原因是沒有統一代碼規約,解決方案是制定統一代碼規約。



這是一種自上而下的推理方法,由已知的公理、定理或者觀念向下推理。使用這種方法,需要在出現問題的領域有一定的經驗和積累。


2.2.2 邏輯遞進

邏輯遞進是指每種思想需要按照一定順序進行排列,例如時間維度按照事前、事中、事後進行排列,程度級別按照高級、中級、初級進行排列,這樣排列的優點是符合理解和記憶的習慣。


3 綜合實例

前面章節我們介紹了SCQA和金字塔原理,本章節我們用一個實例將結構化思維方法論落地,並總結出一個閉環工具。


3.1 提出問題

我們還是以系統優化案例進行說明,第一步是使用SCQA提出問題從而引出回答。背景是業務數據量越來越大,衝突是響應經常超時現有系統難以支撐,疑問是應該做什麼才能夠支撐後續業務,回答是我們應該優化系統,而回答就是金字塔結構的中心思想。


3.2 給出回答

第二步是使用金字塔原理組織回答,在縱向結構上我們通過設問的方式提出2W1H三個問題:



在橫向結構上我們按照一定維度去組織論據,我選取了經驗維度,在怎麼做優化這個問題上選取3H理論指導優化工作,這個理論包含高擴展、高可用、高性能三個維度。



高擴展強調系統可擴展性,包含劃分清晰的領域邊界,使用合適的設計模式,進行合理的組件抽象,遵守統一的代碼規約。

高可用強調對系統的保護,面對大流量可能帶來的非線性壓力,我們要做好降級、延時、隔離、冗餘、告警和響應防止系統崩潰。

高性能強調系統的性能表現,我們首先通過分析時延、負載、壓測表現等指標瞭解系統能力,再從數據層、緩存層、服務層、WEB層、前端層、客戶端、代理層等層級思考優化方案。

因為需要組織和表達信息較多,我們可以選擇將金字塔旋轉90度,這樣做只是為了展示信息更加方便,在邏輯上並不改變金字塔結構。



3.3 落地執行

我們已經將回答進行了結構化表達,現在需要思考如何將回答落地執行,我認為要從以下四個方面思考。

團隊(Team):有多少人可以投入這個項目,人員構成是什麼,例如有幾個服務端和幾個前端,人力投入量直接影響執行節奏。

切點(Pointcut):從哪裡入手這是需要明確的,例如我們做系統優化,可以先從一個耗時最長,性能最差的介面入手,用這個介面驗證方案的可行性。

節奏(Rhythm):受限於開發人數和項目排期等因素,系統優化很難一步到位,所以我們可以設置幾個裡程碑節點,規劃短期、中期、長期目標,這樣大目標就被拆成幾個小目標逐一實現。

結果(Result):系統優化的結果怎麼樣,投入了這麼多時間和精力到底產出是什麼,這是必須要回答的問題。我們可以把哪些預期未達標、哪些流程不順暢、哪些隱患還存在等問題拿出來逐一檢視。

我們把SCQA和上述四個維度進行合併,組成SCQATPRR閉環工具,這個工具可以助力方案減少缺失環節,從而形成閉環。



4 文章總結

本文首先分析了SCQA結構化工具,提好一個問題是解決問題的第一步。在初步給出答案後我們可以進行第二步使用金字塔結構組織答案,縱向結構要符合結論先行、以上統下原則,橫向結構要符合歸納分組、邏輯遞進原則。第三步在落地執行層面,我們提出團隊、切點、節奏和結果這四個維度,結合SCQA工具進而組成閉環工具。

需要說明的是結構化思考工具只是一個工具,解決問題的關鍵還是我們要在本專業領域鑽研和精進,也要在平時註意將零散的專業知識進行歸納整理,這樣專業知識和工具相結合才會發揮更大的作用,希望本文對大家有所幫助。歡迎大家關註公眾號「JAVA前線」查看更多精彩分享文章,主要包括源碼分析、實際應用、架構思維、職場分享、產品思考等等,同時歡迎大家加我微信「java_front」一起交流學習


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Ubuntu下的串口軟體, 除了 CuteCOM, screen, MiniCOM 以外, 還有一個和 MiniCOM 很像的 PicoCOM. 最近在調試 CH340C 串口的過程中, 發現只有 PicoCOM 的連接Reset才能正常工作, 因此單獨記錄一下. ...
  • 這個問題弄了半天,希望可以幫到你。 首先報一下配置: DELL G15 2023 無線網卡:Intel AX201 BIOS版本為最新(截止到2023.5.15) 首先,打開終端ctrl+alt+T 然後,在終端鍵入: uname -r // 查看內核版本 // ax201 需要內核版本5.2+ / ...
  • 1. 查詢速度慢並不只是因為SQL語句本身,還可能是因為記憶體分配不佳、文件結構不合理等其他原因 1.1. 都是為了減少對硬碟的訪問 2. 不同代碼能夠得出相同結果 2.1. 從理論上來說,得到相同結果的不同代碼應該有相同的性能 2.2. 遺憾的是,查詢優化器生成的執行計劃很大程度上要受到代碼外部結構 ...
  • 本文首發於公眾號:Hunter後端 原文鏈接:Redis數據結構一之對象的介紹及各版本對應實現 本篇筆記開始介紹 Redis 數據結構的底層實現。 當我們被問到 Redis 中有什麼數據結構,或者說數據類型,我們可能會說有字元串、列表、哈希、集合、有序集合。 其實這幾種數據類型在 Redis 中都由 ...
  • mysql之數據操作 第一章 添加數據 通常向表中添加數據應該包含表中的所有欄位,即為表中所有欄位添加數據。但也可不包含所有欄位來添加數據 1.1、所有欄位 按照所有欄位來添加數據,有兩種方式: 語法1: insert into 表名(所有欄位) values(欄位對應的值); 語法2: inser ...
  • 2023-05-14 記錄一下今天學習的內容 (1)今天看了在vscode中將代碼提交到Gitee中。使用的方法如下: ①使用PowerShell打開終端(使用cmd也可以),之後打開你項目所在的文件,使用命令 git init 初始化一個倉庫 ②之後將代碼提交到暫存區中,使用的命令是 git ad ...
  • 開始 mock一個用於攔截ajax請求,並返回模擬數據的庫。主要讓前端獨立於後端進行開發,通過 pnpm add mockjs 來進行安裝 基礎 初窺門徑 var data = Mock.mock({ // 屬性 list 的值是一個數組,其中含有 1 到 10 個元素 'list|1-10': [ ...
  • 架構圖一詞應用比較廣泛,涉及到各個行業,從軟硬體領域來對架構圖分類就有如下幾種 物理架構 描述整個信息系統需要使用到的軟硬體設施,以及其部署位置及各個軟硬體之間的關聯關係。軟硬體設施包括主機、伺服器、交換機、路由器、防火牆、緩存伺服器、註冊中心、資料庫等等。 如下兩種架構圖屬於物理架構: 部署圖 基 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...