2008年12月8日 星期一

轉: 無所不在的Context Switch

蔡學鏞大哥寫的這篇文章真的是太好了!!因此和各位分享一下...
如果有看過peopleware這本管理經典著作的話, 裡面有提到很多讓工程師分心所帶來的後果之實例。

作者:蔡學鏞

有時候電腦忽然慢下來,這時候打開「工作管理員」(Task Manager),你會驚訝地發現,怎麼有這麼多莫名其妙的「常駐程式」正同時在執行?其中一個罪魁禍首程式佔用了CPU將近百分之百的效能,難怪你的Visual Studio忽然變得這麼慢。

不僅電腦中有許多常駐程式,會來中斷我們的重要程式,我們現實的生活中,也有許多例行與非例行的事項,佔據我們一天中大多數的時間,讓我們做事的效率不彰。可能是沒有結論的無聊會議、可能是一通女友撒嬌的電話、可能是MSN上沒有意義的寒暄、合作廠商禮貌性的拜會、或者行政人員對於你請款單據的刁難。這些都會讓你的工作產能大減。

你知道,將這些亂七八糟的事情摒除於外,絕對可以省下許多時間寫程式,也就不需要天天加班了!但是你可能不知道,你因此省下的時間,不只是這些雜事的時間,還包括了「進入流」的時間。

心理學家發現一種「高度專心與高生產力」的心智狀態,稱之為「流」(flow)。進入流的狀態,需要約15分鐘(0.25小時)的時間。你可以把「進入流」的時間,比喻成CPU進行Context-Switch時的Overhead。

二十多年前,《Peopleware: Productive Projects and Teams》一書,就已經開始提醒我們,程式員寫程式時遇到外來干擾,對生產力的傷害有多大。總而言之,如果你想提升你的程式生產力,你可以全面檢視一天中有哪些Context-Switch,然後盡量避免。

假設有一個程式員,中午休息一個小時,上下午的上班時間各3.5小時。那麼他處於高生產力的時間,大約是3.5 – 0.25 + 3.5 – 0.25 = 6.5 小時。假設一天中被電話等雜事中斷10次,每次都花費6分鐘(0.1小時),則高生產力的時間變成 6.5 – (0.1+0.25) * 10 = 3小時。降低的幅度相當驚人。每次6分鐘的打擾,都會造成 6+15 = 21分鐘的損失。

每一次的注意力轉移,都需要耗費15分鐘才能回到之前的流狀態。所以大多數的程式員,很難在白天上班時有很高的生產力。有許多程式員喜歡在晚上(或下班後)寫程式,正是因為半夜的干擾比白天少很多,所以產能比較高。

程式員要如何避免來自辦公室的干擾?大部分的程式員都沒有獨立的辦公室,只有小方塊,所以很難避免干擾。以前在上班時,我就常常幻想要把辦公室小方塊隔板加高,蓋上屋頂,加個滑動門,成為一個1.5 x 1.5 x 2 立方公尺的「辦公包廂」。我還想加個造型煙囪,兼具透氣的目的。如果真有辦公包廂,應該就可以阻隔相當多來自辦公室的干擾。

許多程式員習慣上班時戴著耳機,當進入耳朵的聲音變得可以預期(例如音樂),大腦可以將它變成白色噪音(white noise),而主動過濾掉。但是我覺得一整天都戴著耳機,耳朵其實會不舒服。加上長期使用耳機會造成聽力衰退,而現代醫學認為,聽力衰退是無法復原的,所以戴著耳機似乎不是好作法。我後來嘗試著改用耳塞,覺得效果還不錯。

Instant Messenger(IM)軟體也常常會造成工作的干擾。我工作時,盡量不開IM,或者設定成忙碌。有些人很白目,對我的「忙碌」狀態置之不理,找我進行不重要的對話,這種人就會被我封鎖。除了IM,電話也常常是干擾的來源。

上述的這些干擾,是我們可以輕易地察覺的,但是有一類干擾,是編程語言與開發工具造成的,也會造成Context-Switch,使得程式員的生產力降低,但是卻少有人注意到。

有些編程語言和開發工具,需要你進行自我測試、除錯、編譯、連結的冗長動作,讓你離開真正具有高生產力的流。大部分這類的語言,都是編譯式、低階、傳統的語言。

Script語言顯然就比較沒這個問題。許多使用Script語言的人都會覺得生產力很高,開發的時間可以比傳統的語言快上許多倍。一方面是因為Script語言很高階,可以用比較簡短的程式碼,做出很多事;另一方面,有問題可以立刻修改,不需要形成中斷而離開「流」。

即使是傳統的語言,也可以藉由開發工具的幫忙,減少離開流,而改進開發效率。例如六七年前的IntelliJ就顯然比當時其他Java IDE更能夠減少Context-Switch,生產力更高,所以馬上成為最受歡迎的Java IDE之一。

請注意:有些行為很容易被誤認為是干擾,但其實是有助於生產力的。例如,很累時,可以起身走動,到辦公室外面的Starbucks買咖啡,但是腦筋依然保持原來的Context,繼續思考,不要進行Context-Switch。當身體在動作時,血液循環加快,腦筋似乎會更清晰。

在走路的時候,盡量不要被沿路的事情所分心,也不要和他人交談,因為這些都會造成Context-Switch。不過你可得小心,因為我有好幾次在去買咖啡的路上,差一點因此被車撞到呢!為了避免Context Switch,而造成主機損毀是不值得的。

沒有留言:

張貼留言