Bob Martin 以 CTO 的身分,對勇氣提出五項期望。這裡的勇氣不是魯莽冒進,而是專業人員在面對壓力時堅持做對的事的能力——互相補位、誠實估算、勇於說不、持續學習、以及傳承經驗。
We Cover for Each Other(我們互相補位)#
什麼是真正的團隊?#
我們用「團隊」(team)來形容一群開發者,但真正的團隊是:當某個成員倒下時,團隊仍能繼續朝目標前進。就像船上的每個船員都有自己的工作,但每個人也知道如何做另一個人的工作——因為船不能因為一個人倒下就停。
團隊成員可能因為各種原因倒下:
- 生病
- 家庭問題
- 休假
工作不能因此停擺,其他人必須能填補空缺。
你的責任#
Bob 把這個議題翻轉過來:確保有人能替你補位,是你的責任。
- 你有責任確保自己不是團隊中不可或缺的那個人
- 你有責任主動找其他人,教他們足夠多你的工作內容,讓他們在緊急時能接手
- 最好的教學方式:坐下來跟他們一起在工作站上寫一兩個小時的程式碼
- 不只教一個人——知道你工作的人越多,補位能力越強
- 一次不夠——你持續在進展,所以必須持續讓其他人跟上你的進度
Collaborative programming(協作程式設計)的紀律在這方面特別有幫助。
Honest Estimates(誠實的估算)#
估算的本質是不確定性#
作為程式設計師,最誠實的估算其實是「我不知道」——因為你確實不知道任務需要多長時間。但你也知道你大概不需要十億年。所以誠實的估算是你不知道的和你知道的混合體。
一個誠實的估算看起來像這樣:
| 機率 | 預估完成時間 |
|---|---|
| 5% | 這個週五前完成 |
| 50% | 下個週五前完成 |
| 95% | 再下個週五前完成 |
這樣的估算提供了一個機率分布,描述你的不確定性。描述不確定性正是讓這個估算誠實的原因。
大型專案 vs. 小型任務#
大型專案:當管理者要求你估算大型專案(例如判斷專案是否值得授權)時,上述的機率分布格式最有價值。
小型任務:使用 Agile 的 Story Points 更合適。Story points 之所以誠實,是因為它們:
- 不承諾時間框架——只描述任務間的相對成本
- 使用的數字是任意的但相對的
- 例如:Login story 被定為 3 points,Deposit story 感覺沒有 Login 兩倍難,所以定為 5 points
- 機率分布已經內嵌在 story points 裡:它們不是日期或時間,只是 points;它們不是承諾,只是猜測
- 每個 iteration 結束時加總完成的 points,用這個數字來預估下個 iteration 能完成多少
CTO 期望的是描述不確定性的誠實估算,不是對日期的承諾。
You Must Say NO(你必須說不)#
說不的義務#
程式設計師能說的最重要的話之一就是「不!」——在對的時間、對的情境下說出來,可以為雇主省下大量金錢,避免可怕的失敗和尷尬。
這不是讓你到處說不的執照。我們是工程師,我們的工作是找到通往「是」的路。但有時候「是」就是不可能。我們是唯一能判斷這件事的人,所以當答案真的是不的時候,說不是我們的責任。
面對壓力#
場景:老闆要你週五前完成一項任務。你仔細考慮後,發現沒有合理的機會能在週五前完成。
- 你必須回去跟老闆說「不行」
- 聰明的做法是同時說「但我可以在下週二前完成」
- 但你必須堅定:週五就是不行
管理者可能不喜歡聽到「不」——他們可能反駁、對質、甚至對你大吼。情緒對抗是某些管理者使用的工具。你不能屈服。
特別小心「你能不能至少試試看?」這個策略。聽起來很合理,對吧?但其實不合理——因為你已經在盡力了。沒有什麼新的做法能把「不」變成「是」,所以說「我試試看」就是一個謊言。
sequenceDiagram
participant 老闆
participant 程式設計師
老闆->>程式設計師: 我需要你週五前完成這個功能
程式設計師-->>程式設計師: 仔細評估工作量...
程式設計師->>老闆: 不行,但我可以在下週二前完成
老闆->>程式設計師: 週五之前一定要完成!
程式設計師->>老闆: 我理解壓力,但週五真的不行
老闆->>程式設計師: 你能不能至少試試看?
程式設計師->>老闆: 不,我已經在盡力了。說「我試試看」等於說謊Continuous Aggressive Learning(持續積極學習)#
軟體產業的變動極其劇烈。我們可以爭論這是否應該如此,但我們無法否認事實就是如此。因此,我們都必須是持續積極的學習者。
學什麼?#
- 你今天用的程式語言,5 年後可能不再使用
- 你今天用的框架,明年可能就換了
- 程式設計師常被建議每年學一門新語言——這是好建議
- 選一門你不熟悉風格的語言:
- 從未寫過動態型別語言?學一門
- 從未寫過宣告式語言?學一門
- 從未寫過 Lisp、Prolog 或 Forth?學它們
什麼時候學?#
- 如果雇主提供時間和空間——盡量利用
- 如果雇主不提供——你得用自己的時間
- 準備好每個月花數小時在學習上
- 是的,你有家庭義務、有帳單要付、有生活要過——但你也有一個專業,專業需要維護和保養
Mentoring(指導)#
教學的責任#
軟體業對程式設計師的需求似乎永無止境。全球程式設計師的數量正以驚人的指數速度增長。大學能教的有限,而且很多大學教得並不好。
因此,教導新程式設計師的工作落在我們身上——那些已經工作了幾年的程式設計師。
教學的好處#
教學看起來很難,但它帶來巨大的回報:學習最好的方式就是教學,沒有什麼方法能比得上。所以如果你想學某樣東西,去教它。
具體做法#
如果你已經寫了 5 年、10 年、15 年的程式,你有大量的經驗和人生教訓可以傳授給剛入行的新人:
- 帶一兩個新人,引導他們度過最初的 6 個月
- 坐在他們旁邊,幫他們寫程式碼
- 跟他們說你過去的失敗和成功故事
- 教他們紀律、標準和倫理
- 教他們這門手藝(craft)
CTO 期望所有程式設計師都成為 mentor。期望你投入心力,幫助他人學習。