Member-only story

軟體工程師的修煉與成長 (1) — 程式設計 → 軟體工程

vgod's blog
Feb 7, 2022

--

源起

我在2008年時寫了「追求神乎其技的程式設計之道這系列文章,當時我才剛到美國唸博士班,雖然有不少實習和在科技公司打工的經驗,但其實並沒有做過全職工程師。現在14年過去,我花了四年從博士班畢業,後來三年在波士頓創業,接著又到矽谷做了七年軟體工程師一直到現在。

當初神乎其技的程式設計之道這系列文章講了很多我在高中到大學這段時間學習寫程式的心路歷程,現在回頭看覺得很高興當初把這些事情都寫下來並分享出來。不只有很多人說這系列文章給他們很大的幫助,讓他們找到熱情和方向,而且也讓我可以在十多年後重新沉澱和再分享後續的經驗和心得。

我打算接下來開始寫一系列的新文章,名為「軟體工程師的修煉與成長」。如果說神乎其技系列是我作為學生的學習成長過程,這個新系列就是關於我成為軟體工程師全職工作後的修煉和成長過程,某種程度也可以看作是神乎其技的續篇。

和學生時期不同的是,因為公司內部有很多敏感或機密的資訊,所以細節不能講得太清楚。我會盡量用業界通用的語言和原則來描述,特定的人事物可能會忽略或是模糊帶過。

程式設計 → 軟體工程

我從國中自學程式開始,經過高中那段為了奧林匹亞瘋狂練習的時間,一直到後來在G社實習、在博士班做了一個還不少人用的open source軟體,我一直都對自己的「程式設計」能力感到很有信心。但後來到了矽谷,進入D社工作後,我才發現「寫程式」這件事,其實只是「軟體工程」中的一小部分。雖然我自己寫程式可以寫得很好,但在一個有上千個菁英工程師的公司中寫程式可是一件完全不同的事情。

對於一個剛從大學或碩士畢業的菜鳥工程師(以矽谷通用的工程師等級來說就是L3,初階工程師),能夠把想法轉為程式通常是唯一需要的「硬技能」。這時的L3工程師嚴格說來只能說是個程式設計師,基本要求是能夠完成軟體系統中已經定義好的一小部分功能,可能是前端介面上的一個互動流程、後端提供資料讀寫的一個API、或是內部使用的一個小工具。在這個等級的工程師也需要團隊裡比較資深的人帶領,才能知道團隊基本的溝通協作流程,以及「要在哪裡改程式」、「怎樣寫對於這個團隊來說才是好程式」、「怎麼在已經上線的系統裡debug」、還有「怎樣才不會把別人寫的程式搞壞」。

程式設計師和軟體工程師最大的不同也就在這個「個人」vs「團隊」的部分。

從學生時期開始,我一直都很會自己寫程式,只要我有想法,沒有寫不出來的程式。即使學校有專案是需要跟別人合作的,我們也會一開始就找幾個地方把程式切開,讓大家可以分頭獨立做事。例如,一個人各自分頭做一個功能,做完再接起來;或是一個人負責前端介面,一個人負責後端,把API定好後就完全不互相干涉;甚至極端點還有一個人寫全部程式,另一個人做報告XD

雖然我在G社實習過兩次,但兩次我都是在做獨立的新專案,並沒有跟自己mentor以外的人或是其他部分的系統有太多接觸。當時我並沒有覺得這樣有什麼不好,甚至覺得可以做一些新東西很有趣,但現在想想這樣也同樣失去了真正瞭解合作開發這種大規模系統的機會。

後來我進入D社後,才真正了解到一個大規模的軟體工程團隊是什麼樣子。在2015時,D社大約有一千人左右,軟體工程師應該有三四百人,整個code base有8年的歷史。當時我進去時是L4,比剛畢業的新人高一級,但還不到資深(L5)。L4的基本要求是能跟自己所在的團隊合作,可以獨立完成產品中的feature還有解決相關的問題,甚至還要能mentor L3的工程師或是實習生。

我剛開始時沒有什麼特別想專精的領域,比較偏好當個generalist,所以我的角色就是個做產品的full-stack engineer,web前後端都做。寫程式做產品的feature對我來說並不難,我加入後幾個星期就能獨立作業開始有產出了。我有一定的自由度可以嘗試自己想的新idea,但除了做自己負責的部分外,其實我跟這個團隊並沒有融入得很好。我不太關心別人在做什麼,只想著要怎麼把自己的東西做好,總覺得能夠很快把東西做出來推出去給用戶就好了。

現在回頭看,這時候的我,沒有在大型公司的工作經驗,不太知道怎麼跟團隊甚至公司裡其他人合作。在這個時期,軟體工程對我來說大多是書上能學到的硬知識,大概是開發流程(agile、SCRUM)、系統架構設計、Design Patterns、UML這類的東西。簡單的說,除了技術能力外,我在其他面向的軟能力(溝通、領導、協作、培養新人、建立團隊文化等等)其實弱到跟L3沒兩樣,充其量只能說是個不錯的程式設計師,可以獨立作業,但完全不懂大型軟體工程是怎麼回事。

軟體工程是團隊接力馬拉松

一個人寫程式可以很自由,想怎麼寫都行。大多數時候也沒有什麼歷史包袱,如果寫久了覺得程式變得太難維護,隨時可以打掉重來。學生時代的程式更是簡單,沒有真正的使用者,更不用考慮日後維護,程式的壽命只有短短幾個星期最多幾個月,課程一但結束就等於進入墳墓了。

在軟體公司裡工作和上百上千人一起合作寫程式就完全不是這樣了。大型軟體工程比較像是一群人一起接力跑以「年」在計算的馬拉松,這群人會一直變化,有人來也會有人走,一但起跑就不能停下來。除了一直跑以外,還要一邊找目標找方向,因為沒有人知道終點在哪裡。一群人得找方法互相合作,讓大家往同樣的方向前進,中間還要不斷解決各式各樣的問題。幸…

--

--

vgod's blog
vgod's blog

Written by vgod's blog

Software Engineer, San Francisco

Responses (1)

Write a response