iThome 網站首載:程式人的時間魔法
我經常在執行教育訓練的時候,詢問學員一個問題:「你們覺得工作的目的是什麼?」當然,這是個因人而異的問題,約莫幾秒後我就會說:「對我來說,工作的目的是在賺取更多的時間!」當然,這也是我個人價值觀下的答案。不過,在程式設計上,如果能認識一些時間魔法,不僅可以避免把時間浪費在類似的事物上,更可以為你贏取更多的時間。
- 認識軟體開發工具箱與平台
開發程式得使用程式語言來描述待解的問題與解法,因此許多程式人多半將焦點集中在語言上,然而語言必須能夠運行在對應的平台上,而這就是軟體開發工具箱(Software development kit)的職責了。許多時候,程式人不斷遇到並花費時間解決的問題,根源於不認識他們所使用的開發工具箱,或者不瞭解執行的平台,每次都浪費時間用殘破資訊僥倖解決問題,這些浪費掉的時間,用來全面瞭解開發工具箱與平台早已綽綽有餘。
論譠上經常出現的戲碼是,如果問題牽涉到許多細節,有些人會建議先閱讀詳細交代來龍去脈的書籍或文件,不少發問者宣稱他們沒有時間,在論譠上發問只希望獲得一個簡單的答案,更大言不慚地聲稱「若有時間看書找答案,還需要上來發問嗎?」這戲碼容易發生在使用開發工具箱或平台指令不正確時,他們以為只要知道正確指令就可以解決問題,事實上可解決問題的指令背後涉及的情境很多,不全盤瞭解,下次場合略換,類似問題又會發生,又再度花費時間去尋找一個殘破的解答。
更多的工具或高階抽象會構築在開發工具箱及平台上,在不瞭解最初的開發工具箱與平台下,運用更高階工具或抽象架構時,就會引發更多五花八門、形形色色的問題,不少程式人頭痛醫頭、腳痛醫腳,更多的問題被寫入系統之中,最終隨著時間的過去,系統上各式問題就成了歷史共業,更多的時間被浪費在殘缺的解決方案上,更多的問題被產生,循環不停地,系統成了消磨程式人時間的大怪物。
- 觀察、顯現與抽取重複性
雖然程式設計要解決的問題各式各樣,然而問題存在著領域的類似性,因此實際上解決方案間存在著不少類似性,所謂的抽象化,無非就是觀察出這些類似性,將重複元素抽取出來,以便將來不用為了類似的東西花費時間撰寫類似的程式碼。觀察、察覺重複性本身就是一種技能,接下來只要將重複性消弭,就可以避免不必要的時間浪費。
物件導向的目的之一就是在消弭重複性,正如我在專欄〈從消弭重複性看封裝、繼承、多型〉中談過,封裝消弭了物件的重複行為,將來需求變更就可集中修改方法,也避免影響客戶端;繼承消弭了類別間的重複定義,將來需求變更就可集中修改父類別,避免花費時間逐一修改各個類別;多型消弭了相同契約物件的重複操作定義,避免為相同契約但不同種類的物件個別撰寫程式。
複製、貼上、修改一下部份流程或變數的這些動作,看似節省時間,實際浪費時間。複製、貼上本身就暗示了具有重複性,現階段你不花費時間消弭這份重複性,將來在需求變化時,就會為他花費更多時間找出所有重複的地方進行修改。我經常在教育訓練時舉的例子是「在這樣的需求下,一萬個類別,不會抽取類別重複性,你就得寫一萬個方法;如果能抽取出一百個父類別,其下各為一百個子類別,運用多型下就只要寫一百個方法;如果這一百個父類別具有的共同行為抽取並定義為介面,在運用多型下,即使一百個父類別間沒有繼承關係,也只要寫一個方法。這就是你可以比別人早下班的原因。」
有時候重複性確實存在,只是並不容易觀察出來,花些時間瞭解一下顯現重複性的手法是值得的。撰寫夠簡短的方法、職責單一的流程是個簡單的開始,撰寫冗長、具複雜職責的程式碼本身就需要時間,日後為他除錯更需要時間,更別說要能夠觀察並抽取出重複性了。強制讓自己別馬上動手撰寫程式也是一個手法,,像是嘗試別去修改變數值,這會強迫你多花些時間在一開始的程式構思,但會減少你日後花費在維護上的時間。重構手法也是在顯現程式碼的重複性,重構過程並不增加新功能,看似浪費時間,然而實際上是避免你日後耗費更多時間,甚至是避免你日後前功盡棄。
- 用文件取代記憶
程式設計中有觀念也有許多的細節,解決問題的過程中,也會留下一些經驗,然而對人腦來說,時間會沖淡一切。如果程式人經常使用某些工具或語言,那麼關於他們的記憶要消逝就沒那麼容易;實際上許多時候,我們必須同時或頻繁轉換語言或工具,有些曾經運用過的語言工具,假以時日回頭又要運用時,往往就遺忘得差不多,又得花時間重新回顧當初尋找過的相關資料,以與腦海中薄弱的記憶做連結。
在運用語言或工具的過程中,適當地用文件來取代記憶,日後要重新連結記憶就會簡單且省時。不少程式人覺得撰寫文件麻煩又浪費時間,其實用文件取代記憶可以是任何形式,只要你願意去撰寫記錄即可,現階段投資些時間留些文件,將來就可少花費更多時間重新連結記憶,更何況,日後還可以基於原有文件繼續建立你的知識體系,有了這樣的知識體系,不單只是避免時間浪費,更為你產生更多的時間。
文件中多少也記錄了當時撰寫文件的自我,回顧過往文件的程式人,往往都會有看到不成熟自我的感受,因而對一些過去犯下的錯誤也更有體會,更能避免在未來的程式設計中重現。近來我也試著將文件放上版本控制系統,避免因文件不斷修正內容,而抹去了過去不同時期自我程度的記錄,不稍多說,版本控制系統本來是為程式碼版本控管而設計,瞭解並使用它也是程式人在程式碼上控制時間的方式之一。
- 投資時間以獲取更多時間
前面談到我在訓練中常會講到的玩笑話:「這就是你可以比別人早下班的原因。」不過我總會再告訴學員:「如果你今天聽物件導向這幾個觀念會感到吃力,那代表你過去學其他物件導向語言時,不曾花過時間好好瞭解過這些觀念,因而不管你學過任何支援物件導向的語言,每次都只是在這上頭浪費時間。」
時間魔法並不是時間管理術,要教你如何善用每日的24小時,而是告訴你如何投資時間。你可以投資時間在建立完整的知識體系,而不是頻頻獲取片段不全的資訊;你可以多投資時間在觀察、顯現與抽取重複性上,避免那些重複性在後續維護上浪費你的生命;若想凡走過必留下痕跡,用文件取代記憶會是更具體可行的一種方式。
回過頭來看一開頭的問題:「你們覺得工作的目的是什麼?」對我來說,工作的目的是在賺取更多的時間!工作上的金錢收入,是為了讓我活下去,也就是為了擁有更多時間,有了這種觀念,在面對工作上每個問題時,我總會想著如何在解決的同時,贏取更多的時間,這樣的想法套用在程式設計上,也可以發掘出更多時間魔法。人們大多關心工作可以帶來多少金錢,卻鮮少關心工作可以帶來多少時間!然而就如金錢投資得宜可以贏得更多金錢,時間投資得當其實可以贏得更多時間。