“懶”出效率是程序員的美德
原文 http://www.techug.com/lazy-is-virtue-for-programmer
Perl 之父 Larry Wall 曾說過,程序員的三大美德是「懶惰」、「不耐煩」、以及「傲慢」,其中「懶惰」高居三大美德之首,這一回就讓我們來看看程序代碼設計的懶人之道。
惰性是人類科技持續進步的最大動力
這字面上的「懶惰」,或許叫人誤解,以為這是在暗示好的程序員是因為不愿意盡心投入代碼設計工作,才會想要偷懶,盡量讓自己少做點工作。不過, 能成為卓越程序員的人,幾乎沒有例外的熱愛程序代碼設計工作,對他們來說,程序代碼設計本身就是樂趣所在,只可能深陷于其中無法自拔,而沒有不愿意多寫點 程序代碼的。
我們可以把「懶惰」分為兩種,一種是單純的不想做事,而另一種則是希望盡量少做點事,卻達到一樣的目標。同樣是想要少做點事,后者卻有著截然不同的正面、積極意義。而程序員的「懶惰」美德,也是建立在此種「懶惰」基礎之上。
知名的手機制造商 Nokia 說「科技始終來自于人性」,而這句話中的「人性」其實意味著人性中的需要,所以人們都說「需要是發明之母」,許多有用的科技,都是源自于人性中各式各樣的需求及欲望,而在這些需求及欲望中,想要「偷懶」的念頭,絕對是具有相當重要的地位。
倘若說「懶惰是發明之母」,實在是一點也不為過。人類發明馬車、牛車,就是希望藉由獸力提供額外的動作,好讓人類在交通運輸上能夠更為輕松,這當然完全是出自于「懶惰」的想法。人類之后更發明了火車、汽車、甚至飛機,大幅提升了「懶惰」的程度。
許多工程師絞盡腦汁、苦心孤詣的設計,最終便是希望得到一個讓自己、也讓所有人都能夠偷懶的產物。從這個觀點來看,惰性實在是人類科技持續進步的最大動力。
程序代碼設計的懶人之道──四兩撥千斤
所以說,倘若從正向的角度來解讀「懶惰」,工作偷工減料,其更積極的意義,應該是「以最小的力氣達成目標,同時保持不變的品質,或是提升至更好的品質」。從這樣的定義來看,「懶惰」的確可以做為程序員的美德之首。
程序代碼設計并不是一種單靠認真工作就能夠開花結果的工作。一名程序員的工作成效,往往很難單純地只倚靠工時的長短來評估。
工作時間長的程序員,可能是工作能力出了問題,才會需要花費更多的時間。有許多優秀的程序員,只需要花上少許的時間,就能得到和別人一樣、甚至更好的工作成果,原因之一便在于優秀的程序員懂得如何偷懶,而偷懶的真正意義,是以最小的力氣達到一樣的結果。
程序代碼設計的懶人之道便是四兩撥千斤。施四兩之力,得千斤之結果。掌握這懶人之道,便能掌握提升時間效率以及生產力的關鍵。
懶人善用工具增加生產力
想要偷懶,你可以從許多面向來著手,而第一個會被大家所先想到的,便是開發工具上的輔助。的確,如果你想要偷懶,第一件事便是要試著盡可能地自動化所有的事物。
在程序代碼撰寫的過程中,有太多具重復性、單純只是勞力性質的工作。所有具有規則性的事物,都可以利用自動化的方式,讓工具為我們代勞。例如善用程序代碼的產生器,便可以免去人工撰寫那些機器便有能力產生出來的程序代碼。
又好比一些自動化的建構工具,例如在 Java 社群廣泛被使用的 ANT,便是一套透過讓你描述建構軟件的程序,借以自動化執行此一程序的工具。透過這樣的工具,在建構過程中的許多動作,例如自版本控制系統中取出原始 碼、編譯原始碼、部署至測試環境、單元測試,及寄發測試報告等,都可以輕易地自動執行。
降低人力介入的程度,不僅省時省力,也不易犯錯。此外,許多 IDE 也都提供了像程序代碼自動補全(Automatic Code Completion)、或自動 API 提示的功能,都可以省掉許多打字及查詢 API 文件的時間。
優秀的程序員,多半懂得如何善用各式工具。
盡管許多工具都能提升撰寫程序代碼的效率。但許多程序員都存在著對工具的迷思。并不是每種工具都適合每個程序員,原因在于每個工具的定位不同。 工具并不是威力越強大就越好,你必須挑選適合用途的工具,正所謂殺雞焉用牛刀,殺雞不僅不需要動用到牛刀,用了牛刀,雞反而可能也殺得不好。
懶人運用重構提煉自有的程序代碼庫
真正優秀的程序員并不完全倚靠工具來達到偷懶的目的,事實上,工具所能節省的,往往并不是關鍵,真正的關鍵還是在于程序員自己如何進行設計。
真正偷懶的程序員,會持續地讓自己的設計保持在一種很容易可以偷懶的狀態,也就是說,只需要花費一點點力氣,就能得到自己所需要的東西。這就是我所說的四兩撥千斤。
如何讓自己的設計盡可能的保持在一種很容易可以偷懶的狀態呢?關鍵之一說穿了,還是要讓自己的設計盡可能地可以被重復運用,而且是跨專案的重復 運用。許多專案開發的系統,或許與最終呈現出來的面貌有著很大的不同,但內部會運用的元素,往往都落在一定的范疇之內。化學元素周期表中的元素總數僅有一 百余個,但卻也能組成了我們所見到的無數種物品。
設計出能夠跨專桉重復使用的程序代碼,需要持續重構,并且讓自己的代碼朝著更佳的通用性持續演化。當你在執行重構時,會找出形態相似的程序代 碼,并且利用提煉函式或類別的技巧,將它們以更為通用的型式整理出來。你(或你的團隊)需要建立一個自有的程序代碼庫,放置這些通用的代碼。而且,必須在 專案中持續使用程序代碼庫中的代碼。唯有如此,才能持續考驗它們并且讓它們有演化的機會。
懶人不隨便重新造輪
雖然我鼓勵人們建立自有的程序代碼庫,容納在開發過程中所找出來的通用程序代碼,但卻不鼓勵人們反覆地重造輪子。懶惰成性的程序員,是不會浪費 時間去重新建造輪子的,一定是從既有的輪子中挑選出適用的,再施以最小的力氣,添加一些程序代碼碼,使得所選出來的輪子,能夠順利地接上自己所開發的車 子。
所以,把「懶惰」視為美德的程序員,絕不輕易地重新開發已經存在的東西,而是會盡可能加以利用──尤其是開放源碼的成品,因為這代表你可以自行 加工或修繕的空間較大。現成的產物就是你能夠得到的千斤,而四兩就是你所施加的額外力氣。倘若每個輪子都自己重頭來過,那么施千斤力,或許反而只會有四兩 重的效果。
隨著時間的過程,懶惰的程序員會累積出相當多的資產,這些資產是可以被靈活地運用在各種專案中。懶惰的程序員在面臨一個新的開發需求時,所做的事情,往往不是將程序代碼重頭寫過,而比較像是把可被重復運用的程序代碼,當做積木一般堆積起來,生產力自然大大的不同。
懶惰的最高原則:不浪費力氣在不會發生的需求上
偷懶的程序員更不會犯了設計過度工程化(Over-Engineering)的毛病,因為過度工程化,會浪費無謂的力氣在不會發生的需求上。懶惰的程序員只會專注在面前以及可見的近端未來。
你瞧,偷懶的天性竟會對程序代碼設計帶來這么多的好處,難怪它是那么重要的美德了。
作者簡介:
王建興
清華大學資訊工程系的博士研究生,研究興趣包括電腦網路、點對點網路、分散式網路管理、以及行動式代理人,專長則是 Internet 應用系統的開發。曾參與過的開發專桉性質十分廣泛而且不同,從 ERP、PC Game 到 P2P 網路電話都在他的涉獵范圍之內。