軟件設計

軟件設計係軟件工程上嘅其中一個工序,講緊仲未郁手寫源碼實施或者修改隻軟件,先行對隻軟件嘅運作方式做計劃。軟件設計呢個工序,要產生一套有關隻軟件內部點運作嘅概念結構,通常仲會寫低一啲設計文件,團隊其後想睇返嗰陣就可以參考。[1]
要做軟件設計,要處理軟件架構、用家介面設計等嘅問題,要達致抽象化同埋模塊化,目標係設計出能夠正確運行得嚟又易用嘅軟件。呢個工序牽涉到跨層次嘅抽象化同埋用家體驗方面嘅思考。
軟件設計嘅前一步係要確立軟件需求。設計度好咗,下一步就係軟件建造,即係實際製作隻軟件。
基本概念
[編輯]設計本身可以定義為一種計劃同構思嘅過程,界定系統或者產品要有咩特性,從而達到使用者想要嘅目的。由工程學角度睇,設計唔淨只係畫圖咁簡單,而係成套方法,用嚟將需求轉化為可以攞去實行嘅方案,具體噉描述個系統或者件產品(最後出嘅 artifact [註 1])要有邊啲結構同埋組件,過程中會產生流程圖、虛擬碼、用統一製模語言描述嘅模型... 等等,而且呢啲嘢冚唪唥都會紀錄在案。响呢個過程中,設計者需要平衡效能、成本同埋可用度等嘅多方考量,設計出最啱用嘅軟件系統[2]。
做軟件設計,不時要處理一啲棘手問題[註 2],意思係指問題嘅一類,特徵係因為啲需求唔完整、互相矛盾、或者經常改變等... 而難以解決,甚至根本冇可能徹底噉解決,唔會有唯一嘅解決方案。棘手問題之所以難搞,好多時係由於啲嘢之間存在複雜嘅相互依存關係,而且一路解仲可以會揭露出其他之前未諗到嘅問題。對於棘手問題,做設計嘅人往往要靠經驗同埋權衡取捨,唔會有咩簡單方法可以「推理」或者「計」個答案出嚟[3]。
唔同軟件嘅設計可以好唔同,但係最基本上都會用到呢啲概念,引導工程師處理複雜嘅難題:
- 抽象化:忽略啲不必要嘅細節,專注核心特性。
- 模塊化:將系統分拆成細啲、容易管理嘅部份。
- 耦合同內聚:模塊之間應盡量低耦合、高內聚。
- 封裝:將數據同操作「封」喺模塊裡便,使用者用嗰陣唔能夠亂咁搞裡便嗰啲細節。
- 關注點分離
- 契約式設計
軟件架構
[編輯]軟件架構係指系統最高層次嘅結構設計,包括元件同埋元件之間有咩關係。喺呢個階段,設計者要界定一啲大體嘅方向。
設計模式[註 3]係指緊針對反覆出現嘅設計問題而諗出嚟嘅通用解法,唔係現成嘅源碼,而係一套可重用嘅設計結構同協作關係。例如原型模式就係一種常用嘅設計模式,重重點係:採用物件導向編程,想建構物件嗰陣唔會由零開始,而係攞某件物件嚟做「板」,透過「複製」噉嘅方法產生新嘅實例。呢種做法喺遊戲程式入便就成日用到,好多時要高速生成相似(但可能稍有差異)嘅物件,諸如係遊戲入便嘅敵人、子彈、或者道具呀噉。原型模式可以避開昂貴嘅初始化,而且容易配合物件導向編程嚟用[4]。原型模式係一種設計模式,而非某一套特定嘅源碼,好多唔同樣嘅源碼都可以係體現緊原型模式,原型模式嘅一個可能嘅虛擬碼例子,可以想像用噉嘅方法產生遊戲入便嘅虛擬敵人:
# 原型介面 介面 原型 { 複製(): 原型 } # 建立「敵人」呢種物件嘅原型 類 敵人 implements 原型 { 血量, 速度, 模型, ... 複製(): 敵人 { 新敵人 = new 敵人(); 新敵人.血量 = 呢個.血量; ...; return 新敵人 } } # 原型登記冊,記住啲「敵人」物件 類 原型庫 { 儲存; 登記(名, 原型); 產生(名): 原型 = 儲存[名].複製() } # 初始化樣板 原型庫.登記("普通敵人", new 敵人(血量=100, 速度=3, 模型=獸人, ...)) # 遊戲中生成 快敵 = 原型庫.產生("普通敵人"); 快敵.速度 = 5; 世界.加入(快敵)
用家介面
[編輯]
用家介面(簡稱 UI)係指用家同電腦系統、軟件互動嘅渠道同方式。用家介面負責將系統功能以人類易明同操作嘅形式呈現出嚟,同時亦接收用家俾嘅輸入。用家介面可以包括好多唔同形式,諸如係命令行介面全靠打字同出字嚟同用家互動、圖像用家介面用圖像同 click 等嘅方式嚟同部機互動,而自從二十一世紀起,人工智能愈嚟愈識處理自然語言,自然語言用家介面亦應運而生。[5]
用家介面設計有幾個主要挑戰。做用家介面設計,設計師往往會想達致高易用度,但係要做到易用並唔簡單。設計師需要估計用家喺本能上會點樣操作,例如佢哋直覺上會撳咩掣、用咩姿勢,而呢啲資訊好多時都要經過測試先可以確認[6]:Ch 4。設計師又要引導用家,介面要清楚俾提示,畫面唔好太花,等用家能夠一睇就知跟住要撳邊度,嚴防用家迷失或者出錯。要為用家提供即時嘅回饋。然後設計師仲要處理用家多樣性嘅問題:唔同用家喺年齡、文化、語言、經驗水平以至身體能力... 等方面都有差異,所以設計要兼顧可及度,例如假如介面用到唔同顏色嘅掣,就可能要提供幾款唔同嘅色可以揀,方便色盲嘅用家使用。
設計用家介面嗰陣,可以用到紙本原型。
質量評估
[編輯]做軟件設計,需要進行質量分析同評估,常見嘅評估準則有:
評估過程中會用到認知走查法、製作原型同做測試以及故障樹分析呀噉。
關鍵議題
[編輯]根據 SWEBOK,軟件設計上嘅重要議題仲有以下呢啲:[7]
等等。
睇埋
[編輯]註釋
[編輯]引咗
[編輯]- ↑ Ralph, P. and Wand, Y. (2009). A proposal for a formal definition of the design concept. In Lyytinen, K., Loucopoulos, P., Mylopoulos, J., and Robinson, W., editors, Design Requirements Workshop (LNBIP 14), pp. 103–136. Springer-Verlag, p. 109 .
- ↑ Soegaard, Mads (2018). "What is Design Thinking and Why Is It So Popular?" 〈設計思維係乜?點解咁潮?〉. The basics of user experience design 《用家體驗設計入門》 (美國英文). Interaction Design Foundation. pp. 10–20.
- ↑ Johnston, Jane; Gulliver, Robyn (2022). "What are wicked problems?". Commons Social Change Library.
- ↑ Duell, Michael (July 1997). "Non-Software Examples of Design Patterns". Object Magazine. 7 (5): 54.
- ↑ H. Washizaki, eds., Guide to the Software Engineering Body of Knowledge (SWEBOK Guide), Version 4.0, IEEE Computer Society, 2024; www.swebok.org. Ch 2.4 User Interface Design
- ↑ (英文) Soegaard, M. (2018). The basics of user experience design. Interaction Design Foundation,書名粵譯為用家體驗設計嘅基本,屬於入門書。
- ↑ H. Washizaki, eds., Guide to the Software Engineering Body of Knowledge (SWEBOK Guide), Version 4.0, IEEE Computer Society, 2024; www.swebok.org. Ch 2.2 Key issues
資源
[編輯]
- (英文) Roger S. Pressman (2001). Software engineering: a practitioner's approach. McGraw-Hill.