天天看點

專訪熊節:程式設計其實是個社會活動

重構20年,有人說Martin Fowler改變了人類開發軟體的模式,這一點也不過分,從《分析模式》《UML精粹》《領域特定語言》,到這本《重構》新版可以看得出來,他的每一本書都是軟體開發人員必備的案頭讀物。此前他參與的“靈活宣言”,更是引領了整個行業對靈活開發的認識,一直到現在。

2009年,熊節在為《重構》第1版的中譯本再版整理譯稿時,他已經隐約察覺行業中對“重構”這個概念的沖突張力。

如今又是10年過去,隻從國内的情況而論,“重構”概念的表裡分離,大有愈演愈烈之勢。随着當年的一線技術人員紛紛走上上司崗位,他們樂于将“重構”這塊漂亮招牌用在更寬泛的環境下,例如系統架構乃至組織結構,都可以“重構”一下。然而基本功的欠缺,卻也一路如影随形。當年在對象中的刀劈斧砍,如今被照搬到了架構、組織的調整。于是“重構”的痛苦回憶又一遍遍重演,甚而程度更深、影響更廣、為害更烈。

此時轉頭看Martin Fowler時隔将近廿載後終于付梓的《重構》第2版,熊節說:“我不禁感歎于Fowler先生對‘微末功夫’ 的執着。在此書尚未成型之前,我和當時ThoughtWorks的同僚曾有很多猜測,猜Fowler先生是否會在第2版中拔高層次,多談談設計乃至架構級别的重構手法,甚或跟随‘靈活組織’ ‘精益企業’的風潮談談組織重構,也未為不可。孰料成書令我們跌破眼鏡,Fowler先生不僅沒有拔高,反而把工夫做得更紮實了。”

今天小編非常有幸邀請到了《重構》 (第2版)譯者熊節老師,來聽聽他的所思所想。

專訪熊節:程式設計其實是個社會活動

熊節

在IT行業已經打拼了18年,在金融、零售、政府、電信、制造業等行業的資訊化建設方面有着豐富經驗,是中國IT業靈活浪潮的領軍人物。熊節擁有利物浦大學MBA學位。

異步社群:熊老師已經是異步的老朋友了,目前在做哪些項目,可以聊聊嗎?

熊節:我去年離開了效力十幾年的ThoughtWorks,加入了寶尊電商,目前在分管寶尊電商的成都研發中心。靈活的思想正在不斷下沉到大量的國内企業,寶尊的IT也在進行着靈活的轉型。用靈活思想幫助國内企業提升響應變化的能力,從過去到現在一直是我關注的問題。

異步社群:時隔20年再次翻譯《重構(第2版)》一書,是什麼感覺?心态有很大的轉變嗎?為什麼?

熊節:可以說有轉變,也可以說變化不大。2008年《重構(第1版)》再版加印的時候,我有一個觀察:國内真正采用重構技術的團隊和個人,其實比例很小。雖然這本書有好幾十萬甚至上百萬的讀者,但更多的讀者是葉公好龍。這個觀察,到今天其實變化也不大,大部分團隊和個人仍然處在沒有測試、沒有持續內建、不敢也不能重構的狀态。對這種情況,我的悲觀态度比起2008年來也沒有什麼改變。

不過在這十多年裡,我也看到一些團隊、一些個人真的從《重構(第1版)》中學到了東西,踐行了其中的思想和實踐,并且收到了好的效果。于是我的心态又增加了樂觀的一面,我會想再多做一些重構的普及工作,多影響一些人學到好的程式設計方式。例如第2版的另一位譯者林從羽,雖然很年輕,但是受重構思想的影響很深,也很堅定地在踐行。這樣的年輕人讓我感到,做這樣的普及工作還是有意義的。雖然對整個行業的影響微乎其微,至少可以影響到一些人。

異步社群:重構思想在國内發展史是怎樣的?可以分享一些細節嗎?

熊節:2001年12月的《程式員》雜志用十多頁的篇幅介紹重構,這是國内的出版物首次介紹這個技術,當時負責這些内容的技術編輯就是我。後來随着極限程式設計叢書、《靈活軟體開發》的出版,2003年由我和侯捷老師翻譯的《重構》出版時,我當時認為靈活、極限程式設計、重構的理論基礎已經齊備了,國内的行業應該很快能采納這些新的技術、新的方法。

然而事實證明我太樂觀了。當時的中國IT大環境,對高品質、響應變化沒有太高的要求,整個行業都滿足于不做自動化測試、沒有持續內建的很原始的工作方式,重構的土壤是不存在的。到2008年,對重構感興趣的團隊和個人并不多。這可能也是當時機械工業出版社沒有續簽《重構(第1版)》版權、人民郵電出版社接手再版的原因。

2008年以後,随着網際網路浪潮的到來,以及通信行業大規模向靈活轉型,重構(和其他靈活實踐一起)開始真正受到了重視,《重構》這本書也開始成為很多程式員的案頭書。但是說實話,重構及其對單元測試的要求,對于一般的團隊和個人來說,難度太大了。2010年以後,國内的靈活浪潮開始轉向Scrum,重管理實踐、輕技術實踐,很多團隊和個人也就心安理得地把重構束之高閣了。

異步社群:本書作者Martin Fowler曾說“任何一個傻瓜都能寫出計算機可以了解的代碼。唯有能寫出人類容易了解的代碼的,才是優秀的程式員。”您認同嗎?為什麼?

熊節:100%認同。

關于“程式設計到底是個什麼活動”這件事,我跟很多人有分歧。很多人認為程式設計是個科技活動,但是我始終認為,以調用API和簡單的循環、條件邏輯為主,大多數日子裡四則運算都用不全(主要是除法不怎麼用——多謝鄭晔的梗),這樣的工作硬要說它是個科技活動,我覺得很牽強。

我一直認為,程式設計其實是個社會活動。一方面,程式員要把自然語言說出來的需求翻譯成機器能運作的機器語言;另一方面,翻譯出來的結果(也就是代碼)還要支撐團隊(包括技術和非技術的團隊)不斷地在它基礎上協作和交流。前者(即“翻譯”這一步)是很基礎也很簡單的,用鄭晔的話來說,“四則運算都用不全”,也就是傳說中找個高中生來教育訓練幾天就能幹的活。然而實踐證明,找個高中生來教育訓練幾天,是做不好軟體的。問題出在哪兒,就因為程式設計的大挑戰不是把代碼寫出來,而是要在代碼的基礎上建立有效的多方溝通。

當然,話不能說得太死。有沒有真正屬于科技活動的、把代碼寫出來本身就很困難的程式設計任務呢?是有的。但大部分(我保守點說吧,90%以上)程式員日常面對的是不是這樣的任務呢?我覺得不是。90%的程式員在90%的時間面對的任務,還是四則運算都用不全的、以溝通和翻譯為主的任務。我們應該謙卑地認識到這一點,并且誠懇地采納能把這種任務做好的工作方式。

異步社群:有人說“重構代表了一種觀點,是解決問題的一種方法論,是每個程式員寫代碼的必備技能”,您怎麼看待?

熊節:一方面是我前面說的,大部分人在大部分時候處理的程式設計任務,本質上是個溝通活動,那麼溝通就會有溝通不暢的情況,需要不斷調整自己的溝通方式,找到好的溝通方式,讓溝通的另一方(可能是業務的代表,可能是以後維護代碼的人,可能是使用API的人,等等)能更好地了解。

另一方面,現在大家都在說這個時代是“VUCA”(易變、不确定、複雜、模糊)的,都在說要擁抱變化。那麼到底要怎麼擁抱變化,很自然的答案就是要降低變化的成本,不能每次要修改就造成破壞。怎麼能修改而又不造成破壞呢?第一是要有測試,第二是要有靠譜的修改方法,這兩點恰恰就是重構的思想。是以我完全贊同,每個程式員都需要掌握重構的技能,否則他/她的工作方式就會跟不上時代的要求。

異步社群:《重構 第2版》與第一版相比有哪些變化?這本書您最想推薦給誰看?

熊節:很多人說,《重構》第二版跟第一版相比最大的變化是舉例所用的程式設計語言從Java變成了Javascript。但其實這不是一個非常重要的變化。作者展示的重構手法在各種主流的面向對象語言中基本上都可以通用,并且也沒有太特别的Javascript語言特性。

在我看來,第二版最大的變化是變得更加務實了。這種務實感展現在幾個方面:

第一是增加了一些顆粒度更小的重構手法;

第二重構的做法有所改進,更加注重行為保持;

第三是删去了第一版最後對“大規模重構”的介紹。

我覺得,Martin Fowler這種腳踏實地的态度是很值得欽佩的。我們這個行業裡,有太多高舉高打的浮誇,缺的是腳踏實地做好一件件小事的工匠精神。

我認為所有程式員都應該讀《重構》,應該把壞味道清單背下來。缺乏這個基本知識,就無從談論代碼壞在哪裡,更無從說改進了。

異步社群:您曾說:“我已經隐約察覺行業中對“重構”這個概念的沖突張力”為什麼這樣說?

熊節:就是我前面說的葉公好龍的問題。所有人都喜歡說“重構”這個概念,但是很少人真的花精力把重構的基本功練紮實。這也折射我們這個行業的現實情況,吹漂亮話的人多,沉下心把一招一式練紮實的人少。

異步社群:您認為國内做的最好的重構案例是哪個?為什麼?

熊節:我不知道這樣的案例。

我有次跟朋友說到,重構是一個悖論:會重構的人,會把測試做到位,把持續內建搭建好,随時留意壞味道,随時重構,是以他根本不需要跟人說他在重構。跟人大張旗鼓講重構、甚至把重構變成一個“案例”的,基本上可以肯定,他不會重構,他在打着“重構”的大旗瞎搞。

異步社群:在ThoughtWorks工作的經曆給您最大的收獲是什麼?

熊節:最大的收獲大概就是見到了、經曆了很多不同行業、不同類型的軟體系統和項目,然後明白了一個道理:軟體都是一樣的,寫好代碼的方法都是一樣的。很多人會說“我們這個行業很特殊你這套方法擱我們這兒都不适用”,我在十多個不同的行業裡每次都聽人這麼說,聽多了就明白,這些都是扯淡,都是懶人給自己找借口。

異步社群:從2010年《重構》出版一直到現在,軟體行業對這種重構方法越來越接納,請問背後的根本原因是什麼?在這樣的過程中,代碼重構的實踐方法有沒有發生變化?

熊節:我不覺得行業對重構方法越來越接納。整個行業而言,我們最常看到的還是“刀劈斧砍”,做出修改的時候過于樂觀,沒有測試、沒有認真考慮行為保持的修改過程,出了問題就靠加班來解決。大家隻是越來越接納“重構”這個詞,因為這個詞聽起來很好,有一種積極應對變化的感覺。但真正在做的,還是跟以前一樣,毫無規矩的修改。

大家願意接納“重構”這個詞,我想是和時代背景相關的。現在大家都在說VUCA、都在說擁抱變化,有這麼一種能響應變化的方法當然好。但是這個方法,實際做起來又太費腦子,大多數人隻是喜歡這個概念,并沒有真的去學習和實踐如何做測試、如何重構。

重構的實踐方法其實一直就沒有變化。我以前在ThoughtWorks的同僚王健總結了一個口訣:“舊的不變,新的建立,一步切換,舊的再見”。如果我們去看具體的重構手法如何實作,很多時候都是這個套路。放在以前沒經曆過的變更場景(比如把系統架構由單體變成微服務),也是這個套路。

但這個套路有一個最大的難點,就是在“一步切換”之前,你會有“舊的”和“新的”兩個東西存在,那麼就會有一個或長或短的時間段,你需要同時維護這兩個東西。這是有成本的。如果“一步切換”沒有出錯,這個成本就丢掉了。很多人非常樂觀,會覺得我做這個修改一步就修改完了不會出錯,是以他們就不願意接受這個“舊的不變,新的建立”的過程。

盲目樂觀和缺乏事後吸取經驗教訓的能力,這是我們這個行業普遍的現象。從改一個函數名,到改一個服務接口,到改一個架構,我們總會看到這種盲目樂觀說“一下就改好了”的人,然後這次他出錯了,下次他仍然會說“一下就改好了”。人們願意盲目樂觀相信這次不會出錯,願意出錯之後通宵加班,也不願意平時把測試做好、修改的時候選擇一條行為保持的路徑。在這一點上,我們這個行業相比十七年前,沒有任何進步。

異步社群:最後,給剛入門的小白推薦3本專業書,您最想推薦哪一本?

熊節:一本的話,我覺得應該讀《實作模式》。我經常看見号稱七年八年經驗的程式員,起個變量名都起不好。我覺得一個程式員至少應該先讀《實作模式》,或者至少應該先讀《實作模式》的第6章,否則應該禁止他程式設計。

三本的話,那就《實作模式》、《重構》、《測試驅動開發》吧。

從來不推薦什麼“道”啦什麼“禅”啦什麼“思想”啦之類的。中國IT業的現實是能把代碼寫順暢的人都太少。我們應該謙卑地直面這個現實,然後誠懇地做點實在的事情,不要成天就想着變成Linus。

專訪熊節:程式設計其實是個社會活動

作者:馬丁·福勒(Martin Fowler)

《重構:改善既有代碼的設計(第2版)》

本書是經典著作《重構》出版20年後的更新版。書中清晰揭示了重構的過程,解釋了重構的原理和最佳實踐方式,并給出了何時以及何地應該開始挖掘代碼以求改善。書中給出了60多個可行的重構,每個重構都介紹了種經過驗證的代碼變換手法的動機和技術。本書提出的重構準則将幫助開發人員小步地修改代碼,進而減少了開發過程中的風險。

- END -​​​​

繼續閱讀