這樣算是Senior Engineer了嗎?(學習、特質)

「我所認為的Senior Engineer 系列」的第二篇文章,是接續前一篇工作與心態之後,回顧一下自己成長的過程和累積的技能,並反思一下目前的自己與理想中的軟體工程師之間,還有多少路程要走

CraftsmanHenry
12 min readJan 14, 2022

前言

如同上一篇文章所述到今年2022年,我將成為一個擁有五年資歷的工程師;五年資歷不僅僅是客觀的在就業市場上,我未來的客戶(雇主)將會對我有更大的期待而已,更重要的是我有沒有走在自己想要走的道路上。而我想走的路是怎樣的路呢?

做一個「有獨特性的Programmer」一直是我在追求目標,不過它的定義隨著我所處的階段一直在改變,大學的我認為「把Computer Science的學科學好」就算是有獨特性的工程師,因為外面的就業教學機構不會教這些學科,通常是教使用特定工具,因此資工學科確實帶來一點不同,但出社會後面對與你同樣是Computer Science出身的人或是認真把這些都自學會的人,我還能有何不同呢?更進一步是我該有些什麼技能或特質才能比剛起剛從學校畢業的人更有資格與自信認為自己有到「資深」的等級呢?

相信在今年2022年的一開始就想清楚是個不錯的選擇,我想就從這裡開始談吧!

理想的資深工程師(Journeymen)- 我想走的路

一般資深工程師的英文是Senior Engineer,但我想故意引出標題的Journeymen(繁中翻譯:熟練工)這個詞,這個詞的解釋我取自於Clean Coder中Apprenticeship章節中的第二小節;書中這樣定義Journeymen

They are knowledgeable about current technology but typically lack experience with many diverse systems. They tend to know one language, one system, one platform; but they are learning more. Experience levels vary widely among their ranks, but the average is about five years.

以上粗體的部分是我認為的重點

  • 熟習當前使用技術
  • 缺乏在多個平台與系統上工作的經驗
  • 平均有5年資歷

其中最令我在意的是第一項,熟習當前使用的技術。但如今技術日新月異,目前賴以為生的技術會不會下個月就冒出一個新技術說想要取代它,實在很難説。除了第一項外,我搭配第二和第三項思考並認知出我認為要身為一個資深工程師的幾個要素

深知技術背後的概念與其試圖解決的問題

工具與語言頻頻出新,若無條件地追,沒有追完的一天。在部落格上看到不少強者,他們會知道今天這樣新技術是為了解決什麼問題而衍生出來的,而且深諳背後設計的概念,因此能夠以極快的速度學會類似概念的技術

不斷學習新知識並分享給周邊的同僚

而之前觀察有些比較資深的同事會以當前任務所需去看當前市面上是否有比他過去認知的技術更好的解決方案,若有他們會將這些新技術推廣給大家,並且自己學起來後,還能夠撰文或開個workshop介紹給其他同仁們使用

謙虛且積極學習不同系統的知識

這是列在第二點的,在心目中優秀的資深工程師承認自己還無法在多個平台與系統工作,但不因此而自卑,會透過行動不斷學習不同的工具與平台。重要的是他們都不是學來嘴砲的,而會身體力行做個PoC(Proof of Concept)出來,確認自己的學習效果

💡 最後一點5年資歷則比較微妙,因為5年可以是一份工作做5年或是一年換一個工作做5份工作,這兩類的工程師我都遇過,但在同一份工作耕耘較久的工程師一般比較多人具備以下我期許一位資深工程師該有的特質

沒有最好的解決方案只有最適合當前時空背景的

在之前的工作中還有一些令我敬佩的朋友,他們不會執著於特定自己會的技術,而是博學多聞並且會在仔細了解需求過後,根據需求與組織內部習慣選擇最合適的技術,不過我想要資深工程師的後期才能達到這個階段吧!

以身作則,寫出能自我描述與容易擴展的程式碼

軟體工程師在使用任何技術都免不了寫程式,而他們深知組織良好且表達性強的程式碼,能節省相當多的時間和人力成本在未來的開發、擴充或Debug上。不知道是過去深受爛程式碼的迫害還是自己本身就有那份追求好程式的態度,但他們都以身教告訴大家好的程式碼該怎麼寫,並且還會認真code review別人的程式碼,雖然被review會有些痛苦,不過收穫卻很多

持續求變並改進目前的工作方法

根據過往,有經驗的工程師明白,新技術的出現時常會大大影響現有的工作模式,而他們不以過往熟悉的那一套方法為圭臬,而是保持開放的心態,隨時尋找更好的工具來使自己的工作方式更為流暢。同時他們也歡迎其他人與自己分享更好的方式

負責任搞清楚自己當前使用的技術

時常因為專案進度的壓力,工程師們在開發時為了解決眼前的問題,會遺漏自己選擇的解決方案中的一些細節;負責任的工程師會在事後,深入了解他們選擇的解決方案,來避免一些像是安全性、效能或是租賃(雲端服務)費用…等的非功能面問題,對他們而言程式不是能跑就好,他們對自己的產出負責

綜觀全局,分析設計最適合當前規模的軟體架構

沒有阿斯匹靈式的通用軟體架構,只有適合當前團隊大小、客戶規模與需求的架構;有經驗的工程師在許多不同規模的專案中工作過,見識也實作過各種規模的軟體專案,並且腦中也組織出一套系統用以再次實作他們曾經碰過的軟體架構。因此他們有辦法根據目前遇到的狀況,來選擇最合適的軟體架構。這個特質只有在網路上看到部分技術大神具備,真好奇他們都在哪工作

其實以上這些想法都是透過觀察與閱讀書籍、文章後得到的一些心得,當下看到上述這些特質的感覺就是

我也想成為能夠令我自己佩服的工程師

最近重新看 The 7 Habits of Highly Effective People by Stephen Covey 其中第二個習慣「Begin with the end in mind — 以終為始」不禁讓我覺得,事先想清楚自己到底想要如何扮演軟體工程師這個角色,真的讓每天的成長學習,還有面對工作上的各種選擇有個更明確的方向,也減少花在質疑每個選擇的時間。

想推薦兩本能夠幫助大家思考自己想成為怎樣的軟體工程師

還有給我論點整理這篇的另一個部落格文章

以上是我覺得有助於大家思考自己想成為怎樣工程師的部分,但「這些只是跟技術比較相關的部分」,其他還有一些關於溝通跟領導特質(leadership)相關的部分,因為篇幅問題,等我有更深的體悟後,有機會再分享,接下來的部分是我對於自己的反思,若對我本身如何思考沒有興趣的讀者,我覺得到此為止就可以,當然有空看看我的想法並給我建議的人,真的萬分感謝 🙏

現在的我

對我而言透過這篇文章,梳理我腦中許多含糊不清的想法,可以讓我更清楚自己理想的資深工程師到底長得怎麼樣,而現在是該來誠實面對我自己到底如何的時候了,接下來就來理性分析一下自己吧!

學習

到目前的公司為止,我一共服務過三家公司,無可避免的每一家現有的技術跟能接受新技術的能力都不同,為此我學習的方式採用三個原則

  • 將公司選擇所採用的技術學習到可以協助團隊達成公司目標就好,轉而
  • 盡可能了解公司採用這項技術後面的原因和歷史背景
  • 多去談論技術的論壇或是部落格尋找能解決我使用當前技術障礙的方法

以上三點其實最困難的是第三項,也是想略談的項目,由於過往在學校都是由老師給予我學習的內容與方向,所以要「自發地尋找學習與深入的內容」其實非常的有挑戰性,不過透過工作上對自我的觀察後,我選擇以能解決我當前工作上困難的新技術或概念為學習方向,如此不僅對我自身有幫助,也能對公司的其他同事也有幫助;跟其他同事聊過發現,我使用起來有障礙的技術,其實他們也有,如此一來就有小聊一下的話題了 😆;同時這樣的技術還能夠改善現有的工作流程來提升產能或產出的品質。

關於不同的工具與平台的部分,比較算是誤打誤撞,因為前公司的SRE團隊剛好有同事發起活動在連續幾周的某天下午開讀書會講一些Cloud Provider的相關知識,由於我本身有興趣並且認為可以促進自己跟SRE團隊的溝通。沒去上課還好,一去才知道原來Cloud Provider不僅僅會用服務就好,還有很多旁枝末節需要注意,才能避免不少非功能面(例如:擴展性、安全性、開銷…等)方面的問題,在這邊一定要跟前公司的(W 和 J)兩位同事說聲謝謝;不過由於我自己是屬於需要動手實作過才能理解的類型,因此還去弄了Cloud Provider的帳號自己花了不少錢(就是你了魔法小卡 — Credit Card 😆)在亂搞學習;雖然不敢說自己很會用,但起碼踩到地雷的機會降低不少 😤,希望自己未來有空能夠跨雲端供應商學習、整合他們概念上的相同與差異之處。

特質

我自認不是個聰明又有天分的工程師,但我期許自己能成為一個細心又敬業的工程師,為此我必須說我花費許多時間在學習怎麼照料程式碼的概念,並且在實務上身體力行,以下幾點是我有自信說自己做的應該算不錯的部分

  • 寫程式碼力求簡單易懂,勝過於fancy的語言特性
  • 喜歡code review也喜歡被code review,自己蠻享受那種open minded討論彼此想法的過程
  • 產出程式碼的速度不一定算快,但是我相信品質一定算是高的(EX:可讀性、避免引入bug的數量…等)

希望以上幾點有展現出我對寫程式的堅持與熱情。

只有說自己好的地方,總像是老王賣瓜,而自省之後,認為本身最大的問題還是在於要能從心底認同「沒有最好只有最適合的解決方案」這件事情;身為一個血氣方剛的工程師 :sweat_smile: 其實這比想像中的難,尤其是在自己剛學會新的技術(或任何新東西)並跟同事或朋友分享後,才得知自己學的技術已有更新的替代方案,這時常會因為那該死的面子問題,堅守自己的立場。另外像是跟同事討論一些技術問題時,有時也會因為那該死的面子想要堅持「自己覺得」比較好的解決方案;每當這樣的事情發生後,我都不禁覺得自己應該要更成熟一些,若有更新的解決方案自己應該要趕快去了解才對,遠比花時間爭論或堅持己見來得好,更進一步聽到同事提出的解決方案時,也許自己動手下去做個簡單的PoC或是上網查閱對相關技術進行評比的文章,都比堅守自己的意見來的好,說到這邊我想能用一句話總結我認為比較好的做法

身為一個工程師(電腦科學家),用一個客觀的事實證明一件事絕對比 自認為 更有力

最後目前我最缺乏的部分,我想是在許多不同規模的專案中工作的經驗吧!這個部分算是我工作到現在的一個遺憾,在目前的公司和過去兩個公司中,我經手過的專案幾乎都是個人專案或是1–3人的小團隊專案,因此相當缺少在大團隊中與多人協作的經驗;並且最後產出的產品都是面對企業級的客戶,頂多也就是公司員工的規模,而企業用的服務鮮少會面對到大量同一時間的請求,所以也相當缺乏這樣的經驗,真的很希望未來有機會能加強這個方向。

在結束之前 — 未來的我

以上就是我所理解身為一位Senior Engineer該有的原則與人格特質還有我對自己的揭露與反思,其實之前在無意間聽到有同事說出一句我非常不認同的話

能賺錢的程式才是好程式

但在這資本主義社會下的我,沒有任何能反駁這句話的地方,只能當下把有些不滿的情緒保留在心中,而且眼看LinkedIn上的許多公司的Job Description都是以所需語言、技術為主要需求條件,而且面試似乎也沒有辦法看出以上所述的這些特質與原則。

但事後想想其實這件事情不能說有對錯,我想講出這句話的同事跟我之間有「原則上的差異」,也許他的原則是做最能賺錢的工作,那在這個時代,軟體工程師相較其他職業之下絕對算是個輕鬆的好選擇,當然並非我不想賺錢,但在賺錢之上,我還有做一個「誠信、專業的軟體工程師」的原則存在,想到這我瞬間豁然開朗,對我而言被人信任、信服才是一個值得我追求並更令我開心的事情

分享轉載在上面提到的部落格中的 tweet。看到後我才知道自己不是孤單的

也許有些人會說這些原則過於理想化,而且實際上鮮少人這樣做,我能明白!因此我希望起碼能以身作則先從我自身做起;我始終相信

別人是無法被改變的,畢竟改變自己就很難。但人卻是可以被激勵和感動的

若有幸在未來能持續做工程師,希望一路上自己永遠不要忘記當初寫下的這些原則。畢竟隨著年齡的成長、遭遇的事情越多和時代的改變,也許心態會有所轉變,期望自己的未來能夠一直堅持做自己認為對的事情。

--

--

CraftsmanHenry

一段尋求軟體工藝的旅程。 A journey by a software developer looking for software craftsmanship.