人的工作切換有害無益 Human Task Switches Considered Harmful

作者:周思博 (Joel Spolsky)
譯:Paul May 梅普華
Monday, February 12, 2001
屬於 Joel on Software, https://www.joelonsoftware.com/2001/02/12/human-task-switches-considered-harmful/

在管理一個程式團隊時,第一件要學的事就是任務配置(task allocation)要正確。「任務配置」只是把事情分給大家做的誇大說法。用希伯來文的普通話來說就是「倒檔案」(因為你會把檔案倒在某人身上)。有些事情做得對會得到不可思議的生產力利益,決定哪些檔案要倒在誰身上就是其中之一。反過來沒做好的話可能就會陷入麻煩的狀況,沒有人能做好何任何事情而且大家都抱怨「在這裡什麼事都做不起來。」

由於這是個針對程式師的網站,我要拿個程式設計問題讓你的腦袋動一動暖暖身。

假設你要做 A 和 B 兩件運算要做。每一件都需 10 秒的 CPU 時間。現在你有一顆 CPU,為了簡化問題,所以工作序列中沒有其他東西。

在我們的 CPU 中可以選擇是否用多工處理。所以你可以先做好一件再做另一件。

循序處理

運算 A 運算 B
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

也可以使用多工方式。如果用多工的話可以假設這顆特別的CPU每個工作每次可以執行一秒,而且工作切換完全不花時間。

多工處理

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

你會選哪一種方式呢?大部份人的直覺反應都認為多工比較好。不管哪一種狀況,都得等 20 秒才能兩件運算都完成。不過可以想想單就各件運算來說要多久才有結果。

在兩種狀況下,運算 B(標成藍色)都要 20 秒才得到結果。不過運算 A 的結果在多工時需要 19 秒。可是循序時就只要 10 秒就好了。

換句話來說在這個安排好的例子中,循序處理的每件運算的平均時間比多工處理少(15 秒對 19.5 秒)。(事實上這例子也並不是真的那麼假 - 它是源於 Jared 在工作上必須解決的一個真實問題。)

方法 運算A花的時間 運算B花的時間 平均
循序處理 10秒 20秒 15
多工處理 19秒 20秒 19.5

我剛剛說過「工作切換完全不花時間」。其實在真的 CPU 中工作切換是需要一點點時間的,基本上要足夠儲存 CPU 暫存器的狀態並載入其他工作的 CPU 暫存器。實際上這短到幾乎可以忽略。不過為了讓生活更多樂趣,讓我們假設工作切換需要半秒。現在情況變得更糟了:

方法 運算A花的時間 運算B花的時間 平均
循序處理 10秒 20秒 + 1次工作切換 = 20.5秒 15.25
多工處理 19秒 + 18次工作切換 = 28秒 20秒 + 19次工作切換 = 29.5秒 28.75

現在呢,雖然我知道這有點蠢,不過就算為了讓我高興一下,想想如果工作切換需要一分鐘拿如何?

方法 運算A花的時間 運算B花的時間 平均
循序處理 10秒 20秒 + 1次工作切換 = 80秒 45秒
多工處理 19秒 + 18次工作切換 = 1099秒 20秒 + 19次工作切換 = 1160秒 幾近19分鐘!!

工作切換用的時間愈長,多工處理的代價愈大。

這件事本身不怎麼新奇,不是嗎?不久大概就會有些白痴氣憤地寫信指控我「反對」多工處理了。他們會質問我:「你真的想要回到那種得先結束 WordPerfect 才能執行 Lotus 1-2-3 的 DOS 時代嗎?」

不過那並不是我的意思。我只是想要你同意,在這類例子中:

a) 循序處理會讓結果平均上比較快得到,而且
b) 工作切換需要愈久,多工處理所付的代價就愈大。

夠了,別管 CPU 了,來管管人吧,這有趣多了。這裡的重點在於管理「程式師」時,工作切換會需要很長很長的時間。因為程式設計這種工作必須同時在腦袋裡記很多東西。另外記住的東西愈多,寫程式時生產力愈高。用全速寫程式的程式師腦裡隨時都會記住無數的事情:變數名稱,資料結構,重要的 API,寫過常要用到的輔助函數名稱,甚至存放原始碼的次目錄名稱,一切東西都要記住。如果你把程式師送到克利特島去度假三星期,他所有東西通通都會忘掉。人腦似乎會把東西移出短期 RAM,改存到永遠都讀不回來的備份磁帶上。

要多久呢?嗯,我的軟體公司最近放下手頭上在做的事(開發一套代號 CityDesk的軟體產品),花了三星期去幫助某個客戶處理一個緊急狀況。當我們回到辦公室時,感覺好像要另外三星期才能回復全速製作 CityDesk。

就個人層次來說,你曾經注意過某件事嗎?叫某人做一個工作可以做得很好,可是如果給他兩個工作,他會把其中一個做好卻忽略另一個,不然就是兩件工作都做得很慢,慢到你覺得懶鬼都比他勤勞。這是因為程式設計的工作就是需要很長的切換時間。就我自己來說,當我需要同時完成兩個程式設計專案時,切換時間大概要六個小時。以一天八小時來看,等於說多工處理把我的生產力降到每天只剩二小時。真令人沮喪啊。

同樣的道理,如果你給某人兩件工作,應該要感謝他們只做一件工作而放棄另一件,因為這樣能做好更多的事,而且平均上也能更快完成工作。事實上這一切的重點就是絕對不要讓人同時做一件以上的事。請確定你有明白它的意思。好的經理人會認為自己的責任是消除障礙,好讓大家都能專注在一件事情並把它真的完成。遇到緊急狀況時,請先想想能不能自己處理掉,真的不行再丟給深陷在專案中的程式師吧。

這些網頁的內容為表達個人意見。
All contents Copyright © 1999-2006 by Joel Spolsky. All Rights Reserved.