Perl之父Larry Wall曾說過,程式人的三大美德是「懶惰」、「不耐煩」、以及「傲慢」,其中「懶惰」高居三大美德之首,這一回就讓我們來看看程式設計的懶人之道。

惰性是人類科技持續進步的最大動力
這字面上的「懶惰」,或許叫人誤解,以為這是在暗示好的程式人是因為不願意盡心投入程式設計工作,才會想要偷懶,盡量讓自己少做點工作。不過,能成為卓越程式人的人,幾乎沒有例外的熱愛程式設計工作,對他們來說,程式設計本身就是樂趣所在,只可能深陷於其中無法自拔,而沒有不願意多寫點程式的。

我們可以把「懶惰」分為兩種,一種是單純的不想做事,而另一種則是希望盡量少做點事,卻達到一樣的目標。同樣是想要少做點事,後者卻有著截然不同的正面、積極意義。而程式人的「懶惰」美德,也是建立在此種「懶惰」基礎之上。

知名的手機製造商Nokia說「科技始終來自於人性」,而這句話中的「人性」其實意味著人性中的需要,所以人們都說「需要是發明之母」,許多有用的科技,都是源自於人性中各式各樣的需求及慾望,而在這些需求及慾望中,想要「偷懶」的念頭,絕對是具有相當重要的地位。

倘若說「懶惰是發明之母」,實在是一點也不為過。人類發明馬車、牛車,就是希望藉由獸力提供額外的動作,好讓人類在交通運輸上能夠更為輕鬆,這當然完全是出自於「懶惰」的想法。人類之後更發明了火車、汽車、甚至飛機,大幅提升了「懶惰」的程度。

許多工程師絞盡腦汁、苦心孤詣的設計,最終便是希望得到一個讓自己、也讓所有人都能夠偷懶的產物。從這個觀點來看,惰性實在是人類科技持續進步的最大動力。

程式設計的懶人之道──四兩撥千斤
所以說,倘若從正向的角度來解讀「懶惰」,工作偷工減料,其更積極的意義,應該是「以最小的力氣達成目標,同時保持不變的品質,或是提升至更好的品質」。從這樣的定義來看,「懶惰」的確可以做為程式人的美德之首。

程式設計並不是一種單靠認真工作就能夠開花結果的工作。一名程式人的工作成效,往往很難單純地只倚靠工時的長短來評估。

工作時間長的程式人,可能是工作能力出了問題,才會需要花費更多的時間。有許多優秀的程式人,只需要花上少許的時間,就能得到和別人一樣、甚至更好的工作成果,原因之一便在於優秀的程式人懂得如何偷懶,而偷懶的真正意義,是以最小的力氣達到一樣的結果。

程式設計的懶人之道便是四兩撥千斤。施四兩之力,得千斤之結果。掌握這懶人之道,便能掌握提升時間效率以及生產力的關鍵。

懶人善用工具增加生產力
想要偷懶,你可以從許多面向來著手,而第一個會被大家所先想到的,便是開發工具上的輔助。的確,如果你想要偷懶,第一件事便是要試著盡可能地自動化所有的事物。

在程式撰寫的過程中,有太多具重複性、單純只是勞力性質的工作。所有具有規則性的事物,都可以利用自動化的方式,讓工具為我們代勞。例如善用程式碼的產生器,便可以免去人工撰寫那些機器便有能力產生出來的程式碼。

又好比一些自動化的建構工具,例如在Java社群廣泛被使用的ANT,便是一套透過讓你描述建構軟體的程序,藉以自動化執行此一程序的工具。透過這樣的工具,在建構過程中的許多動作,例如自版本控制系統中取出原始碼、編譯原始碼、部署至測試環境、單元測試,及寄發測試報告等,都可以輕易地自動執行。

降低人力介入的程度,不僅省時省力,也不易犯錯。此外,許多IDE也都提供了像程式碼自動補全(Automatic Code Completion)、或自動API提示的功能,都可以省掉許多打字及查詢API文件的時間。
優秀的程式人,多半懂得如何善用各式工具。

儘管許多工具都能提升撰寫程式的效率。但許多程式人都存在著對工具的迷思。並不是每種工具都適合每個程式人,原因在於每個工具的定位不同。工具並不是威力越強大就越好,你必須挑選適合用途的工具,正所謂殺雞焉用牛刀,殺雞不僅不需要動用到牛刀,用了牛刀,雞反而可能也殺得不好。

懶人運用重構提煉自有的程式庫
真正優秀的程式人並不完全倚靠工具來達到偷懶的目的,事實上,工具所能節省的,往往並不是關鍵,真正的關鍵還是在於程式人自己如何進行設計。

真正偷懶的程式人,會持續地讓自己的設計保持在一種很容易可以偷懶的狀態,也就是說,只需要花費一點點力氣,就能得到自己所需要的東西。這就是我所說的四兩撥千斤。

如何讓自己的設計盡可能的保持在一種很容易可以偷懶的狀態呢?關鍵之一說穿了,還是要讓自己的設計盡可能地可以被重複運用,而且是跨專案的重複運用。許多專案所欲開發的系統,或許最後呈現出來的面貌有著很大的不同,但內部會運用的元素,往往都落在一定的範疇之內。化學元素週期表中的元素總數僅有一百餘個,但卻也能組成了我們所見到的無數種物品。

設計出能夠跨專案重複使用的程式碼,需要搭配持續重構,並且讓自己的程式碼朝著更佳的通用性持續演化。當你在執行重構時,會找出形態相似的程式碼,並且利用提煉函式或類別的技巧,將它們以更為通用的型式整理出來。你(或你的團隊)需要建立一個自有的程式庫,放置這些通用的程式碼。而且,必須在專案中持續使用程式庫中的程式碼。唯有如此,才能持續考驗它們並且讓它們有演化的機會。

懶人不隨便重新造輪
雖然我鼓勵人們建立自有的程式庫,容納在開發過程中所找出來的通用程式碼,但卻不鼓勵人們反覆地重造輪子。懶惰成性的程式人,是不會浪費時間去重新建造輪子的,一定是從既有的輪子中挑選出適用的,再施以最小的力氣,添加一些程式碼,使得所選出來的輪子,能夠順利地接上自己所開發的車子。

所以,把「懶惰」視為美德的程式人,絕不輕易地重新開發已經存在的東西,而是會盡可能加以利用──尤其是開放源碼的成品,因為這代表你可以自行加工或修繕的空間較大。現成的產物就是你能夠得到的千斤,而四兩就是你所施加的額外力氣。倘若每個輪子都自己重頭來過,那麼施千斤力,或許反而只會有四兩重的效果。

隨著時間的過程,懶惰的程式人會累積出相當多的資產,這些資產是可以被靈活地運用在各種專案中。懶惰的程式人在面臨一個新的開發需求時,所做的事情,往往不是將程式碼重頭寫過,而比較像是把可被重複運用的程式碼,當做積木一般堆積起來,生產力自然大大的不同。

懶惰的最高原則:不浪費力氣在不會發生的需求上
偷懶的程式人更不會犯了設計過度工程化(Over-Engineering)的毛病,因為過度工程化,會浪費無謂的力氣在不會發生的需求上。懶惰的程式人只會專注在面前以及可見的近端未來。

你瞧,偷懶的天性竟會對程式設計帶來這麼多的好處,難怪它是那麼重要的美德了。

作者簡介:
王建興
清華大學資訊工程系的博士研究生,研究興趣包括電腦網路、點對點網路、分散式網路管理、以及行動式代理人,專長則是Internet應用系統的開發。曾參與過的開發專案性質十分廣泛而且不同,從ERP、PC Game到P2P網路電話都在他的涉獵範圍之內。


Advertisement

更多 iThome相關內容