# 二十三、任務換人有害無益
在管理一個程序團隊時,第一件要學的事就是任務配置(task allocation)要正 確。「任務配置」只是把事倩分丈家微的夸大說法。用希伯來文的普通話來 說就是「倒檔案」(因為你會把檔案倒在某人身上)。有些事情做得對會得到不可 思議的生產力利益,決定哪些檔案要倒在誰身上就是其中之一。反過來沒做好 的話可能就會陷入麻煩的狀況,沒有人能做好何任何事情而且大家都抱怨「在這 里什么事都做不起來。」 由于這是個針對程序員的網站,我要拿個程序設計問題讓你的腦袋動一動暖暖身。
假設你要做A和B兩件運算要做。每一件都需10秒的CPU時間。現在你有一顆CPU, 為了簡化問題,所以工作序列中沒有其他東西。
在我們的CPU中可以選擇是否用多任務處理。所以你可以先做好一件再做另一件。
循序處理

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

你會選哪一種方式呢?大部份人的直覺反應都認為多任務比較好。不管哪一種狀 況,都得等20秒才能兩件運算都完成。不過可以想想單就各洋運算來說要多久才 有結果。
在兩種狀況下,運算B(標成藍色)都要20秒才得到結果。不過運算A的結果在多任 務時需要19秒。可是循序時就只要10秒就好了。
換句話來說在這個安排好的例子中,循序處理的每洋運算游f均對/琢比多任務處 理少(15秒對19.5秒)。(事實上這例子也并不是真的那么假–它是源于Jared在工作中必須解決的一個真實問題)
| 方法 | 運算A花的時間 | 運算B花的時間 | 平均 |
| --- | --- | --- | --- |
| 循序處理 | 10秒 | 20秒 | 15秒 |
| 多任務處理 | 19秒 | 20秒 | 19.5秒 |
我剛剛說過「工作切換完全不花時間」。其實在真的CPU中工作切換是需要一點 點時間的,基本上要足夠儲存CPU緩存器的狀態并加載其他工作的CPU緩存器。實 際上這短到幾乎可以忽略。不過為了讓生活更多樂趣,讓我們假設工作切換需要 半秒。現在情況變得更糟了:
| 方法 | 運算A花的時間 | 運算B花的時間 | 平均 |
| --- | --- | --- | --- |
| 循序處理 | 10秒 | 20秒 + 1次工作切換 = 20秒 | 15.25秒 |
| 多任務處理 | 19秒 + 18次工作切換 = 28秒 | 20秒 + 19次工作切換 = 29.5秒 | 28.75秒 |
現在呢,雖然我知道這有點蠢,不過就算為了讓我高興一下,想想如果工作切換需要一分鐘那如何?
| 方法 | 運算A花的時間 | 運算B花的時間 | 平均 |
| --- | --- | --- | --- |
| 循序處理 | 10秒 | 20秒 + 1次工作切換 = 80秒 | 45秒 |
| 多任務處理 | 19秒 + 18次工作切換 = 1099秒 | 20秒 + 19次工作切換 = 1060秒 | 幾近19分鐘!! |
工作切換用的時間愈長,多任務處理的代價愈大。
這件事本身不怎么新奇,不是嗎?不久大概就會有些白癡氣憤地寫信指控我「反 對」多任務處理了。他們會質問我:「你真的想要回到那種得先結束WordPerfect 才能執行Lotus 1-2-3的DOS時代嗎?」
不過那并不是我的意思。我只是想要你同意,在這類例子中:
a)循序處理會讓結果次上比較快得到,而且
b)工作切換需要愈久,多任務處理所付的代價就愈大。
夠了,別管CPU 了,來管管人吧,這有趣多了。這里的重點在于管理「程序員」 時,工作切換會需要很長很長的時間。因為程序設計這種工作必須同時在腦袋 里記很多東西。另外記住的東西愈多,寫程序時生產力愈高。用全速寫程序的程 序員腦里隨時都會記住無數的事情:變量名稱,數據結構,重要的API,寫過常要 用到的輔助函數名稱,甚至存放原始碼的次目錄名稱,一切東西都要記住。如果 你把程序員送到克利特島去度假三星期,他所存東西通通都會忘掉。人腦似乎會 把東西移出短期RAM,改存到永遠都讀不回來的備份磁帶上。
要多久呢?嗯,我的軟件公司最近放下手頭上在做的事(開發一套代號CityDesk 的軟件產品),花了三星期去幫助某個客戶處理一個緊急狀況。當我們回到辦公 室時,感覺好像要另夕A三星期才能回復全速制作CityDesk。
就個人層次來說,你曾經注意過某件事嗎?叫某人做一個工作可以做得很好,可 是如果給他兩個工作,他會把其中一個做好卻忽略另一個,不然就是兩件工作都 做得很慢,慢到你覺得#龍蜜都比他勤勞。這是因為程序設計的工作就是需要很長 的切換時間。就我自己來說,當我需要同時完成兩個程序設計項目時,切換時間 大概要六個小時。以一天八小時來看,等于說多任務處理把我的生產力降到每天 只剩二小時。真令人沮喪啊。
同樣的道理,如果你給某人兩件工作,應該要感謝他們只做一件工作而放棄 另一件,因為這樣能做好更多的事,而且平均上也能更快完成工作。事實上這一 切的重點就是絕對不要讓人同時做一件以上的事。請確定你有明白它的意思。好 的經理人會認為自己的責任是濟餘摩濤,好讓大家都能專注在一#事倩并把它真 的完成。遇到緊急狀況時,請先想想能不能自己處理掉,真的不行再丟給深陷在 專案中的程序員吧。
- 第一部分 位與字節:編程實踐點滴
- 一、語言的選擇
- 二、深入底層
- 三、joel測試:改進代碼的12個步驟
- 四、每一位軟件開發人員必須、絕對要至少具備UNICODE 與字符集知識(沒有任何例外!)
- 五、輕松寫就功能規格說明書 - 第1節:為什么煩心?
- 六、輕松寫就功能規格說明書 - 第2節:什么是規格說明書?
- 七、輕松寫就功能規格說明書 - 第3節:但是……如何?
- 八、輕松寫就功能規格說明書 - 第4節:技巧
- 九、輕松制訂軟件進度表
- 十、每日連編是朋友
- 十一、難伺候的故障修復
- 十二、軟件開發中的5個世界
- 十三、稿紙原型開發
- 十四、不要被太空架構師所嚇倒
- 十五、開火與運動
- 十六、人員技能
- 十七、源于計算機學科的三個錯誤思想
- 十八、二元文化
- 十九、自動獲取用戶故障報表
- 第二部分 開發人員的管理
- 二十、面試游擊指南
- 二十一、重金激勵害多利少
- 二十、二不配備測試人員的五個首要(錯誤)原因
- 二十三、任務換人有害無益
- 二十四、絕不去做的事情,第一部
- 二十五、冰川下的秘密
- 二十六、漏洞抽象定律
- 二十七、程序設計界的LordPalmerston
- 二十八、評測
- 第三部分 Joel對常態問題的遐想
- 二十九、RickChapman解讀愚昧
- 三十、在這個國家狗是干什么的? 我們有多么天真?
- 三十一、作為哼哈二將,只管去做事
- 三十二、兩個故事
- 三十三、巨無霸麥當勞與天才廚師JamieOliver
- 三十四、沒有什么像IT看起來那么簡單
- 三十五、提防非自主開發綜合癥
- 三十六、策略I:BEN&JERRY公司與AMAZON
- 三十七、策略II:雞與蛋問題
- 三十八、策略III:讓我回去!
- 三十九、策略IV:大件與80/20神話
- 四十、策略V:公開源代碼的經濟因素
- 四十一、墨菲法則肆掠的禮拜
- 四十二、微軟公司是如何敗北API之戰的
- 第四部分 對.NET稍多的評說
- 四十三、微軟精神失常了
- 四十四、我們的.NET對策
- 四十五、請問,我可以使用連接程序嗎