2012年2月12日 星期日

讀書心得: 程式設計師提昇生產力秘笈

More about 程式設計師提升生產力秘笈
原文書名:Productive Programmer
(對岸譯『卓有成效的程序員』,我比較喜歡這個名字。)

「程式設計師提升生產力秘笈」這本書非常有趣,它並不打算教你一套新的程式心法或者尖端技術,他想要做的事情是「扭轉你從小到大操作電腦的習慣」。有一點莫名其妙,不過讀過之後,我發現自己過去的不良的操作習慣,甚至一般人習以為常的操作習慣,的確很浪費時間。

啟動板

啟動板「Launchy」是我打開書後第一個安裝的小工具軟體,而且用了五分鐘後我就愛上它了!平常我們想要啟動一隻程式,例如打開 Word,會怎麼做呢?當然是先把滑鼠移到螢幕左下角點擊「開始功能表」、展開「程式集」、選擇「Office」目錄、最後用滑鼠敲一下程式的捷徑。

這個過程一般人已經習以為常,不以為怪;而啟動版Launchy讓你直接這樣幹:按下Alt+Space叫出啟動板,敲W-O-R-D四個鍵就行了。(甚至只要敲W,啟動版就替你挑出最常用的程式),傳統的方法相較之下簡直是繁文縟節。

這例子很小,但是隱約帶出了幾個本書強調的原則:

第一、用搜尋取代瀏覽。隨著使用電腦的時間越久,應用程式的清單就會越來越長,而長度正好和其用處成反比,清單越長,效率就越低。啟動版可以幫助你跳過這段用眼睛上下找尋瀏覽的時間,保證啟動程式的動作永遠是O(1)。

第二、啟動版可以隔離那些會讓人不小心分心的事物。從你想要啟動某個程式,到程式真的運行起來之間,不會有瞥見一眼就丟掉十幾分鐘的東西,例如 RSS Reader,或者是某個你之前就很有興趣但是一直沒時間看的漂亮網頁。

第三、手不需要離開鍵盤。程序員大多時間都把手放在鍵盤上,滑鼠雖然直覺,但是操作速度上一定沒有鍵盤快,而且手臂在鍵盤與滑鼠之間一直移動也是很令人討厭的事情。

上面提到的這幾項都是書中不斷重複出現的中心思想,用搜尋取代瀏覽,排除讓你分心的事物,鍵盤永遠比滑鼠好,以及最重要的,不要不停的重複做同一件事。

附帶一提,我的桌面現在非常乾淨,只有一個垃圾桶跟幾個常用檔案,因為那些花花綠綠的圖示跟捷徑都不再需要了,呵呵。

漂亮的GUI是效率的障礙

「重複做同樣的事」是軟體開發裡面最嚴重的效率傷害,通常我們把他稱作 D.R.Y (Don't Repeat Yourself) 原則。

不光是程式碼複製貼上存在DRY原則而已,操作電腦的習慣也有DRY。例如重複來回地在兩個視窗之間複製貼上,手動修改一份文件裡的幾十個同樣的格式錯誤,或者在許多目錄之間來回的瀏覽翻找一個檔案都是。

重複動作有雙重傷害:浪費時間,而且會傷害專注力。書裡有幾段話節錄:
『對使用者有生產力的事情(漂亮的GUI、滑鼠、下拉式選單等等)實際上可能是某人試著讓電腦發揮最大效能的障礙。』
『最近幾十年來最大的諷刺之一就是,高手執行日常任務的速度變慢了。往昔Unix的傢伙都比較有效率,因為他們把一切都自動化了。』
我看了很震撼,對於GUI的效率傷害深有所感。回想起之前我剛開始用 CodeIgniter Framework 寫網站的時候,因為一個網頁程式被切成M-V-C三隻檔案,所以我必須一直用滑鼠去點分頁切換檔案,手不斷地在滑鼠跟鍵盤之間移動,這樣重複的操作把我弄得很痛苦,但是我卻從來沒有想過是GUI的問題,不知道從何改善。

現在我開始轉變自己的心態,放開心胸去學習那些以前看起來不太友善的東西。比方說,書裡說道『IDE有大量鍵盤捷徑,全都學!』我就把eclipse快捷鍵全部翻出來作成一份清單放在案前。以前我寫PHPUnit,一個檔案裡總會出現幾十次$this->assertEquals($v1, $v2);,現在我把它編成 Code Template,我現在只要打 aeq+Tab 就會自動展開句子。比方說看起來就很難懂的 vim 、 Regular Expression 還有命令列工具。

我的觀念從原本的基本會用就好,轉為積極的去探究IDE的極限。程序員應該是使用工具的終極高手。只要一件工具能讓你效率倍增,就值得多花時間學習掌握。

電腦是重複工作的能手

我想我被本書影響最大的一點就是對 D.R.Y 原則的敏感程度,由一般人的程度拉高到靈敏有如狗鼻子,每當察覺自己做了同一件事兩三次後,就思考如何讓電腦代勞。書中到處可見一支支用Script Language (Ruby/Python/Perl) 隨手捏成的小程式,作者甚至連每天要固定開啟數個 Excel 檔案都寫成 Ruby 程式。

雖然第一次會多花費一點時間來撰寫Script,但是他的論點很簡單『想出聰明的方法讓任務自動化,可讓你變精明,因為一路上你得學點什麼。』而這個加速的過程是正向循環,越熟悉工具,就能把更多任務自動化,人手熟練有先天的速度極限,而電腦的自動化速度幾乎沒有極限。

這本書的前半段就是一個收集很多技巧的大錦囊,總共有四大原則幾十條內容。總結來說吧,作者認為Unix上操作電腦的方法跟工具很有效,但現今已逐漸失傳,於是作者打算撥亂反正,把這些訣竅重新挖出來分享給大家,而且試圖證明這些訣竅在Win、Mac上一樣可以實現。

後半段則是一系列思考軟體開發的散文集。我很喜歡其中的一篇,用一個漂亮的例子說明TDD不只消極的防止bug,還能積極的影響軟體本身的設計。應用TDD的程式最後會切割成許多很小、不可分割的運算,正好呼應Code Complete裡的優良函數的特性「內聚力強」、「耦合力弱」。有機會我再把後半段也吸收消化成另一篇讀書心得。

這裡有兩篇我認為跟本書呼應的文章,相當值得一看:
Vgod追求神乎其技的程式設計(十): 程式員生產力之謎
軟體開發之建置風險的故事