面試題:一頭牛重800公斤,一座橋承重700公斤,牛應(yīng)該怎么過橋
JAVA前線
歡迎大家關(guān)注公眾號「JAVA前線」查看更多精彩分享,主要內(nèi)容包括源碼分析、實(shí)際應(yīng)用、架構(gòu)思維、職場分享、產(chǎn)品思考等等,同時(shí)也非常歡迎大家加我微信「java_front」一起交流學(xué)習(xí)
1 問題分析
在知乎上看到了這個(gè)有意思的問題,首先這個(gè)問題不是為了考察建筑工程學(xué)知識(shí),因?yàn)槊嬖囌卟⒎嵌季哂薪ㄖこ虒W(xué)經(jīng)驗(yàn)。我認(rèn)為這個(gè)問題是在考察三種分析方法:合理性分析、結(jié)構(gòu)化分析、可行性分析。

2 合理性分析
在職場上是允許爭論需求和問題合理性的,拒絕掉一個(gè)不合理的需求,其實(shí)也是在節(jié)約資源和成本。例如產(chǎn)品經(jīng)理提出業(yè)務(wù)需求,程序員用代碼實(shí)現(xiàn)業(yè)務(wù)需求。在代碼開發(fā)前大家會(huì)進(jìn)行需求評審,首先評估需求合理性,再評估需求實(shí)現(xiàn)細(xì)節(jié)。如果經(jīng)過充分討論后,大家覺得本次需求不合理或者無法實(shí)現(xiàn),那么本次需求會(huì)被拒絕。
回到這個(gè)問題,一頭800公斤的牛要通過承重700公斤的橋,這個(gè)需求本身合理嗎?那么我們可以從為什么、是否緊急、是否可替代這三個(gè)維度提出三個(gè)問題:
第一個(gè)問題:牛為什么要過橋,到底什么事情非要過橋不可,是否具有必要性
第二個(gè)問題:如果非要過橋,那么這個(gè)過橋需求緊急嗎?不緊急可以從長計(jì)議
第三個(gè)問題:有沒有什么替代方案,是否可以坐船或者繞路走,如果討論結(jié)果是??梢岳@路走,那么無需再考慮橋的承重問題
3 結(jié)構(gòu)化分析
如果經(jīng)過討論結(jié)果是牛非過橋不可,那么我們再思考牛怎么過橋的方案。這里可以使用結(jié)構(gòu)化思維,將大問題拆分為小維度,盡量做到不遺漏和不重復(fù)。影響過橋的因素有這幾個(gè)維度:橋的維度、牛的維度、資源維度、環(huán)境維度。
橋的維度:加固橋使承重大于800公斤
牛的維度:等待牛的體重小于700公斤
資源維度:使用一臺(tái)吊機(jī)把牛運(yùn)過去
環(huán)境維度:取消環(huán)境重力
4 可行性分析
我們從橋的維度、牛的維度、資源維度、環(huán)境維度給出了方案,那么選擇哪個(gè)方案呢?這就需要我們進(jìn)行可行性評估,因時(shí)因地在資源制約下選擇當(dāng)前最合適的方案。
加固橋方案經(jīng)濟(jì)成本較高,等待牛的體重小于700公斤時(shí)間成本較高,取消環(huán)境重力技術(shù)難度較高,所以使用一臺(tái)吊機(jī)把牛運(yùn)過去這個(gè)方案目前看來最合適。
5 結(jié)構(gòu)化思維延伸
在這三種分析維度中我們著重分析結(jié)構(gòu)化思維。結(jié)構(gòu)化思維的核心思想并不復(fù)雜:一件事情可以總結(jié)出一個(gè)中心思想,這個(gè)中心思想可以由三至七個(gè)論點(diǎn)支持,每個(gè)論點(diǎn)再可以由三至七個(gè)論據(jù)支持,基本結(jié)構(gòu)圖如下:

對于結(jié)構(gòu)化思維僅僅分析到這里是不夠的,我們還應(yīng)該進(jìn)一步去分析結(jié)構(gòu)化思維的內(nèi)在結(jié)構(gòu),而內(nèi)在結(jié)構(gòu)可以從縱向和橫向兩個(gè)維度分析:縱向結(jié)構(gòu)體現(xiàn)了結(jié)論先行和以上統(tǒng)下兩個(gè)原則,橫向結(jié)構(gòu)體現(xiàn)了歸類分組和邏輯遞進(jìn)兩個(gè)原則。
5.1 縱向結(jié)構(gòu)
5.1.1 結(jié)論先行
結(jié)論先行是指開宗明義地展示中心思想,讓聽眾一開始就明白溝通主旨,而如果把中心思想隱藏在溝通過程中,聽眾可能因?yàn)樽呱窕蛘邷贤ㄐ畔⑻喽Ы?,根本不知道你在說什么。結(jié)論先行具體有以下六個(gè)方面:
先重要后次要
先框架后細(xì)節(jié)
先總體后細(xì)分
先論點(diǎn)后論據(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)致的?問題排查很難短時(shí)間得到結(jié)論,我們還是先回滾代碼至上一個(gè)版本吧
這位同事中心思想是問題原因比較難排查,應(yīng)該先回滾代碼再分析問題,但是他把最重要的觀點(diǎn)放在最后,不聽到最后不知道他要做什么,而如果結(jié)論先行應(yīng)該怎么表述呢?
我們應(yīng)立即當(dāng)回滾代碼,因?yàn)閱栴}排查比較復(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)勢所在。
5.1.2 以上統(tǒng)下
以上統(tǒng)下是指任何一個(gè)層的思想必須是其下一層思想的總結(jié)概括,我們分析一個(gè)例子進(jìn)行說明:小王今天需要買牛肉、雞蛋、蘿卜、果汁、白菜、牛奶、青菜、雞肉、酸奶,但這么多菜品他記不住,請你想辦法幫助小王。
第一步我們要對菜品自下而上進(jìn)行聚合歸納,這是一個(gè)找規(guī)律的過程。第二步再以上統(tǒng)下進(jìn)行結(jié)構(gòu)化表達(dá)從而幫助記憶。

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

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


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

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

6 文章總結(jié)
關(guān)于更多結(jié)構(gòu)化思考內(nèi)容請參看我的文章:結(jié)構(gòu)化思維如何指導(dǎo)技術(shù)系統(tǒng)優(yōu)化,回答這類問題結(jié)論不是最重要的,因?yàn)楸举|(zhì)上是考察思考方法,所以思考過程才是最重要的。
JAVA前線
歡迎大家關(guān)注公眾號「JAVA前線」查看更多精彩分享,主要內(nèi)容包括源碼分析、實(shí)際應(yīng)用、架構(gòu)思維、職場分享、產(chǎn)品思考等等,同時(shí)也非常歡迎大家加我微信「java_front」一起交流學(xué)習(xí)
