01 故事總有個開始
周五晚七點,王老板走進坐滿猿類的辦公室,磁性的嗓音響徹在空氣中「明天周六全體加個班,公司來了位新技術總監,明兒大家給他接個風」。
底下議論紛紛,但并沒有反對的聲音,畢竟大家還有一個半月的工資扣在老板手里。
老板走后,不知誰吱了個聲「噯,聽說新技術總監是老板遠房親戚,東北搞房地產崩盤跑路到公司避風頭」。
我嘴角微微揚起繼續埋頭鍵盤,公司的風言風語由來已久,也算不錯的茶飯談資。保潔大叔收走桌上喝完的Coco奶茶杯,我才發現今兒的保潔阿姨換了人。
「我她老伴兒」。大叔從我眼神里看出了端倪,慌忙解釋。
「32行少個縮進」他語出驚人,收走我垃圾的手指停留在我15寸的mac大屏上,我目瞪。
「唉~我兒子跟你同行,天天就拉著我看他這玩意,看著看著就熟了」。他好似發現氣氛有些不對勁,撓撓頭踟躕踱出辦公室,臉上掛著一抹歉意的笑。
02 技術總監
周六一點半,全員到位,畢竟大家都惦記著老板手里拖欠已久的銅板。
「我先自我介紹下吧」兩點鐘老板沒出現,保潔大叔出現在會議室。劇情跌宕,機智如我已然感覺事情好像有些稍稍不妙。
「如你們說,年輕時的確做了九年工頭」說這話時,保潔大叔意味深長的看向躲在角落的小李,眼神帶著點王之蔑視。「你們的事,老王和我說了,你們的情況我也了解了,今兒兩個事」
「互相認識下,順便說幾個故事」「再就是老王他不好意思說出口的事,我給大家交個底」他輕描淡寫,大家心里一緊,老王請個包工頭過來果然目的不單純。
「大家可以叫我老周,周扒皮的周。這樣,今兒不說技術,我說幾個故事」他說完,大家基本已經對工資不指望了
03 編碼規范
「以前我工程隊上,有個小伙叫二狗,做起工來又快又穩,農村蓋房主結構他一個人完成簡直就小兒科。技巧嫻熟,甚至可以不看工程圖,這樣的小伙子慢慢成了我的得力干將。」他停頓半拍,有些惋惜的氣息圍著他轉了轉。
「工程隊越做越大,慢慢我們做到了城里,拿下一政府大工程。本來是件大喜事,地標剪彩那天副市長都到了。那時候的自己,感覺所有的光環加身也不過如此」有些同事有些聽不下去,開始埋頭敲著代碼。
「承重梁倒塌,死了兩個人,承重梁半塊磚的誤差,二狗建它的時候沒看工程圖。我蹲了兩年,狗子在隔壁牢里一年半。刑滿釋放的時候狗子哭得稀里嘩啦跪在我門前,額頭扣在地上咣咣響。我不怪他,我整整想了兩年,這是我人生的轉折。」敲代碼的那幾個同事這時已經抬起頭,感同身受。老周說完,會議室爆發出熱烈的鼓勵性質的掌聲。
「所以,我昨兒看到你們,就想起這些事,規矩太重要!」程序員們已經完全被他感染了,紛紛點頭默認。
「IF單行邏輯不加大括號」
「文件流不關閉,沒有finally處理」
「一大段邏輯幾千個字符寫到一行里?」
「取個方法名叫earthFlatLine,地平線?取個out2Empty外太空好不好?」
「一個工程里面又是GBK,又是UTF-8,GB2312還來打打醬油」
「幾萬行的工具類,全是首列對齊」
「你們的POJO類啊,屬性全都是public?別人問你借你對象去春個游行不行?」
「數據庫操作我看你們該加事務的不加事務,又沒有手動異常回退處理」
… ...
「看到你們,我就想起那根承重梁!」老周一口氣說出了幾十條,面紅耳赤,最后用他包工頭的口吻總結陳詞。大家仿佛在看一個天外來物,我們這個半吊子創業公司,之前的CTO從來沒和我們說過這些。我偷偷的環顧四周,程序員那種特有的技術宅氣質在這一瞬間仿佛在這一個小會議室里爆棚。
我看著這個工程隊出身的保潔大叔,我也不那么確定以后是該叫他聲老周還是周總。
04 設計模式
「接下來,我跟你們談談我們那時建樓房的故事哈!」一場說下來,會議室的氣氛已經完全是一種斗志昂揚的感覺,老周悲傷的情緒轉換相當迅速,現在他的狀態是亢奮的。
「就說說設計模式吧!」
「以前的工程,開發商一個樓盤十幾個區域,承包給不同的工頭,工頭間吵得死去活來的情況比比皆是,主要還是資源競爭太大,資源共享不及時」
「想想看我玩兒程序也就是從那時開始,找了幾個大學生,弄了個簡單版的資源管理系統,完美解決了開發商和包工頭之間的資源共享和調度問題。你們說這么個任務管理系統,就好像是我們這些個工頭唯一的老大,是不是就是你們所說的“單例”?」他說這些的時候似乎有些得意,特意頓了頓。「其實,當時我們留了點后門,掌握了很多一手的資料」
是呀,老周的這個房產任務管理系統,可不就是為了解決資源和性能的損耗,也方便各個資源間通訊的單例雛形么?我不得不佩服他的眼光,也著實為他來源于生活的比喻暗暗叫好。
「還是說說二狗!那小子真的太靈光了。隨著我們接的活越來越多,有一天二狗跑來和我匯報“周哥,你有沒有發現,咱接的這些個活兒呀,多數浴室和廚房組織結構都差不多?”」
「他這一句話,點醒夢中人。那天開始,我讓狗兒把所有的廚房浴室臥室陽臺等結構分類匯總,咱們做了個樣式庫,狗兒直接根據這些個分類造了多個模具,原本很復雜的工程,通過模具快速成型生產。客戶需要什么類型,咱們就拿出對應的模具,直接生產。生產完了之后再把他們組合形成不同風格的廚房浴室。就這樣,那段時間我們的工程隊,效率和質量都足足甩下其他人一大截。」他娓娓道來,一口氣祭出好幾個大招。
復雜的工程用模具的形式呈現,這不正是Property原型模式的完美應用?
廚房浴室臥室陽臺這些個用程序語言來說都屬于不同的接口,他們對外的服務模式就好比是一個大型的抽象工廠,對他們來說雖然只是幾個造廚房、造浴室、造臥室、造陽臺的動作(方法),卻因為狗兒整理的全量分類匯總,成了一個個具體的工廠方法組成。廚房、浴室、所有的這些部分都是一個個獨立的工廠,但都在他們的服務模式里向外提供。
然后再到具體工廠方法的實現,他們根據客戶不同的需要,進行不同模具的組合拼裝,然后形成各個區域獨立的風格,這不正體現著組合模式么?
「這些弄完后,事實卻沒有按照我們發展的軌跡走。我們提供出去的詳細分類的方案圖,偏向于工程制圖,客戶看不懂,并不買賬。這不我找了當時中央美院的表哥,把我們的工程方案分類圖白描成室內設計圖給客戶,這才把我們推向了神壇。」
因為供需的不平衡,老周在他的施工隊還用上了適配器模式,臺下的小弟們也只能用眼神表露出大大的服。
老周越講越來了興致,看著他在臺上的樣子,我突然覺得保潔大叔和包工頭都是他的偽裝,技術大拿這次用在他身上并不為過。
05 重構
「其實,我們最巔峰的時候,是在2000年前后。那時我們是國內首個技術外包的團隊。我們的業務越做越大,但核心的團隊實際并沒有擴張,這個時候你們老板老王給了我很大的幫助。他剛剛留學歸來,看到我們的情況,當即建議我們把非核心業務外放。」
「要知道當時房地產的各個環節,那都是滿滿的暴力,讓我們割肉出去,我當時的想法就是瘋了。那之后,老王給我們劃出一個模型,把我們的業務拆分成數個大的環節:競標、采購、設計、施工、檢測、交付,他的建議是所有的環節都外放,我們只需要打造品牌,也就是你們所說的模板!這個風險很大,相當于把我們之前的團隊結構完全重構掉,但他是我多年的朋友,在這一點上,我無償的相信他」他眉頭舒展,仿佛在說一個愛情故事。
「我們詳細的制定了各個環節的職能職責和計劃,將工程的各個階段劃分為一個個的職責鏈,緊密的串聯在一起。同時每個職責鏈里邊,制定了多個順序化的可行方案,也就是你們所說的一個個的命令。我們團隊的重心完全轉移,只關心各個不同的招標項目需要哪些職責鏈的搭配和哪些職責鏈命令的組合調度(模板模式),所有安排好了之后再到市面上二次招標,進行具體環節執行者的確定。這樣子,我們通過模板、責任鏈、命令的方式,進行原團隊的重組,很幸運,這次之后我們的品牌一炮而紅,這都少不了老王對我們團隊的重構。」
的確,老周的口述,讓我看到了一大坨屎一般的邏輯經過重構后變得如此清晰靈活,它挽救一個臃腫的超大型項目。
06 演員
「所以,老王這次找我,我就來了。他說讓我當你們的技術總監,但說白了我到現在還是個帶著濃厚土包子氣息的包工頭。至于錢嘛,他現在給不出了,我也就免費給他打工了。」老周終于說出了他今天要表述的重點,我突然察覺這劇情貌似有點套路,可機智如我的人太少,程序猿們情商的曲線都有點奇怪。
「我今天就說到這吧!明天大家正常上班吧,我們要走的路還很長!」角落里那幾個頹廢的程序猿,好像瞬間打了雞血,持續亢奮。我看出來,這個新來的技術總監,不簡單。
第二天,我和大家一樣,連敲鍵盤的速度都超速12分。
那天,我再也沒見過那個保潔大叔。我一直想單獨問他一句「總監,這是不是你的套路?」
-END-