學校(可能)沒有教的業界軟體工程 - 項目與雜記
目錄
業界、公司開發軟體不只是「寫程式」。我把在網際網路產業的經驗,想到有哪些會用到的軟體工程項目簡單列一下。片面資訊,會有遺漏,不定期回來更新
寫程式與產品,如同煮菜與餐廳 #
學校個人的程式作業,多半目的很單純,用你程式的也只有自己或老師助教,使用的方法或介面可能比較陽春。例如聊天機器人,你可能寫一個簡單邏輯,或是套用 AI 模型,搭配自己寫的簡單網頁、Line、或甚至是純文字介面。
而業界所謂的「產品」 (product) 則有很多不同、需要額外考慮的:有「目的」,而且有各地的「使用者」。差異在哪呢?
最主要考慮的像是:
- 為什麼?
- 每個產品都有他的意義:造福大眾的話要造福哪方面?提供服務要什麼目的?怎麼賺錢?
- 例如可能單純講笑話讓使用者排遣寂寞,或是當公司的客服,或是當萬事通取代 Google 搜尋等等
- 怎麼給其他人使用?
- 放在自己的電腦關機就沒了嗎?
- 是包裝成 App 或程式安裝在別人的手機電腦?或是寫網站讓大家不用安裝,而主要的程式放在自己不關機的電腦或是租用主機?
- 怎麼改版、修理、或增加功能?
- 文章後半段還有列很多
就像開餐廳不光只要煮菜,光是水電瓦斯、食材購買、內場外場等等。在家裡煮飯給自己吃,跟餐廳煮飯給別人吃是不一樣的。使用者體驗到的是整體,而你身為廚師無法解釋給每個客人聽(想想你自己在用 app 或網站,你只會覺得好用難用)
不過,只要知道要考慮什麼,知道概念以後
- 使用工具,把煩人的事外包
- 如果在公司,跟同事分工
就能重新專注在你拿手的項目上
概念與工具 #
舉個例子:你要找個地方跑你的程式,不可能一直放在自己的筆電。你可能會自己買電腦當不關機的「伺服器」(server) ,加上固定的網路。也有可能找其他人幫你把這件事情搞定
有很多主機服務商,他們擁有很多電腦,你可以給他們錢,把你的軟體程式放在上面跑。這些服務商他們的工作就是這樣,所以會盡力把操作方式弄得很簡單,讓你很容易上手。例如 Digital Ocean, AWS, Google Cloud 等等都提供這樣的服務
上面的例子介紹了兩個概念
- 伺服器(跑你的程式給別人用的機器)
- 部署(要怎麼把你的程式丟到其他人的機器上去跑?)
相對應的,這些概念都有各種工具或同事幫你
- 伺服器: Digital Ocean, AWS, Google Cloud, …
- 部署: Docker, Jenkins, Kubernetes, …
工具每年會變,而概念幾年才變一次。
- 概念:從概念上知道大綱,有哪些事情要搞定
- 工具:怎麼達成那些事。把工具當黑盒子,知道你要給他什麼,他會幫你達成什麼
有這個心法就不用害怕整天追逐,怕跟不上推陳出新的工具!
上面的伺服器跟部署只是千百例子的幾個,下面是你不一定會在學校學到,但其實很重要的
一些概念要點與名詞 #
先列出一些名詞,以後會個別額外解釋:
- Agile - 從想法、產品、到實作,還有三要素:透明、檢視、適應 (transparency, inspection, and adaptation)
- “Production” 的品質以及 Operation (ops, 部署)
- 版本控制 - 版本 + 控制。套用範圍不光是程式碼,還可以有資料、模型,甚至 pipeline, infrastructure 本身等等
- Pull request (PR) / Merge request (MR)
- 測試
- CI/CD - Continuous integration & Continuous deployment 持續整合與持續部署
- 自動化
- Infrastructure 基礎建設 - 包括網路、serving 服務、資料、運算處理等等的基礎建設
- Logging - 記錄
- Monitoring/alert - 監控與警報
- Tracking, metrics, dashboard, … - 了解使用者怎麼使用產品
- …
而上面這些都是為了達到更基本、抽象的目的
- 為了把想法實現成產品,並且「所做即所得」:所以會需要大家有共同的目標,試驗並且調整,所以會有各種開發的流程 (Agile 心法衍生出的),以及 CI/CD 系統來輔助把開發的東西變成大家都看得到的現實
- 為了品質,不會這裡錯誤那裡有 bug:所以會需要多人檢視 (pull request),測試,並且透明化地所做即所得
- 重現 + 反悔拯救:為了能夠在不同時間不同機器上都能重現你們的開發(而不是只在某個人的電腦上):所以需要 infra 基礎建設,版本控制,CI/CD 等等
- 為了減少人工負擔與錯誤:能自動化的地方盡量自動化,所以 CI/CD 的實作要盡量自動化,基礎建設也用程式+版本控制等等
因為這些概念與痛點,而有了上面的各種名詞,而每個名詞又有不同的工具來幫助你。這邊隨便舉例
- Agile - 衍生出各種實踐框架,例如 Scrum, Kanban 等等
- 程式版本控制 - git + github 或 gitlab
- infra 版本控制 - terraform
- CI/CD - Jenkins, GitLab CI/CD 等等
- Infra - 各種雲端服務商, docker / container, kubernetes 等等
- Logging - (太雜了) fluentd, ELK, DataDog 等等等
- 監控警報 - prometheus + grafana, DataDog 等等