
一位年輕哲學家遠道拜訪禪師,卻在每個話題上都急著展示自己已知的東西。禪師不動聲色,在茶道中將茶倒滿杯子仍不停手,直到茶溢出。哲學家驚呼:「杯子已經滿了!」禪師微笑回答:「你帶著滿滿的杯子來,我怎麼能給你倒茶呢?」
這則禪宗故事正是本章的核心隱喻。你過去的經驗越多,就越需要花力氣「倒空杯子」——放下壞習慣、擱置對既有技能的驕傲、敞開心胸接受更有經驗的同事所帶來的不同(甚至反直覺的)做法。
本章的模式幫助你以正確的態度展開學徒期:The White Belt 教你維持初學者心態;Unleash Your Enthusiasm 讓你突破挫折與迷惘;Your First Language 引導你深入第一門語言;Concrete Skills 為你打開機會之門;Expose Your Ignorance 與 Confront Your Ignorance 讓你系統性地擴展技術廣度;The Deep End 鼓勵你接受艱鉅挑戰;Retreat into Competence 則在你不堪負荷時提供喘息空間。
Your First Language — 你的第一門語言#
情境#
你剛起步,對一兩門程式語言只有淺層的理解。
問題#
你的工作(或求職)取決於你能否用某門特定語言交付與隊友同等品質的成果。
解法#
選一門語言,讓自己精通它。 在接下來的幾年裡,它將是你解決問題的主要工具,也是你持續磨練的預設技能。
- 如果工作要求特定語言,就讓「解決問題」來驅動學習;如果是為了求職,就用該語言做一個開源的小專案,讓潛在雇主看見你的作品
- 找一位最有經驗且願意幫忙的程式設計師作為長期導師——有人即時回答問題,可以把原本數天的卡關縮短到幾分鐘
- 用真實問題來學習,而非只做書上的小範例;這提供了第一個有意義的回饋迴路(feedback loop)
- 善用語言提供的互動式工具(Ruby 的
irb、Python 的 REPL、瀏覽器的 Firebug / DevTools 等)建立學習沙盒 - 採用 測試驅動開發(TDD) 來確認你對語言的假設,從極小的步驟開始,隨理解加深再擴大步幅
Ralph Johnson(《Design Patterns》共同作者)的建議:選語言時,最重要的因素是你身邊有沒有專家。一位專家就夠了,但你需要一位。最好的情況是與專家一起做專案,哪怕只是每週四晚上一起寫程式。
選擇語言的同時,你也加入了一個實踐社群(community of practice)——它有既定的慣用語法、聚會和溝通管道。參加當地使用者群組或論壇,看看你是否想成為這個社群的一員。隨著深入,你會學到超越語法的慣用表達(idioms),例如 XSLT 的 Muenchian method、Perl 的 Schwartzian Transform、C 的 Duff’s Device。這些技巧可以從閱讀程式碼中學到,但理解「何時該用」則需要社群的集體經驗。
深挖第一門語言有「卡住」的風險。它可能終身伴隨你,但不要讓對它的精通阻礙你學習其他語言。健康的職涯應該接觸軟體開發的多元語言地景——物件導向的人應探索函數式語言,動態型別的人應嘗試靜態型別,後端的人應接觸 UI 設計。
行動#
- 找到你所用語言的規範(specification)並閱讀它
- 如果標準函式庫是開源的,用 Use the Source 模式的技巧去閱讀
- 詢問你認識的人「當初怎麼選第一門語言」,把他們的標準加入你自己的評估清單
- 研究 Muenchian method、Schwartzian Transform、Duff’s Device——追溯它們最初要解決的問題,想想你會如何用自己的主力語言解決同樣的問題
The White Belt — 白帶心態#
情境#
你已經深入理解了第一門語言,安穩地走在能力的高原上。同事認可你的能力,常找你幫忙解決問題。你對自己的技能有自豪感。
問題#
你發現學習新東西變得比以前更困難了,自學的速度似乎在放緩。你擔心個人發展已經停滯。
解法#
在保留自信的同時,面對新情境時把過去的知識暫時擱置。 如 Yoda 所說:「You must unlearn what you have learned.」
白帶的意義在於:黑帶知道路該怎麼走,而白帶別無選擇只能學習怎麼走。當你允許自己暫停使用慣常的程式設計慣用語法時,你才能發現新的可能性。
- 短期會犧牲生產力,但一旦掌握新方法就能大幅躍進
- 學習第二門語言時尤其需要白帶心態,因為這很可能是你第一次必須放棄生產力才能提升技能
- 避免過早把新舊知識混在一起——讓新知識先沉澱,用初學者的心態去接近它
- 這樣做的好處是你能學會用新語言的慣用方式表達自己,而非「用任何語言寫 Fortran」
書中以一個樂透數字產生器為例:同樣的功能用 Java 寫需要十幾行,用 Io 語言可以簡化,但用 J 語言只需要
sort 1 + (6 ? 49)一行。如果你不戴上白帶、不接受「沒有迴圈的語言也有截然不同但同樣有效的解法」,你就無法在 J 語言中取得進展。
行動#
- 找一個你用某種範式(如命令式、物件導向、函數式)寫過的程式,用另一種範式的語言重新實作,並確保遵循新語言的慣用風格
- 找一位使用你不熟悉技術的人,請他告訴你「像你這種背景的人通常會有哪些誤解」
Unleash Your Enthusiasm — 釋放你的熱情#
情境#
你對軟體開發的技藝有著旺盛的好奇心和興奮感。
問題#
你發現自己在壓抑熱情,因為注意到同事們對工作的熱忱遠不及你。
解法#
不要讓任何人澆熄你的興奮——它是珍貴的資源,會加速你的學習。
在團隊中,新人往往有從眾的傾向。多數團隊並非對技術充滿狂熱,而是聚焦於交付下一個專案。因此,充滿熱忱的學徒常常壓抑自己、選擇低調行事。
- 風險存在:如果團隊士氣低落或不歡迎新人,你的熱情可能招來白眼。對於重視「能力」勝過「學習力」的人,暴露無知更可能留下不好的印象
- 但在開放的團隊中,你的想像力和熱情是資深開發者所倚賴的獨特品質。James Surowiecki 在《The Wisdom of Crowds》中反覆指出,思維多樣性是集體智慧的關鍵成分
- 研究發現,航空母艦的運作團隊中,不同經驗層級的成員混合搭配反而更健康——「新手對一切不視為理所當然」與「老手認為自己什麼都見過了」的互動,能提升團隊的整體理解力
釋放熱情是學徒為數不多的「責任」之一。你可能沒有深厚知識或超高生產力,但你有義務為團隊注入活力、質疑一切。你擁有獨特(且短暫的)全新視角,應該善用它提出有用的改善建議。
行動#
回想上一次你有個想法卻沒有提出來的情境。找到你當時想建議的對象,向她描述你的想法。如果她指出缺陷,試著說服她幫你改進。
Concrete Skills — 具體技能#
情境#
你正在尋找加入一支優秀工匠團隊的機會,期望獲得比目前更好的學習環境。
問題#
那支團隊沒有動機冒險雇用一個可能無法直接貢獻產出的人。他們甚至擔心你連間接貢獻(例如自動化簡單的手動任務)都做不到。
解法#
獲取並維持具體技能。 儘管學徒帶給團隊的一大價值是快速學習的能力,但擁有離散且可展示的特定工具和技術能力,能增加你被信任、被允許間接貢獻的可能性。
- 有些具體技能只是為了通過粗糙的 HR 篩選或玩流行語 Bingo 的管理者
- 有些則是讓未來隊友確信你能派上用場、不需要「托嬰照顧」
- 範例:撰寫各種流行語言的建置檔(build files)、熟悉 Hibernate/Struts 等開源框架、基本網頁設計、JavaScript、你主力語言的標準函式庫
具體技能是你對「如果今天雇用你,週一早上你能做什麼來幫助我們?」這個問題的答案。隨著你從學徒過渡到熟練工(journeyman),你會越來越少依賴這些技能,轉而靠聲譽、作品集和你帶給團隊的更深層品質來獲得機會。
行動#
- 收集你敬佩之人的履歷,為每人找出五項離散技能,判斷哪些對你想加入的團隊立即有用
- 擬定計畫並做一個小專案來展示你已具備這些技能
- 養成定期審視自己履歷的習慣,把具體技能提取成獨立清單——你能接受很多招聘經理只看這份清單嗎?
Expose Your Ignorance — 暴露你的無知#
情境#
付錢請你當軟體開發者的人們期待你知道自己在做什麼。
問題#
你的主管和團隊成員需要對你的交付能力有信心,但你對某些必要技術並不熟悉。這不只發生在顧問身上,而是每個人都會遇到的情況。
解法#
向依賴你的人展示:學習過程本身就是交付軟體的一部分。讓他們看著你成長。
- 社會心理學家 Carol Dweck 的研究指出,「顯得有能力」的需求深植於多數工業化社會的人們心中。然而因為你的經驗不足,你有許多無知區域
- 面對「功能 X 要多久才能完成?」的詢問,壓力會驅使你說人們想聽的話。但對人們說真話才能建立穩固的關係
- 讓人們知道你正在理解他們的需求、正在學習如何實現。用你的學習能力來讓他們安心,而非假裝你已經知道
- 暴露無知最直接的方式就是提問。這說來容易做來難,尤其當對方預設你已知道答案時。但堅持下去——直接向團隊中最有知識的人提問,最終會變成你的第二天性
專精(expertise)是長路上的副產品,而非目的地。工匠與「專家」的區別在於:專家可能一輩子死守一個平台或領域,而工匠在漫長的職涯中會接觸無數技術與領域。工匠需要勇氣和謙遜,在拾起不熟悉的技術時戴上 The White Belt。
無知就像花園中的裸露土塊——你可以透過實驗、練習和閱讀來播種培育知識。你可以選擇遮住這些裸露之處以維護自尊,也可以選擇暴露它們、誠實面對自己和依賴你的人,並尋求幫助。
行動#
寫下五件你在工作中真正不理解的事情。把清單放在別人看得見的地方。養成隨著工作變化定期更新這份清單的習慣。
Confront Your Ignorance — 面對你的無知#
情境#
你已經辨識出自己技能中與日常工作相關的缺口。
問題#
有些你需要掌握的工具和技術,你不知道該從何開始。有些甚至是周圍每個人似乎都已經會的東西,而且大家預期你也應該會。
解法#
挑選一項技能、工具或技術,主動填補你的知識缺口。
- 有人偏好先閱讀所有入門文章和 FAQ 來獲得全貌
- 有人偏好直接動手做 Breakable Toys 來理解
- 不論哪種方式,都要向你的 Kindred Spirits 和導師打聽是否有人已具備這項技能並願意分享
- 有時別人也在學同樣的東西,合作能讓彼此進步更快
這個模式與 Expose Your Ignorance 密切相關但有微妙差異。只面對無知而不暴露,會助長一種「失敗和學習不可接受」的文化,因為每個人都在暗中學習。反之,只暴露無知而不面對,則會導致過度謙卑和無助——「我就是不會,那又怎樣」的聳肩態度。兩者必須平衡並用。
另外也要注意:不要讓學習需求影響團隊的交付。如果你為了學習並行系統而自己寫一套訊息系統取代現成產品,維護你程式碼的同事不會感謝你。工匠精神的特徵之一,是願意將社群的整體利益置於個人成長之前。
行動#
拿出 Expose Your Ignorance 中寫下的清單,逐一學習並劃掉。新獲得的知識可能揭露你之前沒注意到的缺口——別忘了把它們加進清單。
The Deep End — 跳入深水區#
情境#
一直走小而安全的步伐讓你感到不滿足。你開始擔心這不是高原期(plateau),而是陷入窠臼(rut)——在高原期你透過勤奮練習來鞏固技能以攀向下一層;在窠臼中,平淡的勝任能力終將衰退為平庸。
問題#
你需要成長你的技能、自信和成功作品集。你渴望更大的專案、更大的團隊、更複雜的任務、新的業務領域或新的地方。
解法#
跳進深水區。等到「準備好了」再行動,可能意味著永遠不會行動。 當你被提供高曝光度的角色或困難的問題時,雙手緊握它。成長只發生在你接下令人害怕的工作、做那些會伸展你的事情時。
- 這有風險——如果水位超過你的頭頂,你可能會淹死。但 IT 領域有很多地方即使失敗也不會毀掉你的職涯
- 風險是透過半閉的恐懼之眼所看到的機會。 這不是說在履歷上造假,也不是毫無準備地接受挑戰,而是在「失敗的真實可能性正盯著你看」的時候接受那個升遷或外派任務
- 書中 Enrique 的故事:他從西班牙的核心團隊自願外派到奈及利亞(當時世界第三危險城市),原訂三個月卻待了近兩年,為客戶從零打造了真正適合的平台
即便鼓勵你尋找最有挑戰性的任務,仍要記得:如果水位超過頭頂就是在溺水。你有責任透過 Find Mentors 和 Kindred Spirits 來抵消風險,並建立 Feedback Loops 以便在專案失控時及時發現並求助。實踐這個模式應該感覺勇敢而非魯莽。
行動#
- 寫下你參與過的最大成功專案(以程式碼行數和開發者人數衡量),以及你獨自建造過的最大程式碼庫
- 找出衡量專案複雜度的其他維度,用這些指標衡量你參與過的每個專案
- 當下一個專案到來時,畫一張圖把所有專案標示出來,看新專案落在哪裡。久而久之,你可以用這張圖看出職涯走向,甚至據此做出選擇
Retreat into Competence — 退回能力範圍#
情境#
你開始意識到自己知道的有多麼少,或者你承接了新挑戰但進展不順。或者兩者皆是。
問題#
面對自身無知的浩瀚,你感到不堪負荷。
解法#
先退後,再像投石器一樣彈射向前。 短暫退回你的能力範圍以恢復鎮定。花一些時間建造你知道怎麼建造的東西,然後用那次經驗來認知你已經走了多遠、目前有多大的能力。
- 學徒期是雲霄飛車——你會經歷學習新技術的興奮,也會經歷發現自己與工匠和專家之間差距時的心驚膽顫。這是正常且不可避免的
- 克服對自身無能的恐懼,就是連接 Expose Your Ignorance 和 Confront Your Ignorance 之間的橋梁
- 如果你在 The Deep End 中幾乎無法把頭露出水面,就找機會暫時撤退——有時退一步是為了進兩步
這是一個有風險的模式。如果不有意識地設定撤退的時間限制(timebox),你可能從「暫時喘息」滑向「永久投降」。深陷於自己擅長的事物中是舒適的,但當你的專長終究過時,你將被迫再次面對無知的浩瀚——這次你可能已經失去了學習新事物的習慣,重新開始會更加痛苦。
具體做法範例:
- 「我接下來花 10 分鐘重構這頁的 JavaScript 驗證,然後再去優化提供資料的 SQL 查詢」
- 「我接下來花 4 小時實作這個工具的命令列介面,然後再學習如何呼叫這個第三方 SOAP API」
- 「我今天剩下的時間改善測試覆蓋率,明天再處理受 Python GIL 影響的效能優化」
在暫時休息期間,向你的導師和 Kindred Spirits 尋求支持。有了他們的幫助,加上剛剛展示能力所帶來的信心提升,你會更有準備去面對接下來路上的顛簸。
行動#
挑一個你非常熟悉的自包含(self-contained)功能,重新實作它。例如,快取演算法(caching algorithms)是個好選擇——它們可以從極簡單到極複雜,同時也能強化你對設計和演算法複雜度的直覺。
Wrapping Up — 本章總結#
談論無知、深水區、暴露和撤退聽起來可能很消極,但無知如果被認知並面對,就不是壞事。最糟的情況是你甚至不知道自己的無知。
學徒期的基石之一是 Accurate Self-Assessment(精準自我評估):判斷自己在路上走了多遠,並記錄知識中的缺口。你需要親密地了解:
- 你目前的能力(competencies)
- 你需要立即變得勝任的技能
- 你長期感興趣的知識領域
後續章節的 Reflect as You Work 和 Record What You Learn 等模式將幫助你維持這份自我認知。
擁抱 The Long Road 的這個季節。在你的職涯中,很少有其他時期能如此專注於內在、如此全心投入個人成長。
