程式設計基礎講座(一)

學習程式語言的幾個階段


本文大綱


記 得 自 己 曾 經 給 電 腦 下 過 一 個 這 樣 的 定 義 : 「 電 腦 的 目 的 是 讓 那 些 不 懂 電 腦 的 人 能 夠 用 電 腦 , 並 且 幫 他 們 解 決 問 題 。 」 , 但 是 電 腦 並 不 清 楚 人 們 用 它 的 目 的 是 什 麼 , 它 只 聽 命 於 那 些 它 懂 的 指 令 , 也 就 是 程 式 語 言 。 但 是 程 式 語 言 與 人 類 的 語 言 有 著 極 大 的 差 異 , 並 不 是 每 一 個 人 都 懂 得 對 電 腦 下 程 式 語 言 , 於 是 「 程 式 設 計 師 」 的 行 業 就 跟 著 誕 生 了 , 然 而 程 式 設 計 師 並 不 像 律 師 、 醫 師 等 行 業 有 一 定 的 考 核 辦 法 , 因 此 每 一 個 人 都 有 資 格 寫 程 式 。

很 多 人 都 寫 過 程 式 , 寫 程 式 不 是 「 程 式 設 計 師 」 的 專 利 , 但 有 心 寫 程 式 的 人 , 期 望 的 一 定 不 只 是 「 會 寫 程 式 」 ( write the program) , 而 是 「 把 程 式 寫 好 」 ( write the program right) , 乃 至 「 寫 出 好 程 式 」 ( write the right program) 。

會 寫 程 式把 程 式 寫 好、寫 出 好 程 式 的 區 別

有 時 候 我 們 會 這 樣 問 : 「 你 會 寫 x x 語 言 的 程 式 嗎 ? 」 , 其 實 這 個 問 題 的 語 意 並 不 清 楚 , 「 很 會 」 叫 做 會 , 或 是 「 一 點 點 會 」 也 叫 做 會 , 所 以 一 般 我 們 所 謂 的 「 會 寫 程 式 」 並 表 示 一 定 很 會 寫 程 式 、 或 者 可 以 把 程 式 寫 得 很 好 。

「 把 程 式 寫 好 」 則 不 只 是 會 寫 程 式 , 這 還 包 括 把 程 式 「 正 確 地 」 寫 出 來 , 例 如 : 老 師 指 定 程 式 給 學 生 , 學 生 除 了 交 出 寫 好 的 程 式 之 外 , 還 要 讓 程 式 跑 出 正 確 的 結 果 。 要 達 到 這 個 境 界 , 最 常 面 臨 的 問 題 是 程 式 的 偵 錯 , 也 就 是 說 要 除 掉 所 有 的 錯 誤 , 讓 程 式 跑 出 正 確 的 結 果 , 對 小 程 式 來 說 , 這 通 常 不 是 難 事 , 但 對 大 程 式 來 說 , 偵 錯 的 難 度 往 往 會 超 出 一 般 的 想 像 。

已 經 寫 出 正 確 的 程 式 還 不 夠 嗎 ? 某 些 狀 況 下 那 大 概 已 經 足 夠 了 , 例 如 學 校 的 作 業 , 除 此 之 外 , 我 們 應 該 把 程 式 寫 得 比 「 對 」 還 要 「 好 」 , 但 怎 樣 的 程 式 才 算 「 好 程 式 」 呢 ?

算 不 算 得 上 好 程 式 , 除 了 「 正 確 性 」 之 外 , 還 有 以 下 幾 個 要 素 : 「 執 行 效 率 」 、 「 具 親 和 力 」 、 「 可 維 護 性 」 、 及 「 可 再 用 性 」 等 。

從 「 會 寫 程 式 」 到 「 寫 出 好 程 式 」 , 則 大 致 上 會 經 過 以 下 幾 個 學 習 階 段 :

學 習 第 一 個 程 式 語 言

開 始 學 習 程 式 語 言 並 沒 有 什 麼 限 制 , 只 要 有 興 趣 , 大 家 都 可 以 來 學 , 不 過 這 一 系 列 的 稿 子 並 不 在 教 您 學 會 第 一 個 程 式 語 言 , 如 果 您 正 在 學 第 一 個 程 式 語 言 , 或 者 打 算 學 第 一 個 程 式 語 言 , 以 下 是 筆 者 的 建 議 :

    『 每 次 學 到 一 個 新 的 指 令 或 程 式 語 法 時 , 就 用 電 腦 跑 跑 看 , 以 加 深 學 習 的 效 果 。 這 個 階 段 應 該 盡 量 吸 收 入 門 書 籍 中 的 各 種 知 識 , 雖 然 以 後 您 會 覺 得 那 些 東 西 都 太 簡 單 了 , 而 且 對 將 來 撰 寫 大 型 程 式 未 必 有 直 接 的 幫 助 , 但 這 些 初 步 的 知 識 卻 是 您 學 習 電 腦 的 過 程 中 所 播 下 的 「 點 」 , 點 越 多 將 來 連 成 「 線 」 及 「 面 」 的 機 會 就 越 大 、 時 間 也 越 快 。 』

學 習 多 種 程 式 語 言

自 有 電 腦 以 來 , 誕 生 過 的 程 式 語 言 不 下 數 百 種 , 雖 然 有 的 已 經 絕 跡 , 但 存 活 下 來 的 少 說 也 有 數 十 種 , 面 對 這 麼 多 的 程 式 語 言 , 我 們 是 不 可 能 把 它 們 全 部 學 完 的 ( 其 實 也 沒 有 那 個 必 要 ) , 這 不 禁 讓 我 們 思 考 起 以 下 兩 個 問 題 :
  • • 是 不 是 有 一 種 程 式 語 言 , 它 的 功 能 強 大 到 足 以 涵 蓋 所 有 的 程 式 語 言 , 而 我 們 只 要 學 習 這 一 種 程 式 語 言 就 好 了 ? 如 果 沒 有 , 將 來 是 不 是 會 出 現 這 種 語 言 , 或 者 程 式 語 言 會 不 會 統 一 ?
  • • 如 果 只 學 習 一 種 程 式 語 言 是 不 可 能 的 , 那 麼 我 們 該 如 何 選 擇 比 較 值 得 學 習 的 程 式 語 言 ?

程 式 語 言 有 統 一 的 可 能 嗎 ?

一 統 程 式 語 言 的 歷 史 軌 跡

其 實 並 不 是 沒 有 人 想 做 「 統 一 程 式 語 言 」 的 事 情 , 例 如 IBM 推 出 的 程 式 語 言 PL/I, 其 中 PL 是 取 Programming Language 的 第 一 個 字 母 , 而 /I 表 示 第 一 代 , 言 下 之 意 在 宣 示 PL/I 之 前 的 程 式 語 言 都 不 算 是 程 式 語 言 , 大 有 一 統 程 式 語 言 的 企 圖 , 雖 然 推 出 PL/I 時 的 IBM 正 值 其 全 盛 時 期 , 但 歷 史 證 明 IBM 並 沒 有 成 功 。

美 國 國 防 部 也 大 約 在 十 年 前 , 推 出 一 種 叫 做 Ada 的 程 式 語 言 , Ada 不 僅 具 有 物 件 導 向 的 觀 念 , 同 時 也 融 入 多 工 作 業 的 能 力 , 目 的 在 解 決 美 國 國 防 部 使 用 程 式 語 言 上 的 紛 亂 , 以 及 軟 體 的 危 機 , 當 時 的 確 造 成 一 陣 風 潮 ( 我 指 的 是 在 美 國 ) , 但 歷 史 同 樣 證 明 Ada 並 沒 有 成 為 一 統 的 程 式 語 言 。

IBM 以 全 世 界 最 大 的 電 腦 廠 商 身 份 , 而 美 國 國 防 部 以 美 國 最 大 的 電 腦 客 戶 身 份 , 來 推 動 程 式 語 言 的 統 一 尚 且 無 法 成 功 , 我 相 信 將 來 也 不 會 有 哪 個 人 或 機 構 能 夠 一 統 程 式 語 言 。

 
是 否 有 一 種 程 式 語 言 是 「 吾 道 一 以 貫 之 」 的 ? 或 者 某 一 個 程 式 語 言 其 功 能 足 以 「 一 統 天 下 」 的 ? 從 程 式 語 言 發 展 的 歷 史 來 看 , 程 式 語 言 化 一 統 的 事 情 總 是 沒 有 成 功 ( 請 參 照 「 一 統 程 式 語 言 的 歷 史 軌 跡 」 ) , 為 什 麼 程 式 語 言 無 法 統 一 呢 ? 我 想 原 因 可 能 是 : 極 少 程 式 語 言 兼 具 各 種 優 點 , 這 些 優 點 包 括 : 語 法 清 晰 嚴 謹 、 易 學 易 用 、 可 攜 性 高 等 等 , 尤 其 沒 有 一 種 程 式 語 言 可 以 適 合 於 各 種 應 用 範 圍 ,舉 例 來 說 , C 語 言 適 合 用 來 撰 寫 系 統 程 式 , 雖 然 並 不 表 示 它 不 能 用 來 撰 寫 資 料 庫 的 程 式 , 但 它 絕 不 會 比 Visual Basic 來 得 適 合 於 資 料 庫 程 式 的 開 發 。

徘 徊 在 程 式 語 言 的 米 字 路 口

既 然 只 學 習 一 種 程 式 語 言 是 不 可 能 的 , 那 麼 面 對 眾 多 的 程 式 語 言 , 猶 如 徘 徊 在 米 字 路 口 上 ( 通 常 說 「 十 」 字 路 口 , 但 十 只 有 四 個 出 口 , 故 取 「 米 」 字 , 表 示 出 口 多 得 難 以 選 擇 ) , 該 如 何 去 做 抉 擇 呢 ?

以 下 所 列 出 的 是 一 般 選 擇 程 式 語 言 可 能 的 決 策 過 程 :

    • 經 過 評 估 而 選 擇 了 最 適 當 的 程 式 語 言 : 這 當 然 是 我 們 所 期 望 , 但 往 往 事 與 願 違 。

    • 經 過 評 估 而 選 擇 了 較 便 宜 的 程 式 語 言 開 發 工 具 : 「 俗 擱 大 碗 」 是 大 家 所 期 望 的 , 但 真 的 是 大 碗 又 有 料 嗎 ? 值 得 想 一 想 。

    • 經 使 用 不 恰 當 的 程 式 語 言 一 兩 次 ( 也 可 能 是 多 次 ) , 最 後 才 選 到 了 適 合 的 程 式 語 言 : 這 的 確 是 一 件 勞 民 傷 財 的 事 情 。

    • 已 經 熟 悉 某 一 種 程 式 語 言 , 不 想 重 新 學 習 : 有 時 這 種 情 形 會 發 生 在 接 到 比 較 緊 急 的 案 子 , 重 新 學 習 另 一 種 程 式 語 言 會 花 掉 額 外 的 時 間 。

    • 相 信 媒 體 的 宣 傳 , 選 擇 所 謂 最 熱 門 或 功 能 最 強 大 的 程 式 語 言 : 有 時 候 這 一 點 並 不 是 那 麼 容 易 預 防 , 當 然 , 媒 體 的 宣 傳 也 未 必 是 過 度 的 渲 染 。

    • 道 聽 途 說 : 如 果 是 這 樣 , 那 麼 我 敗 給 你 了 。

    • 老 闆 的 規 定 : 對 於 大 部 份 員 工 級 的 人 來 說 , 屬 於 這 種 情 形 的 最 多 。 如 果 老 闆 規 定 的 程 式 語 言 對 您 來 說 是 新 鮮 的 , 那 麼 您 要 在 多 久 時 間 內 學 會 這 種 程 式 語 言 , 並 且 顯 現 您 高 度 的 生 產 力 呢 ? 那 可 能 會 影 響 您 下 次 的 調 薪 及 年 終 獎 金 。

您 的 策 略 為 何 ?

不 可 能 去 學 所 有 的 程 式 語 言 , 因 為 您 跟 我 一 樣 生 命 有 限 ; 沒 有 選 擇 程 式 語 言 的 機 會 , 如 果 您 只 是 個 領 薪 水 的 員 工 。 面 對 必 須 學 習 多 語 言 的 程 式 設 計 世 界 , 我 們 該 有 怎 樣 的 策 略 呢 ? 我 想 應 該 是 培 養 自 己 能 夠 快 速 「 學 習 新 的 程 式 語 言 」 的 能 力 。
 
記 得 大 約 在 大 二 的 時 候 ( 已 經 學 過 兩 三 種 程 式 語 言 ) , 很 流 行 一 句 話 : 「 學 習 新 的 程 式 語 言 不 是 問 題 。 」 , 當 時 總 以 為 只 有 演 算 法 、 作 業 系 統 、 compiler、 資 料 庫 等 才 是 有 學 問 的 東 西 , 直 到 後 來 唸 了 一 門 叫 做 「 程 式 語 言 結 構 」 的 課 程 , 才 有 了 新 的 體 會 。 「 程 式 語 言 結 構 」 的 內 容 並 不 是 以 某 一 種 特 定 的 程 式 語 言 為 對 象 , 而 是 著 重 在 程 式 語 言 「 基 本 」 的 原 理 , 例 如 : 變 數 ( variables) 、 資 料 型 態 ( data types) 、 程 序 ( procedures) 、 例 外 處 理 ( exception handling) 、 同 步 處 理 ( concurrency) 等 , 這 一 門 課 程 原 本 在 教 導 如 何 「 設 計 出 」 更 好 的 程 式 語 言 ( 哇 ! 程 式 語 言 還 不 夠 多 嗎 ? ) , 然 而 學 習 其 中 的 基 本 原 理 , 卻 十 分 有 助 於 學 習 新 的 ( 或 未 曾 學 過 的 ) 程 式 語 言 , 如 果 說 學 過 一 種 程 式 語 言 是 「 見 了 樹 」 , 那 麼 學 過 「 程 式 語 言 結 構 」 可 以 說 是 「 見 了 林 」 。

「 程 式 語 言 結 構 」 , 當 然 也 不 是 三 言 兩 語 可 以 道 盡 的 , 不 過 它 既 然 是 一 門 非 常 實 用 的 學 科 , 我 們 將 在 下 一 回 帶 您 一 探 其 中 的 精 髓 部 份 。

充 實 電 腦 的 相 關 知 識

前 面 我 們 談 的 「 程 式 語 言 結 構 」 是 程 式 語 言 的 基 礎 , 除 了 這 門 學 科 之 外 , 充 實 相 關 的 電 腦 知 識 也 是 提 昇 程 式 設 計 能 力 的 方 法 , 但 資 訊 科 技 日 新 月 異 , 想 要 追 求 所 有 的 電 腦 新 知 猶 如 夸 父 追 日 , 因 此 我 們 只 能 做 選 擇 性 的 追 求 , 但 怎 麼 選 擇 呢 ? 這 實 在 是 一 個 大 哉 問 , 不 過 既 然 我 們 談 的 是 程 式 設 計 , 因 此 我 們 必 須 把 涉 獵 電 腦 知 識 的 範 圍 縮 小 到 只 與 「 程 式 設 計 」 比 較 有 關 的 部 份 :

    資 料 結 構 ( Data Structure) : 與 程 式 設 計 最 有 直 接 關 係 的 學 科 首 推 「 資 料 結 構 」 , 它 主 要 的 內 容 有 程 式 設 計 中 常 用 的 資 料 結 構 , 如 : Array( 陣 列 ) 、 Stack( 堆 疊 ) 、 Queue( 佇 列 ) 、 Linked List( 鏈 結 串 列 ) 、 Tree( 樹 狀 結 構 ) , 以 及 實 用 的 演 算 法 ( algorithm), 如 : 資 料 搜 尋 ( searching) 、 排 序 ( sorting) 、 索 引 技 術 ( index techniques) 等 。

    雖 然 我 們 平 時 寫 程 式 不 一 定 會 用 到 「 資 料 結 構 」 中 所 介 紹 的 資 料 結 構 及 演 算 法 , 但 其 中 含 有 高 度 的 程 式 設 計 技 巧 , 對 於 我 們 撰 寫 程 式 有 很 大 的 助 益 ; 除 此 之 外 , 「 資 料 結 構 」 中 所 探 討 的 如 何 有 效 地 運 用 記 憶 體 的 「 空 間 」 , 以 及 如 何 減 少 CPU 的 執 行 「 時 間 」 , 如 果 應 用 在 程 式 設 計 上 , 則 有 助 於 解 決 記 憶 體 浪 費 及 執 行 速 度 緩 慢 的 問 題 。

    作 業 系 統 ( Operating System) : 除 了 資 料 結 構 之 外 , 另 一 門 與 程 式 設 計 息 息 相 關 的 學 科 是 「 作 業 系 統 」 , 作 業 系 統 的 領 域 可 以 簡 單 分 成 三 個 部 份 : 原 理 、 實 用 、 及 設 計 。 在 「 原 理 」 方 面 主 要 分 成 : 檔 案 系 統 、 CPU 的 排 程 控 制 ( scheduling) 、 記 憶 體 管 理 、 行 程 通 訊 ( Inter-Process Communication) 等 , 這 些 原 理 實 際 上 就 是 程 式 在 系 統 內 部 運 作 的 方 式 , 瞭 解 這 些 原 理 可 以 大 大 地 提 昇 程 式 設 計 的 功 力 。

    而 「 實 用 」 部 份 則 指 是 市 場 上 既 有 的 作 業 系 統 , 例 如 : DOS、 Windows、 OS/2、 UNIX、 MVS、 VMS 等 , 由 於 市 場 上 的 作 業 系 統 多 得 不 勝 枚 舉 , 您 不 可 能 熟 悉 所 有 的 作 業 系 統 , 其 實 也 沒 有 這 個 必 要 , 因 為 紮 實 地 在 作 業 系 統 原 理 上 所 下 的 功 夫 , 可 以 大 大 地 降 低 學 習 新 作 業 系 統 的 障 礙 。

    至 於 作 業 系 統 的 「 設 計 」 則 屬 於 另 一 個 專 業 的 領 域 , 除 非 您 要 設 計 作 業 系 統 , 否 則 可 以 暫 時 把 它 擺 在 一 邊 。

    軟 體 工 程 ( Software Engineering) : 軟 體 工 程 是 什 麼 ? 讓 我 們 以 土 木 工 程 來 比 喻 : 如 果 您 想 蓋 的 只 是 一 個 小 水 溝 , 您 可 以 不 需 要 土 木 工 程 的 技 術 ; 但 如 果 您 想 蓋 的 是 大 樓 , 您 就 非 得 用 到 土 木 工 程 的 相 關 知 識 不 可 。 軟 體 工 程 之 於 軟 體 , 其 道 理 猶 如 土 木 工 程 之 於 蓋 東 西 。

    初 步 來 說 , 軟 體 工 程 是 一 門 因 應 大 型 軟 體 而 生 的 學 科 , 但 那 並 不 表 示 只 有 大 型 軟 體 才 需 要 它 , 如 果 您 把 軟 體 工 程 應 用 在 平 時 撰 寫 的 程 式 上 , 可 以 使 程 式 的 架 構 更 好 , 將 來 更 容 易 維 護 。

    軟 體 工 程 這 門 學 科 主 要 在 探 討 軟 體 開 發 過 程 中 , 也 就 是 所 謂 的 軟 體 生 命 週 期 , 各 個 階 段 的 技 術 , 其 中 包 含 : 需 求 分 析 、 系 統 分 析 、 系 統 設 計 、 程 式 設 計 、 系 統 測 試 等 , 除 了 上 述 的 技 術 性 問 題 之 外 , 軟 體 開 發 過 程 中 的 管 理 問 題 , 例 如 : 時 程 控 制 、 成 本 預 估 、 建 構 管 理 、 文 件 製 作 、 品 質 確 保 等 , 也 在 討 論 的 範 疇 。

    軟 體 工 程 的 研 讀 首 重 觀 念 上 的 體 會 , 對 於 寫 過 越 多 程 式 、 越 大 程 式 的 人 來 說 , 越 能 體 會 其 中 的 意 義 , 如 果 您 還 不 曾 寫 過 千 行 以 上 的 程 式 , 筆 者 在 此 建 議 您 可 以 把 研 讀 本 學 科 的 計 畫 延 後 。

其 他 專 業 學 科 : 其 他 專 業 的 學 科 , 例 如 : 資 料 庫 、 網 路 通 訊 、 電 腦 圖 學 、 系 統 程 式 等 , 雖 然 在 此 沒 有 介 紹 , 但 並 不 表 示 它 們 與 精 進 程 式 設 計 無 關 , 因 此 您 可 做 選 擇 性 的 閱 讀 。

除 錯 能 力 的 培 養

有 句 話 說 : 「 電 腦 程 式 遵 從 你 的 指 示 , 而 不 是 你 的 願 望 。 」 , 想 把 願 望 變 成 100% 正 確 的 指 示 , 必 須 經 過 不 斷 除 錯 的 過 程 , 除 錯 首 先 要 偵 錯 , 然 後 再 修 改 程 式 除 去 錯 誤 。

偵 錯 的 過 程 與 偵 探 有 點 像 , 有 時 還 蠻 有 趣 的 , 不 過 這 種 趣 味 只 會 發 生 在 您 把 錯 誤 找 出 來 的 時 候 , 如 果 找 不 出 錯 誤 的 所 在 , 加 班 熬 夜 恐 怕 在 所 難 免 , 那 麼 趣 味 何 在 我 就 不 知 道 了 。

找 到 了 程 式 的 錯 誤 , 並 不 意 味 著 問 題 就 解 決 了 , 當 程 式 比 較 大 或 是 程 式 架 構 不 好 時 , 極 可 能 會 發 生 「 牽 一 髮 而 動 全 身 」 的 事 情 , 因 此 更 早 的 預 防 方 法 是 開 始 寫 程 式 前 先 做 好 分 析 的 工 作 。

除 錯 的 能 力 通 常 會 隨 著 經 驗 的 增 長 而 累 加 , 但 這 並 不 表 示 它 不 能 憑 藉 著 努 力 而 加 以 培 養 的 , 以 下 是 培 養 除 錯 能 力 的 幾 個 方 向 :

    • 熟 悉 程 式 語 言 的 特 性

    • 善 用 除 錯 工 具 ( debugger)

    • 訓 練 抓 蟲 的 技 巧

    • 養 成 良 好 的 習 慣

    • 建 立 良 好 的 程 式 架 構

培 養 除 錯 的 能 力 , 基 本 上 一 定 要 「 熟 悉 使 用 的 程 式 語 言 」 , 雖 然 這 不 表 示 您 一 定 要 徹 底 瞭 解 使 用 的 程 式 語 言 才 能 夠 開 始 寫 程 式 , 但 至 少 寫 在 程 式 裡 的 每 一 個 式 子 都 要 弄 得 清 清 楚 楚 。

接 著 是 「 善 用 除 錯 工 具 」 , 除 錯 工 具 會 隨 著 您 所 使 用 的 開 發 工 具 而 有 所 差 異 , 不 過 常 用 的 功 能 , 例 如 : 單 步 執 行 、 設 定 中 斷 點 、 觀 察 變 數 等 , 在 所 有 的 開 發 工 具 中 幾 乎 都 會 支 援 , 而 一 些 視 覺 化 的 ( visual) 開 發 工 具 更 有 您 意 想 不 到 的 功 能 , 好 好 地 花 時 間 熟 悉 除 錯 工 具 保 證 讓 您 值 回 票 價 。

除 錯 工 具 並 不 是 萬 能 的 , 再 好 的 工 具 都 必 須 有 善 用 之 人 才 能 發 揮 它 的 功 用 , 濫 用 除 錯 工 具 盲 目 地 設 定 中 斷 點 有 時 反 而 會 浪 費 時 間 , 就 像 用 槍 一 樣 , 除 了 曉 得 扣 扳 機 之 外 , 還 要 瞄 得 準 目 標 才 行 , 這 其 實 就 是 「 抓 蟲 技 巧 」 , 抓 蟲 的 技 巧 雖 多 半 來 自 經 驗 , 但 絕 不 是 不 傳 之 秘 , 那 將 是 本 系 列 文 章 介 紹 的 重 點 。

預 防 勝 於 治 療 , 除 錯 只 是 事 後 的 補 救 , 如 何 避 免 錯 誤 往 往 比 除 錯 更 加 重 要 。

許 多 程 式 錯 誤 的 原 因 是 因 為 程 式 設 計 人 員 的 不 小 心 , 避 免 錯 誤 首 重 「 良 好 習 慣 的 養 成 」 , 哪 些 是 良 好 的 習 慣 ? 哪 些 又 是 壞 習 慣 ? 也 是 在 後 續 的 討 論 中 再 向 您 說 明 。 避 免 錯 誤 的 另 一 個 方 法 是 「 建 立 良 好 的 程 式 架 構 」 , 良 好 的 程 式 架 構 不 僅 可 以 減 少 錯 誤 的 發 生 , 萬 一 發 生 錯 誤 時 , 它 也 比 較 容 易 偵 錯 及 除 錯 , 怎 樣 的 程 式 架 構 是 一 個 好 的 架 構 , 我 們 將 在 下 下 一 回 的 「 為 您 的 程 式 做 體 檢 」 為 您 做 詳 細 的 說 明 。

當 程 式 越 來 越 大 時

徐 志 摩 說 : 數 大 就 是 美 ; 然 而 在 程 式 設 計 的 世 界 裡 , 數 大 卻 是 麻 煩 。 當 程 式 越 來 越 大 時 , 也 會 衍 生 出 許 多 問 題 , 這 些 問 題 首 推 : 「 程 式 開 發 的 時 間 」 與 「 程 式 的 管 理 」 。

程 式 開 發 的 時 間

東 西 變 大 , 自 然 要 花 更 多 的 時 間 才 能 做 完 它 , 就 像 功 課 變 多 了 , 您 就 必 須 花 等 倍 的 時 間 才 能 做 完 它 , 然 而 當 程 式 變 大 時 , 您 所 花 的 時 間 就 不 只 是 等 倍 , 而 是 2 的 冪 次 方 倍 , 例 如 : 當 程 式 變 成 了 兩 倍 時 , 您 所 花 的 時 間 會 變 成 四 倍 , 而 不 是 原 來 的 兩 倍 。 為 什 麼 呢 ?

就 像 我 們 前 面 所 說 過 的 , 程 式 不 是 寫 了 就 好 , 而 是 要 把 它 寫 正 確 , 有 經 驗 的 人 都 知 道 : 程 式 的 開 發 , 最 花 時 間 的 地 方 不 是 「 編 碼 」 , 而 是 「 除 錯 」 , 當 程 式 變 成 兩 倍 時 , 編 碼 的 時 間 當 然 也 是 兩 倍 , 但 是 真 正 影 響 程 式 開 發 的 除 錯 , 卻 要 花 上 四 倍 的 時 間 , 以 下 讓 我 們 以 一 個 例 子 來 說 明 :

假 設 有 一 程 式 A , 其 大 小 為 S , 而 為 程 式 除 錯 的 時 間 是 T , 如 果 另 一 個 性 質 完 全 相 同 的 程 式 B , 其 大 小 為 A 的 N 倍 , 那 麼 為 B 程 式 除 錯 所 花 的 時 間 是 多 少 呢 ? 等 於 N xT 嗎 ?

程 式 大 小 除 錯 的 時 間
N xS N xT ?

乍 看 之 下 , 好 像 沒 錯 , 但 其 實 N xT 的 答 案 忽 略 了 另 一 個 重 要 的 因 素 : 發 生 錯 誤 的 機 率 P 。 如 果 程 式 A 發 生 錯 誤 的 機 率 是 P , 那 麼 N 倍 大 的 程 式 B 發 生 錯 誤 的 機 率 則 大 約 是 N xP , 所 以 當 程 式 的 大 小 增 加 為 N 倍 時 , 其 除 錯 的 時 間 應 該 是 ( N xP ) x( N xT ) 是 原 來 ( P xT ) 的 N xN 倍 , 若 以 曲 線 來 表 示 則 是 :

如 果 除 錯 的 時 間 佔 了 開 發 時 間 的 大 部 份 , 我 們 就 可 以 推 論 : 當 程 式 逐 漸 加 大 時 , 其 開 發 的 時 間 將 以 2 的 冪 次 方 倍 來 增 加 。

以 上 的 曲 線 有 點 駭 人 聽 聞 , 果 真 如 此 , 那 豈 不 表 示 當 程 式 大 到 某 種 程 度 時 , 程 式 開 發 的 的 時 間 將 會 趨 於 無 限 大 ( 參 考 曲 線 的 X 點 ) 。 基 本 上 , 若 單 純 從 數 學 的 角 度 來 看 , 以 上 的 曲 線 並 沒 有 什 麼 錯 誤 , 但 我 們 可 以 想 辦 法 把 這 條 曲 線 的 弧 度 壓 低 , 使 X 點 向 後 拉 , 以 增 加 可 開 發 程 式 的 大 小 。

壓 低 曲 線 的 方 法 不 外 乎 : 減 少 「 除 錯 的 時 間 ( T ) 」 及 降 低 「 錯 誤 發 生 的 機 率 ( P ) 」 。 先 前 我 們 所 提 到 的 「 除 錯 能 力 的 培 養 」 , 包 括 : 熟 悉 程 式 語 言 的 特 性 、 善 用 除 錯 工 具 、 及 訓 練 抓 蟲 的 技 巧 可 減 少 除 錯 的 時 間 ; 而 建 立 良 好 的 習 慣 及 建 立 良 好 的 程 式 架 構 則 可 降 低 程 式 發 生 錯 誤 的 機 率 。

程 式 的 管 理

將 軍 的 騙 術 與 程 式 管 理

記 得 以 前 在 傳 記 的 文 章 中 , 讀 過 某 一 將 軍 能 夠 叫 出 小 兵 名 字 , 讓 小 兵 感 動 異 常 的 故 事 , 文 中 讚 美 這 將 軍 的 記 憶 力 很 好 , 但 如 果 我 們 運 用 一 點 邏 輯 的 思 維 , 就 可 以 知 道 這 不 過 是 小 小 的 騙 術 。

一 位 將 軍 大 約 要 帶 領 多 少 大 軍 , 至 少 是 上 萬 吧 ! 也 許 將 軍 的 記 憶 力 真 的 好 到 可 以 把 幾 萬 個 小 兵 的 容 貌 與 名 字 連 接 起 來 , 但 其 實 他 要 叫 出 小 兵 的 名 字 大 可 不 必 如 此 大 費 周 章 , 因 為 他 只 要 刻 意 記 幾 位 小 兵 的 名 字 , 然 後 在 集 合 時 叫 出 其 中 的 一 兩 位 就 可 以 了 , 反 正 沒 有 小 兵 敢 問 : 「 將 軍 , 請 問 您 知 道 我 的 名 字 嗎 ? 」

也 許 您 跟 我 一 樣 , 沒 有 機 會 當 真 正 的 將 軍 , 但 我 相 信 有 一 天 您 也 會 像 我 一 樣 , 把 程 式 寫 到 幾 萬 行 , 甚 至 幾 十 萬 行 , 如 果 這 每 一 行 的 程 式 就 像 您 麾 下 的 小 兵 , 您 如 何 去 帶 領 它 們 呢 ?

真 實 生 活 中 的 將 軍 只 要 記 幾 個 小 兵 的 名 字 就 夠 了 , 然 而 在 電 腦 的 世 界 裡 , 要 把 程 式 完 完 全 全 地 寫 正 確 , 卻 不 可 以 忽 略 程 式 中 的 任 何 一 行 , 但 問 題 是 我 們 真 的 能 記 得 住 幾 萬 行 程 式 中 的 每 一 行 嗎 ? 所 以 如 何 管 理 大 型 程 式 就 變 得 異 常 重 要 。

多 大 的 程 式 才 算 得 上 是 大 程 式 呢 , 幾 百 行 的 程 式 ? 幾 千 行 的 程 式 ? 還 是 幾 萬 行 的 程 式 ?

我 個 人 一 直 不 喜 歡 用 幾 「 行 」 來 衡 量 程 式 的 大 小 , 因 為 我 們 通 常 會 把 程 式 分 成 許 多 個 「 副 程 式 」 , 每 個 副 程 式 用 來 執 行 某 一 個 ( 或 某 些 ) 功 能 , 為 了 便 於 記 憶 起 見 , 我 們 會 為 這 些 副 程 式 取 個 恰 當 的 名 字 , 這 些 副 程 式 就 像 幫 我 們 完 成 程 式 任 務 的 小 兵 , 因 此 以 副 程 式 的 個 數 來 衡 量 程 式 的 大 小 是 比 較 恰 當 的 。

一 般 來 說 , 副 程 式 的 個 數 達 到 幾 百 個 就 算 得 上 大 程 式 , 面 對 這 麼 多 的 副 程 式 , 我 們 可 能 會 忘 了 某 些 副 程 式 到 底 做 了 些 什 麼 , 修 改 時 無 法 馬 上 知 道 它 們 對 整 體 程 式 的 影 響 ; 當 程 式 是 由 多 人 共 同 開 發 時 , 一 旦 發 生 問 題 時 , 如 何 確 認 是 誰 出 的 錯 ; 如 何 控 制 開 發 的 進 度 , 確 保 如 期 交 貨 …

為 了 解 決 上 述 的 問 題 , 常 被 討 論 到 的 主 題 有 : 文 件 的 製 作 、 各 種 分 析 設 計 的 方 法 論 ( 例 如 : 結 構 化 分 析 、 物 件 導 向 技 術 ) 、 專 案 管 理 等 等 , 有 關 這 方 面 的 技 術 及 知 識 , 都 可 歸 類 到 我 們 前 面 所 介 紹 的 「 軟 體 工 程 」 學 科 中 。 軟 體 工 程 不 是 一 門 以 理 論 為 出 發 的 學 科 , 筆 者 過 去 常 有 機 會 帶 領 新 人 從 沒 有 工 作 經 驗 逐 步 進 入 大 型 軟 體 開 發 的 領 域 , 曾 經 過 幾 番 軟 體 開 發 的 波 折 , 希 望 未 來 能 夠 與 大 家 共 同 討 論 。

如 何 寫 出 更 好 的 程 式

什 麼 是 好 程 式 ? 比 較 油 腔 滑 調 的 說 法 是 : 只 要 使 用 者 可 以 接 受 的 程 式 就 是 好 程 式 。 不 過 這 樣 的 好 程 式 可 能 經 不 起 更 高 的 挑 戰 , 舉 例 來 說 , 當 使 用 者 又 有 新 的 需 求 時 , 您 是 否 能 夠 在 短 時 間 內 寫 出 ( 或 是 由 原 程 式 修 改 出 ) 另 一 個 符 合 使 用 者 需 求 的 新 程 式 ? 您 的 程 式 是 否 可 以 移 植 到 別 的 作 業 系 統 ? 操 作 介 面 是 否 具 親 和 力 ?

使 用 者 「 可 以 接 受 」 通 常 代 表 的 是 「 功 能 符 合 需 求 」 , 但 如 果 我 們 將 境 界 提 昇 到 使 用 者 「 滿 意 」 的 程 度 呢 ? 那 可 能 就 必 須 做 到 「 操 作 介 面 具 親 和 力 」 、 「 程 式 穩 定 不 當 機 」 、 「 執 行 快 速 不 延 遲 」 等 等 。

前 面 是 從 「 使 用 者 」 的 角 度 來 衡 量 程 式 的 好 壞 , 接 著 讓 我 們 從 程 式 「 開 發 者 」 的 角 度 來 看 , 怎 樣 的 程 式 才 算 得 上 好 程 式 ? 進 入 討 論 以 前 , 請 容 我 介 紹 一 個 觀 念 : 「 軟 體 生 命 週 期 」 。

「 網 中 人 」 與 「 軟 體 」 的 生 命 週 期

以 前 看 布 袋 戲 時 , 有 一 個 角 色 始 終 留 給 我 十 分 深 刻 的 映 象 , 他 的 名 字 叫 做 「 網 中 人 」 。 網 中 人 第 一 次 在 戲 中 出 現 時 , 武 功 已 經 非 常 厲 害 , 但 中 原 武 林 之 中 亦 有 不 少 能 人 , 網 中 人 難 免 要 遭 逢 敵 手 而 落 敗 , 這 時 候 他 會 消 失 一 陣 子 , 將 自 己 困 在 網 中 蛻 變 再 生 , 等 到 他 下 次 出 現 時 , 周 圍 金 光 閃 閃 , 一 陣 如 雷 貫 耳 的 聲 音 出 現 : 「 第 二 代 , 第 二 代 的 網 中 人 再 生 了 ! 哈 哈 哈 ! 」 , 當 然 這 回 要 比 上 回 厲 害 多 了 , 但 強 中 自 有 強 中 手 , 網 中 人 的 命 運 最 後 又 難 逃 再 度 落 敗 的 下 場 , 不 過 沒 關 係 , 主 演 者 又 會 在 適 當 的 時 機 讓 他 重 現 江 湖 , 「 第 三 代 , 第 三 代 的 網 中 人 再 生 了 ! 哈 哈 哈 ! 」 , 不 管 怎 麼 樣 , 他 總 會 再 生 , 而 每 次 再 生 總 引 來 觀 眾 的 一 陣 騷 動 , 這 回 他 不 知 道 什 麼 時 候 才 會 再 遭 逢 敵 手 。

網 中 人 的 生 命 猶 如 週 期 一 般 , 可 以 週 而 復 始 生 生 不 息 。 軟 體 其 實 也 是 有 生 命 的 , 例 如 我 們 看 到 許 多 軟 體 都 有 版 本 的 更 新 , 1.0 版 指 的 是 軟 體 的 第 一 代 , 2.0 是 第 二 代 … , 這 每 一 個 版 本 就 猶 如 一 個 生 命 週 期 。

對 使 用 者 來 說 , 他 可 不 必 管 什 麼 軟 體 生 命 週 期 , 反 正 好 用 就 好 ; 但 是 對 開 發 者 來 說 , 要 維 繫 軟 體 的 生 命 週 期 卻 是 一 大 挑 戰 , 其 中 「 軟 體 需 求 的 變 更 」 可 以 說 是 軟 體 生 命 週 期 最 大 的 敵 手 , 有 些 軟 體 因 無 法 做 局 部 的 修 改 而 宣 告 死 亡 , 設 計 者 不 得 不 重 新 開 發 系 統 , 有 些 軟 體 則 在 工 程 人 員 大 費 周 章 之 後 而 勉 強 符 合 新 的 需 求 , 但 不 知 道 它 下 回 還 能 不 能 那 麼 幸 運 。 軟 體 是 不 是 具 有 可 維 繫 其 生 命 週 期 的 特 性 , 我 們 統 稱 「 可 維 護 性 」 , 好 的 程 式 應 該 具 有 高 度 的 可 維 護 性 。

程 式 是 否 可 維 護 首 重 「 文 件 」 , 做 好 文 件 對 許 多 率 性 的 資 訊 人 來 說 是 一 件 苦 差 事 , 不 過 今 天 不 做 , 明 天 卻 可 能 要 付 出 更 高 的 代 價 。 除 了 文 件 之 外 , 若 從 技 術 的 角 度 來 看 , 程 式 是 否 可 維 護 則 首 推 「 程 式 架 構 」 的 好 壞 。

另 一 個 有 趣 的 話 題 是 「 可 再 用 性 」 , 舉 例 來 說 , 兩 個 不 同 的 軟 體 可 能 會 有 某 些 共 通 的 地 方 , 或 者 某 一 段 程 式 碼 其 通 則 性 很 高 , 程 式 開 發 時 可 考 慮 把 這 段 程 式 抽 取 出 來 , 寫 成 為 可 重 複 使 用 的 程 式 段 , 稱 之 為 可 再 用 的 「 軟 體 元 件 」 。 利 用 軟 體 元 件 來 開 發 程 式 , 除 了 可 以 節 省 開 發 的 時 間 與 成 本 外 , 由 於 軟 體 元 件 通 常 會 經 過 比 較 多 次 的 測 試 , 其 穩 定 性 也 會 比 較 高 。

綜 觀 以 上 的 討 論 , 想 寫 出 更 好 的 程 式 , 應 該 考 慮 以 下 幾 個 要 素 :

    • 符 合 功 能 需 求

    • 具 親 和 力 的 操 作 介 面

    • 可 靠 性

    • 執 行 效 率

    • 可 維 護 性

    • 可 再 用 性