高壓力,似乎是一般社會大眾對於程式設計工作的普遍認知。時常可以看到有人在談論成為一名好的程式設計師的必要條件,幾乎都包括了必須承受高壓力,抗壓性必須要強。壓力彷彿是程式設計工作中必然會存在的產物。這一次,我想談談在程式設計工作中和壓力相關的種種議題。

談到程式設計工作的壓力,首先你會想到什麼?我想大多數人的腦中會先閃過的第一印象,應該就是開發時程的壓力吧。在軟體開發這個行業裡,時常可以看到無法準時交付的產品或專案。但無法準時交付的影響因素很多,例如評估每項工作所需時間及人力的方法或經驗不夠好,造成預估失準。或者像是低估了工作中隱含的風險,使得風險發生時,影響了工作的進度,等等。或許也有因為程式員偷懶或者能力不足才造成專案時程的延遲,但這種情況在現實生活中,反而可能是少數。

但可以想見的,即使預估不夠準確,各方人馬(使用者、業務人員、客戶、老闆)還是會希望開發專案能如期完成。那麼,這個預估和現實之間的落差,就必須倚靠程式設計者在必須紋風不動的期限內投入更多的心力,才能夠填補,而這就成了一個重要的壓力來源。

最怕表面上準時交付,卻只是交出地雷般的程式碼
對於時程預估的失準,不同的專案經理會有不同的因應之道,有人會面對現實,調整時程、縮減範圍,以便依舊能夠準時交付。也有人會施加更多的壓力在程式設計者身上,迫使他們利用類似加班的手段,以便在期限內完成必須完成的事情。當然,也有專案經理不理會這種事情,直接讓專案在期限到時進行一次的大爆炸,接著依情勢看著辦。這三種情況都有可能見到,不過,如果不是進行一些像是縮減範圍、刪去工作的動作,對程式設計者來說,都會構成時程的壓力。

時程壓力有時候是好事,能夠提升程式設計者工作的效率,不過一旦壓力大過於某個臨界值時,就有可能會造成崩潰的現象,程式設計者就有可能採取一些奇奇怪怪的手段,來處理他所面對的壓力。

當程式設計者面臨程式碼可能會來不及在期限內寫完,但期限看起來又是牢不可動時,可能會採取降低品質的方法來應對。

好的程式設計者給他足夠的時間,他會試著寫出沒有壞味道(bad smell)的程式碼,同時也會考慮到將來重複運用的可能性,並且兼顧日後的擴充性及彈性。此外,像各種異常情境的處理,也都會盡可能地撰寫完備。

一旦時間不夠充份,又受迫於時程的壓力,程式設計者就很有可能放棄這些活動,試圖寫出只要能夠過關的程式碼就好了。甚至有些程式設計者在時間十分缺乏的情況下,還會寫出那種似是而非的程式碼,也就是說是,看起來好像真的是那麼一回事,但一些細節可能都不大對勁的程式碼。即使沒有到這麼誇張的地步,也有可能產出的程式碼,只包含了主要情境會通過的執行路徑上的功能,至於那些非主要情境才會通過的執行路徑,也許就留白,或者是加上一行註解,寫著:”TODO”。

因為對程式設計者而言,只要能夠在時間內交出看起來能動的程式碼,如期的闖進測試階段,那麼眼前必須承受的壓力就被釋放掉了。反正,「頭過身就過」。程式碼裡尚存的問題,就等測試人員測試時發掘出來了再說,同時在這過程中看看能否爭取到額外的時間,例如有人進度落後了,自己還可以利用這空檔來填補其實自己沒有完成的部分,責任還順道由別人給承擔掉了。而且,在進到測試階段後,「不告不理」,如果為了逃避壓力而埋進去的地雷,恰好沒有被測試人員踩到,那麼就讓使用者或客戶去踩吧。

可以想見倘若發生這種情況,其實是滿可怕的。但是,誰都不想揹上造成專案延遲的罪名,所以,很多人都寧可表面上宣稱自己都有完成該有的進度。對於這一類的人,有人給了一個專門的稱呼,叫做「Schedule Chicken」。

上有政策下有對策,很多管理者或許以為提高對程式設計者的時程壓力,是很好壓搾生產力的手段,殊不知其實這壓力曲線到了崩潰的點時,就有可能讓程式設計者製造一些表面的假象,來隱瞞進度不如預期的現實。就算程式設計者沒有採取這類的手段,他也可能會受迫降低程式碼的品質,寫下設計不佳,但勉強能夠交差的程式碼──缺乏可重用性、彈性、不易擴充、難以因應需求的變更。

程式設計者用來勉強闖進測試關卡、徒具其形而不具其神的程式碼,通常只會拉長測試、修正的整體時間。而缺乏可重用性、彈性、不易擴充、難以因應需求變更的程式碼,也無助於日後提升開發的生產力。

如果你是一個開發團隊的管理者,打算制定一個十分具有侵略性的時程表,對你的程式設計者施加高壓力,試圖提升工作的效率,那麼,你可能要考慮程式設計者會有的一些光怪陸離的因應之道,也必須考慮,程式設計者被迫降低程式碼品質後,對於整體(包括未來)的生產力的影響。整個換算起來,未必划得來。

及早反映時程趕不上,並與專案經理討論出對策
如果你是一名程式設計者,面對可能不合理的時程壓力,當然採取黑暗面的手段來應對是十分不恰當的。身為程式設計者,還是應該要有那種視自己程式碼為自身光榮的使命感。但這種被強加時程壓力的情況時常發生,倘若要維護身為程式設計者的尊嚴以及光榮,不是選擇提高工作的時數,以便在時間期限內產出品質水平夠的程式碼,就是得尋求他法。

但就像我之前一直強調的,加班這個手段,對於短程的衝刺效果不錯,但倘若長期為之,反而會讓生產力降低。而且,長期加班下的壓力很容易會折損優秀的程式設計者,面對總是十分緊蹦的時程、總是日以繼夜的工作,即使對程式設計有再多的熱情,在這樣的過程中,都有可能受到影響。慢慢的,你或許會覺得,自己不再想從事這行的工作了,而這正是最差的局面。

我的建議是,與其消極的應付,不如積極的溝通。很多程式設計者都有任勞任怨的美德,即使被交付了或許無法如期達成的任務,但心理還是抱著願意努力一試的想法,或者甚至自己心裡也相信,這是可以做得到的,我們可以說是一種樂觀的承諾。但是,專案的進程必須是可以被預估的,最好不要有太多不確定的因素。或許這是出自於程式設計者的美意,但最後倘若無法如期完成,也會造成專案的困擾。

即使被指派的工作可以如期完成,但程式設計者也必須負荷著更大的壓力。適度、適時的壓力是好事,可以讓人成長。但是過度、長期的壓力,對程式設計者絕對不是好事。如果你期待在程式設計領域長期的發展,最好要試著調整所面對的時程壓力到合理的程度。讓你的每一天開發生活都過得愉快,在每天下班結束工作時,也都能期待著明天又能再度坐在自己座位上撰寫程式的那種感覺。這樣子,才能維持你的開發工作的續航力。
對於自己被交付工作的期限,許多程式設計者不懂得,或甚至不好意思向自己的專案經理溝通。事實上,最好的方式還是在工作期限沒有相當把握完成時,立即的反映並且溝通。這一方面固然是降低自己必須承受的壓力,另一方面,也是避免日後為專案製造出驚而不喜之局面的可能性。

專欄作者

熱門新聞

Advertisement