---
# System prepended metadata

title: “讓程式去跑程式” 解決方案概念整理

---

# “讓程式去跑程式” 解決方案概念整理

---

## 概觀

### 問題背景

因應客戶對 “低代碼” 使用情境的需求 -- 像是動態新增自製模組，在客戶端以類似低代碼的方式，編輯程式流程的需求，和內部、外部開發客製化需求愈來愈明確的情形，本文提出程式碼結構 “可模組化” 的開發方式，與 “程式的程式” 可能的實作方向。


### 讓程式去跑程式的概念

從程式語言層級、實作的角度來看，常見的方式有**動態模組**、**腳本定義檔案**、**腳本語言**等方式。

#### 動態模組的解決方案

如果要在既有的系統下，做出廣義上的低代碼功能，將會是 platform 等級的開發工作。

我們需要先打造一個 platform，讓這些模組去運行程式的程式。然後內部、外部開發，都透過模組來打造系統，例如 Android APK，和 launcher 、其他 App 的關係。

在既有的開發環境、產品環境，和技術人員的習慣下，最接近的技術解決方案是 OSGi。

#### 腳本定義檔案

指的則是利用格式化的純文字檔案 (並非程式語言)，用 “人讀” 的方式 (不需要寫程式的使用者)，編輯程式執行流程、用到的模組。主程式則會讀取、解析這些腳本定要檔案，並且執行對應的功能。

以目前開發和客戶團隊知道的技術來舉例，腳本定義檔案常見的格式，和實際的應用案例有 XML (套件管理工具 Maven)、JSON (Azure 平台部署設定)，或是 YAML (Dockerfile)。

#### 腳本語言

如果有動態模組的需求，例如讓客戶也可以自己寫模組，較為適合的方式，則是使用腳本語言作為動態模組的實作方案。例如網通領域常見的 Lua，或是 serverless 的 Node.js、Python。


### 客製化開發、二次開發

讓客戶自己寫模組，或是透過自己寫的模組，去使用核心模組、開發延伸功能。


## 實作議題

### 使用情境

以**腳本語言**解決方案為例：

1. 依照**規範**撰寫腳本語言 (shell scrip)，儲存為文字記錄或是檔案
2. 使用程式語言*laod class/module from file/text*的方式，載入與執行程式的程式、模組

上述所說的**規範**，指的是腳本檔案的**模組**入口函式叫什麼名字、如何避免套件名稱衝突，還有參數怎麼傳送等等。


### 腳本語言/動態模組的 ``handler`` 介面設計

除了功能開發，模組設計還有一個重點，就是 “讓別人知道我怎麼用，怎麼知道我有什麼功能”。這個別人可以是主程式、模組，或是其他模組。

如果參考 Web service 的術語，就是 well-known discopery。至於這個介面的設計，在 serverless 稱為 ``handler``，可以參考 [AWS serverless 範例程式](https://docs.aws.amazon.com/lambda/latest/dg/python-handler.html)。


### 模組管理

再來則是模組版本、套件管理的設計，這包含了套件名稱、作者、權限等等。


## 自製解決方案與現有 codebase 改造

### 第二代解決方案 PoC

(內部 demo) 動態語言版本、靜態語言版本 ... 略。


### 第三方圖控、可視化工具整合

略。


### 參考資料

* Dynamically-load-modules: https://www.geeksforgeeks.org/how-to-dynamically-load-modules-or-classes-in-python/
* Serverless example: https://newrelic.com/blog/best-practices/create-a-serverless-function-in-python
