我認識最頂尖的程式設計師
我這輩子見過許多開發者。最近,我問自己:「要成為最頂尖的一員,需要具備什麼?他們共同擁有什麼特質?」
希望這能啟發某些讀者,我把在這個領域中最傑出的人身上觀察到的特質寫了下來。真希望我剛入門時就有這份清單。如果當時就依循這條路,一定能省下我許多時間。
閱讀官方文件
如果年輕時的我有一件事應該要做的,那就是去閱讀官方文件,也就是我所使用工具的說明文件。例如去讀 Apache Webserver Documentation、Python Standard Library,或是 TOML spec。
別去 Stack Overflow,別問 LLM,也別瞎猜,直接去看源頭。很多時候,你會驚訝地發現官方文件出乎意料地好讀、而且寫得很好。
深入了解你的工具
頂尖的開發者對自己使用的技術有根本性的理解。
能夠使用一項工具是一回事,真正grok(透徹理解)它則是另一回事。普通的使用者只會摸索嘗試、很容易困惑、用錯方法,也不會去最佳化設定。
專家則會(在讀完官方文件之後!)坐下來為該工具撰寫設定檔,他們理解其中的每一行,並且能夠向同事解釋。這就不會留下任何疑慮!
要真正了解一項工具,你必須知道:
- 它的歷史:是誰創造的?為什麼?為了解決什麼問題?
- 它的現況:誰在維護?他們在哪裡工作?在做什麼?
- 它的限制:什麼情況下不適合使用這個工具?它會在何時失效?
- 它的生態系:有哪些函式庫?誰在使用它?有哪些外掛?
舉例來說,如果你是一名後端工程師並且大量使用 Kafka,我會期待你對 Kafka 有深入的了解——而不只是從 Reddit 上看到的東西。至少,如果你想成為最頂尖的工程師,我會這樣期待。
仔細閱讀錯誤訊息
指的是真正去讀錯誤訊息,並試著理解其中的內容。結果發現,只要你靜下心來好好琢磨錯誤訊息,它就會開始對你說話。最厲害的工程師能從極少的脈絡中推斷出大量資訊。光是閱讀錯誤訊息,你就能自行解決大多數問題。
如果你去幫助一個沒有這種能力的人,也會感覺自己像擁有超能力一樣。就像「觀杯占卜」之類的。
拆解問題
每個人都有卡關的時候。最頂尖的人懂得如何脫困。他們把問題簡化到可以消化的程度。這是一項難以學會的技能,需要大量的經驗。或者,你天生就擁有出色的問題解決能力,例如你很聰明。如果沒有,你可以訓練這項能力,但無論如何都無法迴避拆解難題。這世上有些問題太過困難,沒有人能一次就解決。
如果你是一名專業的開發者,這就是你受薪工作的主要內容:拆解問題。如果你做得對,會感覺像在作弊一樣:你只是一個接一個地解決簡單的問題,直到完成為止。
別怕弄髒雙手
我認識最頂尖的開發者會閱讀大量的程式碼,而且不怕動手去碰。他們從不說「那不關我的事」或「這方面我幫不上忙」。相反地,他們直接開始動手、邊做邊學。程式碼就只是程式碼。只要投入時間和精力,他們就能學會任何需要的技能。不知不覺中,他們就成了團隊中處理那些事務的首選人物。主要原因就是,他們一開始是唯一不怕動手去碰的人。
樂於助人
相關的一點。優秀的工程師總是很搶手、總是很忙,但他們總會盡力幫忙。那是因為他們天生好奇,而那種樂於支持他人的心態,正是讓他們一開始就成為優秀工程師的原因。團隊中有他們是莫大的樂事,因為他們是問題解決者。
寫作
大多數厲害的工程師都口條清晰、樂於分享知識。
最頂尖的人會有一些抒發想法的方式:部落格、演講、開源專案,或是以上幾種的組合。
我認為寫作能力與程式設計能力有很強的關聯。我認識的所有頂尖工程師都至少精通一種人類語言——通常還不只一種。掌握寫作的方式就是掌握思考的方式,反之亦然。一個人的寫作風格充分反映了他的思考方式。如果寫作混亂、缺乏結構,他的程式碼風格也會如此。如果寫作簡潔、有啟發性、結構良好、偶爾還帶點機智,他的程式碼也會如此。
優秀的程式設計師樂在玩弄文字。
永不停止學習
我認識的一些最頂尖的開發者已經 60 多歲了。他們的能力遠遠超過我。部分原因在於他們持續學習。如果有他們還沒試過的新工具或喜歡的語言,他們就會去學。用這種方式,他們總能輕鬆地跟上潮流。
這可不是理所當然的事:很多人從大學畢業或開始第一份工作後,就很快停止學習了。他們卡在認為學校教的就是做事情的「正確」方法的思維裡。所有新東西都是不好的、不值得花時間。所以有 25 歲就「心智上退休」的人,也有 68 歲仍保持思維鮮活的人。我期許自己有朝一日能成為後者。
有點相關的是,最頂尖的工程師不會盲目追隨潮流,但他們總會仔細評估新技術的好處。如果他們否定了某項技術,他們能準確地告訴你為什麼、這項技術在什麼情況下會是好選擇,以及有哪些替代方案。
頭銜並不重要
最頂尖的開發者與首席工程師和資淺開發者都能同樣自在地交流。沒有階級之分。他們試著向每個人學習,無論年長或年輕。新人往往還未深陷辦公室政治,仍保有新鮮的思維。他們不知道為什麼事情會很難,所以會提出有創意的解決方案。也許過去的障礙早已不復存在,這讓這些人成為絕佳的靈感來源。
建立聲譽
如果你做出好成績,你可以成為一名穩健的工程師,但只有當你因為好成績而為人所知時,你才能成為最頂尖的一員;至少在一個(較大的)組織內是如此。
建立聲譽有很多種方式:
- 你為(較大的)組織打造並交付了一項關鍵服務。
- 你寫了一個知名的工具
- 你對一個熱門的開源工具做出貢獻
- 你寫了一本常被提及的書
為什麼我認為因你的工作而為人所知很重要?以上所有方式都是擴大你在社群中影響力範圍的方法。知名的開發者影響的人遠比不知名的開發者多。你能寫的程式碼終究有限。如果你想「擴大」你的影響力,你就必須成為思想領袖。
建立聲譽是一個長期目標。它不會一夜之間發生,也不必如此。而且它不會偶然發生。你每天出現、做好工作。久而久之,成果會自己說話。會有更多人信任你和你的工作,並且想與你合作。你將參與更具聲望的專案,影響圈也會隨之擴大。
我曾聽過這樣一個想法:你最新的作品應該要超越你之前所做的一切。這就是你走在正確道路上的好跡象。
保持耐心
你需要對電腦和人保持耐心。尤其是對自己。不是每件事都能馬上成功,人也需要時間學習。不是你身邊的人很笨;他們只是資訊不完整。沒有耐心,你會覺得全世界都在與你作對,身邊的每個人都只是無能。那會是個很痛苦的處境。你聰明反被聰明誤。
想成為最頂尖的一員,你需要驚人的耐心、專注與投入。如果你想解決難題,就不能輕易分心。你必須回到鍵盤前去克服它。你必須投入心力把專案推向終點。而如果你能做到這些,同時又不顯得自大傲慢,那就更好了。這就是頂尖與平庸的區別。
別怪電腦
大多數開發者會把不穩定、看似「隨機」的錯誤怪到軟體、其他人、他們的狗,或是天氣頭上。
最頂尖的開發者不會這樣。
無論電腦的行為看起來多麼反覆無常或捉摸不定,永遠都有一個合乎邏輯的解釋:只是你還沒找到而已!
最頂尖的人會不斷深究,直到找到原因。他們可能不會馬上找到原因,也可能永遠找不到,但他們從不歸咎於外部環境。
抱持這種態度,他們能夠取得驚人的進展,並學到別人學不到的東西。當你把錯誤當成無法理解的魔法時,它就永遠都會是魔法。
別害怕說「我不知道」
在求職面試中,我會逼候選人至少說一次「我不知道」。原因不是我想顯得高人一等(雖然有些人確實有這種印象)。不,我想觸及他們知識的邊界。我想和他們一起站在他們自以為知道的邊緣上。很多時候,我自己也不知道答案。老實說,我也不在乎答案是什麼。我在意的是,人們是否在面試中胡謅瞎扯、矇混過關。
最優秀的候選人會說:「嗯,我不知道,但這是個有趣的問題!如果要我猜的話,我會說……」然後他們會接著推導出答案。這就是你有潛力成為優秀工程師的跡象。
如果你害怕說「我不知道」,你是出於自大或防衛心態。我不喜歡團隊裡有愛胡扯的人。最好承認你不可能什麼都知道。一旦你接受這點,你就允許自己去學習。「重要的是永不停止發問,」Albert Einstein(愛因斯坦)如是說。
別瞎猜
「面對模稜兩可,要拒絕猜測的誘惑」這是我在 PEP 20 – The Zen of Python 中最喜歡的一條規則。
而猜測真的、真的很誘人!
我也曾多次身陷其中,並因自己的想當然而失敗。
當你瞎猜時,可能會發生兩件事:
- 在最好的情況下,你猜錯了,而你錯誤的假設導致了一個錯誤。
- 在最壞的情況下,你猜對了……而你將永遠不會停下來質疑自己。你基於錯誤的假設建立起心智模型。這可能會困擾你很長一段時間。
再說一次,抗拒猜測的衝動。提出問題、閱讀官方文件、使用除錯器、徹底求證。竭盡所能去找到答案。
保持簡單
聰明的工程師寫出聰明的程式碼。傑出的工程師寫出簡單的程式碼。
那是因為大多數時候,簡單就夠了。而且簡單比複雜更容易維護。有時確實需要把事情做到精準到位,但能否分辨其中的差異,正是頂尖與平庸的區別。
保持簡單,你就能成就很多。專注在對的事情上。
結語
以上內容不是一份待辦清單,也不是一場競賽;卓越的工程也不是賽跑。
只是別自欺欺人,以為可以跳過辛苦的付出。沒有捷徑。祝你的旅程好運。
隨機一篇部落格