如何編寫簡潔代碼?(上)
原創(chuàng)作者:袁慎建
聲明:本故事幾乎屬虛構(gòu),適合程序員和非程序員~
篇首語:「話語簡潔,意圖自攜」說的是,干脆利索的表達更容易有效傳達意圖。當你聽一個說話啰里啰嗦的人講話時,腦細胞會消耗更多,這種不愉快的消耗會引發(fā)本能腦的反抗。自然而然就降低了你專注傾聽的欲望,請相信這不是你的問題,而是對你講話的人要改進的方面。
域冗余
“什么!我寫的代碼也會講話?” 清揚驚訝地大聲叫起來。
剛?cè)肼毑坏?個月的清揚特別熱愛學習,每周五下午的學習時刻,她一定會纏著他的Buddy袁帥探討整潔代碼。
這不,倆已經(jīng)到了公司年會現(xiàn)場并入座,還在探討著。袁帥剛要說點什么,被主持人清脆悅耳的聲音給打斷了。
“尊敬的各位來賓和領導,歡迎來到思特沃克2019年會現(xiàn)場,我很開心也很榮幸能主持年會,首先請允許我代表大家邀請思特沃克全球CEO果總、思特沃克中國區(qū)總經(jīng)理彰總... 思特沃克內(nèi)訓團隊Head卓老師...”
袁帥皺起了眉毛,湊到旁邊同事的耳旁:“主持人是哪位同事呀?”“不知道,沒見過呢,好像聽說今年從外面雇了一個職業(yè)主持人。”
“難怪...” 袁帥若有所思地端坐直,但還是眉頭鎖緊,這幅表情被清揚抓了個正著,調(diào)戲道:“人家主持人真是風光了得喲,上個月征集主持人你不報名,現(xiàn)在嫉妒了吧!”
“誒,你有沒有覺得剛才主持人那段開場介紹有什么不對勁的地方?” 袁帥絲毫沒有受到挑釁,故意挑起清揚的興趣。經(jīng)這么一問,本來沒覺得有什么不正常的清揚警覺了起來,“嗯... 好像是有點不對勁,但說不上來。”
“如果主持人不是內(nèi)部同事,”袁帥一句話剛擠出了半句,清揚就跟發(fā)現(xiàn)新大陸似的:“啊,我發(fā)現(xiàn)了!她在介紹人名時總是帶上「思特沃克」這個前綴,外部職業(yè)的主持人,應該是習慣使然吧。”
“小鬼不錯啊,這么機靈!”。
“現(xiàn)在有請思特沃克全球CEO果總上臺發(fā)言,掌聲有請!” 主持人好像聽到了他倆談話,再次用行動證實了清揚的發(fā)現(xiàn)。他倆也為CEO送去了陌生而熟悉的掌聲,內(nèi)斂的CEO僅用了1分鐘就結(jié)束了自己的發(fā)言。
在掌聲還未消散前,袁帥給清揚拋出了一個問題:“你要是主持人,你會怎么講?” “廢話,我肯定不會帶上多余的「思特沃克」前綴,本來就是咱們公司內(nèi)部的年會。”
“是的,咱們寫代碼的時候也很容易犯這樣的小糊涂,來,我寫幾段給你看看?!?袁帥早有準備地從背包里抽出A4紙和鉛筆手寫了幾段斷碼:
清揚瞅了一會兒就開始說:“在「ParkingLot」這個域的限定下,「parkingCapability」這個屬性中前綴parking就是一個「域冗余」,更簡潔的命名可以是「capacity」。「parkCar」這個方法也存在域冗余,使用「park」命名就好?!?說罷,她從袁帥手里搶過鉛筆改了一版:
袁帥給清揚豎起了大拇指,這讓清揚有點得意,她嘚瑟起來:“哼,這種冗余我在代碼庫見太多了!” 只見她嫻熟的寫了一個用于操作User對象的資源庫類「UserRepository」:
袁帥也很清楚冗余的地方,由于紙張寫不下了,但他心里有明確的思路:“方法「queryUsers」、「queryUser」和「updateUser」中的User后綴屬于「域冗余」,可以使用如下命名方式來區(qū)分”:
清揚領會到袁帥的意思了,這次她秉著真心學習而非調(diào)侃的口吻問了袁帥:“這種冗余代碼還真不少呢,但冗余有聽起來很寬泛,有沒有一個更合適的名字來向別人傳遞它呢。”
清揚的口吻讓袁帥內(nèi)心頗為感動,他很認真地思考了好一會兒才不緊不慢地講:“「域冗余」。什么意思呢?域,泛指一個特定范圍,比如常說的領域、區(qū)域中的域。在代碼中,工程、模塊、包、類、方法都是不同級別的域。模塊處在工程的域中,包處在模塊的域下,類處在包的域中,成員變量和成員方法處在類的域中?!赣蛉哂唷箘t是指在一個明確特定的域下,重復使用父級域的名稱來做額外的修飾?!?/p>
清揚此刻對袁帥那種純真不屑的眼神,此刻褪去了幾分不屑,但依然純真。
“有請內(nèi)訓團隊Head卓老師上臺為講師們頒獎” 聽到主持人的邀請,倆眼神不約而同相視后會心一笑,因為聽出來主持人的這段話鬼使神差般地消除了域冗余「思特沃克」。
碼尾禪
卓老師為臺上可愛的講師們頒獎合照之后就下去了,只見主持人讓其中一名講師留步聊聊這一年作為講師的感想。也不知道主持人是不是故意的,把跟袁帥有過較多合作的技術(shù)大拿吳柳巖留了下來,讓袁帥沒想到的是柳巖這么一個不愛講話的技術(shù)直男也在組織需要的時候挺身而出。
“額,那個我叫柳巖,額... 我來自國內(nèi)華北交付團隊,我是一名DEV,來Thoughtworks有7年多了。那個我平時一直在做交付,然后也特別感謝今年內(nèi)訓團隊提供了一個不一樣的機會,那個也讓我有機會去嘗試不一樣的事情......”
看到袁帥眉頭微微緊鎖,清揚心里猜到他在想什么,“包大人,您是不是又發(fā)現(xiàn)什么貓膩啦?” 說完一副古怪精靈的眼睛直盯著袁帥,“小鬼少來!”袁帥頓時表情放松地笑了起來。
“口頭禪這個東西,往好里說,它代表了一個人的特色,能夠讓人留下一些深刻可能奇怪的印象。還可以被當做思維緩沖器?!痹瑤浖傺b一本正經(jīng)的開門見山了。
“往不好里說,有點多余,容易誘導聽眾注意力放在講者的口頭禪上了。” 清揚迅速接過話茬,直接把袁帥想說的下半句搶先講出來。
“你看,咱們在各種正式和非正式的場合經(jīng)常聽到「然后、那么、那個、這個、額...」,要是非得給口頭禪加個罪名也有點過了,大多數(shù)情況下它的存在對溝通帶來的副作用也不大,只是如果沒有這些下意識的習慣用語,會讓整個表達顯得更加精簡流暢,提升聽眾體驗和溝通的效果。”
清揚這次沒有搶話,而是邊聽邊開始在第二張A4紙上寫起了代碼,不一會兒抬起頭來略微得意道:“代碼的表達也存在這種現(xiàn)象,有些人總在業(yè)務概念命名后加個「Info」或者「Data」后綴,比如「ContactInfo,PolicyInfo,PersonData」,這種加在代碼末尾的我稱之為「碼尾禪」。同理,類似加在命名之前的前綴也屬于這種,加在前面的碼頭禪相對少見。”
清揚的一番言論讓袁帥自豪感油然而生,頗有名師出高徒的味道,也不知道是酒過一巡還是自豪感使然,他有點飄飄然,伸手拿來清揚剛才寫的代碼手稿,看得入迷:
“砰!” 清揚手持高腳杯有意加大了力度碰在袁帥的杯子上,袁帥這才從發(fā)呆狀回過神來,繼續(xù)在酒過N巡的道路上前行著。
層錯綜
“我覺得內(nèi)訓師要扮演好三個角色,首先,內(nèi)訓師應該是一名知識沉淀者,其次,內(nèi)訓師應該扛起文化傳播的旗幟,做一名文化傳播者,最后,內(nèi)訓師要充當組織潤滑劑,也就是高效協(xié)調(diào)者。
作為知識沉淀者,內(nèi)訓師除了自身的專業(yè)業(yè)務知識的積累,還應該根據(jù)組織的發(fā)展需要,提取業(yè)務部門的知識和經(jīng)驗,并將其沉淀成方法論和框架體系,讓組織的知識和經(jīng)驗得到高效復制和傳播,助力員工知識儲備和技能成長。
作為文化傳播者,內(nèi)訓師面對的是企業(yè)中的新、老員工,你的一舉一動,一言一行都在向員工傳遞著某種內(nèi)在的文化信息。你的認知理念是否符合企業(yè)文化,你的言行舉止是否符合企業(yè)文化,這都將很大程度影響被你培訓過的學員,所以你得深刻理解企業(yè)文化,并身體力行,以身作則。
作為組織潤滑劑,你要幫助多個不同的業(yè)務部門去做人員培養(yǎng),在業(yè)務部門和職能部門之間,你需要優(yōu)先根據(jù)組織發(fā)展的需要,去協(xié)調(diào)優(yōu)勢資源,解決高優(yōu)先級業(yè)務部門的問題,同時也要兼顧其他部門的發(fā)展需要,做好資源協(xié)調(diào)和沖突協(xié)調(diào)。”
袁帥雖然剛加入內(nèi)訓不久,卓老師的這番激情言論讓他心潮澎湃,他很認同這三個角色的比喻,也暗自許諾要在內(nèi)訓好好干出點成績。
除了文字中的精神,袁帥也贊嘆其結(jié)構(gòu)如此清晰,邏輯順序非常自然,一開始道明3個角色,然后逐個角色深入介紹,一個簡單的先總后分結(jié)構(gòu)彰顯出來。
此時,他有點潸然淚下,因為想起了自己剛畢業(yè)那會兒,去找別人時,講話結(jié)構(gòu)混亂,東一句西一句的,講了一兩分鐘別人都聽不懂他要表達什么。后來在Thoughworks,經(jīng)過很多同事直言不諱地反饋,袁帥逐漸克服了這個問題。久病成良醫(yī)加上薄弱的舉一反三能力,袁帥把這個道理運用在寫代碼上了。
恰巧清揚最近在讀《金字塔原理》,袁帥想考一考她,當然不是溝通表達,而是代碼。他拿起手機找到之前拍的一張代碼照片遞給清揚:“嘿,最近《金字塔原理》咋樣了,剛聽了大姐大的發(fā)言,你有什么新發(fā)現(xiàn)嗎?”
清揚興奮地接受了挑戰(zhàn),不過讓她不解的是,明明在說《金字塔原理》和表達,但給她的卻是一片代碼:
“意圖導向編程!” 沒想到清揚這么快就說出了關(guān)鍵詞。
“可以啊,你也看過《敏捷技能修煉:敏捷軟件開發(fā)與設計的最佳實踐》這本書?” 袁帥故作驚訝。
“何止看過,當時就是這個意圖導向編程讓我一知半解,正好今兒你幫我解解惑。”
聽到清揚的請教,酒過三巡的袁帥這次假裝正經(jīng)地關(guān)切道:“哦,哪里不懂呀?”
“作者說這樣寫代碼叫意圖導向編程,難道我從一開始一行一行的寫這些細節(jié)過程,不是按照我的意圖嗎?”
“確實,你要寫的代碼和你要說的話都是你意圖想表達的內(nèi)容,要說你一行一行的寫不合符意圖導向有點冤枉,我談談我的理解哈?!?袁帥喝了口水杯中的熱水,往清揚靠近了一些:“如果我講話一上來長篇大論各種細節(jié),你聽了會有什么感受?”
“煩躁!” 清揚不假思索地蹦出兩字。
“那讀這樣的代碼的呢?” 袁帥趁勢追擊。
“一樣啊,心里還會吐槽這是哪個二貨寫的!” 清揚呆萌的表情把袁帥逗笑了,因為他想到了清揚打開Git提交記錄看到提交者是她自己的畫面。
“對的,你可能需要花很多精力和注意力去了解這些代碼的意圖,而且也容易看了后面忘了前面,迷失在細節(jié)里。那如果我把這大段代碼做一層抽象提煉,提煉成三個功能步驟,每個步驟給它一個貼切的名字,你感覺會怎么樣?”
“我就很方便就明白作者意圖了,而且不容易迷路?!鼻鍝P反應很敏捷。
“是呀,這樣你就很快獲知作者的整體意圖,就可以大大節(jié)省你的時間,當你需要了解細節(jié)的時候,再進入到某個步驟?!?/p>
“所以說,意圖導向是提倡用更高效的方式表達代碼意圖咯!” 清揚若有所悟地補充道。
“基本上說對了,要做到高效,就要優(yōu)先傳達更高抽象層次的意圖,而且同一個地方抽象層次應當保持在一個層級上,然后逐層往下,越往下就會越具體,也就是越細節(jié)?!?/p>
“難怪,有些人一開口,聽眾如沐春風(意圖明朗,結(jié)構(gòu)清晰),有的人一開口,聽眾痛不欲生(陷入細節(jié),苦苦掙扎)。而介于這之間的一開口,聽眾會不知所措(層次結(jié)構(gòu)交叉混亂)?!?清揚很得意自己的總結(jié),順手舉杯跟袁帥碰了一下,但她沒注意到袁帥此時愧疚地低下頭,他有點內(nèi)疚當年剛畢業(yè)的自己給別人帶來了不少困擾。
“作者也提到這種方式僅僅是思考方式和編碼順序不同。但作者說這個基本不會增加工作量,可怎么覺得我用這種方式的時候就很花時間呢?” 清揚有點像在自言自語。
“意圖導向編程得結(jié)合結(jié)構(gòu)化思考和呈現(xiàn),方才讓代碼講得一席受歡迎的話”
“編程高手不是能夠快速寫出可用代碼的人,而是能夠快速寫出別人一眼就能看懂的代碼的人(整潔可用)”
“編程高手更多比拼的是底層勝任力,如何分解問題,如何抽象提煉,這些都不是一朝一夕能練成的”
“編程是藝術(shù)表演,不是打字游戲”
在一連串地感慨后,袁帥覺得自己喝的不是酒,而是思想。此刻,酒過四巡的袁帥已然無力思考,望著臺上的節(jié)目表演,思緒不知去向。
“幸運獎二等獎,袁帥!” 主持人話音剛落,清揚尖叫著跳起來,把思緒飄飛的袁帥驚醒,然后一股力量“托”著他飄到領獎臺。
今年年會,他不再因獎品感到寂寞......