如何才有資格稱為資深工程師

看到這篇推,心中還滿有感觸的。本來就不是資歷混夠久、程式寫得好就能算得上資深工程師;資深工程師該怎麼定義其實很難拿個準,我的主管也曾問過我這個問題,我一時之間也很難完整回答。不過在面試時常常看到很多面試者都是應徵資深工程師,但實際問他們一些問題之後,卻發現他們卻缺乏了一些東西。

所以藉這個機會,我想從幾個面向來聊聊我心目中的工程師應該具備哪些特質與能力,而這些特質與能力,我都是從身邊厲害的同事們與社群的朋友們身上觀察到的,他們都是我所敬重的資深工程師 (當然職稱不一定是) ;同時我也會提供一些過去遇到的反指標,避免大家誤會資深工程師是否都是這樣的人。

技術能力層面

對工具技術有深入的掌握度

這個特點大概是一般人用來評斷資深工程師能力最明顯的表象特徵,也就是是否將常用的工具能練得很熟或是對語言理解得夠深,同時也將技術內化到自己平常的開發習慣裡,達到信手捻來的境界。這樣的資深工程師在開發上能有全面性的考量,同時也能幫助團隊更有效率地達成目標。

反指標:有時這個能力會以個人開發的效率來評估,使得有人常常誤認為只要能很快完成功能就有資格當資深工程師,但他們卻忽略掉其他更值得注意的能力,結果為團隊帶來災難。

能寫出可理解可維護的程式碼

這個特點的特徵就是平時就會撰寫測試、並對自己的程式碼做重構;對於自己的程式碼風格、變數或方法名稱等都非常要求,也絕對不會特意去走難懂的捷徑。這樣的資深工程師是非常自律的,所以被他 code review 時可能會有點痛苦,但絕對會學到很多。通常到這個階段的工程師,都是心靈上已經受過不少傷害,也對自己發過誓不再讓自己的程式碼傷害他人。

反指標:有些工程師會過度強調工具或標準帶來的規範,反而讓整個團隊疲於應付這些規則,失去了開發上的敏捷與效率。

選擇技術的能力

雖然實務經驗豐富而能夠精準判斷是資深工程師的優勢之一,然而在面臨專案要使用的技術選項時,資深工程師不會把自己的喜好的技術強加在團隊上,而是跟團隊一起討論與研究,並在多方考量後去挑選出最適合這個專案以及這個團隊的技術。

反指標:有些時候老鳥會認為他所習慣的舊技術可以解決一切問題,即便這種技術維護起來不那麼容易。當專案使用新技術遇到瓶頸時,他不會伸手幫忙,反而會在旁幸災樂禍。

軟體架構分析與設計能力

這個階段的能力靠得是非常多的實戰與專案經驗,加上對理論的融會貫通才能得到。一個優秀的資深工程師可以針對需求做出完整的分析,並從上而下、由粗到細地規劃出良好的軟體架構設計,也能在程式效率與可理解性之間取得平衡。他們對於每個技術的生態系都有一定程度的瞭解,幫助自己的規劃時能夠更快找到工具,也能避開嚴重的缺陷。

反指標:有些工程師可以將書中理論背得滾瓜爛熟,但在實際設計時卻沒有看清現實而規劃出不甚合理的架構,這是多數理論派工程師的通病。

圖像解說能力

能夠在解釋一個技術時,用簡單清楚的圖形來解釋原理,這點是資深工程師必備的能力。通常如果能用手繪圖形的方式來說明,表示對該技術的原理已經有足夠的瞭解。從畫出來的圖也能看出工程師對於知識的組織能力,好的圖像組識要能讓其他人一眼就能理解知識的全貌,這全仰賴工程師對該知識的理解。

反指標:有些工程師會只畫個方塊或圓形,然後就開始講解;而在講解過程中,動筆的次數也不多;也有些工程師只是把記憶裡的圖形畫出來,但卻說不出所以然。這些都是圖像解說能力不夠的現象。

文件編寫能力

多數的軟體工程師都討厭別人不寫文件,但討厭自己寫文件。其實寫開發文件並不是浪費時間的事情,而是可以減少其他開發者跑來打擾自己的機會。只是很多數人對於自己的文筆沒有太大的自信,把它當成不寫文件的藉口。資深工程師通常會在文件中交代這個專案的背景、架構以及如何安裝、維護等資訊,事實上他們會以未來的自己要重新接手這個專案的心情來寫,這樣就不會認為寫文件是痛苦的事了。

反指標:有些工程師會用自動產生器生出制式化文件後就交差了事,認為這樣就盡了編寫文件的責任。但通常這些文件僅僅包含函式和參數的名稱,沒有任何它為何存在的說明,參考的價值並不大。有時文件不見得要另外寫,註解裡也是說明為什麼的好地方。

能綜觀全局的能力

在討論一個新功能,或是修改一個舊功能時,能不能考慮到所有會被影響的層面,進而判斷如何處理。另外這也考驗著資深工程師的記憶能力,因為通常這不是已經踩過無數類似的雷,就是對系統已經瞭若指掌了。資深工程師會站在俯瞰的角度來觀看整個專案全貌,並權宜各種技術面的優缺點後,提出可行的方案讓決策者參考,也讓其他執行的工程師在實作時能夠有依偱的方向。

反指標:有些工程師會過度憂慮未來的情況,而提出一些其實沒有明顯必要的因應措施;有時這些人是為了讓自己能佔有一席之地,所以用一些沒有根據的論點來讓自己顯得很資深。

嘗試導入對團隊更好的流程

資深工程師會從木桶定律體認到自己的效率不等於團隊的效率,所以會試著導入良好的開發流程,或是自動化佈署等讓團隊能更有效率的技術。在這期間,他會透過 code review 或是教育訓練的方式來協助伙伴們往好的方向前進,讓他們感受到好的開發流程所帶來的好處。

反指標:有些工程師很喜歡新技術,而沒有考慮到團隊的接受度就貿然導入;這種狀況很容易造成浪費過多人力在解決一些新技術所帶來的新麻煩,進而影響整個團隊的士氣。

心理素質層面

真正能完成一件事的自信

這個特點並不是指自傲,而在技術層面的各項指標都達到一定水準後,資深工程師在面對任何挑戰時所產生的自信心。他能從各種面向來規劃出專案所需要的基礎建設,在開發時也能夠從架構面到程式碼都有很棒的見解與實作。在經歷過多場戰役後,這種態度通常都能贏得其他伙伴的敬重,明白只要有他在團隊裡,很多問題都能迎刃而解。

反指標:有些工程師會把熟練工具後就能完成的事當成自己的能力,進而產生過度的自信;一旦抽離這些工具,他們會很難找到替代方案來解決問題,進而對提出質疑的人產生防禦心態。

不斷地自我提升

在工作之餘,資深工程師會調配自己的時間來接收新知,也會不斷地加強自己的基本能力。由於他們的基礎打得非常好,所以能對新事物有舉一反三的能力。他們對新事物接受度高,但也不會過份追逐新事物;他們會針對自己的興趣或是工作的需要來有計劃性地學習,避免把時間花在太多方向上,結果反而一事無成。

反指標:有些工程師會有自己的一套偏方,認為這些偏方就能幫他達到目標,不用花時間學新事物。但是累積錯誤糟糕的經驗並不能成為好的資深工程師,因為他從來不打算理解有無新的方法可以做得更好。

臨危不亂

專案在進行開發或維護的過程中,常常會有一些意外發生,這常會讓一些沒有經驗的工程師慌了手腳。優秀的資深工程師會秉持著「難題不會因為你的憂心而變得簡單,不如保持平常心來看待。」的心態來面對意外。這會讓他們跳出被框住的思維,看見問題的全貌,進而找到更好的解決方案。

反指標:有些工程師會在問題發生時漠不關心,似乎這些問題事不關己一樣。這會發生在一些權責過度分明,犯錯就會被處罰的制度裡。

樂於分享所知

資深工程師會意識到只有技術能力高是不夠的,他們會透過演說的方式來訓練自己的口才技巧,也會透過紀錄文章的方式來加強自己的文筆能力。而藉由這些分享,除了能幫助他人少走冤枉路之外,事實上也能得到更多回饋來讓自己的視界變得更加廣闊。技術社群有很多這樣的工程師,他們會在工作之餘參加讀書會或研討會,以分享更多工作上的經驗。

反指標:有些工程師很喜歡分享書中的死知識,而不是自己的實務經驗談;他們分享的知識可能很有道理,但卻很難跟實際狀況有所連結。

溝通受人敬重

在進行專案討論時,在自己有把握的部份會做出有自信的發言;而且也會尊重同事的想法,而不是用嗤之以鼻的方式來反駁。謙遜是資深工程師一個很重要的特色,他不會在不懂的地方上爭辯,而是會在時間允許的狀況下虛心請教,不然就是下次討論前先作足功課再上場。伙伴們通常都會喜歡找他討論技術,通常也不一定是因為能力落差的關係,而是跟他聊技術這件事本身就很快樂。

反指標:有些能力很強的工程師,會以強勢的方式來讓對方接受自己的想法。即便他是對的,但通常時間一久之後,就會破壞皇城團隊內的和諧。

勇於認錯、自我反省

不論是線上的大問題,或是開發時的錯誤,資深工程師都會勇於認錯;多數這樣的工程師,也都是勇於承擔責任的人。他懂得承認自己的錯誤並不是可恥的事,因為他知道這是自己成長的契機;所以他會在問題被解決之後,重新省視自己做錯了什麼。這倒不是說資深工程師該把責任往自己身上攬,而是要讓團隊能夠儘快發現問題,儘快去解決。這樣的工程師通常可以在反省會議上提出不少好的見解,因為他其實就是團隊的鏡子,能幫助大家看見自己忽略的問題。

反指標:有些工程師會抱著「把過錯推給別人,比自己承認來得簡單。」他們可能會以職責權限來讓自己不受責難,或是毫無肩膀地把過錯直接推給資淺的同事。

這些不是全部

以上這些面向並沒有完整地涵蓋一個資深工程師會有的特質與能力,我想各位可以就近觀察自己身邊的優秀同事,看看他們身上是有哪些值得你敬重的地方。當然也不是說每個資深工程師都要能做到上面這些,像我自己也常常會自省有哪些特質與能力是我還沒達到的。

而不論是能力或特質,其實都是相輔相乘的。在技術能力上雖然可以透過自我訓練來加強,不過心理素質就比較難在一夕之間改變了。優秀的資深工程師則會在這兩方面同時俱進,從工作上去找出讓自己的技術能力與心理素質都能提升的機會。