為了把本文的觀點講清楚,需要先講一段黃石公和張良的小故事,如果你熟悉這個故事,可以略過這段:
漢初三杰之一的張良,在躲避秦朝戰亂隱姓埋名時,遇上一位老人,這個老人故意把鞋拋到橋下,看著張良說:“小子,下去把鞋取上來!”張良預先不知道是詐,有些愕然想揍他;因為見他年歲大了,才強忍怒火,下了橋,給他把鞋取上來。于是就跪著給他穿上。那位老人伸出腳來,讓張良把鞋穿好,笑著走了。張良感到很驚詫。他大約走出一里遠,又返了回來,對張良說:“年輕人倒是可以教育的!五天后的清晨,你在這里和我會面。”張良更覺得奇怪,又跪下說:“是。”五天后的早晨,張良去了約定的地方,黃石公生氣的說:“你與老人約定,為什么后來?”再五天后的早晨約定,張良天不亮就去了,黃石公又早在那里了,又生氣的說:“為什么晚來?”又五天的早晨的約定,張良半夜就去了。過了一會,黃石公也來了,高興的說:“孺子可教也!”于是拿出一本編書給張良,說:“你回去讀他,就可以做帝王的老師了。十三年之后,你見到的濟北谷城山下的黃石,就是我了。”于是離去,看不見了。張良天亮翻開書一看竟然是《太公兵法》。
作為小說或者歷史故事,這樣的情節是吸引人的,因為一直有懸念。
但是,如果把這個故事的場景換成公司內部培訓,由一個講師給大家做培訓,講師前邊講了很多細節,直到最后一刻才給我們揭曉答案,也許很多人等不到答案出現,早已睡著或者離開會場。為什么會這樣?
是因為我們在聽故事的時候,大腦是一種捕獲獵物模式,我們只需要找到一個興奮點,其他的次要內容記不住也沒有關系。而在參加培訓的時候,大腦是一種學習模式,大腦有一張知識網,新知識點必須與現有知識網中的某個點建立聯系,才能成為知識網的一部分,這才是真正的聽懂,到實際工作中才能用得上。而在我們參見培訓時,很多講師的講課方法其實就是照搬應試教育的講課方式,只講結果少講其他。
【改造后的故事】
那什么樣的講述方式才能讓大家容易聽懂呢?我把黃石公和張良的故事改造一下:
第一層:黃石公通過對張良的考驗,把《太公兵法》傳給了張良。
第二層:
第一步:黃石公考驗張良。
第二步:黃石公決定把《太公兵法》傳給張良。
第三層:
黃石公考驗張良,分為三步:讓張良給他穿鞋、第一次五日之約、第二次五日之約。
黃石公決定把《太公兵法》傳給張良,實際上沒有第三層。
改造后,思路清晰了很多,不需要再看故事原文,我們就能明白故事要表達的所有重點。看起來,我們的改造很完美,但是這里還有一個重要問題并沒有解決:黃石公考驗張良,為什么要分為這三步?黃石公到底要考驗張良的哪些方面?
對于如上的疑問,每個聽課者都會有自己的一個理解,就像“一千個人心中有一千個哈密雷特”一樣。對于小說來說,這確實很好,它能給人以無限瞎想。但現在是在工作啊,講課的目的是讓大家都能得到明確的答案,而不是每一個人都有自己的理解,明確的答案可以避免以后的很多誤解和爭論。我認為這是現代企業做內部培訓的一個重要目標。
于是我們再次修改(前兩層不變):
第三層:
黃石公考驗張良,分為三步:考驗張良對老人的恭敬之心,考驗張良的信用,考驗張良的耐心。
黃石公決定把《太公兵法》傳給張良,沒有第三層。
第四層:
考驗張良對老人的恭敬之心:具體做法是讓張良給他穿鞋來刁難張良。
考驗張良的信用:具體做法是五天后的約會刁難張良。
考驗張良的耐心:具體做法是第二次五天后的約會繼續刁難張良。
第二次的修改,讓所有人都能得到一個沒有二義性的答案,目標達成!
【改造的精妙之處】
現在我們就需要總結一下,改造后的故事到底好在哪里。
我認為好處有三個:
一、層次感強烈,能解除人腦一次只能記住七樣東西的限制。
據研究,人腦一次只能記住七樣東西(甚至有的人只能記住三樣)。現在我們把思維放在改造后的、層次感強烈的結構中,思維可以隨時移到下一層,這樣就能再次記住七樣東西,這樣的好處其實是巨大的!但是像不少培訓師講的那樣,一次把所有細節都展開,聽課者不犯困才怪。
好處再擴展一點,在層次感強烈的結構中,聽課者一直都知道:當前講的內容在整體結構中處于什么地位、對全局有何作用、受到全局的什么影響。于是,聽課者原本認為的枯燥的工作,經過這樣一講,他會被吸引住,因為他了解了自己的工作對全局的貢獻,以及一種洞悉全局的美妙感覺!
二、縱向層次擁有無須解釋的關聯,是因為下層給上層呈現的是結果而不是實現。
我們讀第二次改造后的故事梗概,當讀到“黃石公考驗張良”時,讀者最希望看到的下文是:與“考驗”兩字有顯而易見聯系的,例如“恭敬之心”,這就是第二次改造故事的意義所在!上下兩個層次用這兩個詞關聯起來,根本不需要再做任何解釋,因為“考驗恭敬之心”傳達出來的意義沒有二義性。
而反觀第一次改造后的故事,“考驗”與“給他穿鞋”這兩個詞,雖然有點聯系,但是又說不太清楚,存在二義性,聽課者腦子還在這里打轉的時候,講師卻已經翻到了下一頁。
再深入一層,上下兩層之間的兩個詞,為什么擁有無須解釋的關聯?是因為在第三層來看,黃石公要考驗三個方面,其他一個方面是“恭敬之心”,這個“恭敬之心”是第四層“給他穿鞋”形成的一個結果。也就是說,站在每個層次看下一層,只應該看下一層的結果,而不是看它們的實現方式,這種方式才能看得明白。我們一定有這樣的經驗:一旦鉆進一件事情的細節,就會淹沒在細節的海洋中,很難再看清事情的外部特性了。這個思路其實也是,上下級領導之間效果很好的交流方式。
三、站在更高的層次,能激發更高的智慧!
還拿第二次改造后的故事舉例,如果你只是站在第四層那里,你所能看到的選項只有:讓他給我穿鞋、讓他給我捶背等。
如果你站在了更高的第三層,你會看到這個考驗的本質(也可以理解為目標)是:考驗張良對老人的恭敬之心。
有人會說,本質不本質的有什么用?
我現在來回答,這段很重要,請仔細體會:你的實現方式(例如讓張良給他穿鞋)必須能滿足本質或目標(例如考驗張良對老人的恭敬之心),才能成其為一個合理的結構,但如果不滿足目標,就一定會讓這個結構坍塌。
怎么講?在黃石公還沒想好怎么考驗張良的時候,黃石公知道自己的目標是:考驗張良對老人的恭敬之心。但這時黃石公該怎樣考驗張良,哪些方法能考驗出真正的品質,而不是虛假的品質?不站在這個場景上,我們怎么會知道黃石公還有這樣一個選擇難題?智慧就在這里。
這個選擇是很重要的,因為它決定了能不能滿足目標,從而決定了這個結構會不會坍塌。黃石公可以選擇:道聽途說、直接和張良開誠布公地談。但是,這些方法都會讓張良意識到他正在被考驗,從人性的角度來看,張良一定會隱藏起自己自私的一面。這就是為什么有一些外企考驗人的時候,要制造一個考試之外的意外情況!
【軟件開發領域的思想與此相通】
作為軟件開發者,很多人都會去學習:面向過程編程、面向對象編程、C++/Java、設計模式、重構等。你的方式是不是:強制記憶大師們的方法或者格言?如果讓你創造一個新的模式、方法、格言,我相信就幾乎沒有人能做到了。為什么?我認為關鍵在于沒有明白這些方法的背后是什么。
我提幾個與本文思想有關的軟件開發概念,它們背后的東西其實是相通的:
1.為什么有一條開發格言大概是這么說的:接口類中的函數個數盡量不要超過10個?
本質上與我前文提到的“層次感強烈,能解除人腦一次只能記住七樣東西的限制”是一個理念。因為代碼是給人看的,如果超過10個函數,一眼看上去就懵了,而且關系隨著函數的增加而錯綜復雜,很容易出現邏輯漏洞。
2.為什么大師級人物Martin Fowler在《重構》這本書中提到:“當你感覺需要撰寫注釋,請先嘗試重構,試著讓所有注釋都變得多余”?
本質上與我前文提到的“層次的縱向維度,擁有無須解釋的關聯”的是一個理念,只是大師并沒有解釋那么清楚。很多人就看不懂了,于是他們繼續我行我素,在代碼中充斥著無效注釋,還認為自己寫的注釋多么規范、多么專業。忠實奉行大師理念的很多人,會走到另外一個極端,就是沒有注釋或者很少注釋,實際上在沒有讓函數名符合我說的“擁有無須解釋的關聯”標準之前,不寫注釋就是一種災難!
3.為什么寫《敏捷軟件開發原則模式實踐》一書的作者鮑勃大叔,會在書里提到如下兩條原則:接口隔離、依賴倒置?
我的理解:接口隔離就是,把接口函數命名為結果而不是實現方式,這樣多個類之間就能做到無須解釋,只看接口函數名就能無二義性地彼此明白。
依賴倒置就是,作為客戶代碼(即調用其他接口的代碼),應該在“我”的地盤定義“我”要使用一個什么東西(接口),而不是由這個接口的實現者去定義它給客戶提供什么,這就是倒置。這樣才能做到無須解釋,因為接口是客戶定義的,它能清晰地知道它想要什么結果。
這兩個原則,本質上與我前文提到的“層次的縱向維度,擁有無須解釋的關聯”的是一個理念。你看到這里一定會發現,我的一個這觀點能包含Martin
Fowler和鮑勃大叔兩個人的三個觀點,這說明什么?這說明很多道理都是相通的,它們的根也許都是一個,就看誰能挖出那個根!
注:如果想了解接口隔離、依賴倒置原則的詳細內容,請自行參閱相關書籍,本文只講我個人的深層理解。
4.很多人以為面向對象比面向過程高級,要徹底拋棄面向過程。話雖然可以這么說,但內涵遠遠不是這樣。
本文提到的三條核心理念,實際上都是面向過程的方式,是函數之間的調用關系。雖然我們都認為面向過程弱爆了,但是我們看到了本文提出的三個理念,其實都是面向過程的核心理念。我自己分析出來這些核心理念之后,就發覺自己曾經低估了面向過程。而面向對象如果沒有面向過程這個根基,就只能是水中月、鏡中花!
更深入一層,面向對象的每一個切面都是一個面向過程,而對象卻是另外一個維度的事情,關于面向對象與面向過程的更深入討論,我會專門寫文章。
【結束語】
為什么很多人都不喜歡給別人講課?是因為他給別人講的東西里,根本沒有熠熠發光的點,他自己講過之后也沒有任何提高,只是為了應付工作而已,當然沒有樂趣可言。
本文所講的三個理念,可以應用到很多領域:上下級溝通、知識培訓、用戶手冊、程序員寫代碼。具體的使用技巧,以后我會再寫文章專題講解。
----------結束----------
作于2017-4-15。
我的相關文章:
《快人十倍的秘訣:一個初學者和一個資深者的對話:融會貫通續》