熊節(jié)
2009年,在為《重構(gòu)》第1版的中譯本再版整理譯稿時(shí),我已經(jīng)隱約察覺行業(yè)中對“重構(gòu)”這個(gè)概念的矛盾張力。一方面,在這個(gè)“VUCA”(易變、不確定、復(fù)雜、模糊)橫行的年代,有能力調(diào)整系統(tǒng)的內(nèi)部結(jié)構(gòu),使其更具長期生命力,這是一個(gè)令人神往的期許。另一方面,重構(gòu)的扎實(shí)功夫要學(xué)起來、做起來,頗不是件輕松的事,且不說詳盡到近乎瑣碎的重構(gòu)手法,光是單元測試一事,怕是已有九成同行無法企及。結(jié)果,“重構(gòu)”漸漸成了一塊漂亮的招牌,大家都愿意掛上這個(gè)名號,可實(shí)際上干的卻多是“刀劈斧砍”的勾當(dāng)。
如今又是十年過去,只從國內(nèi)的情況而論,“重構(gòu)”概念的表里分離,大有愈演愈烈之勢。隨著當(dāng)年的一線技術(shù)人員紛紛走上領(lǐng)導(dǎo)崗位,他們樂于將“重構(gòu)”這塊漂亮招牌用在更寬泛的環(huán)境下,然而基本功的欠缺,卻也一路如影隨形。
此時(shí)轉(zhuǎn)頭看Martin Fowler時(shí)隔將近廿載后終于付梓的《重構(gòu)》第2版,我不禁感嘆于他對“微末功夫”的執(zhí)著。在此書尚未成型之前,我和當(dāng)時(shí)ThoughtWorks的同事曾有很多猜測,猜Fowler先生是否會(huì)在第2版中拔高層次,多談?wù)勗O(shè)計(jì)乃至架構(gòu)級別的重構(gòu)手法,甚或跟隨“敏捷組織”“精益企業(yè)”的風(fēng)潮談?wù)劷M織重構(gòu),也未為不可。孰料成書令我們跌破眼鏡,F(xiàn)owler先生不僅沒有拔高,反而把工夫做得更扎實(shí)了。
對比前后兩版的重構(gòu)列表,可以發(fā)現(xiàn):第2版收錄的重構(gòu)手法在用途上更加內(nèi)聚,在操作上更加連貫,更重視重構(gòu)手法之間的組合運(yùn)用。第1版中占了整章篇幅的“大型重構(gòu)”,在第2版中全數(shù)刪去。一些較為復(fù)雜的重構(gòu)手法,例如復(fù)制“被監(jiān)視數(shù)據(jù)”、塑造模板函數(shù)等,第2版也不再收錄。而第2版中新增的重構(gòu)手法,則多是提煉變量、移動(dòng)語句、拆分循環(huán)、拆分變量這樣更加細(xì)致而微的操作。這些新增的手法看似簡單,但直指大規(guī)模遺留代碼中最常見的重構(gòu)難點(diǎn),正好補(bǔ)上了第1版中闕漏的細(xì)節(jié)。這一變化,正反映出Fowler先生對于重構(gòu)一事一貫的態(tài)度:千里之行積于跬步,越是面對復(fù)雜多變的外部環(huán)境,越是要做好基本功、邁出扎實(shí)步。
在《重構(gòu)》第2版里,重構(gòu)手法的細(xì)節(jié)被再度打磨,重構(gòu)過程比之第1版愈發(fā)流暢。細(xì)細(xì)品味重構(gòu)手法中的前后步驟,琢磨作者是如何做到行為保持的,這是能啟發(fā)讀者舉一反三的讀書法。以保持對象完整重構(gòu)手法為例,第1版中的做法是在原本函數(shù)上新添參數(shù),而第2版的做法則是先新建一個(gè)空函數(shù),在其中做完想要的調(diào)整之后,再整體替換原本函數(shù)。兩相對比,無疑是新的做法更加可控,出錯(cuò)時(shí)測試失敗的范圍更小。
從這個(gè)視角品味一個(gè)個(gè)重構(gòu)巨細(xì)靡遺的做法,讀者大概能感受到重構(gòu)與“刀劈斧砍”之間最根本的分歧。在很多重構(gòu)(例如最常用的改變函數(shù)聲明)的做法中,F(xiàn)owler先生會(huì)引入“很快就會(huì)再次修改甚至刪除”的臨時(shí)元素。假如只看起止?fàn)顟B(tài),這些變更過程中的臨時(shí)元素似乎是浪費(fèi):為何不直接一步到位改變到完善的結(jié)果狀態(tài)呢?然而這些臨時(shí)元素所代表的,是對變更過程(而非只是結(jié)果)的設(shè)計(jì)。缺乏對過程的精心設(shè)計(jì)與必要投入,只抱著對結(jié)果的美好憧憬提刀上陣,遇到困難就靠“奮斗精神”和加班解決,這種“刀劈斧砍”不止發(fā)生在缺乏審慎的“重構(gòu)”現(xiàn)場,又何嘗不是我們這個(gè)行業(yè)的縮影?
是以,重構(gòu)這門技藝,以及Fowler先生撰寫《重構(gòu)》的態(tài)度,代表的是軟件開發(fā)的匠藝——對“正確的做事方式”的重視。在一個(gè)浮躁之風(fēng)日盛的行業(yè)中,很多人會(huì)強(qiáng)調(diào)“只看結(jié)果”,輕視做事的過程與方式。然而對于軟件開發(fā)的專業(yè)人士而言,如果忽視了過程與方式,也就等于放棄了我們自己的立身之本。Fowler先生近廿載對這本書、對重構(gòu)手法的精心打磨,給了我們一個(gè)榜樣:一個(gè)對匠藝上心的專業(yè)人士,日積月累對過程與方式的重視,是能有所成就的。