技术方案设计的方法论及案例分享
作者 |?高福來(lái)(不拔)
來(lái)源|阿里巴巴云原生公眾號(hào)
怎么去體現(xiàn)技術(shù)方案設(shè)計(jì)的深度是大家普遍關(guān)心的一個(gè)問題,這個(gè)問題不是個(gè)例問題,因此本文主要分享下作者個(gè)人的一些觀點(diǎn)和看法。
文章主要分為三個(gè)部分:
-
第一部分主要分析為什么技術(shù)方案沒有體現(xiàn)出深度,找到問題后就好解決,并提出技術(shù)方案的廣度和深度特征。
-
第二部分是技術(shù)方案設(shè)計(jì)的方法論,主要包括了本質(zhì)論、矛盾論、系統(tǒng)論、演進(jìn)論四個(gè)方法論,構(gòu)成一個(gè)閉環(huán)反饋鏈路。
-
第三部分是通過(guò)具體的案例,反復(fù)運(yùn)用第二部分的方法論闡述在實(shí)例的案例中如何去應(yīng)用,加深對(duì)方法論的理解。
技術(shù)方案體現(xiàn)廣度和深度
1. 方案設(shè)計(jì)常見的反饋
我們都希望自己設(shè)計(jì)的技術(shù)方案能夠讓人眼前一亮、嘆為觀止、拍案叫絕……,然而在實(shí)際情況下,卻并不是這樣的,我們經(jīng)常聽到如下的說(shuō)法:
- 場(chǎng)景簡(jiǎn)單:業(yè)務(wù)場(chǎng)景很簡(jiǎn)單,怎么也設(shè)計(jì)不出花兒來(lái)。
- 復(fù)雜度低:業(yè)務(wù)復(fù)雜度低,很難講得出挑戰(zhàn)來(lái)。
- 亮點(diǎn)少:運(yùn)用的技術(shù)亮點(diǎn)少,基本上都是現(xiàn)有的中間件或框架來(lái)完成。
- 設(shè)計(jì)普通:方案缺乏新穎,業(yè)內(nèi)也是這么做的,沒有體現(xiàn)出自己的設(shè)計(jì)能力。
- ……
的確,上面反而是經(jīng)常遇到的場(chǎng)景,那么需要思考下背后的問題和原因,為什么會(huì)有這樣的感受,如果這個(gè)事情交給另外一個(gè)人去做,為什么他能設(shè)計(jì)出更好的方法,而當(dāng)時(shí)你卻沒有想到呢?
2. 原因探究
個(gè)人覺得這個(gè)問題最為核心的一點(diǎn)是就事論事,因?yàn)橹皇强吹竭@個(gè)事,需要完成某個(gè)具體的功能點(diǎn),而沒有跳去這個(gè)事情的表象,去思考到底要什么、解決了什么問題、價(jià)值是什么,這樣思考很有可能你現(xiàn)在的解決方案只是其中一個(gè)很小的點(diǎn),沒有站在全局去思考問題。曾經(jīng)我的老師講過(guò)一個(gè)觀點(diǎn):把手掌放在眼前,你只能看到這個(gè)手掌,如果把手掌放在遠(yuǎn)處,你的視野就更廣了。因此視野更關(guān)鍵,不要只關(guān)注事情的本身,可以跳出來(lái)看看,或者你能想到的更多。
就事論事只是一個(gè)表象,背后還是深層次的原因,個(gè)人覺得是缺乏體系化的思考,“只見樹木、不見森林”,沒有從不同的維度上去思考問題,只是線性的思考,直接的表現(xiàn)就是【就事論事】,只把手頭上的事情完成即可。講體系化思考的書籍很多,大家有興趣可以去了解下,幫助自己更好地思考問題。
到這里其實(shí)還沒有結(jié)束,還有一個(gè)重要的原因是缺乏方法論引導(dǎo),就是沒有形成自己的一套方法去思考問題、解決問題,不同的人會(huì)有自己的方法,有了方法論的引導(dǎo),拿到一個(gè)問題,知道怎么去分析、思考、解決,遠(yuǎn)比只是被動(dòng)地接受一種具體的方案要好,下次場(chǎng)景變了,很有可能現(xiàn)有的方案是不能支撐的,因此需要建立一套適合自己的方法論,具體在第二部分會(huì)分享自己的方法論。
3. 技術(shù)廣度和深度
廣度和深度對(duì)于我們來(lái)講并不陌生,大家都知道要體現(xiàn)出廣度和深度,卻不知道怎么去做。廣度覺得從數(shù)量和類型兩個(gè)維度去分析(應(yīng)該還有其它的維度,大家可以自行補(bǔ)充),是讓事物更加地豐富,比如動(dòng)物園里有不同的動(dòng)物,種類比較多,就能更加滿足不同人的觀賞需求;深度主要體現(xiàn)出問題的識(shí)別和創(chuàng)新解決上,一個(gè)問題大家沒有發(fā)現(xiàn),而你從中發(fā)現(xiàn)了,這就是深度,比如網(wǎng)上購(gòu)物,站在今天來(lái)看,再平常不過(guò)了,但在 20 年前,并不是每個(gè)人能想到的。現(xiàn)如今,同樣是做電商,每個(gè)公司的打法、策略是不一樣的,這就體現(xiàn)在深度上,深耕于某一個(gè)領(lǐng)域。
這里拿自己的經(jīng)歷來(lái)說(shuō)明:之前本人在滴滴是做優(yōu)惠券業(yè)務(wù)(當(dāng)時(shí)營(yíng)銷比較簡(jiǎn)單,就是單一券業(yè)務(wù)),優(yōu)惠券只是一種營(yíng)銷的具體手段,行業(yè)內(nèi)有卡、券、分、金,那么對(duì)于技術(shù)來(lái)講就是豐富營(yíng)銷基礎(chǔ)能力,從單一券能力發(fā)展至卡、券、分、金的營(yíng)銷行業(yè)標(biāo)配能力,這個(gè)就體現(xiàn)了廣度,從數(shù)量、類型上豐富了。而怎么體現(xiàn)深度呢?營(yíng)銷中有一個(gè)重要問題是如何防控資損,一旦有資損,問題就比較大,因此需要去好好思考和設(shè)計(jì)方案,當(dāng)時(shí)借鑒穩(wěn)定性方案,分成事前、事中、事后三個(gè)階段去防控資損,每一個(gè)階段里又包含了不同的方案,深度主要體現(xiàn)對(duì)問題的識(shí)別,以及怎樣創(chuàng)新地去解決,重點(diǎn)是創(chuàng)新,做到人無(wú)我有、人有我優(yōu)。
4. 怎樣證明技術(shù)方案是好的
大家在和別人分享、交流技術(shù)方案時(shí),有人會(huì)提出一些尖銳的問題,比如:為什么說(shuō)你的技術(shù)方案是好的?其實(shí)這個(gè)問題非常好,值得大家去思考。
有一個(gè)很常見的情況,大家去講一個(gè)技術(shù)方案時(shí),把背景、目標(biāo)講完之后,直接給出了技術(shù)方案,其實(shí)技術(shù)方案本身并不重要,重要的是你是怎么思考的,思考的過(guò)程非常重要,強(qiáng)調(diào)的是 WHY,HOW 很重要,但 WHY 更重要。這里有兩個(gè)原則:
-
三段論:大提前、小提前、結(jié)論。一定要先講大提前,它是一個(gè)有力的支撐,比如寫議論文時(shí),平時(shí)常寫"魯迅說(shuō)過(guò) xxxxx",這個(gè)就是大提前;在技術(shù)方案設(shè)計(jì)上,就是要看業(yè)內(nèi)的方案、業(yè)界的標(biāo)桿在哪里,和它有什么不一樣、創(chuàng)新了什么,一目了然,往往大家忽略了這個(gè)大提前,直接講自己的方案,怎么證明你的就是好的呢?沒有對(duì)比就沒有感覺。
-
環(huán)境論:有時(shí)業(yè)內(nèi)還沒有具體的方案,或者是當(dāng)下你的公司不適合業(yè)內(nèi)頂配的方案,比如"中國(guó)特色社會(huì)主義",它就是強(qiáng)調(diào)當(dāng)前的環(huán)境,結(jié)合了具體的業(yè)務(wù)場(chǎng)景來(lái)權(quán)衡考慮的,并不是行業(yè)內(nèi)的最優(yōu)方案就是適合你的,方案的設(shè)計(jì)一定要有權(quán)衡、選擇,設(shè)計(jì)出最適合當(dāng)前環(huán)境的方案。
技術(shù)方案設(shè)計(jì)的方法論
1. 方法論到底是什么
經(jīng)常有人講方法論,方法論也讓人感覺比較玄乎,感覺是一種虛無(wú)縹緲的東西,方法論在百科中的解釋是:“方法論是關(guān)于人們認(rèn)識(shí)世界、改造世界的方法的理論”,看了這個(gè)定義,大家還是不清楚它到底是什么,只知道它挺厲害的,但不知道方法論到底是什么、有哪些方法論、應(yīng)該如何去運(yùn)用方法論,所以這里談下自己的理解。
個(gè)人對(duì)方法論的理解是方法論是讓方法變成更方法的方法,方法論拆分成兩個(gè)詞方法和論。因此它首先是一種方法,方法是為了解決具體的問題,比如大家熟知的穩(wěn)定性建設(shè),全鏈路壓測(cè)、異常監(jiān)控等都是具體的方法,但這些方法都是一個(gè)個(gè)散的點(diǎn),并不是最好的方法,方法論強(qiáng)調(diào)的是好的方法;然后再看"論",論是議論、分析、思考的過(guò)程,它最大的好處是讓方法更好,還是拿穩(wěn)定性建設(shè)來(lái)講,現(xiàn)在有成熟的方法論,分成事前、事中、事后三個(gè)階段,事前包括容量評(píng)估、全鏈路壓測(cè)、強(qiáng)弱依賴……,這樣講就比較成體系,將它劃分成事前、事中、事后,覆蓋了整個(gè)過(guò)程,你基本上挑不出什么毛病出來(lái)。因此方法論是對(duì)解決方法進(jìn)一步的升華和提煉,形成更通用、成體系的方法,它并不是虛無(wú)縹緲的東西。
方法論是通過(guò)不完全歸納法總結(jié)出來(lái)的,方法論并不是萬(wàn)能的,比如你看到的天鵝都是白色的,萬(wàn)一哪天出現(xiàn)了一只黑天鵝,就說(shuō)明當(dāng)時(shí)的歸納是不完全歸納的。
2. 技術(shù)方案設(shè)計(jì)方法論
下面所說(shuō)的方法論都是存在的,自己只是組合運(yùn)用了這些方法論而已,下面總結(jié)下自己工作中使用的一些受益比較大的方法論。
本質(zhì)論是我第一個(gè)受益的方法論,本質(zhì)論強(qiáng)調(diào)的是透過(guò)現(xiàn)象看本質(zhì),這句話聽起來(lái)是比較簡(jiǎn)單的,但要做到卻是非常難的。看透本質(zhì)至關(guān)重要,能讓你真正把控事物的核心,我個(gè)人的一個(gè)方法是使用不超過(guò) 15 個(gè)字概括出事物的本質(zhì),因?yàn)楸举|(zhì)的東西是簡(jiǎn)單的、美的、直揭主旨的,所以判斷是否抓住了事物本質(zhì)的一個(gè)標(biāo)準(zhǔn)就是用簡(jiǎn)單的話能否概括出事物的主旨。比如高并發(fā),現(xiàn)在不再是一個(gè)新鮮的詞匯,甚至大學(xué)生都知道怎么去做,緩存、異步操作、并行……,這些都是具體的措施,問高并發(fā)到底是什么,大家都能回答一些,比如流量大、系統(tǒng)壓力大、用戶多……,這些都是具體的特征,用一句話概括高并發(fā):有限的資源應(yīng)對(duì)大量的請(qǐng)求,概括出了高并發(fā)的根本特性,抓住了本質(zhì)的東西就比較解決問題。帶應(yīng)屆生的時(shí)候,我提到一個(gè)觀點(diǎn):工作三年以后,要能說(shuō)得出 10 句對(duì)技術(shù)本質(zhì)理解的話,提早給自己定下目標(biāo),在平時(shí)中積累一些思考和沉淀。
矛盾論揭示的是事物之間的矛盾,矛盾是推動(dòng)事物不斷發(fā)展的動(dòng)力,一般從事物本質(zhì)中,可以看到一些矛盾出來(lái),比如上面高并發(fā)的本質(zhì)是有限的資源應(yīng)對(duì)大量的請(qǐng)求,有限對(duì)大量本身就是一對(duì)矛盾,找到了矛盾就去解決矛盾,解決的一個(gè)方向就是平衡矛盾,矛盾解決了,問題自然就解決了,比如現(xiàn)在資源是大量的,完全可以應(yīng)對(duì)大量的請(qǐng)求,這樣高并發(fā)的場(chǎng)景對(duì)于你來(lái)講就不是一個(gè)問題。
系統(tǒng)論是從系統(tǒng)各個(gè)要素出發(fā),多維度思考問題,最為簡(jiǎn)單的是從矛盾雙方出發(fā)思考問題,比如有限的資源,能不能讓資源的數(shù)量變多呢?能不能提升資源的處理能力呢?……,從這些方向去思考,思路就一下子打開了,所謂的緩存等常說(shuō)的方法只是一個(gè)個(gè)具體的解決手段,我們需要更加立體、多維的解決思路,再結(jié)合具體的場(chǎng)景、現(xiàn)狀組合一些解決方法。
演進(jìn)論強(qiáng)調(diào)事物是進(jìn)化的,符合事物的發(fā)展規(guī)律和人的認(rèn)識(shí),有可能我們想得非常完善,不可能等所有的事情都做好了再上線,得有計(jì)劃、分階段地解決問題,優(yōu)先解決主要矛盾、核心訴求。也有可能經(jīng)過(guò)一段時(shí)間之后,事物的主要矛盾發(fā)生了變化,我們的方案也得演進(jìn)式設(shè)計(jì)。
技術(shù)方案設(shè)計(jì)案例
下面拿三個(gè)具體的案例來(lái)講怎么將方法論落地于實(shí)際的技術(shù)方案設(shè)計(jì),讓大家能夠感覺到方法論的真正作用,不再是一種虛的感覺。
1.?高并發(fā)技術(shù)方案
高并發(fā)在之前是非常火的,大家也都能說(shuō)出一些解決措施,如使用緩存、MQ、并行……,下面談下自己的一些思路。
問題定義:高并發(fā)的本質(zhì)是有限的資源應(yīng)對(duì)大量的請(qǐng)求,它的核心問題就是現(xiàn)狀不足已支撐那么大量的請(qǐng)求,系統(tǒng)的負(fù)載太高,很可能出現(xiàn)網(wǎng)站打不開、用戶下不了單等現(xiàn)象。
問題分析:高并發(fā)的矛盾就是有限的資源對(duì)大量的請(qǐng)求,解決了這個(gè)矛盾就解決了高并發(fā)的問題。接下來(lái)就是平衡這對(duì)矛盾,一般是采用"中和"的思想,就像中醫(yī)治病:寒病用熱藥、熱病用寒藥,因此就會(huì)站在資源和請(qǐng)求兩個(gè)維度去思考。資源能不能變多:常見的有水平擴(kuò)展;資源能不能變強(qiáng):常見的是性能優(yōu)化,性能優(yōu)化又會(huì)分成前端優(yōu)化、網(wǎng)絡(luò)優(yōu)化、計(jì)算優(yōu)化、存儲(chǔ)優(yōu)化、程序優(yōu)化……。請(qǐng)求能不能減少呢?比如通過(guò)答題錯(cuò)峰,合并請(qǐng)求等等,這樣解決問題的思路就一下打開了。
解決方案是重要的,但設(shè)計(jì)的過(guò)程更為重要,清楚了問題是什么、怎么去分析,解決方案自然而然就出來(lái)了,重要的還是分析的過(guò)程。
2. 異步處理技術(shù)方案
說(shuō)到異步處理,大家最容易想到的方案就是 MQ。MQ 是常見解決的技術(shù)方案,如下圖所示:貸款端系統(tǒng)向放款端系統(tǒng)發(fā)送標(biāo)的信息,一天的量大約有 4000 多筆,每天偶爾有幾個(gè)是超時(shí)的,影響放款。怎么去解決這個(gè)問題呢?用 MQ 是最容易想到的,當(dāng)時(shí)公司還不有用到 MQ 中間件,去搭建一個(gè)不現(xiàn)實(shí),怎么辦呢。
問題定義:現(xiàn)有的系統(tǒng)能力無(wú)法支撐實(shí)時(shí)處理,同步調(diào)用對(duì)系統(tǒng)的壓力很大,很有可能某個(gè)時(shí)間點(diǎn)系統(tǒng)的負(fù)載比較大,處理慢了接口調(diào)用就超時(shí)了。
問題分析:借鑒 MQ 的設(shè)計(jì)原理,發(fā)送方將消息先發(fā)送至 Broker 上,消費(fèi)方從 Broker 上拉取消息消費(fèi),抽象出異步處理的本質(zhì)就是數(shù)據(jù)暫存 + 擇機(jī)處理,那么問題來(lái)了,數(shù)據(jù)暫存在哪里呢,內(nèi)存?文件?數(shù)據(jù)庫(kù)?……,擇機(jī)處理的方式是拉還是推,定時(shí)還是隨機(jī)……,這樣一思考,發(fā)現(xiàn)除了 MQ 還有很多其它的解決方法,總結(jié)出通用的解決方案后,可以在不同具體的環(huán)境中演繹出不同的方案。當(dāng)時(shí)設(shè)計(jì)的方案就是將數(shù)據(jù)存儲(chǔ)到 ftp 服務(wù)器上,實(shí)現(xiàn)也比較簡(jiǎn)單,方案沒有最好,只有適不適合,難道公司沒有 MQ 中間件,這個(gè)事情就不能解決了嗎?
3. 可擴(kuò)展性技術(shù)方案
可擴(kuò)展性設(shè)計(jì)是現(xiàn)在一個(gè)非常典型的場(chǎng)景,當(dāng)時(shí)遇到的場(chǎng)景是實(shí)時(shí)人群計(jì)算場(chǎng)景,每當(dāng)業(yè)務(wù)方提一個(gè)需求過(guò)來(lái),就要進(jìn)行對(duì)數(shù)據(jù)口徑,然后熟悉業(yè)務(wù)方的一些業(yè)務(wù),接下來(lái)就是編寫 Flink 任務(wù),測(cè)試、核對(duì),最后上線,整個(gè)流程下來(lái)至少 2 周,需求提一個(gè)簡(jiǎn)單需求,很疑惑為什么要 2 周才能上線。
問題定義:業(yè)務(wù)方希望快速上線而實(shí)際開發(fā)要 2 周的矛盾,究其主要原因是不懂業(yè)務(wù),需要有熟悉的階段,這個(gè)階段耗時(shí)比較多,真正開發(fā)的時(shí)間不多,怎么去解決這個(gè)問題呢?
問題分析:雖然主要的矛盾找到了,很明顯的一個(gè)方向是讓業(yè)務(wù)方的開發(fā)參與進(jìn)來(lái),平臺(tái)只做一些支撐、答疑的作用,但是讓業(yè)務(wù)方的同學(xué)進(jìn)來(lái),就有一個(gè)挑戰(zhàn):別人沒有學(xué)過(guò) Flink,你讓他來(lái)開發(fā),業(yè)務(wù)方愿意嗎?對(duì)整個(gè)業(yè)務(wù)進(jìn)一步的抽象,發(fā)現(xiàn)我們的需求場(chǎng)景是變化的,實(shí)時(shí)指標(biāo)也是變化的,但整個(gè)流程卻是不變的,用 y = f(x) 來(lái)表示,就是來(lái)一個(gè) x 經(jīng)過(guò)計(jì)算、變換成結(jié)果 y,所以當(dāng)時(shí)就梳理出了哪些是變化的、哪些是不變的,從多變中找不變的東西。這里還需要一種能力是抽象分層,如果把 f() 只當(dāng)作一層,就只有一個(gè)抽象分層,如果里面它還有復(fù)合函數(shù),那么就有多個(gè)抽象層,這取決于對(duì)問題的思考,不同的人設(shè)計(jì)出的抽象層次是不一樣的。當(dāng)時(shí)借鑒了 Flink 的一些設(shè)計(jì)思想,將整個(gè)過(guò)程產(chǎn)品化了,業(yè)務(wù)方只要選擇、勾選一些信息,就會(huì)自動(dòng)生成 Flink SQL,然后點(diǎn)擊運(yùn)行即可。SQL 對(duì)于大家來(lái)講,入門比較簡(jiǎn)單,基本上能看得懂,沒太大的難度。平臺(tái)側(cè)不需要像之前那樣完全投入人力去學(xué)習(xí)業(yè)務(wù)知識(shí)、開發(fā)、測(cè)試上線。
總結(jié)
本要分享了技術(shù)方案設(shè)計(jì)的一些思路,整個(gè)方法論包括本質(zhì)論、矛盾論、系統(tǒng)論、演進(jìn)論,通過(guò)三個(gè)具體的案例闡述怎么去運(yùn)用方法論。
總結(jié)
以上是生活随笔為你收集整理的技术方案设计的方法论及案例分享的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Serverless Kubernete
- 下一篇: 托管节点池助力用户构建稳定自愈的 Kub