不要猜問題所在
高鐵售票系統不能符合使用者需求、以及系統無法正常運作等原因似乎很簡單,但是,長年軟體開發的經驗與專業卻告訴我:只站在表面上來看事情是不夠的,而要思考問題背後的問題。
有些人認為,高鐵售票系統會發生重覆劃位的問題,是因為資料庫設計上,沒有加上資料庫unique key來限制資料的唯一性,或是在確認交易完成前,並未加檢查同一個位置是否已被買走了(筆者認為,他大概指的是類似資料庫寫入時加入lock鎖定的機制)。
不過這樣的推論可能有問題。因為,據「可靠的馬路消息來源」指出,高鐵售票系統並未採用資料庫技術。因此,重覆訂票的問題與資料庫表格有沒有設unique key 或在交易過程中有沒有加入lock鎖定的機制是沒有關係的。
筆者想說的是,許多技術人員習於以自己所熟知的技術經驗,來尋求問題解答,卻未先去深入探討問題本身,相當令人憂心;這種做法常常會造成設計的盲目現象,當然不可能解決真正的問題。試想,如果我們沒辦法看清楚問題,對問題茫然,又怎能期待真正解決問題呢?
解決問題的心態
筆者認為,大型公共建設軟體專案在技術上的關鍵,並不在於技術本身,而是開發者心態問題,也就是開發者深入了解問題之後,選擇可用的技術,並加以不斷的調適、熟練的過程。大型公共建設專案常常不能單純只站在技術的著眼點來看事情,因為除了工程技術(engineering technology)觀點之外,軟體資訊系統往往是社會技術觀點(social technology)下的產物。如同前面所言及的,要兼顧不同關係人的期望與目標,問正確的問題,才能找到最適當的解決方案。
依據筆者的觀察,愈資深的技術人員在面臨軟體出現功能失常(failure)時,愈容易傾向於用猜測的方式來解決。可能是因為他們自認經驗豐富,問題應該不出於他們的經驗範圍之外,所以不管軟體出現的失常現象有多棘手,他們並不想花時間寫測試程式找出軟體的瑕疵(defect)。可能拜開發技術進步及開發工具的強大所賜,筆者近年來也常發現,一些新進的軟體開發者也有這種習慣猜問題來找答案的習慣。
筆者非常不認同這種處理軟體功能失常的態度,當有人尋求我的支援,協助他(她)找到程式bug的過程中,我都會提醒開發者:問題不要用猜的!我們當然可以假設問題,但必須要去求證,所以不要吝惜寫測試程式或加上程式執行過程的記錄(log)。
到底高鐵售票系統的重覆劃位問題,問題出在什麼地方呢?筆者並未參與其中,同時也不想妄加臆測;因為筆者相信,不管經驗有多麼豐富,我永遠不知道我所不知道的事情。不過,筆者卻知道,問題不要用猜的,而是要經由穩定及可見的觀察、假設後的求證、尋求問題的對策、最後再採取行動解決的過程,經驗往往是最不可靠的東西之一。態度才是決定技術得以成功的決定因素呀!
66.匿名 於 2007/12/31 16:33 回應
重覆劃位的原因是售票機票印出, 賣出! 沒有 Send Tx 去後端 Req 此位已售...
後來修改的版本是 Query -> Tx 已售, 結果整車空空無人坐
FYI...確認的小道消息
65.GZ 於 2007/11/27 15:45 回應
請 作者大人,編輯大人們 多用點心,少讓這種文不對題的文章刊登吧!這篇文章內容整體看起來感覺很散漫,如果沒有後來的說明,真抓不到作者想要表達的中心思想到底在哪裡. 好的作者寫文章不是只會引用名言而已. 整體的佈局與結構也是很重要的.
64.匿名 於 2007/09/26 12:14 回應
高鐵並非個案,智慧財產局的E網通也是響叮噹。這家神通廣大的公司手法也不過就這樣:
1.找國外廠商背書:弄來IBM的顧問,每個名號看起來都很響亮,感覺上更應該去學校當教授的那種人,得標後沒多久就閃人了。
2.經驗豐富的團隊成員:每個看起來學經歷都很不錯,取得業主的信賴;不用一年後,整個團隊跑去搞別的案子,把大部分專案分包給小公司,PMO裡一堆搞不清業主需求的人。
3.拖...:這種大專案通常有政府背景,承辦人員一定比廠商更急...
63.匿名 於 2007/08/17 15:05 回應
開發團隊裡面的問題多多…也許吧,也許裡面又臭又爛。但就算又臭又爛的問題有一萬個,也否認不了清清楚楚己浮上檯面的那一個
反過來說
又如何確定開發團隊裡面又臭又爛…搞不好裡面其實是又乾又淨
除了今天暴出的問題外,再也沒有別的問題
那還不如就事論事,討論目前出現的這個狀況
而這個狀況其原因如此明顯,何需猜測?何需憶測?
只是沒想到一個高鐵的狀況,到了昏庸者的的手上,居然會比"誰殺了甘迺迪"還難找出問題?
如果高鐵如同發文者所說,放著眼前Critical Section的狀況不處理
只會想些有的沒的,那系統的這些狀況將永遠存在
62.同人 於 2007/08/10 13:42 回應
我的女兒當然比在座的各位都要年輕,她只有七個月大呀。不過年齡並不代表什麼,just do it。61.LUKE 於 2007/08/10 13:01 回應
呵呵,有機會到我的BLOG看看囉! 是的;我是提出了一些想法,我們也在試圖改變自己,這篇文章的觀點並非抱怨而是指出事實,事實上;我們常問自己,"寫程式"這個工作,我能夠做到幾歲(可能你已離開寫程式這個領域),這個思維正是業界不尊重專業的寫照(我在BLOG內也寫到類似的觀點),但在此同時我們應該反思,我們自己的專業在哪裡,應該要重新開始重視課堂上的那些基礎工作,當我重新靠近學術殿堂,我發現我找到了答案,寫程式是可以寫到終老的,即使比你虛長幾歲(看照片我應該比你老,呵呵...),我相信我對這個領域還像當初一樣懷抱夢想,但是築夢必須踏實,只有這些基礎的東西應該能夠讓技術人員更踏實才是管理與技能都重要,但管理不是本質上的問題,能夠先把本質上的問題解決,管理才能有效;前文第三段提到的觀點完全同意,但是請思考一個問題,當你沒有好的技術能力產出產品(專案)時,根本不會有所謂的"市場及客戶的觀點",這恰好與之前的問題定義與條件成立的順序相關論述相互輝映,事實上只靠管理 業務或是行銷是沒有辦法讓一個不堪使用的東西變成有用的,這些除了技術本體以外的部分都重要,但是得要先有一個強壯且穩固的東西,才能做出加乘的效果,自己做的東西總要先講求不傷身體是吧!總不會是做越多罵越多,那麼再好的管理都將失效
60.同人 於 2007/08/10 11:52 回應
同人從學校畢業後就在軟體產業一直堅持到現在,很能理解大多數的開發者對大環境的抱怨與失望,我可以體會他們說的,但我更相信”如果對現狀不滿意,改變它,但別抱怨”。很多技術人都非常有想法,但卻沒有勇氣實現理想(見同人在cnet投稿的另一篇文章:〈羅馬不是一天造成的〉),好的設計概念與技術只會在茶餘飯後的閒聊中言及,同時伴隨對公司或產業的抱怨,頗有懷才不遇之嘆。
但換個角度想一想,你認為技術專業很重要,但有沒有思考過市場及客戶的觀點,專業管理最重要的是整合及快速回應的能力,如果技術者掌握的技術無法整合至業務及客戶面,這個技術並不是專業而負擔。
態度沒有用嗎?我不認為如此。態度決定一個人的成功,而非成功後才改變態度。如果開發者缺少面對現實的態度,技術就不可能與業務或客戶面適當著周旋,管理者也一樣,少了面對現實態度,只會做出無效的管理行為,因為他不知道技術、業務與客戶面如何達到平衡。所以堅持態度是最重要的,態度上堅持做對的事才是真正的專業。
寫這篇文章,不願偏向管理者或開發者的角度看事情,有些讀者以為我在批判開發者,但上篇我對管理者的批判也不少呀!管理者與技術者關切的事物不同,但唯有充分整合,尋求平衡之道,這才是真正的專業,這也是本篇文章真正的旨趣。
59.LUKE 於 2007/08/10 10:26 回應
事實上我們一直都在使用臆測未證實的資訊來解決問題,我們的科學一直假設一些我們自己未證實的已知,不知道這是不是也被稱為道聽塗說? 不過這有點扯遠了歐!原來當在談邏輯/functional(理論)時被視為不懂imperative language或是沒開發過大型系統或是與實務脫節?? 呵呵...理論與實務應該要並重,技術也該博而廣之最後才是深耕,學術上的東西本來就可以務實的應用在現實的環境裡,只是大部分的人訴諸高閣,在業界有很多工程師,一開始就不重視演算法不重視理論視為無物;很多做系統整合的公司,只有一項技能那就是委外,只有一項法寶,那就是培養了一堆很棒的專案管理師,而現實情況下有半數的工程師只懂怎摩用sql寫程式,事實上他們只懂得sql語法,或是只知道如何使用元件接收rs232 rs458的訊號,其他就是拉拉畫面...現在的工具真的讓程式看起來像是個大玩具,而大型專案卻不是一個玩具,這是絕大部份專案失敗的主要理由之一,也是本質上的問題,管理當然也是問題;但是,管理沒辦法解決團隊中本質的的問題,管理可以提升軟體品質,但你沒有辦法透過管理讓每個工程師突破他所面臨的技術問題,或是透過管理讓一個新手變成真正的熟手,再好的專案管理也抵擋不了人事上的異動,因此;文中提到"開發者深入了解問題之後,選擇可用的技術,並加以不斷的調適、熟練的過程" 這一段寫的正確,但是卻沒意義,當本質上技術人員的技術水準低落,那麼它能選擇使用的技術就只有那麼少數幾種,產生問題的機率就大增了,而且專案的過程通常都沒有練兵的機會,很多工程師一開始 槍沒拿穩就上戰場(這是公司的成本考量?),所以他們是在戰場上才真正學會使用槍隻,在戰場上才看到大砲,等武器都能正確使用回首已百年身,那麼專案的成功機率有多高?可能一開始用看的就能評估出來,不過這可能又是一場什麼是專案與什麼是產品的論戰,可能是個人見識淺薄基本上我沒看過成功的專案,只看過 "最後" 能work的專案,那些不正確的邏輯與bugs,最後是被其他人或是高手重構擬平了,但是卻是千瘡百孔,由這裡莫名的跳到那裡;一堆的flag 與註解說明當初未何這樣又那樣,但再也沒人敢碰那些高超的技能,於是看起來是能work,但是流竄在程式碼裡的毒瘤,不知道哪一天會以另一種形式爆發,整個維護的門檻變的很高,呵呵這又正中下懷,因為這樣只有一家軟體公司堪稱有資格承接系統維護的業務,其實發表這麼多的觀點,我想表達的只有一件事,先重視那些被遺忘的 最基本 的東西,再配合管理上的議題,可以讓專案做的更好,讓專業的問題回到專業;認同與尊重專業,情況可能會比公司拿到任何認證重要的多(請注意!這個意思不是說公司的認證制度不重要),總結! 高鐵的問題是台灣整個軟體發展的縮影,這並不是某個公司的問題,而是本質上從業人員的素質與大環境的問題,不管寫程式工藝或工程,寫程式是不是就是寫證明,假設問題是不是等於猜問題...理論與實務同等重要,偏廢一方最後只會淪落如是結果