正確的自我認知概念圖

學習速度快的人,最大的風險之一就是變成小池塘裡的大魚。小池塘本身沒有錯,但大魚必須意識到外面還有無數個池塘,更重要的是,存在著比你的池塘還大的巨魚。

有才華且努力的學徒絕不能因為小小的成功而自滿。在軟體開發領域,要超越平庸其實很容易,因為太多人只滿足於比平均稍微好一點。你必須對抗這種趨向平庸的慣性,主動去了解其他團隊、組織、熟練工匠和大師級工匠,他們的技藝水準可能是學徒難以想像的。

你的目標不是成為比「一般開發者」更好的人。你的目標是衡量自己的能力,然後找到方法讓今天的自己比昨天更好。我們都在同一條路上,與他人比較只有在能幫助彼此進步時才有意義。

你必須願意放下自以為的能力,承認自己在**漫漫長路(The Long Road)**上才走了一小段。


Be the Worst — 成為最差的#

Be the lion’s tail rather than the fox’s head! – Tractate Avot

情境#

你已經釋放了熱情(Unleash Your Enthusiasm),抓住每個機會學習新技能。結果你已經超越了團隊,甚至可能超越了整個開發組織。

問題#

你的學習速度趨於停滯

解法#

讓自己被比你強的開發者包圍。找到一個更強的團隊,你是其中最弱的成員,並且有成長的空間。

這個模式源自爵士吉他手 Pat Metheny 給年輕音樂家的建議:「讓自己成為每個樂團中最差的人。」

關鍵要點:

  • 團隊會讓你看起來更強 — 在強大的團隊中,其他成員會防止你犯錯,並幫你順暢地從錯誤中恢復,以至於你可能沒意識到自己學到的不如想像中多。只有當你獨立工作時,才能看到團隊對你產生力的真實影響。
  • 你必須比任何人都努力 — 作為最弱的成員,目標不是停留在最底層,而是從底層開始,透過有意識地模仿和學習更強的開發者來向上攀升。
  • 風險管理 — 你可能會拖累團隊;好的團隊不會長期容忍純粹的搭便車者,你有被淘汰的風險。另一個副作用是,如果你沒有積極磨練技能,可能會對自己的程度感到沮喪。

刻意加入一個團隊當最差的成員,有其自私的一面。務必搭配 Sweep the FloorConcrete Skills 模式來抵銷這一點 — 主動承擔瑣碎任務以直接為專案創造價值,同時發展具體技能來增加你對開發工作的貢獻。

這個模式與文化規範相悖 — 文化鼓勵你盡快取得優勢地位。但作為學徒,你應該把學習技藝的機會看得比擴張權威更重要。建立**反饋迴路(Create Feedback Loops)**至關重要,它能告訴你團隊是否太過超前,或者對試圖向上爬的人抱持敵意。

行動#

列出你所知道的所有團隊,包括開源專案、其他部門和其他公司。按技能水準排序,然後找出一個對願意從底層做起的新成員持開放態度的團隊。這可能需要你加入幾個郵件列表、向各種人提問來衡量相對的技能水準。


Find Mentors — 尋找導師#

Whether a beginner starts out with a training course or is self-taught, the first step on the path to software craftsmanship is finding a craftsman to apprentice himself to. – Pete McBreen, Software Craftsmanship

情境#

你已經意識到自己並不是第一個走這條路的人,而且你花了太多時間在探索死胡同。

問題#

你走在一條路上,卻不知道下個轉角有什麼,也不知道如何準備。你需要幫助與指引

解法#

尋找那些已經走在你前面的人,並努力向他們學習。

理想情況下,你能找到一位大師級工匠接受你為學徒,在她的監督下完成整個學徒期,以她的聲望為你的未來奠基。然而,這種理想在現實中極其罕見。

我們的領域非常年輕,因此公認的大師極少。更何況,作為學徒很難分辨誰才是真正的大師級工匠。因此,你的學徒期更可能由一系列擁有不同程度精通力的導師來指導。

關於尋找導師的實務考量:

  • 不限於面對面 — 最有影響力的導師可能不在你身邊,甚至可能已經過世(如 Edgar Dijkstra),但他們仍然可以作為燈塔,照亮前方的道路。
  • 導師也有盲點 — 每個人都在走漫漫長路,沒有人什麼都知道。不要因為導師知道得比你多就認為她是大師,也不要因為發現她的弱點就感到幻滅。
  • 主動出擊 — 找到作者、講者、開源專案貢獻者和成功網站的開發者並不難,難的是他們可能對指導不感興趣,而且主動提出「學徒」這種不尋常的請求可能令人怯步。但被拒絕的風險很低,而潛在的回報卻巨大。

你的學徒期不會在孤立中進行。就像有人走在你前面,也會有尚未達到你技能水準的學徒。你必須願意向尋求指導的人提供指導 — 傳承你從導師那裡學到的東西,這是你開始向熟練工匠過渡的方式之一。

行動#

選擇一個擁有活躍郵件列表的工具、函式庫或社群。訂閱列表但先不要發文,只是潛水觀察。隨著時間推移,你會開始理解社群的價值觀,並辨識出哪些訂閱者是有耐心的老師。當你有了這些理解後,在下次研討會上找到這些成員,看看他們是否願意提供一些非正式的建議。


Kindred Spirits — 志同道合的人#

Nothing is more powerful than a community of talented people working on related problems. – Paul Graham, Hackers & Painters

情境#

你已經進入學徒期數月或數年,卻發現自己對開發組織的文化感到灰心。

問題#

鼓勵軟體工匠精神的組織文化是稀有的。你發現自己沒有導師,處於一個與你志向相悖的氛圍中。

解法#

為了保持前進的動力,尤其是在缺乏全職導師的情況下,你需要經常與走在類似道路上的人接觸。因此,你應該尋找跟你一樣追求卓越的人

漫漫長路不是任何人獨自走的路,在學徒期這些年裡,你尤其需要同伴情誼

導師與同伴的差異:

  • 導師是你想效仿的人,因此常常感覺有些距離,甚至令人敬畏。
  • 同伴社群則提供一個安全的環境來探索和學習。你可以自由地分享各自正在學的東西,而不必有跟隨對方腳步的義務。

儘管志同道合的社群有諸多好處,你也必須警惕團體迷思(group-think)。強迫自己保留提出震撼社群的問題的能力。用那一點點知識上的距離,產生有禮貌的異議,以維持社群的健康。社群的健康程度可以從它對新想法的反應來衡量 — 它是在激烈辯論和實驗後擁抱新想法,還是迅速拒絕這個想法以及提出它的人?

行動#

列出你可能加入的所有社群 — 基於你使用的工具、你會的語言、共事過的人、閱讀的部落格和感興趣的想法。找出哪些群體在你所在的城市有實體聚會,逐一參加,決定哪些群體最有趣。

如果沒有群體在你附近定期聚會,那就是一個創建聚會的黃金機會。發起一個當地的軟體工匠定期聚會,不要太早限制會員資格或主題。隨著群體成長,一個自我篩選的核心成員會逐漸定義你的群體性質。當你不在場時群體仍能自行運作,那就代表你擁有了一個真正的社群。


Rubbing Elbows — 並肩合作#

I enjoy being given a certain amount of freedom in order to interpret or to come up with stuff, but I do enjoy collaboration. I seek and thrive on projects where I am going to learn from the people I’m working with. – William Kempe

情境#

你可能有定期見面的導師和同伴,但在實際開發軟體時,你是獨自工作的。

問題#

你的生產力停滯不前,學習陷入瓶頸,你感覺有更優秀的技術和方法在你的掌握之外。

解法#

找到方法與另一位軟體開發者並肩坐在一起,共同完成一項實作任務。有些東西只有在你和另一位開發者一起工作、追求共同目標時才能學到。

核心洞見:

  • 總會有一些**微技術(micro-techniques)**是你只有在與同事緊密合作時才能學到的。這些通常被認為太瑣碎而不值一提,但它們的影響會累積。
  • **結對編程(Pair Programming)**是這個模式的具體實踐。學徒應尋找使用此技術的團隊。

Richard Sennett 在 The Craftsman 中描述,理想的工匠工坊是一個讓人「吸收隱性知識(tacit knowledge)— 未言明、未被文字編碼」的地方,是「每天一千個小動作累積成一門手藝」的場所。由於這種理想環境如今已非常稀有,我們必須用 Rubbing Elbows 模式作為現代替代。

處理結對編程中的困難:

  • 你經常會覺得跟不上對方的步調 — 這不代表結對編程失敗了,只是意味著你需要透過提問來放慢節奏,或者忍受迷失感並嘗試吸收你能理解的部分。
  • 如果你持續數週都感到絕望般地落後,那就該做出改變 — 嘗試輪換結對夥伴,或建議用 Ping-Pong Programming 來增加你的參與度。

這個模式的應用不限於結對編程。目標是找到方法讓自己接觸到其他有技術的人的日常工作習慣,觀察他們如何逐漸將這些習慣精煉為更高的技能。你可以合作撰寫學術論文、準備演講、參與開源專案的衝刺開發等。

行動#

找一個你認識的、已經表達過想要啟動或貢獻開源專案意願的人。安排每週花一個晚上一起在專案上工作,看看你們能互相激勵多久。忙碌的生活不可避免地會削弱合作的動力;當這發生時,你必須適應並找到方法維持專案,直到動力回歸。


Sweep the Floor — 掃地#

In the craft tradition, newcomers start as apprentices to a master craftsman. They start by contributing to the simpler tasks, and as they learn and become more skilled, they slowly graduate to larger, more complex tasks. – Pete McBreen, Software Craftsmanship

情境#

你是專案中的一名新學徒

問題#

你不確定自己在團隊中的位置,團隊也不確定你的能力。你希望找到一種方式來為團隊做出貢獻、贏得信任,並逐漸成長為一名工匠。

解法#

自願承擔簡單、不起眼但必要的任務。 這是在早期為團隊成功做出貢獻的好方法,展現你即使在看似不重要的事情上也能做出高品質的工作。

這些任務的具體例子包括:

  • 維護建置系統(build system)
  • 線上環境支援(production support)
  • 回應維護請求
  • 修復 bug
  • 程式碼審查(code review)
  • 消除技術債
  • 建立專案 wiki
  • 更新文件
  • 充當他人想法的共鳴板

通常你會想聚焦在系統的邊緣,那裡風險較低,而不是核心,因為核心通常有許多依賴關係和大量複雜度。Jean Lave 和 Etienne Wenger 觀察到,「新人的任務往往被安排在工作流程分支的末端,而非在串聯工作段落的中間」。

為什麼受過教育的人也需要「掃地」:

在工作場所中,你的教育背景的價值可能低於你的預期。在資訊科學學位或自學經歷中「付出的代價」讓人們對你的第一天有更高的期望,但真正加入團隊時,你是從零開始的。你應該把握這個機會,向團隊傳達你想要貢獻的訊息,即使這意味著承擔不性感的任務。

潛在風險:

  • 你可能淪為團隊的雜務工,被困在沒人願意做的瑣事中
  • 你可能無法把早期的成功轉化為獲得更具挑戰性任務的理由
  • 你可能因為習慣了「掃地」而害怕做其他事情
  • 你可能因為只做零碎任務而無法發展對全局的理解

如果你發現自己陷入這些處境,嘗試培養熱情(Nurture Your Passion)釋放熱忱(Unleash Your Enthusiasm)、為自己發聲,並尋找每一個證明自己能勝任更高層次工作的機會。

行動#

你的團隊已經拖延了幾個月的最髒亂的任務是什麼?那個每個人都在抱怨、但沒人想碰的東西。去處理它。不只是捏著鼻子硬撐過去 — 看看你能否用創意的方式解決問題,超越人們的期望,同時讓自己樂在其中。


Wrapping Up — 本章總結#

謙遜是成功學徒期的基礎之一。與抱負結合,謙遜能幫助你保持專注並朝正確的方向前進。缺少謙遜,你容易過早宣告學徒期結束,錯過重要的課題。

也許你為一個重要的專案或子系統感到自豪,認為它證明你已經成為熟練工匠。也許吧。但你是否在多個平台上都交付過重要的東西?如果嘗試另一種語言,你還能學到多少?

任何有抱負的學徒的自然本能都是想衝向終點線,盡快成為熟練工匠。但請記住,你走的是漫漫長路(The Long Road),這趟旅程不是短跑。花時間從學徒期中獲得最大的收穫,並理解不論你已經寫了三個月還是五年的程式,在軟體工匠精神這條路上,你仍然只是個初學者。

Accurate Self-Assessment 模式關係圖