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