在最近的某一個關於敏捷軟體開發的課程中,參與課程的學員向我提出了一個時常會被問到的問題:「在搭檔編程(Pair Programming)中,投入兩個人的工作時間,同時間卻只有一個人在撰寫程式,如此一來豈不是浪費時間以及生產力呢?」但明白搭檔編程的特性的人都會知道,雖然是兩個人同時在撰寫同一份程式,但是因為兩人搭檔,分別從不同的觀點出發,考慮不同面向的議題,可以達到互補的作用。經由這種方式寫下的程式碼,因為有了更為周詳的思慮,所以品質較好,其中所含的程式臭蟲也可能較少。

程式碼不只是要寫完,還要有品質
此處有個關於生產力的迷思,真正的生產力評估基礎是有效、可用的程式碼,光只是寫下程式碼,並不見得有真正的意義。例如,你的程式碼可能有為數不少的臭蟲,或許從外表上來看,你是「寫完」了程式,但實際上,一旦開始測試程式,其中的問題便會一一浮現,而你可能要花上許多時間才有可能修正其中的問題──修正的時間甚至可能多於撰寫程式的時間。根據以往的經驗,投入程式除錯的時間往往和撰寫程式碼本身相當,甚至可達數倍之多。

一般的情況下,專案會基於所謂的人時(man-hour)或人月(man-month)來做為評估程式碼被開發的速度。人們會假設它們和實際產出呈線性的關係,也就是,所投入的人數或時間和程式碼的具體產出成正比。當然,如果人是一成不變的機器,而撰寫程式也像堆磚頭的工作一樣的規律,那麼或許這個假設即使有所偏差,也不致於太離譜。不過,很可惜的是,撰寫程式碼的是人,人是複雜的動物,人有千變萬化的心理狀態及情緒,而做為撰寫程式碼的程式設計者所面對的工作,其複雜度,有時候相較於人本身,亦不遑多讓。

改善程式撰寫工作效率的方法
程式設計者的生產力充滿了太多變因,我們卻習慣性地誤以為,時間是唯一支配具體產出的因素,這使得類似加班的活動在軟體開發活動中大行其道。在過去,針對「加班」不見得會帶來正面效果已經有過不少討論。不論是專案經理或程式設計者本身,在試著透過加班的手段來提高產出的同時,或許因為這個手段在短期內太有效了,所以忽略了或許還有其他足以改善生產力的方式。接下來,我想試著討論一些其他有可能改善程式設計者工作效率,進而提升生產力的方式。

首先,好的工作環境是絕對必要的。這泛指實體的工作環境,以及非實體的工作環境。實體的工作環境指的是像辦公室中的硬體設施。程式設計者並不需要華麗的裝潢或高貴的家具,事實上,簡單樸素、確實有用、滿足需求才是重點。

像極限編程(eXtreme Programming)中,由於必須採取搭檔編程,所以必須適合兩個人同時坐在一塊作業,太小的桌子或隔間,就不適合搭檔編程。關於軟體開發工作的實體環境搭配,在《Peopleware》這本書中有不少著墨。透過改善的硬體,創造出讓程式設計者更利於撰寫程式的環境,進一步提升程式設計者工作效率,是許多人沒有想像過的方式。一張坐起來舒服的椅子、一只能夠快速且無礙地輸入的鍵盤、一隻操控靈活的滑鼠,都能加快程式設計者開發步調、提升工作效率。

現在已經有不少公司逐漸開始重視這個議題,有些公司甚至配備每位程式設計者兩個大螢幕,方便他們同時檢視、編寫程式碼及執行測試程式。這些硬體配備,會在無形中一點一滴地節省程式設計者寶貴的時間,最後當然能夠提升工作效率。不論是從管理面或者是程式設計者本身,都能夠為實體工作環境的改善而努力。

有效的工作時間與專注程度有關
相較於實體的工作環境,非實體的工作環境指的則是工作的型態。對程式設計者而言,關於工作型態最重要的一點,便是「專注」。程式設計者工作有一個特性,便是在開始撰寫程式時,必須經歷過一段類似「暖身」的階段,才能真正進到工作的情境裡頭,而在進到工作情境裡頭之後,才能開始寫下有效的程式碼。一旦離開這個工作情境,就得再次「暖身」,花費一段時間及力氣之後,才能重新再進到這個適合工作的狀態之中。如果一名程式設計者在一天中,或是一天的上午、下午能夠專注的只處理一項工作,那麼只需要「暖身」一次,其餘的時間便都是有效能投入撰寫程式的時間。但如果一名程式設計者,必須同時處理多項工作,便有如多工作業系統般的「Context Switch」,得在多組工作情境中來回切換、不斷地重新暖身,有效的工作時間當然也會大幅降低。

許多扮演安排、指派程式設計者工作角色的人,往往會忽略掉多工對於程式設計者工作效率的傷害。當然,就像作業系統一樣,能夠多工處理多項工作,利用率(utilization)看似比較好。但是,程式設計者做為一個多工的系統,在Context Switch時所付出的額外代價,可是遠比電腦作業系統來得高上許多。當你安排一名程式設計者必須同時處理多項工作,而無法讓他在一段時間內專注在同一項工作時,就必須意識到必須在工作效率上有所犧牲了。

「專注」對程式設計工作來說,其實是愈來愈難能可貴。程式設計者不僅要面對被安排同時間要面對多項任務,而這些任務可能是必須被交錯著處理之外,讓程式設計者本身不專注的誘惑,事實上也愈來愈多。

人能一心多用,但要花更多時間切換工作狀態,才能收心
還記得在DOS的時代,由於是單工作業系統,所以同時間在電腦上只能執行一項工作。當我們在撰寫程式時,就只能在電腦上撰寫程式,沒法子同時間做兩樣以上的事情。因此,寫起程式來,大多都能夠維持專注的狀態,因而保有純粹的生產能力。

但是,當多工作業系統逐漸普及之後,我們在電腦上可以同時間做很多事情,某種程度來說,這也便利了我們撰寫程式:我們可以同時檢閱API文件、編修程式碼,還可以執行測試程式。但是,外在的誘惑也透過這多工,慢慢地侵蝕到程式設計者的開發生活中,尤其在網際網路發達、各種千變萬化的應用陸續和人們的生活結合在一塊密不可分之後,這些會造成分心的誘惑,更是深植在許多程式設計者的生活中。

我們每天打開電腦,Email 程式、MSN 即時通程式、還有各種瀏覽器上的應用,像是Plurk、Twitter、Facebook通常也就一併跟著打開。有些人甚至還要開個開心農場,關心一下菜園的發展和進度。可以想見的,好不容易從牛棚暖身好,等著要上場應戰時,突然朋友從 MSN 傳來一則訊息,總不好意思不聊個一下吧?好不容易結束了早晨的小聊,接著 Twitter 上又看到一則有趣的消息,點下鏈結原來是一則影片,工作……也得等影片看完再來做呀!不知不覺,時間就在這些活動中,以及不斷的Context Switch中流失,但工作進度往往沒有太多的進展。

有些人認為XP中的搭檔編程某一方面,也因為降低了程式設計者這些分心的活動(兩個人一起撰寫程式,總不方便回覆私人訊息吧?),反而提高了專注的程度,當然也就提升了許多工作上的效率。

專欄作者

熱門新聞

Advertisement