我從事專業程式設計工作已經超過十年了,大約在第三年的時候,我逐漸意識到一個令我深感不安的事實:我因之受到表揚的內容、我獲得晉升的原因、讓經理們爭相留住我的技能——幾乎都與我在編程訓練營、在線課程或我一直開著的 47 個教程標籤頁到的東西無關。

別誤會,我當然需要會編程。但是,在我第一份工作中,那個比我升職的人?她寫的程式碼比我的還亂。在我還是個中階程式設計師的時候,那個被聘為高階程式設計師的人?他的GitHub專案遠不如我的。那個時薪300美元的顧問,而我當時年薪8.5萬美元?我的程式水平比他強多了。

那一刻我才恍然大悟。我以為自己玩的遊戲,其實不是真正的遊戲。
你看,當你半夜刷 LeetCode 或完成第五個 React 教學的時候,沒人會告訴你:公司付錢不是因為你懂技術,而是因為你能幫他們解決問題。而且,他們遇到的問題大多並非技術性的——只是表現形式不同而已。
讓我解釋一下我的意思。
去年,我親眼目睹了一場裁員,一位初級開發人員被解雇了,而一位技術能力明顯不如他的人卻留了下來。這位初級開發人員才華橫溢,他能實現我需要上網搜尋才能找到的演算法,他對設計模式的理解甚至比他年紀大一倍的人還要透徹。但他有個習慣,就是會連續三天消失,埋頭鑽研某個東西,然後拿出一個根本沒人需要的、也解決不了實際問題的方案。同時,留下來的那位呢?她擁有近乎超自然的能力,總是能在編寫任何一行程式碼之前提出關鍵的澄清問題。她花三十分鐘的談話就能節省三天的工作量。她能發現隱藏在表面問題背後的真正問題。她能在糟糕的需求變成糟糕的功能之前就提出反對意見。
這不是從文件中就能學到的技能,也不是《高級JavaScript模式》這本書裡會涵蓋的內容。
令人不安的事實是,大多數教程教你文法和模式——也就是「是什麼」和「怎麼做」。但它們不會教你“為什麼”、“誰來用”、“什麼時候用”,以及“等等,我們真的應該這麼做嗎?”這些問題才是真正價值所在。
我在第二份工作的一個專案中才深刻體會到這一點。當時我們正在開發一個儀錶板,用於幫助銷售經理追蹤團隊績效。我花了三週時間,用 WebSocket 實現了這個美觀的即時功能,包括動畫圖表和流暢的使用者介面。我為此感到非常自豪,因為它的技術效果確實令人印象深刻。我的程式碼審查也收穫了不少熱情洋溢的表情符號。
然後,在演示過程中,我看到銷售總監的臉色垮了下來。 “這很棒,”她用那種表示並不滿意的語氣說道,“但是我們可以把它導出到Excel嗎?我們所有的分析都是在Excel裡做的。”
整整三週。我花了整整三週時間,打造了一個技術上非常複雜卻又偏離本質的東西。沒人想要即時儀錶板。他們想要的是每週四早上就能看到的報告,而且格式要能在他們用了二十年的工具裡操作。實際需求如此簡單,反而讓我覺得枯燥乏味,或許正因如此,我才不自覺地決定用科技讓它變得有趣。
一位資深開發人員會先詢問他們的工作流程。一位資深開發人員會了解到他們每天都泡在 Excel 裡。一位資深開發人員會在三天內交付一個雖然枯燥但正確的解決方案,然後去做一些更重要的事情。
但我當時還不是資深員工,真的不是,儘管我的頭銜表明了這一點。我的思維方式仍然像一個靠寫程式碼賺錢的人,而不是一個靠解決商業問題賺錢的人。
我希望當時有人能告訴我:你的工作不是寫程式碼,而是減少組織內部的痛點。程式碼只是實現這一目標的工具之一。有時候,合適的工具是對話;有時候是電子表格;有時候,則是堅持己見,說「我們根本就不應該開發這個」。
那一刻的領悟徹底改變了我。我突然明白了為什麼有些人會被邀請參加重要會議,而有些人卻不會。為什麼有些人的意見舉足輕重,而有些人僅僅被視為「執行者」。這與技術能力無關,而是與判斷力有關。
判斷力或許是我們產業中最被低估的技能,在教育中幾乎完全缺乏。沒人教你如何辨識糟糕的需求。沒人教你如何辨別技術問題其實是人為問題。沒人教你「技術上正確」和「在特定情況下、在特定限制條件下、針對特定人員正確」之間的區別。
我曾和一位名叫馬庫斯的同事共事,他擁有近乎預知未來的判斷力。在一次計畫會議上,有人提出解決方案,馬庫斯會靜靜地坐一會兒,然後說:「這聽起來不錯,但我們有沒有想過維運團隊會如何看待他們要為此值班?」這時,會議室裡會頓時鴉雀無聲,因為沒人想到這一點。突然間,我們意識到,我們即將建立的系統會讓大家苦不堪言,並導致凌晨三點接到大量待命電話,而這些問題原本是可以事先避免的。
馬庫斯並非團隊中最強的程式設計師。他技術不錯,穩健可靠,能力也夠。但他對系統如何在充滿情感、受限於各種限制和相互衝突的優先事項的組織中運作有著全局性的理解。他會考慮決策的後續影響。他會考慮維運負擔。在我們寫一行程式碼之前,他就會詢問監控和偵錯方面的問題。他會想到兩年後維護這套系統的人會面臨怎樣的困境。
那不是與生俱來的天賦,而是後天習得的。但這種天賦不是從課程學來的,而是從親身實踐中學到的,從交付那些看似不錯但最終卻變成維護噩夢的專案中學到的,從凌晨三點值班中學到的,從眼睜睜看著專案失敗並非因為技術問題而是因為沒有人考慮到人為因素中學到的。
說實話,真正考驗人的因素才是工作的關鍵。
我曾多年認為,只要我提高程式水平,其他一切都會迎刃而解。演算法會越來越好,系統設計會越來越好,最新的框架也會越來越好。當然,你需要具備基本的技術能力。但我看過很多團隊,裡面都是才華洋溢的工程師,卻產出一堆垃圾,因為沒人懂得如何溝通,沒人願意問「傻」問題,每個人都只想著如何顯得自己很聰明,而不是如何提高效率。
溝通能力不是一種可以忽略的軟技能,即使你的技術夠好。它本身就是一種技能。它決定了你的技術能力是否真的有用。
想想看:你可以建立世界上最優雅的解決方案,但如果你無法解釋為什麼它是正確的方法,如果你無法讓利益相關者理解並接受它,如果你寫不出讓人想放棄的文件——那麼你優雅的解決方案就形同虛設。更糟的是,它雖然存在,但沒人理解,所以他們會繞過它,或者因為不理解其中的假設而破壞它,或者六個月後被一個根本不了解你意圖的人重寫。
我在一次程式碼審查中學到了這個教訓,那次審查至今仍讓我耿耿於懷。我當時用一些 TypeScript 的高階特性寫了一段很巧妙的程式碼,讓類型系統在編譯時就能強制執行業務規則。我當時為此感到非常自豪。這段程式碼放在一篇關於高級類型系統的部落格文章裡肯定很漂亮。
我的同事看了之後說:“我知道這很厲害,但我完全不知道它在做什麼,而且我現在也沒時間深入學習 TypeScript。我們能不能用一種全團隊都能理解的方式來實現呢?”

我的第一個反應是辯解。問題不在於我的程式碼——問題在於他們不理解高級類型。但後來我仔細想了想。我們團隊規模很小,需要快速推進。我們需要每個人都能接觸到程式碼庫的任何部分。我精心寫的程式碼反而造成了瓶頸,導致只有我一個人能開發那個功能。我追求的是個人技術上的滿足感,而不是團隊的開發速度。
所以我重寫了它,讓它更簡潔、更直覺。當然,程式碼量是稍微多了些,但團隊裡的任何人都能讀懂,並且立刻明白它的作用。它是不是沒那麼令人印象深刻了?當然。但它是不是讓程式碼庫更健康了?是的。
這種權衡取捨是沒人教過的。程式碼不是寫給電腦的——電腦才不管你有多聰明。程式碼是寫給人的。六個月後,晚上11點,如果有人(很可能就是你自己)在閱讀你的程式碼並試圖修復一個bug,他需要能夠快速理解。上週剛入職的新員工需要能夠修改程式碼而不破壞整個系統。審核你的PR的人也不需要博士學位才能批准。
編寫簡潔、清晰、易懂的程式碼比編寫巧妙的程式碼更難。它要求你放下自我,考慮讀者而非編寫者,重視維護而非炫技,重視團隊效率而非個人滿足感。
而我花了很長時間才明白這一點,真是慚愧:人們會注意到這些細節。管理者會注意到有人寫的程式碼便於整個團隊協作。他們會注意到有人會考慮程式碼的可維護性。他們會注意到有人會把團隊的成功放在個人成就之上。
這引出了另一個鮮為人知的議題:技術工作的政治層面。我指的並非那種低俗的「辦公室政治」。我指的是要理解,組織是由目標各異、壓力不同、激勵機制不同的人組成的,而你駕馭這些差異的能力決定了你的工作效率。
我以前覺得政治有損我的尊嚴。我當時是個程式設計師,只想寫程式碼,其他那些亂七八糟的事就讓別人去操心吧。
然後我花了六個月時間開發一個功能,結果在發布前一天被砍掉了,因為我不了解其中的政治格局。當時有個副總裁一直力推另一種方案,而我開發出來的方案相比之下顯得遜色不少。我對此一無所知。我以為自己只是在按照產品經理的要求開發。但由於不了解更廣泛的背景,不了解利害關係人是誰以及他們關心什麼,我不知不覺地踏入了政治雷區。
工作做得不錯,程式碼也很紮實。但這都沒用,因為我沒意識到技術決策是在政治背景下做出的。如果有人更了解這個組織,要嘛會設計出不同的方案,要嘛會儘早爭取到副總裁的支持,或至少會意識到這是一個風險很大的專案。
我並不是說你應該變成一個善於操縱的政治人物。我的意思是,你應該明白,組織是由人組成的複雜系統,而人有各種不同的動機、恐懼和目標,這些都超越了技術上的最優解。你的工作不僅僅是建立技術上正確的產品——而是以組織能夠真正吸收和利用的方式來建立正確的產品。
這意味著要了解你的利害關係人是誰。他們最關心什麼?衡量他們的績效指標是什麼?他們想要實現什麼目標?因為當你了解這些,你就能以幫助他們成功的方式開展工作,這意味著他們會支持你,這意味著你才能真正把事情做好。
我曾與一位名叫莎拉的開發人員共事,她在這方面堪稱大師。她總是用商業術語來闡述她的技術方案。她不會說“我們應該重構這段程式碼,因為它太亂了”,而是會說“重構這段程式碼可以降低我們的bug率,從而讓團隊能夠更快地交付新功能,這有助於我們實現第三季的目標”。她用的是商業價值的語言,而不是純粹的技術語言。
而且奏效了。她的重構方案獲得了批准。她的架構變更方案也獲得了預算。她之所以能把事情辦成,並非因為她的技術比別人更精湛,而是因為她懂得如何駕馭組織內部的運作。
那不是操縱,那隻是了解你的受眾。這和優秀技術寫作者的必備技能一樣──根據受眾調整訊息傳遞方式。你不會用同樣的方式向前端開發人員解釋你的 React 優化,也不會用同樣的方式向財務長解釋。他們關注的重點不同,他們需要的資訊也不同,才能做出決策。
說到決策——沒有人教你如何在資訊不完整、時間緊迫、後果嚴重的情況下做出決策。
在教程裡,一切都很清晰。問題定義明確,解決方案也已知,有一個正確答案。但實際工作並非如此。實際工作意味著你只能根據自己希望掌握的60%的資訊做出最佳猜測,並且要明白,等待完美的資訊意味著你會錯過截止日期,而什麼都不做本身也是一種會帶來後果的決定。
我見過一些才華洋溢的工程師,因為不確定性而束手無策。他們必須先弄清楚所有事情才能開始寫程式碼。他們需要完美的架構,需要評估所有可能的函式庫,需要考慮所有極端情況。同時,街對面的新創公司推出的產品雖然不完美,但功能齊全,他們從用戶那裡學習,不斷迭代,最終贏得了市場。
既不能進展太快(導致技術債堆積,最終害了自己),也不能進展太慢(導致被時代淘汰)。找到這個平衡點是一門藝術,而非科學,只能透過痛苦的經驗才能學會。
我記得有個專案,我們花了三週時間討論一個功能的最佳架構。我們考慮了微服務、事件溯源、各種資料庫方案,幾乎所有相關方案都考慮過了。我們開了白板會,寫了文件。感覺效率很高。但我們一行程式碼都沒寫。
同時,我們的競爭對手推出了他們的版本。雖然架構不如我們預期的那麼完美,但它的確存在了。他們開始收集用戶回饋,並不斷迭代。六個月後,當我們最終推出「完美」的解決方案時,他們已經根據真實用戶回饋迭代了五個版本,儘管最初的架構不如我們,但他們的產品卻遠勝於我們。
關鍵不在於“永遠不要考慮架構”,而是“行動導向”。從最簡單的可行方案入手,然後發布,從中學習,不斷迭代。完美主義是發布的敵人。
但棘手之處在於:有時候你確實需要放慢腳步。有時,承擔技術債就等於以高利貸的形式向未來的自己借錢。懂得何時該快,何時該謹慎——這又需要判斷力。而這正是區分資深人士和其他人的關鍵技能。
我總結了一條很好的經驗法則:如果某件事以後很難修改,那就一開始就把它做好。如果某件事以後很容易修改,那就先發布簡單版本,然後再根據實際使用情況進行改進。資料庫結構定義?仔細考慮。 UI 元件命名?隨便選一個就行了。
這引出了另一個常被低估的技能:知道什麼才是最重要的。並非所有事情都同等重要。並非每個決定都值得投入相同的思考時間。並非每段程式碼都需要完美無缺。
初級開發人員常常把所有事情都看得同等重要。他們會花三個小時命名一個變數,然後匆匆忙忙地編寫實際邏輯。他們會糾結於程式碼風格,卻忽略了根本性的架構缺陷。他們還沒有培養出判斷該把注意力放在哪裡的直覺。
資深開發人員知道什麼才是最重要的。他們知道該在哪些方面下功夫。他們知道什麼時候“差不多就行了”,什麼時候必須做到盡善盡美。他們知道如何果斷地進行優先排序。
我從一位技術長那裡學到了這一點,他常說一句話:「這是一扇單行門還是一扇雙向門?」單行門指的是一旦做出決定,就很難甚至不可能逆轉,需要仔細考慮。而雙向門,如果你不喜歡另一邊的東西,還可以走回去。對於雙向門,只要選好就行了,然後繼續前進。
大多數決定都是雙向的,但我們卻把它們都當成單行道,因為我們害怕犯錯。克服這種恐懼——坦然面對不確定性,坦然接受錯誤並及時調整——至關重要。
你知道坦然接受錯誤與什麼有關嗎?那就是能夠接受回饋而不產生防衛心理。
這雖然是件很基本的事情,但我看過太多人因此毀掉職涯。有人收到關於程式碼、設計或方法的回饋,但他們不是認真聽取和學習,而是爭辯。他們會解釋回饋為什麼是錯的,他們會變得很敏感,會把回饋當成針對他們個人的攻擊。
我明白,真的明白。你辛苦做了一件事,為此感到自豪。但有人卻說它不夠好,感覺糟透了。但你如何應對那一刻,決定了你會成長還是停滯不前。
我最敬佩的開發者,是那些能夠聽到「這不太對勁」後,以好奇而非防禦的姿態回應的人。他們會問:「哦,很有趣——你會怎麼改呢?」而不是「其實,我這麼做是因為……」他們是真心想學習,而不是為了維護自己的面子。
這不僅適用於程式碼審查,也適用於所有方面。關於你的溝通方式、時間估算、問題解決方法、會議表現等方面的回饋,所有這些都能幫助你提升自己。但前提是,你必須能夠放下自尊,並認真傾聽這些回饋。
我職涯早期的一位經理告訴我,我在會議上總是打斷別人。我當時的第一個反應是“不,我沒有”,然後列舉了一大堆例子來證明我其實只是熱情投入而已。但我還是強迫自己閉嘴,在接下來的幾次會議中認真觀察自己的言行。結果證明,她是對的。我確實一直在打斷別人。我太想發表自己的意見,以至於根本沒給別人說完的機會。
這一點很難發現。但一旦我發現了,我就能改正。改正之後,我在會議中效率更高,人們更願意與我交流,我的想法也更容易被接受,因為大家不會感到被壓制。
但我差點錯失了整個成長機會,因為我的第一個反應是防衛。
關於回饋,還有一點要注意:你需要學習如何尋求回饋,而不是被動地等待。要主動去尋找回饋。因為別人主動提供的回饋通常要不是顯而易見的,就是相對安全的。真正有價值的回饋──那些能真正改變你人生軌跡的回饋──往往因為難以啟齒而無人提及。
「我可以做出哪些改變來提高效率?」這是一個神奇的問題。問問你的經理,問問你信任的同事,問問曾經和你一起合作過專案的人。你會得到一些意想不到的答案。其中一些答案甚至會改變你的工作方式。
但你必須真心想聽到答案,必須真正敞開心胸去聽。人們能分辨出你是出於義務才問,還是真心想提升自己。如果他們察覺到你的防備心理,他們只會給你一些安全但無用的建議。如果他們感受到你的真誠,他們或許會告訴你一些有價值的資訊。
這與更廣泛的自我認知有關,我認為自我認知或許是職業生涯中最重要的元技能。你需要誠實地面對自己的優勢、劣勢、不足和盲點。
多年來,我一直以為自己很擅長估算工作量。其實不然。我總是高估兩到三倍。但我卻渾然不覺,因為我總是能找到理由解釋為什麼這次的估算錯了。需求變了。出現了意想不到的複雜情況。有人阻撓我。總是有外部因素作祟。
直到一位經理給我看了我過去六個月的預估資料與實際資料的比較表格,我才意識到問題的癥結所在。哦,原來是我在這方面做得不好。這不是運氣不好,而是技能不足。
一旦我承認了這一點,我就能著手解決了。我開始自己追蹤預估和實際完成情況。我開始預留緩衝時間。我開始把工作分解成更小的部分,以便更好地了解進度。我的預估能力有所提升——雖然還不夠完美,畢竟沒有人是完美的,但已經可以正常運作了。
但只有當我停止找藉口並對自己誠實時,我才能有所進步。
自我認知也意味著了解自己的工作方式。你早上工作效率更高還是下午更高?你需要大段不受干擾的時間,還是可以輕鬆切換工作內容?你喜歡邊說邊思考,還是喜歡安靜思考?你如何應對壓力?哪些問題會讓你充滿活力,哪些問題會讓你精疲力盡?
這些內容在任何教程裡都沒提到,但它卻會大大影響你的工作效率。我是個早起的人,需要大塊不受干擾的時間來處理複雜的工作。一旦我意識到這一點,我就開始嚴格保護我的上午時間,把會議安排在下午。我的工作效率立刻提升了。但我之前卻花了多年時間與自己的自然節奏作鬥爭,因為我總覺得我應該隨時隨地都能有效率地工作。
了解自己也意味著了解自己的觸發點。什麼會讓你焦慮?什麼會讓你停滯不前?什麼會讓你拖延?這些雖然不是教學內容,但對實際完成工作至關重要。
如果工作範圍不明確,我很難開始工作。如果問題太模糊,我會一直拖延下去。意識到這一點後,我給自己設定了一個強制機制:在開始任何重要任務之前,我會寫一段話描述完成時的樣子。這短短的結構就足以讓我脫離困境。但我首先必須注意到這個規律。
所有這些——溝通能力、判斷力、自我意識、政治理解力——加起來就構成了企業迫切想要但卻難以言喻的東西:職業成熟度。
職業成熟與年齡無關。我曾與22歲的年輕人共事,他們成熟有餘,也曾與45歲的人共事,但他們卻不成熟。職業成熟關乎責任感,關乎超越眼前的任務,思考你的工作如何融入全局,關乎如何讓周圍的人更輕鬆地工作,關乎如何成為一個大家都樂於與之共事的人。
以下是職業成熟在實務上的表現:
你不只要完成任務,也要質疑任務的意義。在糟糕的需求變成糟糕的程式碼之前,就要及時提出並阻止它們。在問題易於解決的時候就發現它們,而不是等到問題變得代價高昂時才解決。
你積極主動地溝通。如果你遇到困難,你會立即提出,而不是等到三天後別人問起工作為什麼還沒完成時才說。如果你會錯過截止日期,你會在知道後立即發出警報,而不是等到截止日期前一天。如果你發現風險,即使這並非你的職責範圍,你也會提出來。
你在職權範圍內做決策,如果事情超出職權範圍,則及時向上級匯報。你不會事事都向經理請教,但也不會閉門造車做出重大架構決策。你會根據實際情況和風險進行權衡。
你負責撰寫文件,撰寫清晰的提交訊息,註解掉令人困惑的部分,更新維基百科。你做著這些枯燥乏味的工作,讓其他人的工作更輕鬆,即使這些工作感覺不像是在「真正」地編寫程式碼。
你幫助他人取得成功。你認真進行程式碼審查。你指導初級開發人員。你分享知識。你讓團隊變得更好,而不僅僅是你自己。
你善於向上管理。你及時向你的經理報告工作,而無需他們事無鉅細地管束你。你明白他們的工作也很辛苦,所以會在力所能及的範圍內幫助他們。
你會建立人脈關係,認識其他部門的人。你會明白,在周五下午四點你需要幫助的時候,和你關係不錯的運維人員會比那些只通過簡短的工單更新聯繫過的人更能幫上忙。
你會從業務角度思考問題。你明白公司需要獲利。你明白每個決策都存在著權衡取捨。你會考慮成本,包括顯性和隱性成本。你不僅追求技術上的精妙,更追求商業價值。
這一切都不光鮮亮麗,也並非人們想像中開發者的工作內容。但這正好決定了誰能晉升,誰會止步不前。
我見過太多這樣的例子了。兩個技術水準相近的開發者,一個進步神速,升職加薪,接到有趣的專案,獲得豐厚的回報;另一個則停滯不前,感到沮喪,最終可能選擇離開。技術上的差距很少是顯而易見的,往往是其他因素造成的。
最令人沮喪的是,停滯不前的人往往不明白原因。他們認為自己明明技術過硬,卻還是被忽略了。他們沒有意識到,技術只是基本要求。超過某個門檻,技術就不再是決定性因素了。
公司真正重視的──他們真正付費購買的──是那些能讓公司工作更輕鬆的人。是那些能降低風險的人。是那些能在迷茫中理清思路的人。是那些值得信賴、能承擔重要工作的人。是那些能讓周遭所有人效率更高的人。
這才是真正的技能。但招聘啟事中很少提及,因為它很難用語言準確描述。 「必須能夠編寫簡潔的程式碼」很容易寫進徵才啟事裡,而「必須有判斷力,知道完美主義是優秀的敵人」則很難量化。
但面試過程其實就是在評估這些,即使他們沒有明確說明。那些行為面試題,那些沒有唯一正確答案的系統設計題,那些關於你如何處理衝突或應對模糊情況的問題,他們都在試圖了解你是否具備職業成熟度。
職業成熟的關鍵在於:它是可以培養的,並非與生俱來的。但你需要有意識地去培養牠。你必須專注於工作運作的深層機制,而不僅僅是工作本身。你必須從自己的錯誤和他人的錯誤中學習。你必須勇於嘗試新方法,即使這意味著要承受不適。
當我開始積極投入這些工作——真正關注溝通、利害關係人管理以及團隊的人際關係——我的職業軌跡發生了變化。這並非一蹴而就,而是需要時間。但機會開始出現,人們開始徵求我的意見,經理們也開始邀請我參與早期階段的討論。專案也變得不再那麼令人沮喪,因為我更擅長預防問題,而不是被動應對。
我繼續寫程式碼,繼續學習新技術,不斷提升自己的技術水準。但我不再把這些視為最重要的事。它們固然必要,但還不夠。它們是基準,而不是決定性因素。
我真希望十年前有人告訴我這些。我真希望有人告訴我:「沒錯,學習程式設計固然重要,但也要學習溝通技巧、如何融入組織、如何管理利益相關者、如何在不確定性中工作、如何平衡各種優先事項、如何給予和接受反饋、如何理解業務背景。」 那樣我就能省去多年困惑,不必糾結於為什麼僅僅擁有精湛的技術是不夠的。
但也許我根本不會聽。也許這是你必須透過經驗才能領悟的道理。也許你必須花幾年時間,眼睜睜地看著自己寫出的優秀程式碼無法帶你走向成功而感到沮喪,才能最終明白,職業成功還有完全不同的維度。
如果你正在閱讀這篇文章,並且你還處於職業生涯的早期階段,我希望你能認真對待。我希望你不要誤以為多學一個教學、多考一個憑證、多掌握一個框架就能讓你更上一層樓。事實並非如此。真正讓你更上一層樓的是培養這些元技能。
留意高層人員的行事方式。不僅僅是他們編寫的程式碼,還有他們的溝通方式、會議主持方式、衝突處理方式、決策方式、時間管理方式以及與非技術利害關係人的互動方式。這才是真正學習的地方。
要多提問。不僅是關於如何實現某個功能的技術問題,還要問關於流程、背景和原因的問題。 「我們為什麼要開發這個?」「誰會用它?」「如果我們不發展它會怎樣?」「有哪些替代方案?」這些問題看似簡單,卻能幫助我們從更高的層面思考工作。
主動承擔一些超出你舒適圈的事情。例如,主動提出做產品演示,主動提出撰寫文件,主動提出指導新員工入職。這些看似會分散你「真正工作」的注意力,但實際上卻是提陞技能的絕佳機會。它們會迫使你進行溝通,思考使用者體驗,並從不同的角度看待系統。
尋找導師。不只是技術方面的導師——技術技能你可以從 Stack Overflow 上學到——更重要的是人生方向的導師。找到那些已經達到你目標的人,問問他們是如何做到的。如果你真心好奇,並且尊重他們的時間,大多數人都會非常樂意提供協助。
對自己要有耐心。這些都需要時間。你會犯錯,你會誤判情勢,你會溝通過度或溝通不足,你會判斷錯優先事項。這都沒關係,學習就是這樣。關鍵在於真正從中學到教訓,而不是只歸咎於運氣不好或別人的失敗。
還有一件重要但很少被提及的事:照顧好自己。職業倦怠是真實存在的。不斷學習、隨時待命、快速交付、用更少的資源做更多事情——這些壓力真實存在,而且非常巨大。如果你精疲力竭,其他所有技能都毫無意義,因為你將無法正常運作。
我為此付出了慘痛的代價。我曾連續兩年每週工作超過60個小時,隨時待命,隨時響應,並為自己能處理這麼多事情而感到自豪。然後,我徹底崩潰了。我無法集中註意力,也無法解決那些對我來說輕而易舉的問題。我變得易怒、疲憊不堪,而且頻頻出錯。我需要三個月的時間,刻意地恢復正常的工作時間,並真正地休息一段時間,才能恢復過來。
公司口口聲聲說要平衡工作與生活,但激勵機制往往適得其反。總是隨叫隨到的人往往能接到緊急專案,反應迅速的人會被視為可靠。人們很容易陷入「努力工作才是成功之道」的誤解。
但可持續的成功需要設定界線。它需要你偶爾說「不」。它需要你保護好自己的時間和精力。它需要你認識到,你不是一台程式碼產生器——你是一個擁有有限資源的人,需要進行策略性管理。
我認識的最有效率的人並非工作時間最長的人。他們工作方式可持續,擁有工作以外的生活,能夠以飽滿的熱情而非疲憊的狀態去解決問題。他們或許單日產出不多,但他們日復一日、年復一年地保持穩定。這種穩定性會產生累積效應。
說實話,擁有工作以外的興趣與嗜好和人際關係會讓你在工作中表現更出色。它能讓你擁有更廣闊的視野,避免將全部自我價值與工作捆綁在一起,從而在遇到問題時減少抵觸情緒。它還能讓你接觸到不同的思考方式,讓你成為更受歡迎的合作夥伴。
所以,沒錯,要培養這些專業技能。但也要去攀岩、演奏音樂、讀小說、做志願者,或做任何能讓你快樂的事。別讓工作佔據你的全部生活。那些站在頂峰的人並不是因為他們犧牲了其他一切——而是因為他們找到瞭如何在不犧牲其他一切的情況下高效工作的方法。
回顧我迄今為止的職業生涯,模式清晰可見。我的成長並非來自教程,也並非來自我學習的框架或掌握的語言,而是來自那些混亂的人際互動經驗。來自交付失敗的產品並理解其原因;來自與難相處的人共事並學會如何應對;來自犯錯並學會接受反饋;來自緩慢而痛苦地培養對重要與不重要事物的判斷力。
教學給了我基礎知識,讓我敲開了這扇門。但之後發生的一切——所有真正的學習、所有實際的成長、所有公司真正重視並願意為此付費的技能——都來自於實際工作以及對工作運作方式的深入理解。
如果說我希望你們記住一件事,那就是:技術技能固然必要,但並非充分條件。它們是進入這個行業的門檻,而非通往成功的唯一途徑。在這個行業,真正的成功源自於技術能力和職業成熟度的結合。而職業成熟度並非一朝一夕就能學會的,它需要透過經驗累積、刻意練習以及對產業本質的深刻理解才能獲得。
所以,是的,要不斷學習。繼續編程。保持你的技術技能精湛。但也要發展其他方面的能力。學習溝通。學習如何在組織中游刃有餘。學習如何管理利害關係人。學習如何思考商業價值。學習如何在不確定性中工作。學習如何給予和接受回饋。學習如何在資訊不完整的情況下做出決策。學習如何永續地照顧好自己。
這才是真正的課程。這才是企業真正願意付費購買的課程。這才是能讓你在職涯中不斷前進的課程,而其他擁有和你相同GitHub star數的人卻還在苦苦思索為何停滯不前。
如果你讀到這裡心想「但我只想寫程式」——我完全理解。我以前也是這麼想的。但秘訣在於:培養這些技能並不代表你會減少寫程式碼的時間。它意味著你將有機會參與更有趣的專案,擁有更大的自主權,獲得更高的薪酬,加入更優秀的團隊。它意味著你將減少因組織運作不良而產生的挫折感,從而有更多時間創造真正有意義的東西。
選擇並非在於技術能力和職業素養之間,而是孤立地運用技術,還是以一種能在現實世界中創造真正價值的方式來運用技術。而現實世界紛雜、充滿人性、政治因素與不確定性。那些能夠成功發展的開發者,正是那些擁抱而非抗拒這一切的人。
所以,擁抱它吧。學習那些教程裡不會教的技能。成為一個不僅能寫出好程式碼,還能創造佳績的人。這才是公司真正需要的。這才是他們願意付費的。這才是能幫你打造理想職涯的關鍵。