前言
最近剛結束一段人生的職涯歷程,由於是自己正式踏入純軟業的第一間公司,因此會想在自己最記憶尤新的時候把這段時間的經歷給記錄下來,不管是未來自己是否能有機會回頭審視或者是能分享給需要資訊的人一些幫助也好。
個人背景簡述
2020年大學畢業,由於本身是電機背景且大學時期修課內容比較偏向硬體或者工程相關知識 (控制系統、工程數學、電路電子、...)因此在先前對於純軟多工開發以及設計模式等等本身就沒麼概念,甚至連作業系統在加入第一份純軟工作之前也沒有學過,其中幾個自己認為比較能跟純軟有相關的經驗是
- 大一計算機概論:C++
- 大三計算組織概論:粗略了解計算機硬體各個元件之間的運作關係及原理、作業需要使用硬體描述語言製作CPU完成基本運算功能
- 大三資料結構:當初其實學這個也不知道要做什麼,因此也學完就忘的差不多了
- 大三~大四畢業專題:透過影像辨識進行物件測距量測,使用Python以及OpenCV和機器學習相關套件
- 入伍前:由於正值Covid疫情期間,因此在入伍前找了一份10個月的影像辨識相關的工作(職位上是Contractor且非純軟業),做的內容使用到的知識是從大學專題的經驗繼續延伸
新鮮人的迷茫
在接近大學畢業時期基本上就跟大部分電機系上的人一樣,沒有什麼業界實習經驗因此對於未來工作喜好的選擇依據都是透過實習課上的內容而進行刪減,當時最卡住自己的點就是即便有些技能在學理上是自己喜好的也很有可能在技能實作上自己未必能適應,舉例來說像是對於控制系統、電路電子學擅長的人未必會想把寫嵌入式系統控制器來控制電力電子電路作為未來職涯的技能。
由於最後認知到對於職涯目標的錨定最終還是得透過實務經驗來累積,因此便以自身現有的技能影像辨識胡亂的找了第一份非正職工作,也算是間接地拿到下一份也就是第一份進入純軟業的門票。
與純軟業的邂逅
在結束了第一份非正職工作以及4個月的義務役過後開始下一段求職旅程,但由於當時還是個新鮮人狀態大部分面試官對於一個剛大學畢業的人要求也不會太苛刻,通常有些能夠佐證自己是有一定學習力的方式還是能免強拿到一些面試機會,當時自己手上有一些過去影像辨識相關的side project (全都是Python撰寫),很幸運地在一個月左右的時間就找到了第一份工作職缺是一家AI新創公司的ML Developer,而由於認知到跟碩士生相比自身的條件本身就比較沒優勢因此也很快就接下了第一份工作。
新人的起始點
比較值得一提的是,這家公司做的領域是AI裡的自然語言理解跟原先自己所熟知的影像辨識有一大段差距而且純軟本身大多數都會涉及大量的後端相關以及協作開發知識,自己在先前可以說幾乎是完全沒有這些經驗,因此也可以大概猜測到公司也是基於新鮮人對於一些dirty work比較沒有拒絕的空間的情況下才會願意錄用。
開始的第一個專案
最一開始進入後除了本身要開始快速上手領域內的知識外,不外乎也會有些維護打雜的工作,而當時遇到的第一個問題就是在既有的商業邏輯下要跟資料庫做Create以及Update的動作在人工操作上必須花費大量的時間(主要是花費在資料驗證上,而且在不必要的情況下用了Neo4j來作為儲存資料庫),為了節省後續維護時間成本因此便著手開始了資料索取服務的重構。
而整件事情就最後結果上來說是好的,把原本每一張Jira Ticket單子的更新需求從30分鐘縮短到大約5分鐘,然而從另一個角度上來說也是遇到了在新創才會遇到的問題
基本上大多數東西都不會有明確的Spec,當前的程式碼以及資料長什麼樣Spec就長什麼樣,且沒有穩健的測試優化流程
也意味著若今天在維護的過程中出現了問題,有時也很難辨認到底是屬於真的問題還是新需求的誕生,而再回頭過來審視一次這項專案時也是挺替當時的自己捏了一把冷汗,不過總體而言這也是一個入門好的開始,進一步了解Web以及NoSQL相關的知識,也藉由更動線上產品使用到的程式碼學會懂得負責。
為了生存,主動要求解決有價值的問題
在來到公司約莫3個月後左右,對於軟體開發使用到的工具如git、bitbucket、docker以及gitflow開發流程逐漸熟悉,而對於後端框架以及軟體規範等等的部分也藉由開發以及code review過程中有了一些基本的認識,然而這樣子遠遠不夠,由於先前提到職位的部分我是ML Developer,試想一下假如在這邊沒有爭取到這方面相關的開發經驗也就意味著沒有在這邊發揮足夠的專業價值,在未來也履歷上也勢必會接受到質疑,而新創公司本身在組織管理上本身就比較相對沒有嚴謹的制度,需求從哪來未必有個明確的流動方向,而當時有聽到產品主管方有意解決音樂播放準確度的問題因此便要求了這個題目做下去,當時心中唯一的念頭就是
即便是硬著頭皮,也要想辦法在當前的職能上發揮專業價值
很順利的,在新創公司的組織條件優勢下有機會爭取到了專案的機會,也藉此正式走入了自然語言開發的世界了解Transformer架構的起源、LLM(大型語言模型)、Machine Learning Develope Life Cycle、模型評估的方式、以及Elasticsearch(搜索引擎)的應用等等,在實作開發中學習也讓自身的知識經驗得到了快速的增長。
跨團隊協作以及專案中遇到的問題
在拿下了改善音樂播放準確度的任務後決定開始使建立Semantic Search Engine(語意搜索引擎),在專案優化的過程中也會看看開源專案是如何實現類似的功能也能順便精進自己的coding style。然而建立一個服務不是最大的問題,而是如何在既有的產品架構下加入一個新建構的服務,過程中會考慮到的點像是後續會與你進行API串接的團隊如何在加入新服務的情況下同時考慮向後兼容不影響既有的使用體驗,以及正式與測試版本間的比較測試要如何設計來證明專案可以達成最初的目的。
在一般公司當中可能比較無法輕易的讓一個新鮮人對產品做到這麼大的改動,光是動用到其他團隊的時間資源本身就是一個大問題,而新創公司的其中好處之一就是組織相對的扁平化所以有辦法拿到這些大膽嘗試的經驗,但反過來說個人也認為可能會是缺點之一,原因是對於經驗不足的菜鳥永遠無法預知到在當下的變動過後在未來延伸而出的問題或者代價是什麼,而在出事情時有足夠的理由去說服他人接受當下的不完美也是一門大哉問。
在項目推動的過程中由於自身經驗的不足在後續問題也理所當然的浮出檯面,例如沒有在搜索引擎建立的前期設計test cases為後續的優化行為設計一套Baseline、以及新建立服務時考慮商業邏輯的向後兼容時服務本身的設計不應該被後續串接的客戶端影響程式規則等等。
從問題中建立未來的學習目標
儘管意識到問題的出現,當下能不能解決以及現實中問題的優先度佔整個產品的scope大小又是另一回事,不過也正因為有這些問題的存在也才能更體現專業的價值。然而在新創公司給我的體驗是比較不好有個累積專業的理由,畢竟處於燒錢的狀態期待產品表面勝過於其實質品質是再合理不過的事,因此在這方面自己的看法是在職涯的前期不要在一家公司待到太久,給自己在這段期間設立個想解決的目標,過程中遇到的問題若在其他家也遇到了再考慮把時間投資在能解決問題的技能也不遲。
舉例來說像是在建立機器學習分類器時在標記樣本不足時會透過外包的方式標記資料,又或者是透過既有的資料來推論沒有標記過的資料的標籤,哪些地方透過額外要取資源比較容易解決且能被接受,哪些則是必須要發揮自身專業能力下去執行,像類似這樣的問題也常常在心中打轉。
新創公司的優點與缺點
儘管前面部分打了一長串,最後還是以職場菜鳥的角度還有對比身邊朋友們的經驗來歸納一下在新創公司待下來自己認為的優點以及缺點以供大家參考。
從優點部分開始說起,由於未上市的新創大多人數規模都不大且產品獲利模式也相對沒有那麼穩定,因此比較可以容納新人有一些發揮空間,以及自身對公司的影可能也相對得更會被放大。
另一方面缺點則是,新創公司在招募資深有社會經驗的人的時候可能難度也相對來得高一些,若在團隊在運作的過程中沒有被導入良好的規範很有可能會學到不好的習慣,這時可能平時就要去看看其他軟體公司團隊在流程上是如何運作好讓自己不要跟業界常識脫軌。
結語
在這一年半再多一些的時間下來接觸到了許多軟體相關的知識與文化,而自己本身的職涯以及學習軌跡也算是蠻偏離主流道路,當然也不免的得花一些下班時間拿去補齊一些缺少的專業相關知識像是資料結構、演算法、作業系統、機器學習、系統設計、Leetcode、Design Pattern等等,雖然這些東西在工作未必能直接用得上,但長期來看對於職涯機會還有與人討論時的專業底氣都非常有幫助。
但也得說本身自己也並非是對coding或者技術有極大熱忱的人,反而是資料科學以及技術工具背後解決的問題以及做選擇的trade-off能給自己帶來更多的成就感,但有沒有市場以及發揮空間又是另一回事,因此錨定自己在軟體業中能提供核心價值還有定位想必也接下來會困擾我好一陣子。