歡迎你們關注公衆號「JAVA前線」查看更多精彩分享文章,主要包括源碼分析、實際應用、架構思惟、職場分享、產品思考等等,同時歡迎你們加我我的微信「java_front」一塊兒交流學習java
在知乎上看到了這個有意思的問題,首先這個問題不是爲了考察建築工程學知識,由於面試者並不是都具備建築工程學經驗。我認爲這個問題是在考察三種分析方法:合理性分析、結構化分析、可行性分析。程序員
在職場上是容許爭論需求和問題合理性的,拒絕掉一個不合理的需求,其實也是在節約資源和成本。例如產品經理提出業務需求,程序員用代碼實現業務需求。在代碼開發前你們會進行需求評審,首先評估需求合理性,再評估需求實現細節。若是通過充分討論後,你們以爲本次需求不合理或者沒法實現,那麼本次需求會被拒絕。面試
回到這個問題,一頭800公斤的牛要經過承重700公斤的橋,這個需求自己合理嗎?那麼咱們能夠從爲何、是否緊急、是否可替代這三個維度提出三個問題:數據庫
第一個問題:牛爲何要過橋,到底什麼事情非要過橋不可,是否具備必要性微信
第二個問題:若是非要過橋,那麼這個過橋需求緊急嗎?不緊急能夠從長計議markdown
第三個問題:有沒有什麼替代方案,是否能夠坐船或者繞路走,若是討論結果是牛能夠繞路走,那麼無需再考慮橋的承重問題架構
若是通過討論結果是牛非過橋不可,那麼咱們再思考牛怎麼過橋的方案。這裏可使用結構化思惟,將大問題拆分爲小維度,儘可能作到不遺漏和不重複。影響過橋的因素有這幾個維度:橋的維度、牛的維度、資源維度、環境維度。框架
橋的維度:加固橋使承重大於800公斤運維
牛的維度:等待牛的體重小於700公斤源碼分析
資源維度:使用一臺吊機把牛運過去
環境維度:取消環境重力
咱們從橋的維度、牛的維度、資源維度、環境維度給出了方案,那麼選擇哪一個方案呢?這就須要咱們進行可行性評估,因時因地在資源制約下選擇當前最合適的方案。
加固橋方案經濟成本較高,等待牛的體重小於700公斤時間成本較高,取消環境重力技術難度較高,因此使用一臺吊機把牛運過去這個方案目前看來最合適。
結構化思惟的核心思想並不複雜:一件事情能夠總結出一箇中心思想,這個中心思想能夠由三至七個論點支持,每一個論點再能夠由三至七個論據支持,基本結構圖以下:
對於結構化思惟僅僅分析到這裏是不夠的,還應該進一步去分析結構化思惟的內在結構,而內在結構咱們能夠從橫向和縱向兩個維度去分析。
金字塔的縱向結構體現了兩個原則:結論先行和以上統下,咱們分別進行分析。
結論先行是指開宗明義地展現中心思想,讓聽衆一開始就明白溝通主旨,而若是把中心思想隱藏在溝經過程中,聽衆可能由於走神或者溝通訊息太多而失焦,根本不知道你在說什麼。結論先行具體有如下六個方面:
假設一個同事代碼發佈上線後致使系統故障,若是不使用結構化方法是這麼表述的:
我看監控發現數據庫負載升高,多是沒有加索引致使的。我又發現頻繁收到重複消息,是否是消息中間件有什麼問題?監控還顯示建立了大量線程,是否是線程池使用不當致使的?問題排查很難短期獲得結論,咱們仍是先回滾代碼至上一個版本吧
這位同事中心思想是問題緣由比較難排查,應該先回滾代碼再分析問題,可是他把最重要的觀點放在最後,不聽到最後不知道他要作什麼,而若是結論先行應該怎麼表述呢?
咱們應當即當回滾代碼,由於問題排查比較複雜,仍是先恢復系統再排查問題。可能的問題分三類:第一多是索引使用不當致使的數據庫問題,第二多是中間件問題致使大量重複接收消息,第三多是線程池使用不當致使線程大量被建立。等到恢復正常以後咱們依次排查這些問題
咱們比較兩段表述不難發現,第二段表述結構清晰不少,信息傳達效率顯著提高,這就是結論先行的優點所在。
以上統下是指任何一個層的思想必須是其下一層思想的總結歸納,咱們分析一個例子進行說明:小王今天須要買牛肉、雞蛋、蘿蔔、果汁、白菜、牛奶、青菜、雞肉、酸奶,但這麼多菜品他記不住,請你想辦法幫助小王。
第一步咱們要對菜品自下而上進行聚合概括,這是一個找規律的過程。第二步再以上統下進行結構化表達從而幫助記憶。
自下而上聚合咱們不難發現,牛肉、雞肉、雞蛋屬於肉蛋類,白菜、青菜、蘿蔔屬於蔬菜類,牛奶、果汁、酸奶屬於飲品類,這樣聚合以後咱們再以上統下進行結構化表達。
上述實例比較簡單,由於元素之間的關聯性比較容易尋找,可是真實場景是不會這麼簡單的,元素之間關聯性並不容易創建,那麼咱們應該如何從中心思想展開至第二層?
金字塔原理推薦使用疑問-回答式對話,經過設問的方式向下展開結構。那麼應該問哪幾個問題從而涵蓋中心思想的要點?咱們能夠參考5W2H分析法,儘可能作到要點不缺失:
What:是什麼、作什麼
Why:爲何、什麼緣由
Where:在哪裏、從哪開始
When:開始結束時間、里程碑
Who:誰負責、誰來作、誰驗收
How:怎麼作、什麼方法、從哪切入
How Much:作多少、各項指標是多少
在此模型基礎上咱們能夠進行簡化,從而減小要素的數量,這樣更加易於結構化表達和記憶。咱們通常選取What、Why、How這三個核心要素組成2W1H模型。
如今咱們須要思考如何組織論據,這就要使用橫向結構的兩個原則:歸類分組和邏輯遞進。咱們分別進行分析。
咱們通常用概括推理和演繹推理兩種方法進行歸類分組,咱們先看概括推理。
概括推理是指把觀察到的事實、規律概括總結爲理論。這種推理方法是不嚴謹的,由於只要觀察事實和信息是有限的,那麼概括推理出來的結論就不必定是正確的。這就是邏輯錯誤中常見的一種:錯誤歸因。
歐洲人看到的天鵝都是白色的,那麼他們就概括總結說全部的天鵝都是白色的。當一隻黑天鵝出現時,這個結論就被證實是錯誤的,這就是黑天鵝事件。
固然咱們不可能觀察到全部事實,收集到全部信息,而通常是爲了解決某個具體問題,咱們會收集側重於某個角度的信息,創建特定模型去分析解決問題,這也不失爲一種有效方法。
金字塔原理概括推理通常有如下四種維度:時間維度、結構維度、程度維度、經驗維度。時間維度是根據自然時間線進行概括,結構維度根據組織結構進行概括,程度維度是根據程度級別進行概括,經驗維度是根據已有經驗進行概括。咱們分別來看上述四種維度的幾種常見類型:
咱們選取時間維度和結構維度分析一個實例:怎樣減小代碼上線錯誤。從時間維度分析事前須要作好代碼測試,事中須要監控關鍵指標,過後須要進行分析覆盤。從結構維度分析開發人員須要作好單元測試,測試人員須要作好邊界測試,運維人員須要完善監控平臺。
演繹推理是指根據公理、定理或者本身相信的觀念,作出推理或者判斷,獲得結論。
這種方法從邏輯上來講是嚴謹的。命題A是真的,推理出命題B也是真的,那是由於命題B的真實性包含在命題A中。
須要注意在邏輯上嚴謹,不是說結論必定是正確的。例如本身相信的觀念最終被證實是錯誤的,那麼獲得結論也就是錯誤的。
標準式演繹推理分爲大前提、小前提和結論:全部小鳥都會飛,這是一隻小鳥,因此它會飛。
演繹推理還能夠分爲現象、緣由和解決方案三個要素:現象是開發代碼質量不高,緣由是沒有統一代碼規約,解決方案是制定統一代碼規約。
這是一種自上而下的推理方法,由已知的公理、定理或者觀念向下推理。使用這種方法,須要在出現問題的領域有必定的經驗和積累。
邏輯遞進是指每種思想須要按照必定順序進行排列,例如時間維度按照事前、事中、過後進行排列,程度級別按照高級、中級、初級進行排列,這樣排列的優勢是符合理解和記憶的習慣。
關於更多結構化思考內容請參看個人文章:結構化思惟如何指導技術系統優化,回答這類問題結論不是最重要的,由於本質上是考察思考方法,因此思考過程纔是最重要的。
歡迎你們關注公衆號「JAVA前線」查看更多精彩分享文章,主要包括源碼分析、實際應用、架構思惟、職場分享、產品思考等等,同時歡迎你們加我我的微信「java_front」一塊兒交流學習