充 實 電 腦 的 相 關 知 識資 料 結 構 ( 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) : 軟 體 工 程 是 什 麼 ? 讓 我 們 以 土 木 工 程 來 比 喻 : 如 果 您 想 蓋 的 只 是 一 個 小 水 溝 , 您 可 以 不 需 要 土 木 工 程 的 技 術 ; 但 如 果 您 想 蓋 的 是 大 樓 , 您 就 非 得 用 到 土 木 工 程 的 相 關 知 識 不 可 。 軟 體 工 程 之 於 軟 體 , 其 道 理 猶 如 土 木 工 程 之 於 蓋 東 西 。 初 步 來 說 , 軟 體 工 程 是 一 門 因 應 大 型 軟 體 而 生 的 學 科 , 但 那 並 不 表 示 只 有 大 型 軟 體 才 需 要 它 , 如 果 您 把 軟 體 工 程 應 用 在 平 時 撰 寫 的 程 式 上 , 可 以 使 程 式 的 架 構 更 好 , 將 來 更 容 易 維 護 。 軟 體 工 程 這 門 學 科 主 要 在 探 討 軟 體 開 發 過 程 中 , 也 就 是 所 謂 的 軟 體 生 命 週 期 , 各 個 階 段 的 技 術 , 其 中 包 含 : 需 求 分 析 、 系 統 分 析 、 系 統 設 計 、 程 式 設 計 、 系 統 測 試 等 , 除 了 上 述 的 技 術 性 問 題 之 外 , 軟 體 開 發 過 程 中 的 管 理 問 題 , 例 如 : 時 程 控 制 、 成 本 預 估 、 建 構 管 理 、 文 件 製 作 、 品 質 確 保 等 , 也 在 討 論 的 範 疇 。 軟 體 工 程 的 研 讀 首 重 觀 念 上 的 體 會 , 對 於 寫 過 越 多 程 式 、 越 大 程 式 的 人 來 說 , 越 能 體 會 其 中 的 意 義 , 如 果 您 還 不 曾 寫 過 千 行 以 上 的 程 式 , 筆 者 在 此 建 議 您 可 以 把 研 讀 本 學 科 的 計 畫 延 後 。 其 他 專 業 學 科 : 其 他 專 業 的 學 科 , 例 如 : 資 料 庫 、 網 路 通 訊 、 電 腦 圖 學 、 系 統 程 式 等 , 雖 然 在 此 沒 有 介 紹 , 但 並 不 表 示 它 們 與 精 進 程 式 設 計 無 關 , 因 此 您 可 做 選 擇 性 的 閱 讀 。 除 錯 能 力 的 培 養偵 錯 的 過 程 與 偵 探 有 點 像 , 有 時 還 蠻 有 趣 的 , 不 過 這 種 趣 味 只 會 發 生 在 您 把 錯 誤 找 出 來 的 時 候 , 如 果 找 不 出 錯 誤 的 所 在 , 加 班 熬 夜 恐 怕 在 所 難 免 , 那 麼 趣 味 何 在 我 就 不 知 道 了 。 找 到 了 程 式 的 錯 誤 , 並 不 意 味 著 問 題 就 解 決 了 , 當 程 式 比 較 大 或 是 程 式 架 構 不 好 時 , 極 可 能 會 發 生 「 牽 一 髮 而 動 全 身 」 的 事 情 , 因 此 更 早 的 預 防 方 法 是 開 始 寫 程 式 前 先 做 好 分 析 的 工 作 。 除 錯 的 能 力 通 常 會 隨 著 經 驗 的 增 長 而 累 加 , 但 這 並 不 表 示 它 不 能 憑 藉 著 努 力 而 加 以 培 養 的 , 以 下 是 培 養 除 錯 能 力 的 幾 個 方 向 : • 熟 悉 程 式 語 言 的 特 性 • 善 用 除 錯 工 具 ( debugger) • 訓 練 抓 蟲 的 技 巧 • 養 成 良 好 的 習 慣 • 建 立 良 好 的 程 式 架 構 培 養 除 錯 的 能 力 , 基 本 上 一 定 要 「 熟 悉 使 用 的 程 式 語 言 」 , 雖 然 這 不 表 示 您 一 定 要 徹 底 瞭 解 使 用 的 程 式 語 言 才 能 夠 開 始 寫 程 式 , 但 至 少 寫 在 程 式 裡 的 每 一 個 式 子 都 要 弄 得 清 清 楚 楚 。 接 著 是 「 善 用 除 錯 工 具 」 , 除 錯 工 具 會 隨 著 您 所 使 用 的 開 發 工 具 而 有 所 差 異 , 不 過 常 用 的 功 能 , 例 如 : 單 步 執 行 、 設 定 中 斷 點 、 觀 察 變 數 等 , 在 所 有 的 開 發 工 具 中 幾 乎 都 會 支 援 , 而 一 些 視 覺 化 的 ( visual) 開 發 工 具 更 有 您 意 想 不 到 的 功 能 , 好 好 地 花 時 間 熟 悉 除 錯 工 具 保 證 讓 您 值 回 票 價 。 除 錯 工 具 並 不 是 萬 能 的 , 再 好 的 工 具 都 必 須 有 善 用 之 人 才 能 發 揮 它 的 功 用 , 濫 用 除 錯 工 具 盲 目 地 設 定 中 斷 點 有 時 反 而 會 浪 費 時 間 , 就 像 用 槍 一 樣 , 除 了 曉 得 扣 扳 機 之 外 , 還 要 瞄 得 準 目 標 才 行 , 這 其 實 就 是 「 抓 蟲 技 巧 」 , 抓 蟲 的 技 巧 雖 多 半 來 自 經 驗 , 但 絕 不 是 不 傳 之 秘 , 那 將 是 本 系 列 文 章 介 紹 的 重 點 。 預 防 勝 於 治 療 , 除 錯 只 是 事 後 的 補 救 , 如 何 避 免 錯 誤 往 往 比 除 錯 更 加 重 要 。 許 多 程 式 錯 誤 的 原 因 是 因 為 程 式 設 計 人 員 的 不 小 心 , 避 免 錯 誤 首 重 「 良 好 習 慣 的 養 成 」 , 哪 些 是 良 好 的 習 慣 ? 哪 些 又 是 壞 習 慣 ? 也 是 在 後 續 的 討 論 中 再 向 您 說 明 。 避 免 錯 誤 的 另 一 個 方 法 是 「 建 立 良 好 的 程 式 架 構 」 , 良 好 的 程 式 架 構 不 僅 可 以 減 少 錯 誤 的 發 生 , 萬 一 發 生 錯 誤 時 , 它 也 比 較 容 易 偵 錯 及 除 錯 , 怎 樣 的 程 式 架 構 是 一 個 好 的 架 構 , 我 們 將 在 下 下 一 回 的 「 為 您 的 程 式 做 體 檢 」 為 您 做 詳 細 的 說 明 。 |
當 程 式 越 來 越 大 時程 式 開 發 的 時 間東 西 變 大 , 自 然 要 花 更 多 的 時 間 才 能 做 完 它 , 就 像 功 課 變 多 了 , 您 就 必 須 花 等 倍 的 時 間 才 能 做 完 它 , 然 而 當 程 式 變 大 時 , 您 所 花 的 時 間 就 不 只 是 等 倍 , 而 是 2 的 冪 次 方 倍 , 例 如 : 當 程 式 變 成 了 兩 倍 時 , 您 所 花 的 時 間 會 變 成 四 倍 , 而 不 是 原 來 的 兩 倍 。 為 什 麼 呢 ? 就 像 我 們 前 面 所 說 過 的 , 程 式 不 是 寫 了 就 好 , 而 是 要 把 它 寫 正 確 , 有 經 驗 的 人 都 知 道 : 程 式 的 開 發 , 最 花 時 間 的 地 方 不 是 「 編 碼 」 , 而 是 「 除 錯 」 , 當 程 式 變 成 兩 倍 時 , 編 碼 的 時 間 當 然 也 是 兩 倍 , 但 是 真 正 影 響 程 式 開 發 的 除 錯 , 卻 要 花 上 四 倍 的 時 間 , 以 下 讓 我 們 以 一 個 例 子 來 說 明 : 假 設 有 一 程 式 A , 其 大 小 為 S , 而 為 程 式 除 錯 的 時 間 是 T , 如 果 另 一 個 性 質 完 全 相 同 的 程 式 B , 其 大 小 為 A 的 N 倍 , 那 麼 為 B 程 式 除 錯 所 花 的 時 間 是 多 少 呢 ? 等 於 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 ) 」 。 先 前 我 們 所 提 到 的 「 除 錯 能 力 的 培 養 」 , 包 括 : 熟 悉 程 式 語 言 的 特 性 、 善 用 除 錯 工 具 、 及 訓 練 抓 蟲 的 技 巧 可 減 少 除 錯 的 時 間 ; 而 建 立 良 好 的 習 慣 及 建 立 良 好 的 程 式 架 構 則 可 降 低 程 式 發 生 錯 誤 的 機 率 。 程 式 的 管 理
多 大 的 程 式 才 算 得 上 是 大 程 式 呢 , 幾 百 行 的 程 式 ? 幾 千 行 的 程 式 ? 還 是 幾 萬 行 的 程 式 ? 我 個 人 一 直 不 喜 歡 用 幾 「 行 」 來 衡 量 程 式 的 大 小 , 因 為 我 們 通 常 會 把 程 式 分 成 許 多 個 「 副 程 式 」 , 每 個 副 程 式 用 來 執 行 某 一 個 ( 或 某 些 ) 功 能 , 為 了 便 於 記 憶 起 見 , 我 們 會 為 這 些 副 程 式 取 個 恰 當 的 名 字 , 這 些 副 程 式 就 像 幫 我 們 完 成 程 式 任 務 的 小 兵 , 因 此 以 副 程 式 的 個 數 來 衡 量 程 式 的 大 小 是 比 較 恰 當 的 。 一 般 來 說 , 副 程 式 的 個 數 達 到 幾 百 個 就 算 得 上 大 程 式 , 面 對 這 麼 多 的 副 程 式 , 我 們 可 能 會 忘 了 某 些 副 程 式 到 底 做 了 些 什 麼 , 修 改 時 無 法 馬 上 知 道 它 們 對 整 體 程 式 的 影 響 ; 當 程 式 是 由 多 人 共 同 開 發 時 , 一 旦 發 生 問 題 時 , 如 何 確 認 是 誰 出 的 錯 ; 如 何 控 制 開 發 的 進 度 , 確 保 如 期 交 貨 … 為 了 解 決 上 述 的 問 題 , 常 被 討 論 到 的 主 題 有 : 文 件 的 製 作 、 各 種 分 析 設 計 的 方 法 論 ( 例 如 : 結 構 化 分 析 、 物 件 導 向 技 術 ) 、 專 案 管 理 等 等 , 有 關 這 方 面 的 技 術 及 知 識 , 都 可 歸 類 到 我 們 前 面 所 介 紹 的 「 軟 體 工 程 」 學 科 中 。 軟 體 工 程 不 是 一 門 以 理 論 為 出 發 的 學 科 , 筆 者 過 去 常 有 機 會 帶 領 新 人 從 沒 有 工 作 經 驗 逐 步 進 入 大 型 軟 體 開 發 的 領 域 , 曾 經 過 幾 番 軟 體 開 發 的 波 折 , 希 望 未 來 能 夠 與 大 家 共 同 討 論 。 如 何 寫 出 更 好 的 程 式什 麼 是 好 程 式 ? 比 較 油 腔 滑 調 的 說 法 是 : 只 要 使 用 者 可 以 接 受 的 程 式 就 是 好 程 式 。 不 過 這 樣 的 好 程 式 可 能 經 不 起 更 高 的 挑 戰 , 舉 例 來 說 , 當 使 用 者 又 有 新 的 需 求 時 , 您 是 否 能 夠 在 短 時 間 內 寫 出 ( 或 是 由 原 程 式 修 改 出 ) 另 一 個 符 合 使 用 者 需 求 的 新 程 式 ? 您 的 程 式 是 否 可 以 移 植 到 別 的 作 業 系 統 ? 操 作 介 面 是 否 具 親 和 力 ? 使 用 者 「 可 以 接 受 」 通 常 代 表 的 是 「 功 能 符 合 需 求 」 , 但 如 果 我 們 將 境 界 提 昇 到 使 用 者 「 滿 意 」 的 程 度 呢 ? 那 可 能 就 必 須 做 到 「 操 作 介 面 具 親 和 力 」 、 「 程 式 穩 定 不 當 機 」 、 「 執 行 快 速 不 延 遲 」 等 等 。 前 面 是 從 「 使 用 者 」 的 角 度 來 衡 量 程 式 的 好 壞 , 接 著 讓 我 們 從 程 式 「 開 發 者 」 的 角 度 來 看 , 怎 樣 的 程 式 才 算 得 上 好 程 式 ? 進 入 討 論 以 前 , 請 容 我 介 紹 一 個 觀 念 : 「 軟 體 生 命 週 期 」 。
對 使 用 者 來 說 , 他 可 不 必 管 什 麼 軟 體 生 命 週 期 , 反 正 好 用 就 好 ; 但 是 對 開 發 者 來 說 , 要 維 繫 軟 體 的 生 命 週 期 卻 是 一 大 挑 戰 , 其 中 「 軟 體 需 求 的 變 更 」 可 以 說 是 軟 體 生 命 週 期 最 大 的 敵 手 , 有 些 軟 體 因 無 法 做 局 部 的 修 改 而 宣 告 死 亡 , 設 計 者 不 得 不 重 新 開 發 系 統 , 有 些 軟 體 則 在 工 程 人 員 大 費 周 章 之 後 而 勉 強 符 合 新 的 需 求 , 但 不 知 道 它 下 回 還 能 不 能 那 麼 幸 運 。 軟 體 是 不 是 具 有 可 維 繫 其 生 命 週 期 的 特 性 , 我 們 統 稱 「 可 維 護 性 」 , 好 的 程 式 應 該 具 有 高 度 的 可 維 護 性 。 程 式 是 否 可 維 護 首 重 「 文 件 」 , 做 好 文 件 對 許 多 率 性 的 資 訊 人 來 說 是 一 件 苦 差 事 , 不 過 今 天 不 做 , 明 天 卻 可 能 要 付 出 更 高 的 代 價 。 除 了 文 件 之 外 , 若 從 技 術 的 角 度 來 看 , 程 式 是 否 可 維 護 則 首 推 「 程 式 架 構 」 的 好 壞 。 另 一 個 有 趣 的 話 題 是 「 可 再 用 性 」 , 舉 例 來 說 , 兩 個 不 同 的 軟 體 可 能 會 有 某 些 共 通 的 地 方 , 或 者 某 一 段 程 式 碼 其 通 則 性 很 高 , 程 式 開 發 時 可 考 慮 把 這 段 程 式 抽 取 出 來 , 寫 成 為 可 重 複 使 用 的 程 式 段 , 稱 之 為 可 再 用 的 「 軟 體 元 件 」 。 利 用 軟 體 元 件 來 開 發 程 式 , 除 了 可 以 節 省 開 發 的 時 間 與 成 本 外 , 由 於 軟 體 元 件 通 常 會 經 過 比 較 多 次 的 測 試 , 其 穩 定 性 也 會 比 較 高 。 綜 觀 以 上 的 討 論 , 想 寫 出 更 好 的 程 式 , 應 該 考 慮 以 下 幾 個 要 素 : • 符 合 功 能 需 求 • 具 親 和 力 的 操 作 介 面 • 可 靠 性 • 執 行 效 率 • 可 維 護 性 • 可 再 用 性 |