軟體工程師的修煉與成長 (1) — 程式設計 → 軟體工程
源起
我在2008年時寫了「追求神乎其技的程式設計之道」這系列文章,當時我才剛到美國唸博士班,雖然有不少實習和在科技公司打工的經驗,但其實並沒有做過全職工程師。現在14年過去,我花了四年從博士班畢業,後來三年在波士頓創業,接著又到矽谷做了七年軟體工程師一直到現在。
當初神乎其技的程式設計之道這系列文章講了很多我在高中到大學這段時間學習寫程式的心路歷程,現在回頭看覺得很高興當初把這些事情都寫下來並分享出來。不只有很多人說這系列文章給他們很大的幫助,讓他們找到熱情和方向,而且也讓我可以在十多年後重新沉澱和再分享後續的經驗和心得。
我打算接下來開始寫一系列的新文章,名為「軟體工程師的修煉與成長」。如果說神乎其技系列是我作為學生的學習成長過程,這個新系列就是關於我成為軟體工程師全職工作後的修煉和成長過程,某種程度也可以看作是神乎其技的續篇。
和學生時期不同的是,因為公司內部有很多敏感或機密的資訊,所以細節不能講得太清楚。我會盡量用業界通用的語言和原則來描述,特定的人事物可能會忽略或是模糊帶過。
程式設計 → 軟體工程
我從國中自學程式開始,經過高中那段為了奧林匹亞瘋狂練習的時間,一直到後來在G社實習、在博士班做了一個還不少人用的open source軟體,我一直都對自己的「程式設計」能力感到很有信心。但後來到了矽谷,進入D社工作後,我才發現「寫程式」這件事,其實只是「軟體工程」中的一小部分。雖然我自己寫程式可以寫得很好,但在一個有上千個菁英工程師的公司中寫程式可是一件完全不同的事情。
對於一個剛從大學或碩士畢業的菜鳥工程師(以矽谷通用的工程師等級來說就是L3,初階工程師),能夠把想法轉為程式通常是唯一需要的「硬技能」。這時的L3工程師嚴格說來只能說是個程式設計師,基本要求是能夠完成軟體系統中已經定義好的一小部分功能,可能是前端介面上的一個互動流程、後端提供資料讀寫的一個API、或是內部使用的一個小工具。在這個等級的工程師也需要團隊裡比較資深的人帶領,才能知道團隊基本的溝通協作流程,以及「要在哪裡改程式」、「怎樣寫對於這個團隊來說才是好程式」、「怎麼在已經上線的系統裡debug」、還有「怎樣才不會把別人寫的程式搞壞」。
程式設計師和軟體工程師最大的不同也就在這個「個人」vs「團隊」的部分。
從學生時期開始,我一直都很會自己寫程式,只要我有想法,沒有寫不出來的程式。即使學校有專案是需要跟別人合作的,我們也會一開始就找幾個地方把程式切開,讓大家可以分頭獨立做事。例如,一個人各自分頭做一個功能,做完再接起來;或是一個人負責前端介面,一個人負責後端,把API定好後就完全不互相干涉;甚至極端點還有一個人寫全部程式,另一個人做報告XD
雖然我在G社實習過兩次,但兩次我都是在做獨立的新專案,並沒有跟自己mentor以外的人或是其他部分的系統有太多接觸。當時我並沒有覺得這樣有什麼不好,甚至覺得可以做一些新東西很有趣,但現在想想這樣也同樣失去了真正瞭解合作開發這種大規模系統的機會。