{程序員邀稿} 以架構為中心的主要設計產出(2)

全文均刊登於北京「程序員(Programmer)」雜誌(台灣天瓏書局可購得), 2007 7月刊, p67~p69。 感謝朱海豔(helenna)小姐用心將文稿轉為簡體專業術語,以及將 Model 重新美編,並轉為簡體。

結構面的設計產出

關於軟體結構

所謂的系統結構(System Structure)分析與設計(Analysis and Design),係指如何正確、有效地分解設計範圍內系統的元素(Element,一般泛指物件(Object)),指派每一個物件所應有的屬性(attributes)與行為(behavior, 責任的分派),抽象表達靜態類別之間的關係,動態組合物件在執行期間(run-time)的訊息(Message)傳遞,以履行系統的功能需求(ex. 來自於 Use Case 的功能分析)...。做好結構分析、捕捉有效的領域概念,以成為系統的主結構,才能建構出堅若磐石的軟體系統,來應付現實複雜系統的善變,甚而讓系統呈現有機的次序成長、生生不息。

如何找出問題領域(Problem)的概念具化成為企業物件(Business Object)、指派每一個物件應盡的責任,並以此來建構系統中的軟體規格模型,已是高階系統分析與設計人員最大的挑戰與應具備的本質學能。更為難的是,如何將企業物件配合現實面的平台,例如如何活用 J2EE Spring and Hibernate 系統框架。因為,現實上,物件的狀態(state)就是被永續(persistent)儲存在資料庫系統內,而在需要用到(企業邏輯的運算)的時候才被活化(activate)起來;同時因為物件共用的議題而需要 AP 應用伺服器的系統支援,包括交易(transaction)控管、安全性(security)、效能(performance)、分散(distribution)等議題的設計考量。兩個層次(高階概念性的分析設計;細部平台面的設計),互補且缺一不可。

系統的內,也就在於分析所組成的內部結構元素,套現在 IT 的術語來說,也就是所謂的物件導向分析與設計(Object-Oriented analysis and design)。相對於系統的外,是著重在功能性的需求分析(也就是前一期內容所介紹如利用使用案例建構的需求模型)。兩者是互補—找出內部穩定的結構元素(物件,Object),來應變外部的功能需求。

而系統的結構分析,正是現今軟體人員們最大的罩門所在。在速成短線的專案開發生態,軟體人員只會看到現在所看到的—找出一個一個的功能,快速地利用所提供的平台技術(如 .NET, J2EE),疊床架屋的方式,Quick and Dirty 快速的給開發出來。不要以為利用 .NET 或 Java 等 OOP 語言,就是所謂的物件導向開發模式,這是兩回事,如果沒有用心地萃取具本質性(Essential)的物件(再一次強調,源自於問題領域的概念術語),而只是看到一個功能就成為一個 Class,那麼,這樣的系統完全會受限於需求性的變動而導致震盪不穩,是不會具軟體系統的彈性(flexibility)、穩定性(stability)與延展性(extensibility)!

什麼是軟體的結構?

軟體系統的整體呈現是來自於問題領域(Problem Domain),也就是把該領域中經常溝通的術語(terminology) 對映至軟體系統的物件,稱之為領域物件(Domain Object)或企業物件(Business Object)。 例如,”人事資源(Human Resource) 管理” 系統的開發,其核心的問題領域當然是以 “人事” ,經常溝通的術語會有 “員工(Employee)”、”部門(Department)”、”請假”、”請假細項(AskLeave Lineitem)”、”考績” …等,而這些術語自然地就會被捕捉(capture)至軟體系統內,而成為構成軟體系統主結構(main-structure)的成分元素了。

將組成軟體系統結構的元素組織在一起,並利用視覺化的方式來呈現,稱之為 “領域模型(domain model)”。領域模型代表真實世界中的概念性類別,呈現的是領域中的概念性類別或真實世界中的物件。在 UML 的模型中,最重要也是最必要的一張結構圖也就是類別圖(Class Diagram)。

參考下圖 1,通常使用 UML 表示法呈現的領域模型,凸顯的是概念(concept),再來則是以及概念之間的關連(association)與屬性(attributes)。例如 “Order”, “OrderLineItem”, “Customer” 都是屬於在該領域中的概念; Customer 與 Order 之間則存在著 1 對 1..多 的關連(一個客戶會有 1到 1..多筆訂購交易); Product(產品) 具有 description, price 的屬性。在概念性的分析時,細節(包括操作,屬性,資料型態等)在目前並不重要,最重要的是能突顯出概念的呈現,也就是找出類別(Class)。

圖 1、範例—訂購系統的類別圖(Class Diagram)
(點擊圖片鏈接看原圖)圖 1、範例—訂購系統的類別圖(Class Diagram)

那個時候最能表現出結構設計的應變能力? 筆者常說,當 SA(System Analyst) 遇到 有點像又不太像 這類的需求時,也就是結構設計發揮的時機了。 舉個例,訂購 若會視訂購的類型,可能是書籍、雜誌、百貨商品等,而有不同的訂購流程與處理邏輯,此時,懂得虛與實互補設計之道的 SA,會很自然地把訂購分為一般化與特殊化(generalization-specialization)—把已知的部分放在一般化;而未來要具體實現的部分放在特殊化。事實上,這也才只是利用到多型(polymorphism)的基本技巧而已,就已經足以解決為何程序員經常會為了訂購類型寫了一堆的 switch, if…then…else 這種的條件敘述,而造成程式碼混雜,難以維護了。

如何找出軟體的穩定結構元素,是系統分析人員最大的挑戰。SA 並不需要具備領域知識(Domain Knowledge),但卻要懂得如何與領域專家(Domain Expert)溝通合作,萃取其知識,並抽象(abstract)成為軟體的主結構。這相當不容易,那並非是純技術面,真正的軟體設計行家,絕對是具高度的抽象的能力,要能懂得從多個構面觀察,時常在反思與找問題(不是找答案)。筆者正是被這在 虛 與 實 均要能互補、一輩子也學不完的軟體設計領域,給深深地著迷,才從原來是系統管理與 Oracle 資料管理師,而至中年才轉到軟體一職來,並已把此視為是終身之職,是要窮究一輩子、甚至帶至下一輩子繼續來修行的。

回歸正題,關於結構設計的好書相當稀少,筆者這裡特別推薦 Peter Coad 軟體大師,從早期 1990年的 “Object-Oriented Analysis”,“Object-Oriented Design”,至 1998 年的 “Object Models”、1999年 ” Java Modeling In Color with UML” 等著作。尤其是 “Object Models” 一書所揭露出以交易為核心的 交易樣式(Transaction Pattern),更是軟體結構分析人員必讀的聖經。在筆者經常訪問與輔導各領域的公司時,經常在當場就直接展現與證明不用懂領域知識,也能馬上抓出該領域的核心結構,所使用的利器即是 交易樣式(Transaction Pattern)

閱讀全文 »

{程序員邀稿} 以架構為中心的主要設計產出(1)

全文均刊登於北京「程序員(Programmer)」雜誌(台灣天瓏書局可購得), 2007 6月刊, p74~p77。 感謝朱海豔(helenna)小姐用心將文稿轉為簡體專業術語,以及將 Model 重新美編,並轉為簡體。

前言

筆者在輔導專案的初期,第一個時間點就要能抓出系統開發的架構全貌,請注意一下,系統不全然是指軟體資訊系統,也有可能是將企業當成是系統,並對其作需求分析、結構設計,此稱之為企業塑模(Business Modeling)。這是牽涉到系統開發的範圍與層級,無論是企業或軟體系統,如何讓開發團隊所有成員與利益關係人(stakeholder),都能對待開發的系統有一致性的整體觀,這會是架構師首重的工作與責任。

保持整體觀可不是只透過一種設計產出就能讓所有人瞭解,道理很簡單,開發人員經常會有各自所關注的觀點,例如,需求分析人員關心的是系統能提供什麼功能與服務給使用者,他重視的是系統外部的功能需求;結構設計人員關注的是如何找出穩定的結構元素(經常是源自於問題領域的概念(concepts)),來支撐與應變外部需求的變動,他重視的就是系統內部的結構組成元素;實做人員當然就是重視能不能快速寫出程式(program),同時還能有高效率與彈性,他重視的就是系統平台面(ex. .NET or J2EE)的實做與相關設計議題;甚至,連客戶單位的高層管理人員,也有他重視的觀點,如資訊系統是如何協助與協助企業流程(Business Process)的自動化 …。

所謂架構呈現的整體,並不是靜態不變的,而是持續性的動態調和,架構師就是要能懂得如何調和 需求功能面、結構面與平台實作面 等多重觀點,凝聚各種不同的角色,還能有一致性的全貌見解。這可不是容易的事,軟體架構不只跟結構與行為有關,同時也跟背景環境有關,包括:使用方式、功能性(Functionality)、效能、彈性、再利用性(Reuse)、可理解性(Comprehensibility)、經濟效應與技術的限制與取捨 … 等。

本篇內文,筆者是希望利用一些 UML 視覺化的設計產出(artifacts),來說明這些產出是如何來協助架構師觀照與協調整體。這些設計產出,彼此之間有某種程度的關連性,並且要能保持一致性;架構師也容易瞭解架構的全貌是從哪一種角度來看待的觀點,然後知道如何在表象複雜的系統中,聚焦(focus)在系統廣度與深度的某一點,而不致偏離所探討的主題。 聚焦可是架構師必具備的能力,知道焦點的所在,決定是否再細分下去探究內部的細節;還是因為成員之間常因細節爭擾不紛時,就知道應該再把討論的焦點層次再往上,才比較能取得共識。

以架構為中心的觀點與產出

在前一期的專欄中,筆者提及了三個觀點來呈現架構(關於該三個觀點的解釋,請參照上期內容),參考如下圖 1。

圖 1、表達軟體架構的三種觀點
(點擊圖片鏈接看原圖)圖 1、表達軟體架構的三種觀點

以下列出筆者個人經常在使用的設計圖,用來呈現與解釋各種架構的觀點。請注意,筆者並不是會全部用到所有的設計圖,會視專案的規模與性質來決定該有哪些架構設計,有時甚至也會有額外、不一定非得是標準 UML 的設計圖。重點還是在於:你要知道該設計產出是在那一個觀點、表達的是那一個範圍與層次。筆者太常看到,團隊成員們之間,爭論的話題,根本就是不同觀點、不同層次,卻又不自知,難怪會經常導致溝通障礙的問題了。

閱讀全文 »

淺論資訊系統的分層結構

領域模型具體化到資訊系統的實現,必須配合現實的技術平台,包括系統廠商所提供的 圖形使用者介面(GUI, Graphic User Interface)的使用、開發與呈現(例如 Browser, Struts/ASP.NET, Web Server)、資料永續儲存的儲存庫(一般泛稱資料庫, Database,如 Oracle, MySQL)、應用程式伺服器(Application Server, 又可稱之為 Middleware, 提供包括如交易, 權限控管, 分散, 資源控管等系統服務,如 MTS, JBoss, WebLogic),尤其是為了能完整實現領域模型的建構與實現,更需要能讓程式開發人員有物件導向程式語言(OOP, Object-Oriented Programming)的開發機制,例如 .NET 平台所提供的 VB.NET, C#.NET,以及 J2EE 平台的 Java 語言,甚而 PHP, Ruby 等,也都是提供物件化的開發機制。只是後者與前兩者的差別在於,PHP,Ruby 等所提供的系統框架(System Framework)偏於 Web 端的開發,而 .NET 與 J2EE 則在UI端、中間層(Middleware)等均提供了適合於企業層級系統開發的 Frameworks,得以享有諸多便利的系統服務機制。

參考下圖,典型的所謂物件導向式資訊系統在設計時會分成幾個分層的結構與模組(modules)。

圖、資訊系統的分層結構
(點擊圖片鏈接看原圖)圖、資訊系統的分層結構

幾個主要的分層結構如:

  • 表達層(Presentation):圖形使用者操作介面,包括 Windows Form, Web Form, Java Swing 等,都是屬於系統廠商所提供給圖形介面開發人員來使用的工具與框架。
  • 中間層:領域物件模型主要所在的位置。為了應付功能性需求,UI 端的功能性呼叫(functional call)是透過中間層的控制物件(Co, Control Object)來控制與協調為完成該功能所需要相關領域物件互動參與的資訊與企業邏輯(business logic)運算;為了隔離外部系統(包括資料庫與外部系統)的變動性,控制物件會透過 邊界類型的物件(boundary object),如 永續性物件(PO, Persistent Object),連結資料庫系統、調變性物件(AO, Adapter Object),連結外部系統,如 Mainframe, Message Quese System, 其它需透過介面(interface)傳遞的系統等,來取得外部系統的資訊。而真正軟體的主結構,其實就是落在 Domain 物件(在中間層稱之為企業物件,Bo, Business Object)上,也就是源自於問題領域的概念性物件,以滿足應用程式的需求。所謂的軟體結構分析設計人員,其實就是應該要聚焦在如何作好領域物件的結構分析與設計!

    三種類型的物件(Control, Entity, Boundary),均會呼叫系統平台所提供的技術層級服務,瞭解平台特性的系統設計人員,會透過系統框架(System Frameworks)所提供的 APIs(Application Programming Interfaces),來呼叫取得所需要的系統服務。這些服務通常與應用領域無關,例如與資料庫之間的溝通介面或記錄程式執行與錯誤的紀錄(log),這些是系統廠商(.NET or J2EE),甚至是 3rd party 的工具廠商,所會提供的。請注意! 不要把這些類型的系統物件當作是要 「可重用(reuse)」 的對象,領域物件才是! 它們只是便於取得系統服務的工具物件而已,會隨著技術的規格變動而變動,甚至有更好用的工具出現,就要換掉原來在用、卻不會影響到系統的主結構。

  • 資料層:中間層領域物件在妥協於現實(記憶體容量與揮發性問題)的技術環境下,需把其狀態(state)永續(persistent)儲存於資料庫內,並且需要使用資料時再透過永續性的機制,將其取出至中間層的領域物件,運算取得結果,並送達至客戶端呈現。現今對於企業層級主流的資料庫系統是以 關連式(Relation)DB 為主,例如 Oracle, MySQL, SQL Server 等。同時關連式資料庫也是最有效可以完整表達問題領域的資料模型,它運用 E-R(Entity-Relationship)的分析技術,就可以呈現為資料庫的 Table Schema,而且其分析的手法與在中間層對於領域物件的分析方式是一致的,可以說 領域物件模型 與 E-R 模型 是 本是同根生(源自於問題領域),而兩者主要的差別只在於,E-R 呈現的是領域概念的資料層,而領域物件(企業物件)則再加上物件應有的行為(behavior),在軟體模型中,是稱之為操作(operation),而在程式語言中,則稱之為 方法(method)。

{程序員邀稿} 從軟體架構師(Architect)的觀點來看軟體開發流程

前言

筆者多年來輔導過諸多不同類型與不同領域的軟體開發專案,本身的職務是擔任軟體架構師(Architect)與顧問輔導。架構師不是只負責技術面的問題,更要兼顧到專案開發的過程中, 」人」 的互動所衍生而來的諸多問題,包括想法的歧異、見解的落差、不同的觀點與角度,甚至情緒問題等等,這些都需要與專案經理協同合作,一同來解決問題。

軟體的開發,最終目標雖然是 「完成高品質」 的軟體系統,但在進行階段過程中,所衍生出的兩大議題—專案管理(Project Management)與開發流程(Development Process),卻是首要需克服的階段目標。而該兩大議題,均是係以 「人」 為核心的考量,專案管理講究的是 「領導統御」、」人和」;開發流程重視的是 「調和 (凝聚團隊成員的觀點、角度,保持產出的一致性)」。專案管理的部分,筆者的角色比較不方便闡述(此一部份由專案管理者來論文比較妥當),倒是相關於開發流程的議題,筆者倒是可以把藉由所觀察到諸多各形的開發型態,以及個人的一些研究、學習、思考與體悟的心得提供給讀者參考之,文中內容會是筆者比較偏以 「主觀意義」 的表達。

變動無常的軟體專案

軟體系統的專案開發,特別的是,需求往往不明確,更何況是經常處於變動中,所以導致專案的範圍與規模無法界定,連帶也引起時程無法估算(人月? 神話吧)。那麼,是不是開發成本的成本也無法預估,而往往也因為成本與時程的低估,更容易導致品質不佳、粗製濫造的軟體系統。

正是由於軟體別於如硬體產業的變動性問題,使得在其它成熟領域的專案管理經驗,並不容易全盤導入至純粹是軟體的系統開發上。若是把軟體開發當成是知識與創新的產業,那麼一成不變且僵化的專案管理方式,並不妥當;除非是將軟體產業當成是軟體工廠,需求固定且明確,工作者(worker) 各司其職,負責實做局部的小功能,再由 「大一點」 的工作者,來組裝成大功能。請記得,這樣的方式,其假設前提是需求不容易變動,工作者也不太需要具備創新獨立思考的能力。

個人是很難相信需求不會變動,同時也認為正是因為軟體的多變性,才造就了更多的好機會,所以軟體的開發,不應該視善變為畏途,反而是把變動看成是理所當然,更是多添了許多的好機會。我們所要作的事情只是,如何將變動抑制或收斂在某一程度可以被控管的範圍內,同時,學會如何在某一問題領域(Problem Domain),重覆性、同質性高的軟體系統,來找出不容易變動的部分,成為系統的框架(framework),或稱之為主結構(Main-Structure)。而容易變動的部分,又是如何從主結構中抽離出來,爾後只花少許的 「工作量(effort)」,就可以輕而易舉的滿足客戶的需求。

很難嗎? 只要有兩個滿足的要素即可:一為開發的資源(包括成本與時程)多一點;另一為團隊對軟體的基礎養成與默契好一點。 但是好像要能滿足這兩點可真是困難,該如何才有可能達成這種 「夢幻」 的要件呢?

這就回到最現實 「人」 的因素了,要能爭取到多一點的開發資源,如果你沒有什麼誘因吸引老闆或業主(兩者可統稱為關係利益人, stakeholder),是不太容易的。專案的領導者總是要有 「實績」 才能讓關係利益人信賴並願意投入資源,而資源越多,當然專案成功的機會就更大。後文會提及,「反覆與漸增(I&I, Iteration and Incremental) 」,會是提升專案開發 「實績」 的好手段。

再探討另外一點,如何才能讓團隊成員對軟體的基礎養成與默契好一點? 默契要好,溝通必然要多,要能溝通多,當然就是要勇於把自己的想法給表達出來,而這些,則是有賴於專案領導者的支援與協調。總之,好的專案領導者是要能懂得 「觀察」 在整個專案開發的過程中,成員之間互動所衍生出的種種問題,然後找出 「解決方案」 來謀和 「人」 的問題;另外回到最根本的是,畢竟這是軟體的開發,軟體的基礎養成功夫不足,當然也不太可能作得好軟體開發,軟體人員持續的學習與成長,更會是軟體產業的命脈。

幾個可能是軟體開發流程的問題點

正是由於 「變動無常」 的軟體開發專案,有些人的想法是想要 「凍結」 住需求,然後依照固定不變的製程,一個階段接續下一個階段以循序式 (Sequential)的開發產出 (artifacts),例如預估一年開發期的專案,三個月的系統分析(SA, System Analysis)、三個月的系統設計(SD, System Design),六個月的實做與測試(Implement and Test),這樣的開發方式稱之為 「瀑布式(Waterfall)」 的開發流程,參考如圖1。 閱讀全文 »

驗測「Workflow 產品」系統整合彈性度的 POC

上個星期,應我們某一上市鋼鐵公司客戶資訊部門協理的邀請,期能協同參與 Workflow 產品 的 Survey,主要是希望能應用在明年 ERP(利用 .NET 系統開發,但需要逐漸從 AS400 移轉)系統的電子簽核功能。

該位協理已經檢視過國內多套 Workflow 產品,但均不是太滿意,例如,光是要求 A牌以 Java-based 所開發的 Workflow 產品能提供個 Web Service 介面供呼叫,就不太能提的出來;或者,雖然與其 ERP 系統同是 .NET Famework 的 Workflow 產品,但卻與 Web UI(ASP or ASP.NET)以及資料庫系統綁得太緊,從 Workflow 廠商的角度,所提供的系統整合的解決方案,就是由 ERP 系統的資料庫,可能是透過 EAI(Enterprise Application Integration) 將資料給整合至 Workflow 系統的資料庫內,甚至,乾脆簡單一點,就是只要能 “匯入(Import)” 至 Workflow 的資料庫就好了。

所以,從 Workflow 廠商角度所提供的系統整合解決方案,均是以 Workflow 的角度來看待系統整合,然後以 Workflow 為核心,來整合其它的系統,包括 ERP、財會系統 …等。這也算合理,因為,最好就是用了該廠商的產品,然後就是一直 “依賴” 它,不要換掉,一同與之成長。 🙂

嗯,不過呢,協理的要求很清楚:要能實現電子簽核的功能,以及...未來要能換的掉 Workflow 產品,但卻不致影響到 ERP 系統的主架構。

從客戶的角度來看,還是不太希望能把公司最核心的命脈:ERP 系統,給緊緊的與某一廠商 Workflow 產品綁在一起,況且,頭大的還不止 Workflow 呢,還有要如何能從 AS400 逐漸的將業務邏輯給移轉至新開發的 ERP.NET 系統,又要不影響到 AS400 既有用戶的權益。當然,這就是明年初我們顧問團隊準備輔導該專案在架構設計的最重要議題,因而,更不可能在專案一開始的階段,就被某一個產品給牽著鼻子走。

如何檢視 Workflow 產品的 “好壞” 呢? 我個人是很肯定國內外一流 Workflow 產品所提供的表單設計、Process Definition 視覺化設計、電子簽核功能的成熟度等。所以,關於功能與圖形操作介面的檢視,由客戶單位覺得 “對眼”,以及價位上可以接受就可以了;至於個人比較重視的,當然就是在系統整合的彈性度上,也就是說:在架構設計上,系統與系統的整合,絕對不是透過資料庫、而是透過 Middleware 層所提供的程式呼叫介面來達成。

我提了一個算是蠻簡單、來驗測 Workflow 產品在系統整合彈性度的 POC(Proof of Concept)。從三個構面,來檢視 Workflow 系統的整合度。

  1. 表達並行簽核(會簽)功能的業務流程圖(利用 UML 活動圖表達)。
  2. 表達資訊系統功能觀點的使用案例圖。
  3. 表達物件(每一支的 .cs 程式碼)在系統動態期間訊息傳遞的循序圖。

圖1 表達的是一個簡單的業務流程圖,我是利用活動圖來表達的,一般 Workflow 廠商即使不懂 UML 也都還知道流程圖的表達。很簡單,就是先目視一下,Workflow 系統要能提供並行(parallel)簽核,或稱之為會簽的功能,以及,當然,要能對業務流程的簽核邏輯,如 “決策(decision)” 的條件判斷做流程的狀態轉移(transition)。同時,該業務流程圖也隱含了,至少有兩個資訊系統的支援:人力資源(HR,Human Resource)系統與Workflow 系統,以及有哪些角色(role),或稱之為參與者(actor),來使用資訊系統。 (從圖一,可以看得出有 “請假當事人”、”直屬主管”、”專案主管”、”人事部門” 等參與者)

圖1、一個簡單的請假業務流程圖
(點擊圖片鏈接看原圖)圖1、一個簡單的請假業務流程圖

圖2 則是表達了以 HR 系統為開發範圍的使用案例圖(Use Case Diagram)。個人經常是用此來表達資訊系統的架構設計,簡單清晰又明瞭。從圖2 可以看得出 “誰” 來使用 HR 系統,包括了 “請假當事人”、”簽核主管”、”人事審核人員” 等主要參與者(Primary Actor)。這裡我用了 “一般化(generalization)” 的語法來表達 部門主管與專案主管都是簽核主管,另外,我用了 “公司員工” 這個參與者,卻沒有利用 “一般化” 語法來表達,而是利用註解(note)來說明,主要是為了簡潔圖形的表達。然後,Workflow 系統在該架構設計下,就屬於是 HR 系統的支援性參與者(supporting actor),這也隱含了未來在系統的實做中,HR 系統是透過 “介面(interface)” 的呼叫來與 Workflow 系統整合。

圖2、一個請假系統的使用案例圖
(點擊圖片鏈接看原圖)圖2、一個請假系統的使用案例圖

閱讀全文 »

以軟御硬的產品整合設計觀—從合成結構圖到使用案例模型

前言

嵌入式系統(Embedded System),簡單的說,就是把軟體 “放入” 硬體設備內,然後寫簡單的程式來控制硬體,一般稱之為 “韌體(Firmware)” 設計。諸如從主機板的 BIOS 設計、光碟燒錄機的控制程式、乃至於至行動電話、PDA、影音家電產品等,均可見其嵌入式系統的蹤影,可說是無處不在,應用範圍非常之廣泛。

以往寫嵌入式系統的程式,受限於記憶容量過小,只能以如 C 語言以比較低階的語法層次,來直接連結與控制硬體的操作,程式要求的是 “輕薄短小” 與 “效能佳”,而多樣化的應用層面,並不容易。而如今,硬體設備的兩個最重要與軟體開發相關的裝置:整合式晶片 (Soc, System on Chip) 與 快閃記憶體 (Flash Memory),前者如同主機板的 CPU,以更小的體積、更佳的效能來控制硬體其它的 I/O 裝置;後者有如資料庫,可以塞更多的資料與應用程式於其內,如此嵌入一個小型的作業系統(OS),如 Embedded Linux、Windows CE、Java Virtual Machine …等,由 OS 負責與更底層、低階的硬體裝置溝通、然後 OS 提供了高階的 APIs(Application Programming Interfaces)甚至系統框架(System Framework,如 .NET)供軟體開發者用更簡單、具彈性的高階程式語言的特性,來達成更豐富的功能。

所以,嵌入式系統的應用範圍,可就更行廣泛與活躍,軟體應用程式的地位,從以往是陪襯於硬體,現在反而是極有可能翻身,反而是 “以軟御硬”,透過軟體,讓競爭性激烈、毛利低的同質性硬體產品可以脫穎而出,能更有特色、更多的變化性。

嵌入性系統如何作需求分析與設計?

那麼,嵌入性系統的軟體設計,是否有別於 “純” 軟體應用系統的設計? 筆者不以為然,尤其筆者教授 UML 軟體設計課程,對多家硬體製造業內的軟體開發部門與 PDA、手機等應用程式開發廠商,就近的觀察,發現到,一個比較顯明的問題是,軟體開發人員的規模,甚至比一般中型 “純” 軟體開發廠商的人員還多,但,開發人員的角色,卻連最基本的 SA/SD (系統分析/系統設計) 都沒有區分,資深的開發人員或經理擔任需求分析,幾乎沒有所謂的結構分析或設計,就是依照需求,直接下去 Coding,所以軟體開發人員的要求是會“寫程式”,能“寫出來” 最重要,資深經理比較煩惱的反而是需求的不明確。

嗯,好吧,那麼如何釐清有效的需求? 本篇先針對這個議題來作一些說明,筆者以為,嵌入式系統的需求分析與設計,比起“純”軟體如 ERP 系統等,簡單得很多,理由為何? 因為,系統範圍就是被“硬體”給確實“框住”,形成最有效的封裝效果,也就是用“眼睛”就可以看到,待開發的系統就是一個黑箱 (Black Box);而“純”軟體應用系統,系統分析人員要能有較高度抽象的能力,才能以“心眼”看到與界定系統的範圍。要能在嵌入式系統做好有效的需求分析與設計,只有一個關鍵:

“找出那一個黑盒子(界定系統範圍),瞭解該黑盒子在硬體產品內的角色與定位”。

閱讀全文 »

軟體思維顧問

專職軟體輔導與教育訓練的獨立顧問。輔導企業資訊單位如何有效組織系統開發與維護;輔導開發人員達成有效的專業分工。傳授如何把軟體作軟 (Keeping Software Soft)的技能,得以提昇系統的彈性/延展,並進而創造系統的再利用價值。

Personal