高鐵車售票系統的問題在網路上引發熱烈討論(例如:JavaWorld),其中又以批評多過讚美。其中最讓人詬病的是,高鐵竟出現一個位子被賣三次的事,讓排了一二個小時買到票的乘客氣得冒煙。
對我們這一些稍有經驗的工程黑手而言,真的是不太能接受,這也令我想到在學校教書教到設計或撰寫多人同時線上使用的系統的時候,常碰到一些即使耳提面命,沒經驗的學生還是會犯的錯。所以看到「高鐵車票連三賣」的新聞時,第一個反應就是:「呵,這是一個很好的Case Study…」特別是對於學校的那一群學生們,他們總是喜歡用「一人使用系統的程式撰寫習慣」來撰寫「多人同時使用系統的程式」,高鐵的例子,剛好提醒他們這樣搞的下場。
就像任何IT專案一樣,要追究高鐵訂票系統的責任,也可以從三方面來追究:程式設計/開發人員、測試人員、以及專案經理。
系統設計人員與技術人員的責任?
首先,就資料庫層面而言,通常在做資料庫的規劃與分析的時候,對於某些形成「惟一值」的欄位,資料庫的schema 設計者就應該利用資料庫的機制(Unique Key)將之限制,這是從資料庫層面所做的保護機制,可以避免程式人員的疏失而造成資料混亂的現像。
以車票的劃位為例,理論上,每一天的同一班列車上相同的一個位子只會買一次,因此,「日期」加「車次」再加「位子」應該是那個惟一值,在高鐵售票系統的資料庫中,這樣一個組合就應該把資料庫中的Unique Key設起來。當然,高鐵售票系統中的表格情況會是更加複雜,但如果沒有找到一個規範,從資料庫的來進行資料的保護,就很容易造成目前這樣一位三賣的情況。
再來,就是程式開發的部份,寫過多人同時使用的系統都會知道,這樣的系統經常要去處理資源所有權的問題。以高鐵的座位為例,在座位還沒有賣出去的時候,這個座位是不隸屬任何人的。當有買家出現時,通常會先做系統做一次查詢的動作,把所有的未銷售的動作列出來,此時列表當下所有被列出來的車位應該都是沒有隸屬者的。不過由於列表與買家下單購買的時間是有時間差的,所以買家決定購買的同時,該車位有可能已經被其家的買家買走了。
所以程式人員在設計或撰寫這段程式的時候,理論上,程式行為應該在買家下單的同時先立即檢查該車位的是否已經被賣走了,如果沒有被買走,程式才可以下單;如果已經被買走了,程式就應該反應給買家一個錯誤訊息:「對不起,所選擇的座位已經在您猶豫不決、拖拖拉拉的過程中被買走了…」。
因此,高鐵車票會一個位子賣到三次,如果猜測沒有錯的話,問題應該是就出在最後買家下單的那一支程式上面,當買家下單時,那隻程式並沒有去檢查(或檢查的邏輯有問題)車位是不是已經被賣走了。所以在購買人潮多的時候,同一個時間點,有多個人進行車位的列表(列表的時候,反正那一個位子還沒有被買走,所以都統統列出來了),後來這些人又選買了同一個位子(加上這個程式在下單的時候沒有去檢查),所以這些人就在高鐵售票系統的搓和下,修得了百年才有機會同位的因緣。
當然售票系統是有可能還有其它的問題。不過如果上述兩個問題在系統設計與開發的時候有注意到,理論上,不論採用什麼架構、技術或介面(Web、人工售票機、自動售票機…),甚至銷售作業流程被改變了,一個座位被買了三次以上的情況應不致發生,因為不論是那個購買者透過任何的UI介面來下單,檢查位子是否有已經被賣出的程式都會是最後防線。
當然還有一種情況,就是在資訊流程上,下單的資料還沒有透過這支檢查的程式塞到資料庫中時,系統就已經把票列印給客戶。但是這種情況不太常見,因為如果這樣子設計,已經列印給客戶的車票是有可能發生沒有被塞到資料庫內的情形。如此,最慘的情況就是高鐵系統售票系統的帳務資料可能會有問題。
高鐵車位連三賣的問題,第一個要去面對責任的就是這一些資料庫系統、系統設計、以及程式撰寫等技術人員。
修改範本不適合?
有小道消息指出,售票系統是機票系統改的。我並不太確這樣這的消息來源是否正確,不過,基本上我對這點抱持質疑,因為兩者商業行為的作業流程是大不相同的。首先,一班飛機的座位有限,也不像高鐵可能會有站票的情況產生,再加上購票的流程中,機票並不是在購買的當下就將座位劃位給旅客,而是在登機的時候才進行劃位。因此在銷售機票過程中,系統只需要掌握所銷售的機票數量不要超過有限座位的數量即可(而且據我所知,大部份的飛機在機票銷售的時候都還是會預留一些座位,以便不時之需)。同時,由於登機櫃檯人員並不會太多,因此負責同一班機劃位的人員作業上較容易協商(幾個劃位櫃台橋一下就好了),比較不容易有重複劃位的情況產生,即使真的重複劃了位,由於旅客的總量是不可能多於座位的數量,所以比較容易立即幫旅客找到座位。
高鐵的情況不同,高鐵的載客量大(每台波音七四七的載量也大概才400個人),售票的方式也比較多元,例如自動售票機(呵,我們大概不可能買機票還用自動售票機買票吧?),並且停駛的車站也多(大概很難找到一架飛機在飛往目的地的途中有六個停駛站的,更不用說,這一些站都會有乘客上下),所以如果高鐵的售票系統是採用機票的售票系統來改的,那這一個售票系統勢必會需要做大幅度—而且很大--調整、重新分析,並逐一改寫。寫過程式的人,或多或少都會知道,與其要Programer改別人寫的程式,說不定自己重寫一個還比較快。
當然,還是有可能有一些因素(商業、政冶因素……)造成這個售票系統是用飛機的售票系統來改的,但即使是這個樣子,在修改系統範本的過程中,稍有經驗的系統分析師或程式撰寫者應該都很容易發現這些系統需求上的差異。重新分析需求、修改架構,適時地給客戶建議,並調整系統到可用,避免這種一位賣到三次的情況。(請繼續閱讀下一頁)
繼續閱讀: 沒有測試到嗎?>>
25.匿名 於 2007/09/22 09:08 回應
高鐵售票系統的委外廠商其品管和測試部分,是某家南軟園區內輔導CMMI的廠商所輔導的,結果是一團亂,原因在於該顧問公司雖然號稱是軟體工程專家,但實際上卻是個只做過測試,沒有實際專案開發經驗的人,自然是會失敗囉!24.肯得雞 於 2007/08/24 12:26 回應
這不是售票系統而是自動收費系統
所以流程比一般的售票系統複雜
另前面幾位說的很對
這不是資料庫的問題
而是區間票未考慮周詳造成
學校教是很基本的
而如何活用這些東西
甚至更上一層樓
又是另一個門檻
23.lulu 於 2007/08/06 13:40 回應
我只知道我去買票時問題一堆~網路預訂的票要前30分鐘取~~可是未取的並無法立即拋出給等待買票的人...重點好不容易從台南回台北都沒位子的情況下,買了三小時後的一班台南到台中..想說從站回來好了(別問我為何不改搭客運..因為高鐵都蓋在鳥不生蛋的地方..抱小孩又拖行李再回市區坐也很累)...又回說不能喔~~會罰錢..很危險~~可是真的再下去小孩快受不了了...只好硬坐...結果是..車上有一堆空位回台北..都有地方坐..不知道他們的票務系統是怎樣規劃的呀?王今坐過三次都一肚子鳥氣~~22.路人 於 2007/08/04 15:03 回應
推好文……還是比較喜歡這一篇………
一個系統專案的運作本來就是一個team work 的關係,高鐵系統的問題,在這個專案下的成員是誰都推不了責任……專案經理、DBA、程式設計師、系統分析師、測試人員都有他們自己在這個專案中應該盡的本份……也在這個team work 的關係下,讓專案中的成員可以彼此互相地互補與支持,好讓專案可以順利的完成……
如作者所說的:「……想想看,同樣在CMMI的流程規範下,如果換上另外一組比較有經驗的技術人員?測試人員?或者專案經理呢?或許就會是另一個故事了。從上述的討論中,我們會發現,技術人員、測試人員以及專案經理三者之一,只要其中之一(其它兩者都可以不需要)有意識到這問題,其本上就不會有「一位三賣」的情況了……」
三組人馬中,只要有其中一組,想到這一個問題,一票三賣的情況,應該就不會發生了……
這也是這個案子好玩的地方……這三組人員為什麼都沒有意思到這個問題?
要死不死,這三組人員的經驗都不夠嗎?(不太可能吧,這是國家級的專案耶)
還是三組人員都無心是這件事上呢?
是誰(或者什麼因素)造成了這三組人員在同一個案子上都沒拿出應有的品質呢?
看得出來,這作者好像有點想避而不談這個問題……
不過他也留下了反省的空間………
21.看戲的 於 2007/08/03 13:00 回應
從高鐵談大型公共建設軟體開發專案(上)-連結
從高鐵售票系統談大型公共建設軟體開發專案(下)-
連結
20.DuanSun 於 2007/08/03 09:22 回應
高鐵這個案子在台灣軟體業引起這麼大的事件,既然大家這麼關心這個案子,如果高鐵同意的話,也許開發商可以考慮乾脆開個研討會,跟大家分享這個案例,總比大家你一言我一語的妄自推斷來得好,多麼具影響力的活教材,值大家瞭解,提升台灣整體軟體專案的經驗,也許有點糗,大家都在討論他們的缺失,但我想他們一定有考量到其他我們不知道的因素,所以乾脆開誠佈公吧.19.匿名 於 2007/08/02 22:37 回應
對於作者的觀點文中作者沒有考慮的Muti_thread的觀念
高鐵的訂票程式90%以上是Muti_Thread的開發方式
不是Signal_Thread可以解決的來
這一種狀況不得不多在Muti_Thread的狀況之下
有部份的邏輯是沒考慮到Lock的問題
而且這樣問題也不一定會在StressTest或Integation Test的狀況之下測的出來
18.匿名 於 2007/07/10 18:23 回應
推……雖然這件事情已經過很久了……
不過看到這一篇文篇還是忍不著要推一下……
大家都菜過,所以程式寫不好、或分析有問題都是可以被接受的……
但最神的就是……管理者卻沒有發現………特別是這麼大的一個案子
「管理」是從細部著手的……
高鐵系統之所以會有問題,簡單來說,就是管理面的問題……
但管理是一堆口令或程序就可以完成的嗎?
管理的基礎是架構在每一個技術的細節上
其實也是作者在文中所提到的……
「沒有技術的深度與經驗來配合,而只仰賴以溝通、協調與文件撰寫能力來管理師或專案經理會是我所擔心的……」