作者 | 擇琨
一、引言
作為長期奮戰(zhàn)在一線的技術(shù)人,我深刻體會到如下幾個思維能力對技術(shù)人成長的重要性,熟練運用這幾種思維可以幫助我們快速的進(jìn)入到新的領(lǐng)域,在分析、定位和解決問題上有很大幫助。
- 抽象思維:幫助我們快速抽取面對問題的關(guān)鍵要素和本質(zhì),可以是其他能力的“元能力”
- 分層思維:幫助我們拆解問題,分而治之,劃清問題和職責(zé)邊界
- 歸納思維:幫助我們從個性問題中抽象出問題的一般規(guī)律和得出共同結(jié)論
- 結(jié)構(gòu)化思維:幫助我們沉淀自己的知識樹,逐步系統(tǒng)性的思考問題
二、抽象能力
- 什么是抽象能力
提到抽象,程序員第一反應(yīng)可能是abstract,抽象能力的官方解釋是這樣的“抽象是從眾多的事物中抽取出共同的、本質(zhì)性的特征,而舍棄其非本質(zhì)的特征的過程。抽象表達(dá)的是一種思維方式,用來反映事物的本質(zhì)和規(guī)律的方法,抽象強調(diào)的是關(guān)注要素,隱藏額外細(xì)節(jié)”。
抽象能力是每個人自有的一種天生能力,可以讓我們把一些相似的東西集中概括起來,暫時忽略他們之間的差異。當(dāng)我們遇到從未見過的事物時,如果能夠運用“抽象能力”去尋找記憶中的知識與現(xiàn)有的事物之間的聯(lián)系,作為解決問題的關(guān)鍵要素,那么我們解決問題的效率將會大大上升,比如當(dāng)我們碰到下圖中左側(cè)這個動物的時候,我們不知道它具體是什么動物,但是因為我們腦海里有一個貓科動物的抽象(如右側(cè)),所以通過尋找記憶中的知識,我們可以知道它是貓科動物的一種,而不會直觀的把它當(dāng)成一匹馬。
- 抽象能力的重要性
抽象能力在我們的工作中非常重要,甚至能決定一個人能力水平的上限,一個抽象能力強的人,往往能從復(fù)雜的現(xiàn)象中直擊事物的本質(zhì)。這也就是我們生活中常見到的一些人總是能抓住事情的重點、總能看到別人看不到的,或者碰到問題能夠快速給出有效解決方案或思路。
- 抽象能力決定你是否能比別人快速掌握技能
作為一線程序員的核心本職工作是編程,編程的本質(zhì)也是為了解決生活中的實際問題而存在的,通過抽象能力把現(xiàn)實中的內(nèi)容的本質(zhì)和特性抽象出來,然后抽象到系統(tǒng)模型上應(yīng)用于工作中,通過編程的方式來解決一類問題,這也就是“設(shè)計源于生活、扎根生活,最終為生活服務(wù)”。
舉一個例子,阿里西溪園區(qū)有一個做麻辣香鍋的檔口,比較好奇麻辣香鍋是怎么做的,正好檔口的加工過程是開放式的,所以我就站在那邊等餐邊觀察他們的加工過程,下面是一個完整的流程:
麻辣香鍋有4個工人,每個工人負(fù)責(zé)固定的實操,整個麻辣香鍋的加工過程按照一個固定的流程扭轉(zhuǎn),各個工人之間交接的內(nèi)容標(biāo)準(zhǔn)固定,比如上圖:
工人1: 負(fù)責(zé)的實操:稱重、收銀(刷工卡)、擺放(有序擺放) ,工人1 完成擺放最后一個操作后,會把商品放到一個筐中交給工人2。
工人2: 負(fù)責(zé)的實操:取件(有序取件)、分類(蔬菜和肉類分開)、煮熟、裝碗,工人2 按照上述流程完成自己的工作后,將加工好的商品放到一個碗中交給工人3。
工人3: 負(fù)責(zé)的實操:取件、加料、炒熟、換碗,工人3 將工人2加工后的商品按照上述流程完成炒熟的加工,炒熟后給到工人4。
工人4: 負(fù)責(zé)的實操:取件、加配料、妥投(叫號),工人4負(fù)責(zé)對最后的商家做錦上添花的配料加工。
完成所有的實操之后,工人4通過叫號的方式客戶上門自取的方式完成妥投.,整個工作流程中不需要單獨有個工人來指揮調(diào)度(無狀態(tài),不需要記錄當(dāng)前的調(diào)度節(jié)點及進(jìn)度),他們會按照既定流程完成本職工作。
在回到我的工作中,我的工作內(nèi)容有一部分跟協(xié)同關(guān)系比較大,協(xié)同這部分的本質(zhì)和一個麻辣燙的加工過程非常相似,區(qū)別在于一個是人之間的協(xié)同,一個是作業(yè)節(jié)點之間的協(xié)同,下面給一個協(xié)同調(diào)度流程示例:
共性抽象:
這兩個看似不相關(guān)的東西其實有相同的共性,麻辣燙的每個工人等同于我們的實操節(jié)點,他們的工作等同于生成倉作業(yè)單、下發(fā)倉作業(yè)單、倉出庫等,倉出庫-->創(chuàng)建配作業(yè)單等同于工人2[裝碗]之后交給工人3,倉出庫就觸發(fā)了一個協(xié)同事件,觸發(fā)了工人3的作業(yè),倉出庫的包裹就是交接的碗(交接物),通過這個我們把現(xiàn)實中的事物本質(zhì)抽象成了調(diào)度協(xié)同的基本模型,包含[協(xié)同模版]、[協(xié)同節(jié)點]、[協(xié)同事件]、[工序]、[交接物],然后通過編程系統(tǒng)這個能力,借助于此解決了當(dāng)時域內(nèi)最大的痛點:協(xié)同調(diào)度模版的爆炸式膨脹和無法動態(tài)編排的問題。因為我們把“調(diào)度協(xié)同的本質(zhì)”共性抽象實現(xiàn)了一下,所以天然收割了一波技術(shù)紅利,第一次把正逆向調(diào)度協(xié)同業(yè)務(wù)都融合進(jìn)來,同時也復(fù)用到了2C和2B的其他業(yè)務(wù)域中。
下面是我們的調(diào)度升級版后的配置化頁面:
本次升級也支持了調(diào)度模版的多版本控制、生效規(guī)則、審批發(fā)布流程等,也從以前一個中心化的調(diào)度升級到無狀態(tài)去中心化的服務(wù)協(xié)同,降低了系統(tǒng)依賴、提高健壯性。
- 抽象能力是將復(fù)雜問題簡單化的重要方法
《史記》有云:“大樂必易,大禮必簡?!币馑际钦f.“大”的音樂一定是平易近人的;“大”的禮儀則一定是簡樸的。世界的表現(xiàn)雖然復(fù)雜,但方法的本質(zhì)卻是簡單。面對紛繁復(fù)雜的萬事萬物,迎接不斷出現(xiàn)的新情況新問題,說難也難,說易也易,關(guān)鍵看你能否把握事情的本質(zhì),復(fù)雜問題簡單化是提高我們生活工作效率的正要途徑,通過抽象思維把復(fù)雜問題簡單化的例子有很多,比如:
- 曹沖稱象
孫權(quán)送來了一頭大象,曹操想要知道大象的重量,詢問他的屬下這件事,但他的手下都不能說出稱象的辦法。曹沖說:“先把象放到大船上,在水面所達(dá)到的地方做上記號,然后將大象牽下來,再讓船裝載其它東西,稱一下這些東西,那么比較下就能知道了。
- 地鐵線路圖
即使不標(biāo)出各個站點之間相隔的具體距離,也沒有標(biāo)出它們的具體位置,僅僅只是提取了必需的信息,就能將整個復(fù)雜的地鐵體系簡單地表現(xiàn)出來。我們只要有地鐵路線圖,就可以知道要怎樣去各個站。
- 系統(tǒng)交接
再舉一個最近發(fā)生在身邊的例子,前幾天的一個系統(tǒng)交接會上,交接過程中總感覺有些遺漏,基于我自己記憶中的知識,我判斷交接清單至少包含如下幾個內(nèi)容:
系統(tǒng)架構(gòu)圖、核心領(lǐng)域模型
核心業(yè)務(wù)流程、時序
上下游系統(tǒng)依賴、核心聯(lián)系人、協(xié)議方式
中間件基礎(chǔ)資源依賴、基本賬號
系統(tǒng)操作頁面、入口
以往大促保障手冊、應(yīng)急預(yù)案、資損盤點
系統(tǒng)基礎(chǔ)監(jiān)控、業(yè)務(wù)監(jiān)控地址
遺留線上Bug清單和Owner分配
代碼權(quán)限以及核心L0入口
其實上面都是基于對一個系統(tǒng)本來該有的內(nèi)容的一個抽象,所有的業(yè)務(wù)系統(tǒng)都具有相同的特征,日常的抽象積累可以讓工作更輕松更簡單,不至于束手無策、手忙腳亂,抽象思維讓我們只關(guān)注了要素隱藏了很多細(xì)節(jié),按照上面這9個大類要素深入進(jìn)去,我們面對的就是無窮的細(xì)節(jié),細(xì)節(jié)是決定成敗的關(guān)鍵。
三、分層思維
除了抽象,分層也是我們應(yīng)對和管理復(fù)雜性的基本思維武器。日常生活中的一些分層的例子,比如我們經(jīng)常所去的大商超,店鋪的分布也是有分層的思維,比如負(fù)一層一般是小吃檔口/停車場,一層一般是化妝品/香水/黃金首飾店鋪,二樓是女裝、三樓是男裝、四樓是兒童/母嬰用品,在往上就是餐廳和電影院、健身房等,通過分層思維,商超將一些共性的東西劃分到一起,讓管理和客戶消費更輕松(如一般晚上只有電影院的那層關(guān)門最晚,其他樓層相對較早,管理上可以重點保障該樓層的用電和安保。),類似用到分層思想的東西非常多,比如新華字典收錄了8000字,通過按照漢語拼音的順序完成所有漢字的分層,同時提供一個目錄用于快速檢索。這樣一個復(fù)雜的問題就簡單化了。在系統(tǒng)架構(gòu)和設(shè)計中,分層思維也是常用的一個思維方式,比如:
(TCP/IP協(xié)議棧的分層架構(gòu)) (操作系統(tǒng)分層架構(gòu))
在我負(fù)責(zé)的系統(tǒng)架構(gòu)設(shè)計上,分層思維也是比較常用的一個思維方式,比如:
- 業(yè)務(wù)能力管理[業(yè)務(wù)邏輯的分層管理]
如上圖,業(yè)務(wù)需求管理上我們采用三層架構(gòu)的方式來進(jìn)行業(yè)務(wù)管理,其本質(zhì)是采用分層的思想,劃分成三層,基礎(chǔ)層、行業(yè)層、商家層,每一次有不同的定位和職責(zé)。
a. 基礎(chǔ)層
主要沉淀業(yè)務(wù)的共性和一些基礎(chǔ)標(biāo)準(zhǔn)和規(guī)范定義,并提供一些默認(rèn)實現(xiàn)。
b. 行業(yè)層
主要沉淀業(yè)務(wù)的特性的內(nèi)容,在基礎(chǔ)層的基礎(chǔ)上疊加一些特性內(nèi)容形成具體的行業(yè),不同行業(yè)之間也是一個分層思維,通過不同的行業(yè)分層管理行業(yè)間的差異。
c. 商家層
主要沉淀業(yè)務(wù)的個性的內(nèi)容,在行業(yè)層的基礎(chǔ)上疊加一些個性內(nèi)容形成具體的業(yè)務(wù)身份,不同業(yè)務(wù)身份之間也是一個分層思維,通過不同的業(yè)務(wù)身份來管理他們之間的差異。
- 系統(tǒng)架構(gòu)設(shè)計[系統(tǒng)模塊的分層設(shè)計]
比如在數(shù)據(jù)中心的系統(tǒng)架構(gòu)設(shè)計上,劃分不同層次、不同的層次職責(zé)邊界清晰。
通過分層的思維設(shè)計,每一層有自己的基本定位和職責(zé)邊界,逐級往上提供基礎(chǔ)能力。
a. 數(shù)據(jù)基礎(chǔ)層
主要解決多數(shù)據(jù)源快速接入,數(shù)據(jù)快速形成一個寬表,核心面臨的挑戰(zhàn)是數(shù)據(jù)的質(zhì)量和穩(wěn)定性這方面,因為數(shù)據(jù)實時性的提高必然帶來一致性的挑戰(zhàn),對上層提供基礎(chǔ)數(shù)據(jù)支撐。
b. 數(shù)據(jù)服務(wù)層
主要解決業(yè)務(wù)數(shù)據(jù)的快速服務(wù)化的問題,沉淀數(shù)據(jù)開發(fā)平臺來支撐,配套的服務(wù)測試、發(fā)布審批流程以及支撐多數(shù)據(jù)源接入,對上層提供數(shù)據(jù)資產(chǎn)服務(wù)。
c. 數(shù)據(jù)視圖層
主要解決數(shù)據(jù)資產(chǎn)服務(wù)的權(quán)限管理問題,控制了什么人能看到什么資源以及看到哪些數(shù)據(jù)范圍,對上層開放,支持appkey的多資源訂閱。
d. 數(shù)據(jù)APP層
主要解決數(shù)據(jù)開放管理的問題,通過appkey來訂閱,目前已經(jīng)支撐異常中心、小時達(dá)實時指揮中心、算法等眾多消費場景。
通過這四層架構(gòu)分層設(shè)計,實現(xiàn)了數(shù)據(jù)來源于業(yè)務(wù)又回歸到業(yè)務(wù)這一過程。
我們在運用分層思維的時候也離不開抽象能力,利用抽象能力去提取他們的共性忽略差異細(xì)節(jié)。
四、歸納思維
很多時候,我們習(xí)慣了碰到問題,都希望能快速的解決,而快速解決的方法很多只能是做表面工作,從表面解決,從表面上下功夫,頭痛醫(yī)頭腳痛醫(yī)腳,不追究發(fā)病的病根,看似很快,實則隱患不少,待問題再出現(xiàn)的時候代價會更大,其實最快的解決問題是從根本上解決問題,雖然這樣前期不能最快解決問題,投入的精力也會很多,但是投入的成本低,在沒有形成頑疾的時候,提前介入,一勞永逸。
“物有本末,事有始終,知所先后,則近道矣。”,當(dāng)我們了解了一件事情的來龍去脈,掌握了事情的本末結(jié)構(gòu) 就基本探究到了事情的本來面貌,歸納思維讓我們可以從一個個具體的事例中,推導(dǎo)出它們的一般規(guī)律和共通結(jié)論的思維。幫助我們尋找問題的根因,從而對癥下藥解決問題。歸納思維的方法有很多在此不做討論,生活中運用到歸納思維的例子有很多。天空烏云密布,燕子低飛,螞蟻搬家等現(xiàn)象時,我們會得推斷說天要下雨了。還有很多比如立冬晴一冬凌,立冬陰一冬溫等等。歸納思維應(yīng)用于工作中,可以幫助我們通過個別問題歸納推演出一類問題的共性和規(guī)律,采取合理的方案解決問題,舉幾個身邊的例子:
- 開發(fā)人員運維投入成本的問題
部門成立初期由于業(yè)務(wù)上的變化較大,為了支撐業(yè)務(wù),底層數(shù)據(jù)模型的做了一次升級,新增了部分?jǐn)?shù)據(jù)模型,兄弟團隊或者業(yè)務(wù)運營同學(xué)經(jīng)常會丟一個單子過來讓開發(fā)同學(xué)人工幫忙查單據(jù)狀態(tài)、物流進(jìn)度、單據(jù)關(guān)系等,這個造成了值班的開發(fā)同學(xué)編碼時間經(jīng)常被打斷,效率下降,所以我們歸納推演了下分析問題的本質(zhì)是【運維工具上的缺失】,基于此問題根因孵化了<火尖槍>和<乾坤圈>,降低了開發(fā)同學(xué)的運維投入的問題。
- 火尖槍
根據(jù)任意單號快速查詢?nèi)溌窋?shù)據(jù)的工具,實現(xiàn)從交易場到物流場全鏈路數(shù)據(jù)一鍵查詢。
- 乾坤圈
通過單據(jù)的生命周期和單據(jù)之間的關(guān)系管理沉淀了"AAR"模型,實現(xiàn)任意單號/關(guān)鍵字全鏈路日志搜索并按照實際發(fā)生時間鏈?zhǔn)秸故尽?/p>
- 業(yè)務(wù)快速分析的問題
為了更好的支撐業(yè)務(wù)接得快、改的少、讓系統(tǒng)更加高可用,F(xiàn)Y22財年針對目前系統(tǒng)架構(gòu)做了一次升級,本次升級和以往不同的是:技術(shù)和業(yè)務(wù)支撐同步進(jìn)行且有人員資源上的問題,抽調(diào)了一部分負(fù)責(zé)數(shù)據(jù)和異常較多的同學(xué)來參加架構(gòu)升級,所以一個問題就出現(xiàn)了:對線上業(yè)務(wù)的了解和差異分析。這個了解不單獨是知道業(yè)務(wù)是什么,要知道線上的業(yè)務(wù)所有細(xì)節(jié),包括這個業(yè)務(wù)下的一個開關(guān)在做什么。這個對于當(dāng)時參加的同學(xué)和架構(gòu)來言都是一個很大的挑戰(zhàn)。通過歸納總結(jié),我們把一些好的案例規(guī)整以后產(chǎn)生出了一個業(yè)務(wù)梳理大綱,按照這個大綱去梳理業(yè)務(wù),同時持續(xù)完善這個大綱。讓所有同學(xué)都可以先有一個大的視角來看,忽略一些細(xì)枝末節(jié)。梳理的業(yè)務(wù)大綱如下:
通用資料庫
作業(yè)模版分析
業(yè)務(wù)身份分析
實操節(jié)點(倉、運、配等)接入方式分析
調(diào)度協(xié)同分析
售中逆向分析
售后逆向分析
財務(wù)/庫存分析
核心業(yè)務(wù)流程分析
數(shù)據(jù)庫關(guān)鍵字段分析
廣播消息匯總
業(yè)務(wù)分析匯總
線上示例單據(jù)&消息整理
關(guān)鍵報文
單據(jù)屬性對比
領(lǐng)域消息對比
架構(gòu)升級新增測試點
特別測試場景提醒
自測案例
持續(xù)的歸納總結(jié),不僅是讓工作做的更好更輕松,更多的是對自己不斷產(chǎn)生出滾雪球的收益,所以從這個需求/這個問題排查開始,多問幾個為什么。
五、結(jié)構(gòu)化思維
先來看下下面這些數(shù)字,然后再10秒內(nèi)說出所有數(shù)字和字母:
2, 4, f, 8, n, 4, 2, 3, 7, d, b, a, h, e, k, m, i, 3, g, j, 9, 6, 5, 1, 1, 0, c, l
面對這樣一堆沒有任何規(guī)律的數(shù)字,如果要記下來是不是有點難?如果我們把這些數(shù)字的內(nèi)容調(diào)整下,變成下面這樣:
0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, g, h, i, j, k, l, m, n
是不是清晰了很多?
其實這涉及到了結(jié)構(gòu)化思維:當(dāng)人接收到大量雜亂信息時,處理復(fù)雜信息的能力有限,但是更偏愛有規(guī)律的東西。我們每天工作生活中都會接收到大量信息,如何把這些信息吸收并結(jié)構(gòu)化為我所用就需要構(gòu)建自己的知識樹。比如上面的業(yè)務(wù)梳理大綱的例子,其實我們就構(gòu)建了一個自己的知識樹,通過它我們可以檢索我們需要的信息,好的知識樹可以借鑒,但是每個人都有自己的一個思維方式,如果沒有內(nèi)化成自己的或者不是自己構(gòu)建的知識樹無法熟練的使用。
結(jié)構(gòu)化思維指從整體思考到局部,是一種層級分明的思考模式。簡單來說就是借用一些思維框架來輔助思考,將碎片化的信息進(jìn)行系統(tǒng)化的思考和處理,從而擴大思維的層次,更全面地思考。沒有結(jié)構(gòu)化的思維是零散混亂無條理的想法集合,而結(jié)構(gòu)化思維是一個有條理有層次,脈絡(luò)清晰的思考路徑,讓這些點連成了線,舉一個常用的問題解決方法思維框架:
按照這個思維框架,很多問題的解決都可以用的上,比如上面舉過的一個數(shù)據(jù)中心的例子,應(yīng)用這個思維框架后,基本思維路徑如下:
六、總結(jié)
一線技術(shù)人每天面臨的都是寫需求、改缺陷、查工單,加班,長此以往。有時候不妨跳出來以一個旁觀者的身份看一看自己,做一個需求前多問幾個為什么?寫一段代碼前先理一下邏輯思路,需求發(fā)布以后想一下怎么運維(最好的是讓沒做過這個需求的人也知道怎么處理工單,打破知識壁壘和人員壁壘),在這個域沉淀的東西如何復(fù)用到另外一個域。我們面臨的業(yè)務(wù)是變化的但是做事的方法是有共性的,如何沉淀這些共性的做事方法才是做業(yè)務(wù)需求帶來的最大成長。
低頭走路,抬頭看天,長路漫漫,不忘初心 -- 自勉。