[閒聊] 2021 台灣軟體業職位近況

PC Chen
11 min readOct 29, 2021

--

因為疫情的影響下,「不在辦公室有一台電腦就能工作、下班可以有自己的時間做想做的事情」這樣的工作型態漸漸被人所嚮往,市場上大量人力紛紛轉向軟體業,想轉職的人也趨之若鶩地以「軟體工程師」這項職位為目標。

居家辦公圖片來源:Joma Tech

雖然都叫「Software Engineer 軟體工程師」,但軟體業發展至今分工也越來越細,也因為新技術的不斷推陳出新、會衍伸出新的職位。身為一個轉職仔,自然無法像大神那樣一次就到頂級的外商軟體大公司,因此這篇文章將整理 台灣 2021 年軟體業的職缺概況還有所需技能(一些關鍵字),大多數見解與分析來自小弟待在軟體業的觀察,若有錯還不吝指教~

概況

以現今大多數軟體業提供的服務,最大宗的就屬 Web(網頁開發)APP(手機、平板、電腦應用程式開發) 我們現在常聽到的前端FrontEnd、後端Backend 也都上述兩者脫離不了關係,而隨著軟體開發分工越來越細,現在又有負責整體 server 維運的 DevOps Engineer、負責整體資料收整的Data Engineer、以及因應業務需求建模的 Machine Learning Engineer 、Data Scientists 等等。

前端工程師 Front-End Engineer

主要負責所有使用者看到的畫面,包含字體、排版、跳轉流程等等,大部分會與PM或UI/UX designer討論畫面如何呈現,並如實地實作出來。

在市場上聽到的前端工程師大多是指開發Web網頁畫面,最常用的技術是 html, css, javascript,而現今大部分前端技術框架已屬純熟,最常見的框架有 Bootstrap, Vue, React, Angular,也因為有這些框架的出現,使得瀏覽器也都漸漸符合標準規範,前端工程師也不用為了不同瀏覽器(Safari, Chrome, IE,...)還要在花額外心力開發,框架的出現讓前端工程師在開發時節省許多時間,也因此初學者只要掌握了基礎框架,就能快速累積作品。

前端三本柱:Html, CSS, JavaScript

但最基礎的還是 html(寫網頁骨架), css(排版畫面美化), javascript(使用者流程互動) 這三者要熟悉。

iOS/Android 工程師

顧名思義就是開發我們現在手機、平板上的 iOS/Android 應用程式的工程師,這兩者其實也算前端,相對於網頁,簡言之就是刻應用程式的畫面與使用流程,但因為用的技術比較特別,相比於過去十年的大網頁時代,開發應用程式的人力需求隨著智慧型手機、平板的問世大幅增加,也因此市場上都會獨立把 iOS/Android 工程師分開來應徵,並不會包含在前端工程師中。另外這兩種工程師所使用的技術語言也不太一樣,所以也不太可能一次雙修兩種,若要轉職基本上就是選擇一種平台來開發、累積作品。

iOS 近幾年的新語言一定是從 Swift 下手,它可以同時用來撰寫 iOS 與 OSX 的應用程式,也就是說用Swift寫出來的程式,可以同時在iOS與Mac上面執行,因此漸漸成為主流。另外也要熟悉 Objective-C,這是一個比較早期用來撰寫Mac軟體的語言,若公司成立較早可能也有很多舊專案是用Objective-C,雖然目前使用度沒有 Swift 那麼高,但還是要了解基本概念。

Android 的話主要就是用 Java 與 Kotlin,如果想選擇這條路,大多是建議先把 Java 學好,雖然以易用性而言,Kotlin 比 Java 更簡潔、有效率,但就學習資源 Java 還是樂勝,加上可以一魚多吃,Java 除了用來開發 Android APP 外,還可另外用於網頁開發、數據平台(Hadoop)、物聯網應用程式(交易系統)等等,cp值還算是挺高的。

後端工程師 Back-End Engineer

主要負責Web, App 背後的邏輯運算與儲存,比如說我們在 UberEats 按下送出訂單後,必須把這項訂單記錄下來、存在資料庫中,另外在搜尋店家時,也得負責把符合搜尋的條件,從資料庫中撈取出來、丟給前端呈現,隨著公司提供不同的服務,背後商業邏輯都會有所不同,這些種種一般使用者看不到的業務邏輯就是由後端工程師撰寫。

UberEats 商業邏輯

由此可知,後端工程師除了程式語言的掌握外,還需要對資料庫有一定程度的熟悉。語言部分非常多種:PHP, Node.js, Ruby, Python, Java, Go, ....都有公司使用,目前聽到最多公司使用的是 PHP,但其實已經漸漸式微,大多都慢慢轉向 Go, Python, Node.js,尤其是 Go 正在快速崛起中。

資料庫的話 sql(Mysql, PostgreSQL) 類語言要滾瓜爛熟,另外還要搭配一種 NoSQL Database,目前常見的有 MonogoDB, Redis 等。由於涉及資料存儲,對於資料結構與程式效能的要求也會比較高,所以 Leetcode 要刷得比較認真(?

DevOps 工程師/SRE, Site Reliability Engineer

這個職位是相對新興的領域,以前軟體公司規模尚不大時可能會由 Backend 兼職做,但隨著服務的擴大,就需要有人獨立出來做整體服務的維運。

隨便Google: DevOps都會出現一百張一樣的圖

「維運」講起來很抽象,要做的事情也確實很雜很多,主要核心為確保公司的各種 Server、Database 都運作正常,只要公司的服務掛掉了,幾乎都唯DevOps是問,或者系統環境要搬遷、資料庫要搬家的時候,DevOps 也要負責輪班緊盯著,算是軟體業中比較操的職位(當然整體薪資也會比較高,有捨就有得~)

除了確保公司本身的Server穩定,也要負責公司整體工程師開發的環境,例如 Git repository, Jenkins CI/CD, Kubernetes,... 等環境的架設,讓其他工程師可以正確順暢地將最新版本部署到Server上。

至於所用到的技術非常廣!由於現今微服務崛起,大部分都使用 Docker, Kubernetes 等容器化服務作部署,加上現在各大雲端平台 AWS, GCP 都有提供類似服務,對於雲端服務要非常熟悉,針對公司遇到的問題能夠使用雲端的服務來解決。另外,DevOps 為了確保環境正常運作,對於日誌管理服務 ELK、監控儀表板 Prometheus, Grafana 也都要有所掌握,了解如何妥善使用工具來監控系統運作狀況,技能樹可以說是最廣的。小公司如果沒有資安相關單位,資訊安全的規範可能也會由 DevOps 來負責。

資料/數據工程師 Data Engineer

主要負責公司內、外的所有數據蒐整,對資料庫的語言掌握要很廣,知道什麼樣的情況適合什麼樣的資料存儲,例如:客戶訂單關聯資料適合放入RDBMS、聊天紀錄適合放入NoSQL、Log日誌適合打入ELK stack….等等,若公司有用到大數據存儲,也需要了解 Hadoop(Hive, Spark, Hbase) 相關生態系。也因為涉及資料存儲,跟 Backend 通常會有密切合作(小公司甚至也會讓 Backend 兼做 Data Engineer),在開發新功能前要常常和後端討論資料邏輯、table schema,確保上線後資料不會遺漏。

外部數據收整最常見的方法就是爬蟲,所以對網頁的架構也要有所了解,基本的 Html, Javascript, http通訊協定…等等都要知道,如果沒辦法有效率的解析網頁、當然就無法把資料爬下來了XD。

數據並不是儲存收整了就好,還要適當地讓它發揮價值,這時就需要資料工程師幫忙開發排程做加工,一般做資料處理的語言首選就是 Python,當然我也有看過專精用 R 的資料工程師,但就寫 script 的效率性與 package 通用性,Python 可以做的事情真的太多了,所以語言部分建議還是強點 Python。由於要開發許多 Data Pipeline,寫 script 的功力要深厚、基本的 Shell Script, Linux指令也要會操作,也要懂得適時將排程重構,極大化搜尋資料以及運算的效率,如果不小心把 DB 操掛 DevOps 會來追殺你。

至於怎麼定義「發揮價值的數據」?恩....通常這部分會由商業分析師或資料科學家,根據商業問題把解決的方法用數據佐證出來,或是建模型找出解決方法。但如果公司內沒有人專做數據分析,那通常 Data Engineer 就要跳下海來做,直接一條龍做到位,反正公司內最熟數據的應該就屬 Data Engineer了。

機器學習工程師 Machine Learning Engineer

主要負責機器學習相關演算法的開發,目前市場上較複雜、較需要開發或改良新算法(i.e 不是簡單套套 packages 就好那種)的應用,大部分屬影像語音處理相關,例如物體辨識、濾鏡特效、自然語言、Deepfake(誤?😳…等等這些能夠「清楚」判斷成效好壞的應用。

最大眾使用的語言非 Python 莫屬,現在也有很多基於 python 的機器學習框架與工具庫,如:Scikits-learn, Pytorch, Tensorflow,…等,初學者要進入的障礙越來越低,但關鍵是有能力自己改良算法、甚至是自己寫,數學能力應該是所有工程師要求最高的。光是現在神經網路相關算法的論文,那個數學式各種高來高去,如果看到下面這些數學符號就會覺得噁心,基本上可以放棄走這行🤣。

人臉辨識模型 Loss Function 數學式

另外,現在許多基礎的算法,各大雲端平台都有推出服務,像 GCP 的 AutoML、AWS ML等,這也代表在改良算法的同時,有可能要跟這些大公司的工程師拚槍😰,真的是不給活路!

資料科學家 Data Scientist

其實一直猶豫要不要把資料科學納進來當做 Software Engineer,就我自己的想法我覺得資料科學家不算是軟體工程師,因為軟體工程只是他們用來解決問題的「其中一種」方法,因此比較像是 Researcher 而不是 Engineer。但因為大部分資料科學家在軟體業會歸屬在 RD 部門,所以也列進來好了。

前段說到軟體工程只是資料科學家用來解決問題的工具之一,代表他們還需要熟悉許多工具,基礎的統計知識、資料處理、結果驗證等等,資料科學家最需要的核心能力反而是如何把商業問題定義清楚、轉換成數學問題,找出解決方式,最後透過數據佐證這項方法是可行的。

最常見到的應用像是推薦系統開發,隨便舉個 Netflix 為例,現在魷魚遊戲非常火熱,若想接續這波浪潮,我們應該繼續推類似劇情是生存遊戲的片?還是推在韓國地區流行的熱門片?才能維持用戶的續訂率。這其實是個很大很空泛的問題,這時資料科學家可能會先從統計著手,先分析高續訂率跟低續訂率用戶有什麼主要特徵的差異?他們都觀看什麼樣子的影片?

待確定關鍵特徵後,這時可能會透過這些關鍵變數建模,或是用基本統計的方法確定變數與結果具有因果關係,例如發現說不同的預覽縮圖,會直接影響用戶點閱、進而影響續訂。所以你提出了同一部影片,給用戶提供個性化的預覽縮圖,可以影響續訂這個提案。

圖片來源:Netflix Tech Blog

接下來針對你的提案,你必須設計 A/B Test 後,在使用統計檢定或其他方式來驗證,看看個性化預覽圖對於一群新用戶是否真的有顯著提升續訂?這中間又先牽涉到如何將新用戶分成無差別的兩群?(i.e 兩群不能差異太大,一群老人一群年輕人)用什麼方法檢定續訂率成效?總結來說就很像在做一篇論文研究。

P.S 以上純屬我瞎掰,如有雷同純屬巧合

總結

以上是小小轉職仔的觀察心得,雖說現在軟體業分工很細,但比較資深的工程師其實每個領域的概念都知道一些,並不是說你走前端、就不必懂後端的東西,或是你是做 Data 的就不需懂 DevOps 、前端,很多概念知識都是彼此有關聯,現在不補之後會來找你還債。

如果選擇踏入軟體工程的領域,要保持一顆持續熱情學習的心,軟體這塊領域是發展極度快速的,一項技術經過兩年後可能都算舊,所有資源也都是開源在網路上一直推陳出新,如果抱持著只做一項職位、就不用學習其他領域知識的心態,這條路是走不長久的。

此篇文章分享內容,希望對您有所幫助~

--

--

PC Chen

喜歡接觸與動手實作各種軟體技術的後端數據工程師 A data- backend engineer who is enthusiastic in learning and implementing any techniques in software engineering.