建造摩天大樓是一項艱鉅的任務。在訂購第一塊鋼材之前,你需要建築藍圖、政府許可和安全審計。這需要數百人協調數月甚至數年。你不能隨便搭建一些乾牆就希望建築物能承受重量。
然後是後院的小屋。沒有藍圖,沒有許可,沒有審計。你只需要抓一些木材、一把鋸子,然後開始敲打。它可能有點漏風,下大雨時屋頂可能會漏水,但你在一個週末就自己完成了。
過去六年來,我作為一名工程師的生活在這兩種模式之間切換。白天,我在企業規模的環境中構建銀行系統。晚上,我在小屋裡,隨心所欲地建造任何我想建造的東西。有時會有所成就,有時則不然。
很容易將這視為兩種截然不同的生活:一份為薪水而做的工作,以及一份為樂趣而做的工作。但回顧我職業生涯的這個階段,我意識到了一些根本性的東西。企業級工作教會了我如何大規模地進行工程設計,但正是個人專案讓我保持了工程師的身份。
我一直告訴年輕的開發者,維護個人專案對你的職涯發展比任何面試準備和 LeetCode 都更有幫助。
早期,最突出的是工作中實際編寫程式碼的部分並不多。有設計文件、測試計劃、架構審查。感覺實際的建造部分只佔工作的一小部分。
但這些周邊工作才使得大規模的建造成為可能。當你處理一家主要銀行處理的交易量時,你不能跳過設計階段或在測試上偷工減料。這些步驟之所以存在,是因為在你之前有人以慘痛的教訓學到了沒有它們會發生什麼。
在這種環境中工作,讓你能夠接觸到無法企及的規模。你可以使用 Cloud Spanner 等工具,這是一個全球分佈式、強一致性的資料庫,你根本無法在筆記型電腦上模擬。你學習防禦性設計。在你考慮功能之前,你開始思考失敗模式。
但這種規模是有代價的:僵化。你是龐大工地上的單一工人。你通常無法選擇材料,也很少能實驗地基。
小屋是你學習到的工作中的藍圖,並真正能夠動手實踐的地方。
早期,我的個人專案很混亂。架構是事後才考慮,如果有的話。典型的「小屋」行為。但隨著時間的推移,工作中的模式自然而然地滲透進來。
你花足夠的時間設計需要優雅處理失敗的系統,然後你會開始自動執行這些操作。家庭實驗室可能是最好的例子。最初只是一台機器上的單個容器,後來發展成了一個帶有自動部署和程式碼定義基礎設施的託管叢集。
這就是將摩天大樓的結構性紀律應用於我擁有完全自由的空間。個人專案不再崩潰。它們仍然可以快速地按照我自己的方式構建,但它們有了錨點。企業級工作教會了我結構完整性的規則,但小屋給了我一個真正成為建築師的地方。
當你為自己建造時,一個糟糕決定的代價是一段被浪費的夜晚。在工作中,選擇錯誤的方法會影響真正的團隊和真正的客戶。
這種快速的反饋循環正是小屋如此有價值的關鍵。你既是開發者,也是審核者,也是使用者。你可以拆掉一些東西再重建,只是為了看看感覺如何。
我用 Go 語言編寫了一個 Game Boy Advance 模擬器,不是因為世界需要它,而是因為我想了解硬體在那個層級是如何工作的。我使用了一些工作中絕不會觸碰的工具來搭建服務,只是為了了解它們的權衡。你可以嘗試一個以前從未使用過的工具,而無需為它撰寫提案。
大多數這些實驗不會變成創業點子,但它們都會留下一些東西。一種新的模式,一個關於「不該做什麼」的教訓,對「外面有什麼」的更廣泛的認識。
最重要的是,小屋是保持好奇心的地方。企業級工作非常有價值,但它會讓你疲憊不堪。衝刺週期混在一起,待辦事項列表永遠不會縮小,問題開始感覺重複。個人專案是你去回憶軟體開發實際上很有趣的地方。
在我職業生涯的早期,我對容器化和雲端基礎設施還很陌生,工作中的學習曲線很陡峭。但因為我在家裡利用自己的時間搭建容器化系統並在 GCP 上運行它們,所以這些概念學得更快。我從兩方面都得到了練習。
這種模式在我整個職業生涯中不斷重複。你在週末在小屋裡嘗試一些東西,因為你很好奇。你了解權衡、粗糙的邊緣、文件沒有告訴你的事情。然後幾個月後,當公司團隊正在評估相同的工具或方法時,你就不會從零開始。
因為你已經在自己的環境中搞砸過,已經自己評估過工具,已經感受過痛點,所以你可以在工作中做出明智的決定,而不是猜測。
軟體工程的陷阱在於認為你的日常工作就是你技藝的全部。
只建造摩天大樓的工程師最終會筋疲力盡。問題變得重複,過程變得令人窒息,創造力開始減弱。你不再因為想做而建造東西,而是因為公司要求而建造。你失去了你的優勢。
不惜一切代價保護你的個人專案。那是你好奇心所在的地方,是你實驗的地方,是你定義自己為一個建造者,而不僅僅是一個員工的地方。企業級工作會教你如何編寫能夠生存的程式碼,但小屋確保你仍然想編寫它。