快轉到主要內容

學校(可能)沒有教的業界軟體工程 - 項目與雜記

業界、公司開發軟體不只是「寫程式」。我把在網際網路產業的經驗,想到有哪些會用到的軟體工程項目簡單列一下。片面資訊,會有遺漏,不定期回來更新

寫程式與產品,如同煮菜與餐廳 #

學校個人的程式作業,多半目的很單純,用你程式的也只有自己或老師助教,使用的方法或介面可能比較陽春。例如聊天機器人,你可能寫一個簡單邏輯,或是套用 AI 模型,搭配自己寫的簡單網頁、Line、或甚至是純文字介面。

而業界所謂的「產品」 (product) 則有很多不同、需要額外考慮的:有「目的」,而且有各地的「使用者」。差異在哪呢?

最主要考慮的像是:

  • 為什麼?
    • 每個產品都有他的意義:造福大眾的話要造福哪方面?提供服務要什麼目的?怎麼賺錢?
    • 例如可能單純講笑話讓使用者排遣寂寞,或是當公司的客服,或是當萬事通取代 Google 搜尋等等
  • 怎麼給其他人使用?
    • 放在自己的電腦關機就沒了嗎?
    • 是包裝成 App 或程式安裝在別人的手機電腦?或是寫網站讓大家不用安裝,而主要的程式放在自己不關機的電腦或是租用主機?
  • 怎麼改版、修理、或增加功能?
  • 文章後半段還有列很多

就像開餐廳不光只要煮菜,光是水電瓦斯、食材購買、內場外場等等。在家裡煮飯給自己吃,跟餐廳煮飯給別人吃是不一樣的。使用者體驗到的是整體,而你身為廚師無法解釋給每個客人聽(想想你自己在用 app 或網站,你只會覺得好用難用)

不過,只要知道要考慮什麼,知道概念以後

  1. 使用工具,把煩人的事外包
  2. 如果在公司,跟同事分工

就能重新專注在你拿手的項目上

概念與工具 #

舉個例子:你要找個地方跑你的程式,不可能一直放在自己的筆電。你可能會自己買電腦當不關機的「伺服器」(server) ,加上固定的網路。也有可能找其他人幫你把這件事情搞定

有很多主機服務商,他們擁有很多電腦,你可以給他們錢,把你的軟體程式放在上面跑。這些服務商他們的工作就是這樣,所以會盡力把操作方式弄得很簡單,讓你很容易上手。例如 Digital Ocean, AWS, Google Cloud 等等都提供這樣的服務

上面的例子介紹了兩個概念

  1. 伺服器(跑你的程式給別人用的機器)
  2. 部署(要怎麼把你的程式丟到其他人的機器上去跑?)

相對應的,這些概念都有各種工具或同事幫你

  1. 伺服器: Digital Ocean, AWS, Google Cloud, …
  2. 部署: 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 等等
若您覺得有趣, 請 追蹤我的Facebook, 讓你獲得更多相關資訊!