This page looks plain and unstyled because you're using a non-standard compliant browser. To see it in its best form, please visit upgrade to a browser that supports web standards. It's free and painless.

Kenming's 軟體設計思維 會員登入 會員註冊

我在網路上看了諸多評論「高鐵訂票系統」重複訂位相關問題的文章與討論串,大部分的 IT 人,謾罵聲不斷,認為該檢討承包系統開發的廠商;也有一小部份人提出自己的看法與建議的解決方案。這非常好,系統的不穩定性造成民眾的不便,本來就該有人監督,廠商也應該虛心接受眾多人所給予的建議。個人並不打算批判,以擔任軟體架構顧問的角度來看此事件時,先找出根本的問題是什麼,然後再提出具體的解決方案。我打算分兩篇文章論述,一篇為觀念篇;另一為實作篇。觀念部分,希望能就系統的結構性來探討;實作部分則會提出整個系統分析設計的過程與實作碼的產出,同時也打算模擬數千至數萬人同時訂票的情境與意外的處理,應該是盡量會接近原廠商所使用的平台(J2EE Solution)。當然,個人更是歡迎,若有機會,原廠商可以找我們過去聊聊,我們絕對很樂意效勞,也願意更進一步說明我們所診斷出來的問題,並且提供開出的處方為何。

一般看待高鐵訂票系統之所以出問題,原因有二:

  1. 經營者的看法與實際使用有落差:
    持這種觀點的人,主要是著眼在經營者提出利用「飛機訂票系統」的觀念來實做高鐵的訂位,實際上並不恰當,飛機的訂位主要是預定「航班」,而實際的劃位則必須在各自的機場櫃臺進行Check-in,這與高鐵的座位預售,明顯有相當大的差距。
  2. 實做平台的考量上,未考慮到分散式交易:
    這種看法大多是資訊專業人員的看法,也就是說,由於未考慮到各售票單位(包括櫃臺以及售票機)對於某一個已訂位的位置的交易,造成在同一時間內,多個售票單位可以販售同一個位置的現象,這主要是屬於「Transaction Lock」的問題。

事實上,這兩個問題都是存在的,然而,這卻不是造成高鐵訂票系統出問題的「主要原因」! 無論是持哪種看法,其實都是「見樹不見林」,忽略了整體軟體設計最重要的核心 - 「軟體結構」的問題。

先從第一個觀點說起:
使用者需求本來就是會不斷地變動,然而,身為軟體設計人員,在開始進行系統分析設計時,本來就應該要想到「使用者需求」是「暫時」的,然而,重點應該是在於軟體結構本身,能不能夠充分地配合使用者需求的變動而有所彈性;因此,把系統出問題怪罪到使用者需求的變動,是軟體設計人員的「墮落」!
從上述的例子來說,使用者雖然在一開始就提出了不正確的需求,但是,當管理者在上線前一、兩個月就發現了這個「重複訂位」的問題,軟體設計人員卻沒有辦法在這段期間內修復這個問題,這很明顯地,並非是單純的「需求變動」而已,勢必是整體的軟體結構發生了大問題,造成了「地基不穩」,以致於「挖東牆補西牆」,永遠沒有辦法確實解決這個問題。

再從第二個觀點來看:
Transaction 的問題,其實是資訊系統管理面「最基本」的問題,套用前述的觀點,怎麼有可能在一、兩個月前發現這個問題,卻拖了一、兩個月都沒有辦法解決,這也很明顯地,勢必是在結構上出了嚴重的問題,以致於根本沒有辦法對症下藥。

那麼,軟體結構究竟是出了什麼問題呢? 以下,我們就上述兩個現象分別來說明:

第一個現象主要是軟體的整體結構不夠穩定,而且缺乏彈性,因此,當使用者的「企業規則」(Business Rule)有所變動時,系統沒有辦法快速因應。

這很明顯地,是設計人員在設計系統時,並沒有針對企業的應用系統結構進行良好的分析,致使在捕捉系統的「本質性物件(Essential Object)」時,出了大問題。本質性物件沒有辦法捕捉好,自然而然對於整體系統的未來彈性,就很容易出嚴重的問題。什麼叫「本質性物件」呢? 其實就是無論企業的作業流程(Process Flow)或是企業的使用者需求(User Requirement)如何變動,但是其基本的結構都不會輕易改變的那些重要概念(Essential Concept),就是所謂的本質性物件。

我們以高鐵訂票系統為例,其本質性物件其實非常單純,我們以 UML 標準的 類別圖(ClassDiagram)來表達:

圖、高鐵訂購系統的核心結構
(點擊圖片鏈接看原圖)圖、高鐵訂購系統的核心結構

從這張圖中,其實就可以看出個端倪:

左下角的兩個物件:Seat班次,主要是由高鐵人員自行維護的相關基本資料,然而,所有的重點應該在於「訂票交易」與「訂票Demand」這兩個物件上。

從訂票交易來說,其只要能夠提供起站及下車站給「訂票Demand」的物件,不管究竟是像飛機的依班次決定是否有空位;或是像現在高鐵實際營運的依特定座位決定是否有空位,其實,該訂票Demand物件只要回答「可不可以訂位」就可以了

至於其實做的相關細節,應該都被隱藏在「Specific 班次」以及「SpecificSeat」兩個子型態(SubType)的物件中。

這樣設計的結構最大的好處是:
當我們發現未來高鐵的軟硬體設施真的如同飛機一樣,可以讓乘客先行訂位,之後才在各自搭乘的櫃臺進行「Check-in」以確認其真實的位置,此時,我們只要再重新「Plug-in」「Specific 班次」的物件到高鐵的訂票系統中就可以了!

至於第二個問題,則是整體 IT 結構規劃的問題。也就是說,由於沒有對整體的系統結構作一個有效的區分,而導致 系統面 與實際 問題領域(ProblemDomain) 面糾纏不清,大幅增加了整體應用系統的複雜度與管理成本。這個部分的問題,其實可以用 "Boundary-Control-Entity" 的 分析層次的設計框架 來予以解決。關於實作的相關設計議題,我們留待實作篇再來討論。

領域模型具體化到資訊系統的實現,必須配合現實的技術平台,包括系統廠商所提供的 圖形使用者介面(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)。

有些開發單位,並不想用需要付費的 Issue Tracking 工具,會問問我的意見,哪一套工具比較好用? 我是覺得用哪一套,都 OK 啦! 不過,我還是有用心地協助一些單位 Survey 了一下 Open Source 的 Solution。從 Google 爬文後,比較了幾套,包括 BugZilla, trac, Track+, JIRA(付費), RT(Request Tracker),都不錯用。不過,後來讓我比較感興趣的是這一套: 螳螂(Mantis)

螳螂(Mantis)的首頁畫面

使用這一套工具的原因是感覺它的可塑性與客製化程度挺高的,而且該專案持續開發與維護的積極度還蠻高的,才就昨天(4/4),又剛釋出了 1.07 的穩定版本。重要的是,它可以整合 dokuwiksubversion 。這挺重要的,尤其是 wiki 功能,使得 Issue Tracking 工具又同時可兼任 Portal,具有文件分享與基本留言討論的功能,讓溝通的機制更加地順暢。 蠻適合於中小專案的團隊,中的規模多大呢? 4,50 人以內吧,我的直覺是使用這套工具是綽綽有餘,沒有什麼問題的。不過,先說明一下,這只是個人的喜好罷了,我可無意陷入工具比較之爭,對於工具的使用,個人只有一個原則,好用就好,還有,真的有在用,這才是重要的。

我為什麼會欣賞這一隻螳螂? 官方網站列舉了一大堆的 Mantis Feature List 。幾個比較有意思的功能:

  • 容易安裝(這可重要)。
  • 多國語言支援,當然包括繁體中文介面。
  • 全文檢索與報表功能。
  • 版本控管(CVS and Subversiion) 與 wiki(dokuwiki) 的整合。
  • 權限驗證的支援(Defatlt, HTTP, LDAP, Active Directory service),不過,這塊可能要有相當的客製化技術能力才能整合得起來。
  • 提供 WebService(SOAP) 的溝通介面。
    這可真不錯,網站上還提供了 Eclipse, .Notifier, Ant Task 等 plug-in,當然,你也可以自行寫 .NET or Java 的 plug-in 外掛,彈性很大。

螳螂是一支利用 PHP 寫成的應用程式,基本上,要安裝 PHP 的應用程式,就是準備好三個基礎建設(Infrastructure)的應用伺服程式就對了。哪三個?MySQL, Apache2, PHP。PHP 與 MySQL,我都是採用最新 5.X 版,而 Apache,因為 Subversion 只支援 2.0.X 緣故,注意就不要安裝 2.2.X;至於作業系統,在 Linux or Windows 的平台上,安裝都很順暢,沒有什麼問題的。

安裝上是蠻簡單的,一下子就可以裝好了,稍微注意一下,我安裝的是 1.1.0a2 版本,安裝完後,雖然是支援 utf-8,但是檢視 MySQL 的資料庫,連線校對(collation)卻是被設成 Latin1,安裝完後中文寫入與顯示是沒有問題,但以我先前的經驗,利用 phpmyadmin 備份資料庫系統時,常會出現中文亂碼。所以最好一開始就改成 utf8_general_ci,那就完全沒有問題了! 如何改?兩種方法,一種是先在資料庫系統建立好 Mantis 的資料庫,設定 utf-8 相關的參數,然後執行 Mantis 的 install script 即可;另一種是等完全安裝好後,備份 Mantis 的 SQL DDL 敘述,然後砍掉資料庫、重建、設定好 utf-8 相關參數。

再來就是安裝及設定與 dokuwiki 的整合。設定的目的只有一個,就是可以透過 Mantis 登入後達成 Single Sign-On,若你覺得 wiki 不需要權限控管,或者 wiki 另有帳號的獨立管理,那也沒有關係,不需要特別強調整合的。整合的步驟好像有些繁瑣,其實也還好,參考這一篇: Integrating DokuWiki with Mantis ,老老實實照這一篇的 how-to 設定就可以完成了。

設定好後,登入 Mantis 的主頁,然後透過 [wiki] 的鍊結,就可以連到 wiki for Mantis 的首頁。DokuWiki 真是小巧玲瓏,語法很容易上手,我是把它當成參考文件的儲存分享與 Issue Tracking 的 Portal,好用的不得了。

DokuWiki 的首頁畫面

我這裡目前還沒有設定與 Subversion 的整合,不過那也不是難事,爾後讓團隊成員可以在螳螂上看到 Subversion 所控管的文件與程式碼,有問題就紀錄下來、有想法或看到不錯的參考文件就寫到 wiki 上,不要把工具當作是一種負擔,也不用特意地去學習它。就是,只要知道,能夠促進團隊之間的溝通與分享,那就是好東西啦。

※ 延伸參考:
 o Mantis 的官方示範操作網站
 o 聊一下「版本控管」與 「Issue Tracking 」的專案開發機制

我在輔導各單位不同性質的軟體開發團隊,對於專案開發的工具導入,只要求至少要能提供兩種機制給團隊成員們使用。一為版本控管(Version Control);另一為 Issue Tracking

各個單位可以自行選擇,無論是選擇 VSS(Visual Source Safe)/VSTS(Visual Studio Team System), CVS, Subversion, ClearCase 等版本控管工具,以及使用 TFS(Team Foundation Server), ClearQuest, 甚至是只用 Excel 當作 Issue Tracking 工具,這些我都沒有意見,團隊成員們覺得好用、還有,真的有實際在用即可。

不過,我是蠻堅持要至少導入這兩種機制,理由為何? 我覺得道理就是很簡單、很自然。 版本控管機制如同 10 餘年前 Novell FileServer 一樣,所有的文件、設計產出(artifacts)、程式碼都是集中放在一個儲存區 (repository)內,團隊成員就是去同一個地方把開發的文件取出來(check-out),改完後再放回去(check-in),而不同於 FileServer,版本控管就是多了因為共用的議題而衍生出衝突的情形發生時,所提供的解決方式與功能。所以,三年多前,我到某大學教授資訊系的講師與教授等,其中一位帶學生作專案開發的女老師就問道了,每個參與開發的同學都負責某一部份的文件與程式碼,並放置在他們各自的硬碟中,但是要整合時卻是問題多多,該如何解決這問題?這個就是,不是問題的問題。很自然地,放起一起就對了,交給版本控管工具來協助管理即可,但是,另外一個問題是,女老師認為安裝與設計這些工具是難事,呵,這好像不是理由,往對的方向走後,再來思考 How-to 的解決議題就是了。 Issue Tracking 為何也要導入?只要是超過兩人以上的開發,必然會有溝通(其實,一個人也會有溝通的問題,與內心自己的溝通),也必然會有問題的紀錄與回應。我最是鼓勵團隊成員第一是勇於問問題,是的,要能勇敢的問問題,這本身就不是一件容易的事。其次就是不要只把問題放在心中,要能 Write Down 下來! 對於某些問題的本身,就是一個可以讓成員之間討論溝通的主題,然後就是把這些溝通的經過給紀錄保存起來,這才是真正有效的知識分享(knowledge sharing)。

簡單的說,版本控管是設計產中的一種共享;Issue Tracking 則是大量溝通的機制。

哪個時候導入?我是不會專案一開始就馬上導入的,當然,專案經理可以先準備好,我也沒意見。理論上,應該是專案啟動時就要馬上導入的,但是,團隊成員,在那個時間點其實要謀和太多的議題了,包括技能、技術、產出之間的橋接、默契 ... 等太多的事情了。我是不主張一開始就是花時間在工具的學習使用,反而是,慢慢地,等到團隊成員們越來越有默契、越來越覺得好像少了什麼東西似的,那個時候,就是可以找工具來導入的好時機了,而且往往是水到渠成,使用這些工具,不會變成壓力,而真正是一種助力了。

用哪些工具,有沒有差別,是否最好是能有一套統籌的 "ALM, Application life-cycle management" 專案管理機制比較好? 我是不會想那麼多、那麼嚴肅的。工具好用順暢即可,還有,更更重要的是,真的有在用才行!嘿,是真的有在用,而不是變為一種形式上的紀錄而已喔,實在是好多單位,還真的是淪落為形式而已,哪可不是更形增加軟體開發人員的負擔與反感嗎?我可不知道這些專案管理層級的主管們是在想什麼。

我輔導過的單位,有使用過 Microsoft TFS, Rational ClearQuest 等比較重量型的 Issue Tracking 工具,當然也有是採用 OpenSource 的工具。有些公司的專案經理,就會請我協助選擇個比較不錯,便宜(最好是免費)的工具,這些我當然欣然接受,沒有問題的。

哪一個 Issue Tracking 的工具功能最佳呢? 就我輔導過許多單位的經驗來看,嗯, 就某大型零售業資訊單位所使用的 Excel 最棒! 因為,他們是我所看過最勇於發問問題,也勤加記錄問題的解決步驟與方案。我們在每一次的輔導,一開始一定是針對 Issue 來討論的,而且,他們也會對 Issue 作分類,還標上顏色識別種類與重要程度。

真的有寫上 Issue,真的有對 Issue 來討論,這才是根本。所以,何嘗 Notepad 不也是一種 Issue Tracking 的工具呢?

各位好:

報名與詳細講座資訊請至:
http://www.hsdc.com.tw/modules/eguide/event.php?eid=34

歡迎對軟體設計議題有興趣的朋友們,在母親節過後的五月份第三個星期,蒞臨來參加「軟體設計鮮思維研討會」。
本次講座的主題完全聚焦在「Microsoft .NET DataSet 虛擬DB」的應用設計探討。

有別於 J2EE O-R Mapping 的主流解決方案(JDO, Entity Bean, Hibernate ...)是走即時性的資料庫連結,MS ADO.NET 卻是走向離線式的資料庫連結。這相當有意思,我們也認為,這是非常 Smart 且為有效擺脫與資料庫緊密耦合(coupling)的解決方案,甚至,把資料庫放到月球去,透過 WebService 去撈嫦娥的資料倉儲然後放到中間層的 DataSet 是相當便利直覺的,因為,Client 端已經不需要再去注意實體資料庫擺在哪裡了 ... 但是,DataSet 卻也不是被實做成 Form->DataSet->Physical 這樣的 2-tier 架構,那只會讓軟體人員變笨,是無法解決軟體變動性的根本性問題,DataSet 仍是需要配套在 3-tier ,與控制物件、企業物件等設計議題的 ...

本次研討會內容,揭露出 HSDc. 顧問團隊近年來輔導諸多以 .NET 開發的軟體公司,所提出如何將 DataSet 設計成「虛擬DB(Virtual DB)」,並有效隔閡表單欄位與資料庫 Table Schema 的變動設計解決方案。得以讓其 GUI Team 與 Business Team 兩者同時開發,GUI 再也不需要考量到 Database Table 的欄位與資料型態,各作各的,彼此沒有衝突,只要透過中間層的控制物件來調和即可。

擔心因離線式而無法作大量資料的查詢與存取,所以才 "不得不" 實做 stored-procedure? 沒這回事的,虛擬 DB 沒有 Performance 的問題,Ringle Lai 講師,會透過實做並公開程式碼,來證明這一些不是問題的問題的。

***
1. 請注意,由於需要保留及計算報名學員們的座位,請確定會前來參加後才填寫報名單,若不克前來,也請於報名表單或來信取消報名。若報名人數尚未滿額(每場人數以 75 人為限),不及報名者,若尚有名額,仍可以現場報名。
2. 基於成本問題,我們需要擔負包括大型會議室租借、光碟製作、點心茶水 ...等費用支出,不得已需要向報名學員,酌收少於電影票一半的研討費用 NT$150,我們的回饋會是講師群們的用心,將其專業的見解與體會,分享給研討會的學員們,當然,參加學員們也會拿到光碟片,內含了收集歷屆講座(2005,2006)的內容與 EA 試用軟體及操作範例等,絕對是物超所值的。

----------------------------------------------------------------------------------------
§講座主題:

 場次1. 活化 .NET DataSet 實作價值的設計觀 -- Kenming Wang
  o 比較一下 .NET 與 J2EE 的 O-R(Object-Relation) Mapping 實做機制
  o 瞭解 .NET DataSet 的本質 — 與資料庫離線的資料物件
  o 利用 DataSet 實現 虛擬DB(Virtual DB) 在中間層的設計
  o 有效隔離表單欄位與資料庫 Table Schema的變動設計 -- ViewVDB and ModelVDB 設計
  o 利用 UML 循序圖(sequence diagram)表達 VDB 與控制、企業物件之間的訊息(message)傳遞
  o 簡單範例與實做

 場次2. 利用虛擬DB的實做策略與範例 -- Ringle Lai
  o 虛擬DB、fine-grained structure及OO Principal
   (1) 虛擬DB v.s. Value object
   (2) 虛擬DB v.s. Business object
   (3) 虛擬DB、Value object與Business object的異同
  o 虛擬DB的應用策略
   (1) Presentation tier與Data tier的應用
   (2) Controller的角色定位
   (3) 實做限制
  o 虛擬DB與實做上的考量Issue
   (1) 大量資料存取
   (2) 虛擬DB or Store Procedure?
   (3) Performance Issue
  o 虛擬DB的實做範例

§時間:2007/05/19 (星期六) PM13:30 ~ PM 17:00 (三小時的講座時間,並留半小時供學員提問)
§對像:對軟體設計有興趣者,包括在職軟體開發人員及相關資訊科系講師及學生等。
§地點:開羅會議中心,台北市光復南路65號B2 (光復南路、市民大道交接口)。 請參考交通與地圖。
§主辦單位:HSDc 軟體設計顧問中心。
§講師:賴信仁(Ringle Lai)、王克明(Kenming Wang)。
§報名方式:請填寫報名活動內的表格內容,包括姓名、公司/職稱、聯絡電話、Email、等,採現場繳費方式。
§備註:
 o 本次講座預計開放 75 個名額。(額滿即停止報名)
 o 因上課人數眾多,恕不直接提供列印教材,本次講座會直接附送「講座教材及示範操作光碟」等。教材內容並於講座前兩日公佈於 HSDc. 網站,學員可自行列印講座教材。
----------------------------------------------------------------------------------------
HSDc.(High-quality Software Design Consultant.)
TEL: 02-27227179
service.hsdc@gmail.com
軟體專業設計論壇: http://www.hsdc.com.tw