經常性收入四到六萬以上,高挑戰、高成就感的程式職缺供不應求。近來更因 COVID-19 引發遠端技術工作、遠端娛樂等「宅」經濟的成長。不僅是現在,未來市場對「程式設計師」的需求將越來越高。我想進入程式產業,但我不清楚軟體特性、不知程式如何運轉、不知如何團隊合作、不清楚學習路線、不知該如何少走彎路……
作為三年的台積軟體工程師、手遊獨立開發人以及遠端程式補教老師,我能做的,是協助你釐清上面的問題。也許,這將是你踏入軟體工作的轉捩點!
產業現況與潛力
手機 App、電腦軟體、臉書、IG、Google 搜尋引擎、特斯拉自動車、電玩遊戲……21 世紀的今天,我們已被程式包圍。程式無所不在,程式職缺高居不下,這些工作機會卻遲遲無法被滿足。甚至在未來,程式設計師「供不應求」的現象可能會日益顯著,潛力將更高。
他困難,他抽象,因此他昂貴,可取代性也相對較低。甚至有「厲害的工程師,生產力差距可達 10 倍」之說。舉個例子,建築工程的設計圖與實際房屋結構很相近,人腦可以輕易聯想成品的樣貌。但來到軟體工程,即便有 UML diagram 來圖解軟體架構,離「直覺」反映出系統結構仍有很長一段距離。因為程式設計的特殊性與其他諸多原因,台灣的軟體職缺一直無法被填滿。
程式設計是一項高收入技能,程式設計有著無窮的潛力。決定挑戰「程式技能」的你,在未來發展方面,可以先給自己掌聲鼓勵 XD。
建築工程設計示意圖
軟體工程架構示意圖
程式簡介與製作流程
程式,其實就是些文字檔。就像英文與中文,程式也有自己的語法、語意跟邏輯。程式被撰寫完之後,會被「編譯/建置」成可以被「點兩下」,或用指令跑起來的執行檔 (例如瀏覽器)。用某些語言撰寫的程式,則會被儲存成「腳本」文件,不需要經過「編譯/建置」的動作 (例如網頁)。接著,會由電腦或手機等執行之。到這個階段,就是我們平常看到的 App 或是網頁了:
- 撰寫程式
- 編譯/建置成執行檔,或儲存成「腳本」文件
- 執行
至於程式的製作,也有一套流程。晶圓製造有製程、蛋糕製作有食譜與步驟,程式開發,也有軟體開發流程!簡單的軟體製作流程如下:
- 需求分析
- 使用者介面、使用者體驗以及系統架構設計
- 撰寫程式
- 測試
- 發佈
在上面五個步驟當中,「需求分析」與「產品設計」是軟體開發的關鍵。這兩個步驟會決定往後的維護難度是否將以「指數」上升。且上面的流程並非走過一次,產品就會完成。軟體的功能,通常會被切成好幾個小迭代,一次一次將小功能完成,一次一次走過上述五個步驟,逐漸組出產品的最終樣貌。
感覺與我們熟知的製造業差很多吧?製造業需要不斷投入原料趕出貨,但製作過程通常可以被「標準化」,可以交由機器大量生產。軟體製作則不需持續投入原料,但因為複雜度高,撰寫過程難被「標準化」,因此生產過程皆需「人」來完成,出錯的風險相對高很多。另一方面,軟體也不用持續產出全新的產品個體,而是不斷對相同的產品做「擴充」以及「修改」。當一個階段性功能完成後,軟體便可以被無限複製,甚至服務全球。
基於以上特點,即便已經做好規劃,軟體製作仍會伴隨許多「未預期」的意外。因此軟體開發最忌諱的,就是不做嚴謹的設計,就是一次把所有功能衝完。在即將發佈的尾聲才發現與需求不符,或才與團隊整合,前面提到的「維護難度指數上升」將在此反噬自己、將是一連串「大災難」的開始。
製作軟體的關鍵是分析及設計、是少量多餐,讓問得以題提早浮現,避免後面無止盡的災難發生
其他則是專業分工及回歸測試,一來讓艱深的軟體工作可以被專業化、被高品質地完成;一來是避免在產品發佈後,大範圍影響到使用者,造成鉅額損失。
軟體團隊常見的 7 個角色
程式工作中,會有那些角色彼此合作呢?一家公司會有 CEO、財務、行政等各類部門。在程式開發團隊中,也有類似的概念。職務約略可分為七類,但並非絕對。產業模式不同,團隊結構也必須隨之改變,是吧 XD。
Product Owner
最理解市場動向及趨勢的人。設定目標及策略,掌握產品的大方向以及功能清單,定義規格與功能優先順序,也是面對使用者的主要溝通人。
Project Manager
視流暢的團隊合作為己任!主要負責暢通團隊溝通,排解合作上的問題,並管理任務排程、掌握團隊前進的速度等等。
UI Designer
設計使用者介面。舉例像 App 的主題配色、整體美術風格、各種元件的樣式,如按鈕的邊邊要是方的?還是圓的?要多圓?等等,都是 UI designer 所設計的。
(UI:User Interface - 使用者介面)
UX Designer
設計使用者體驗以及操作流程。與 UI Designer 只差一個字,工作內容卻截然不同。 UX Designer 注重的,是如何將按鈕、文字等等安置於最佳位置,讓使用者一目瞭然、清楚易懂,並讓使用者在完成任務的過程中感到流暢、順手、舒服。
(UX:User Experience - 使用者體驗)
Front-end Engineer
前端工程師。看到這裡,終於輪到程式設計師了 XD。前端工程師主要會把 UI、UX designers 設計的示意圖,用程式碼撰寫出來,變成實際可以與人互動的圖形介面。
Back-end Engineer
一樣是程式設計師。主要負責處裡資料的儲存、複雜的資料邏輯運算,並將資料整理過後,提供給 front-end engineer 作呈現。例如使用者註冊帳戶之後,這些帳戶資訊如何儲存?如何整理?都是由後端工程師負責。
QA
產品品質的守門人。管理測試相關事務,確保功能的正確性、安全性、耐壓性都符合水平。工作內容可以包含設計測試案例、建立 / 維護測試環境或測試系統,執行或自動化測試腳本,回報測試結果等等。
測試案例:一條使用情境。例如在購物網站完成「結帳」這個動作。用來跑過關鍵的程式碼,確保每個環節的正確性
(QA: Quality Assurance)
其實在現代化的團隊,測試工作通常也會由 front-end engineer 以及 back-end engineer 自行完成。工作種類約略是以上七種,至於如何分配,就看團隊如何定奪囉!
學習路線圖
軟體涉及的產業如此廣闊,軟體需要專業分工,那我該如何選擇?我沒辦法給你答案 XD (揍飛),但我可以保證,軟體程式的學習,有所謂的「單一路線基礎功」,可以在初期避免少走彎路。基礎功走得順、走得紮實,往後要轉入任一程式技術領域,將事半功倍。 從變數觀念、program counter、迴圈以及判斷式觀念、function 功能觀念,到記憶體結構、陣列與資料結構、演算法、物件、資料傳遞方式、執行續、process 程序等知識點,是幾乎所有語言共通的基礎,都是超脫「程式語言種類」的內功。內功養成後,將是你探索可能性的開始!後期的軟體工作者,在意的也都不是程式語法本身,而是如何挑選適當的技術,設計適當的解決方案,為公司、為世界帶來價值。而「程式語法」,只是我們實現目標的「工具」而已。這也代表,基礎功紮實,我們可以在後期快速地轉入多個技術領域。
若真的要挑選入門語言,我會推薦先學 python、JavaScript 或 C#,然後再學 C++。先燃起對程式的興趣,再養成紮實的觀念。等這兩項語言學完後,就是你自由探索的時刻!若你已有明確的求職目標,應直接搜尋哪些語言、哪些技術與目標高度相關,並全力衝刺。
準備好,就勇敢出發吧!
看到這裡,應該多少了解「軟體工作」是怎麼回事了吧?學習程式設計很有挑戰,同時也很有趣,更可以得到征服難題的成就感!學習程式有路線,也有方法,需要切小塊學習,就如上面「有順序地」列舉知識點清單般。若你已經決定挑戰這項高收入技能,在確立學習方向與順序之後,先以培養興趣為主,找到一位適當的老師,勇敢出發吧!全世界的市場,正等著你挑戰!
補充
- Python:AI (人工智慧) 模型製作與訓練、資料萃取/探勘
- JavaScript: 網頁前端程式設計。通常會搭配 HTML 與 CSS。同時亦可作為後端伺服器程式設計
- PHP 與 Ruby:網頁後端伺服器程式設計
- Swift 與 Java (Android):手機應用程式設計
- C#: 遊戲程式設計 (搭配 Unity)、Windows 桌面應用程式設計,亦有網頁後端伺服器程式設計應用
- C++: 處理需要高效能、高負荷的計算。如 3A 級的 3D 遊戲,Adobe PhotoShop、Illustrator、Premiere Pro 等影像處裡工具,亦或是作業系統等等