圓州率
🌐

Feature Image

軟體生態系 (Software Ecosystems)

資料科學, 心得
介紹軟體生態系,並描述各方關係之間的利害關係,目的是要創造一個可持續的生態體系。

簡介

軟體生態系 (Software Ecosystems) 是指軟體、用戶與開發者社群的綜合體,並描述各方關係之間的利害關係,目的是要創造一個可持續的生態體系

軟體生態系組成

  1. 核心平台: 軟體生態圈的中心,可以是作業系統 (Linux)、程式語言 (Python、R、Julia)、平台 (Android、iOS) 或是框架 (Hugo)
  2. 擴展功能: 為核心平台開發的各式功能、套件
  3. 開發者社群: 開發和維護生態系的成員,可能是獨立開發者或公司,為環境提供更多擴展性,例如 GitHub 的開發者社群
  4. 用戶: 生態系中最終的用戶,提出需求、反饋與意見。

特點

  1. 網絡效應 (Network Effects): 生態系用戶增加,生態系的價值隨之增加,例如社群軟體的用戶少,能提供的體驗有限

    人增加 -> 開發者增加 -> 軟體增加 -> 選擇增加 -> 用戶增加

  2. 互相依存: 生態系內部互相依存,生態系內變化會有連鎖反應,例如核心平台更新會導致所有附加功能需要調整兼容性

  3. 協同創新: 生態系內部協作促進創新,共享知識和資源來創新,從而提高生態系的價值

  4. 生態系治理: 生態系需制定管理的規則,確保持續穩定和發展

  5. 市場動態: 生態系內有眾多參與者,市場動態變得複雜。例如彼此可以同是競爭與合作關係

未來趨勢

  1. AI 和自動化: AI 協作成為趨勢,當今不少軟體正在嘗試在引入 AI 以實現自動化,壓縮了套件的生存空間
  2. 開放性: 生態系有逐漸變開放的趨勢,導致更多創新與競爭,用戶的選擇也能增加
  3. 持續性: 沒人願意使用隨時會倒的軟體

開源軟體

使用第三方開源軟體 (package, 套件) 能降低開發門檻且加速開發,卻帶有相對應的風險

  1. 不保證正確性
  2. 引入某套件後卻未使用
  3. 套件之間錯綜複雜的互相依賴
  4. 切換至不同語言或平台上的泛化能力

開源軟體開發

開源軟體中會遇到的數個問題

  1. 一個套件的負責到哪?
  2. 如何防範有問題的程式碼被加入套件中

研究這些套件的性質,是甚麼使他們熱門與成功的,分 4 步

  1. 規劃要挖掘哪些資訊
  2. 定義組件及其依賴關係
  3. 界定邊界與完整性
  4. 數據分析和視覺化

依賴關係

套件們的依賴圖

這張圖來源自 https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-the-dependency-graph,分析了 Python 幾個知名套件的依賴關係

Libraries.io 能分析套件的潛在風險、評估程式碼、評估貢獻等功能。

貢獻

給定某個時間下,例如某套件的依賴 - 貢獻圖為

找出貢獻會有幾個問題

  1. 一人多重帳號,但 Github 使用多重身分驗證,使得多帳號的變得較麻煩
  2. 機器人 (bot) 貢獻,使用自動化更新依賴 (auto update dependency) 會使得貢獻圖加入很多不必要的噪音
  3. 並非所有開發者的行為都是公開的,有些套件的隱私設定會隱藏

Software Heritage

許多早期軟體因無保存而消失,Software Heritage 收集原始碼的方式來保存軟體,將原始碼與發開歷史儲存在統一的格式 (Merkle Directed Acyclic Graph) 中;並表示軟體是重要的文化遺產,人類沒有能力承擔失去它的風險。

SECO-ASSIST 則是在解決彈性的軟體推薦系統、分析演化與社會互動。

定義邊界和複雜度 (Boundaries and Completeness)

定義依賴關係,並不能僅依靠設定檔提供的依賴關係,有可能宣告依賴某套件但完全沒使用,應以程式碼為主的方式檢查依賴關係

研究套件生態系的邊界來研究開發者社群,其中的邊界

  1. 技術邊界:不同套件可能基於不同程式語言
  2. 社群邊界:不同社群的會有各自的文化,例如 Minecraft 的 mod 管理器就有 Forge 和 Fabric
  3. 組織邊界:不同套件可能由特定公司、組織或基金會管理

一個套件缺乏互動不表示失敗,例如高度依賴的的套件且完整性足夠

研究套件包的完整依賴關係可能過於複雜,適度的縮減研究範圍是必要的

  1. 依賴關係可能會隨時間改變,因此可以指定某個時間點的套件
  2. 切分每 3 個月的版本,而非所有版本
  3. 部分採樣,可能只要提及一套件,其子套件就非常龐大,例如限制深度為 3 層

可能的觀察關係

  1. 休眠計畫並不一定意味著它不活躍,使用依賴者和依賴性的數量,作為項目在生態系中重要性的更好指標。
  2. 不應僅依靠程式語言來定義子社群。使用程式語言的通用套件管理器是區分邊界的更有效的經驗法則。
  3. 避免隨機抽樣,抽樣應根據研究目標進行定制,考慮適當的時間窗口等因素或關注組成部分的特定屬性(例如,最受依賴的、最受歡迎的、貢獻最大的)。

Model Driven Engineering

機器學習的能找出事物之間的關聯,那我們也能透過 Github 上的 “issue” 與 “update” 中找尋出問題與假的關係,並做出以下應用

  1. 模型助手: 在建立模型時協助用戶提高效率和精確性,或者自動化完成常見任務。例如自動補全、錯誤檢測、模型優化建議
  2. 分類: 將開發過程的資源自動分類,協助開發者找到相應的資源、優化管理
  3. 重構: 在不改變架構的前提下改善內部結構,增加可維護性與易讀性
  4. 修復: 自動糾正錯誤或不一致性,使其符合一致的規範,例如語法糾正、自動識別輸入物件是否合法
  5. 轉換開發: 更換程式語言或框架後,透過轉換規則自動化切換

參考資料

  1. MENS, Tom; DE ROOVER, Coen; CLEVE, Anthony (ed.). Software Ecosystems: Tooling and Analytics. Springer Nature, 2023.

其他資源

  1. Python package dependency graph
  2. Google 趨勢上的 Data Ecosystem, Software Ecosystem, Software Economy