2010年11月30日星期二

Interview 問題 - 如何防止多使用者同時修改同一Record

昨天見了兩份System Analyst的工作,其中一份,又再被問起老生常談的問題。其實這個問題,我已經被人問了幾次,所以我決定寫出來,和大家分享一下。

問題如下:

不論是WinForms還是WebForms,假如有兩個使用者Tom 與 May,同時已經打開Edit Form,在修改同一個紀錄。
Tom正在埋頭苦幹更新紀錄,May卻慢條斯理工作。

Tom首先完成更新工作後,在12:10pm按下[Submit]按鈕,更新工序完成。
但與此同時,May還在更新,最後在12:20pm才完成工作,那當May按下[Submit]按鈕時,便會Overwrite Tom所更改的資料。
如何防止這個情況?


大家花幾分鐘,先想一想....



這個問題有幾個方向,我們要先決定 :
(1.) 是否容許讓多個使用者開啟同一個紀錄,並可以寫入資料庫?
(2.) 較遲的開啟者只能唯讀?
(3.) 完全防止其他人開啟同一個紀錄?
因為如果決定是(2)和(3)作解決方案的話,換句話說,在Tom進入時,我們已經要有一個Flag去讓May知道有其他人在更改資料中,再由Application 層面去決定如何提示和防止載入。

但很明顯沒有太多人會認為(2)和(3)的做法是最好,因為問題來自那一個Flag會產生DeadLock問題,先解釋一下為什麼 :
假設要做到(2)和(3)的話,可能大家會想到以下做法 :
1. 在SQL Table中加入一個Column - 叫[Locked], DataType Bit, Default 0
2. 當Tom 進入時執行: Update MyContent Set Locked=1 Where id=@id
3. 當May 開啟紀錄前,會檢查[Locked]是否等於1,是的話,就不能更改或進入。
4. 當Tom更新完成後,把Locked設回0


但問題就來了,假如Tom的電腦Hang機或Reboot,那一個紀錄就永遠是Locked=1,其他人亦不能修改,需要由Admin把Locked設回0。


那好了,說了那麼多,那應該怎麼做?

不知道大家有沒有接觸一些Version Control 或者Source System , 例如SVN,每次Commit一個檔案,都會有一個Revision流水號。

參考SVN的原理,我會把那一個Flag Column刪除,加入以下Column
ADD VersionNumber INT;
ADD Modifier Int; /*(記錄StaffID)*/
ADD ModifyDate DATETIME;

在軟件層面上加入一個Version Checking方法,
不論你是WinForms或者WebForms使用Timer或者SetTimeOut + Ajax都是一樣。

程序大約如下:
1. Tom和May都可以同時進入Edit Form修改紀錄,兩個人得到的VersionNumber都是1。
2. 當Tom按下Submit時,會Update VersionNumber/Modifier/ModifyDate,假設是VersionNumber=VersionNumber + 1。
3. 當May之後按下Submit時,會進行一個Version Checking,因為Tom已經把VersionNumber轉變為 2,所以May會被提醒Version不同,這時候可以在讓May選擇覆寫? 檢視更新版本? 還是取消修改?
4. 在軟件層面中用Timer加上剛剛說的Version Checking,即使在編輯途中,也可以知道文件已變更。

以上就是我個人推薦的解決方面,沒有複雜的技術,但這可以解決到多人執行的問題,即使是三個,四個,五個人都可以應付到。
因為他們都可以有選擇權去繼續還是取消。

但當然我不得不承認,這還有很多解決方法。

再假設一個比較不真實的例子:
假如在同時同分同秒同微秒去執行讀寫Query的話,那會怎樣呢?

例如:
一部出單系統的過程是: (當然這是簡單虛構的Flow以容易理解)
1. 輸入Product ID查詢是否有貨
2. 有貨的話,提出貨品,並扣減數量
(1)和(2)之間沒有選擇,是連續性進行。

貨倉只剩下最後一部iPhone,有兩個Sales (Tom 和 May),同時想賣iPhone給客人,假設我虛構成是同一刻進行的話,兩者同時輸入ProductID,按下確定,會怎麼樣?
雖然大家都覺得這種在同一微秒的交互執行是幾乎沒有可能,但既然Programming是對錯誤零容忍的話,就深入看一看究竟。

而上述問題,已經變成SQL Server的Transaction Isolation Level 和 Lock的問題,之後我會再寫編文和大家分享。

2010年11月29日星期一

香港大學生 缺少了甚麼

經濟日報
http://www.hket.com/eti/article/6872fc07-dc4e-47f4-ac7a-d4753225e1d0-348690

最近參加一個為中學生舉辦的「創新科技」研討會。在演講結束前,我問了兩個問題。

港人忽視科技 遑論矢志研究

第一個問題是:是否有人有志於學習當代科技。誰知200多名學生竟然無一人舉手!心想就算只有少數人舉手都是好的。再三追問後,多人回答道:科技工作沒有前途、待遇差、工作不穩定、工作時間太長;另外就是自我感覺缺乏創新能力。

另一個問題是:是否有人知道林百里和李開復是誰、是做甚麼的。在場學生面露茫然,同樣無人認可。

2010年11月26日星期五

Zenithink ZT-180 ePad手入+用後感

身邊的朋友和舊同事有時都會問我見工的心得,因為我見工已經習以為常,原因就不用說,有看開我的Blog就知我工作歷程坎坷。

而我自己的見工心得就是除了守時和衣著和禮貌之外,如何推銷自己都是十分重要。
我去見工,一樣都會把所有Jobs Reference做一個PowerPoint,等同Portfolio,再印出來,到見工時候就個別講解一下自己過去的工作。

要說服僱主給你工作機會或者一定的薪金和職位,不是口講就可以,有截圖就更加令人信服。
而且僱主亦會覺得你是有誠意的。

下星期一我需要見一份個人很想做的工作,本來想把近期的Project印出來,但竟然Printer沒有墨!!!上網看看Canon原裝墨要接近$300!!! 所以我就在想不如買一部平板電腦吧。

記得當日Steve Jobs發佈iPad時,很多人都取笑iPad是放大版iPhone。但今天iPad已經隨處可見了。

但我自己實在覺得iPad太貴了,而且我只是用過播PowerPoint,看圖,上網就是這樣。
聽歌,睇電影,玩遊戲我都不需要。上網找找找,最後見到有兩部山寨機可以選擇,一部叫aPad,一部叫ePad,所以就出高登買了。

兩部機在高登都沒有,反而在黃金商場至有。
見到兩部ePad,一部8吋Mon+Android 2.2 $1550 ,一部10吋Mon + Android 2.1 $1388,我當然買10吋那部,行什麼版本OS沒所謂。

買回來後,我差電後,玩了兩小時,感覺上是沒有那麼順,比起我的SonyEricsson X8電話行Android 1.6還要窒。但肯定的是一般使用上沒有問題的。
於Netbook相比,這部機更適合我,因為Netbook一般都還要$2200,而且重量都超過1kg。
但這部機才$1388,而且只重695g,大約4部iPhone的重量。
而這部機有得插Lan線!!!十分重要!!!因為大陸的酒店一般都還未有Wifi ,有都慢到你不想用。
而且酒店提供的Lan線一般都不用收費!!!
另支持Android Market,不怕沒有軟件用。
官方還提供Firmware update,最新版本是1030,我買回來就已經是最新了,算係咁喇....

使用情況其實大家可以看這裡的測試 : EPAD Android系统简单试用
或者上Youtube看開箱片

這部機的型號是Zenithink ZT-180
個Spec.都不算太差 :
  • 1GMHz CPU
  • DDR 256MB Ram
  • 內置2GB 儲存內間
  • 10.1吋TFT Mon
  • Wifi 或者 Lan頭
  • 兩個USB接口
  • 續航力官方說3小時,但我實際使用2小時已經玩完,可能我不斷上網吧。


其實山寨貨本身真係價錢平,又實用,但好衰唔衰強國人就係鐘意抄人Design,如果唔抄iPad Design,反而仲易令香港人接受。
所以呢部機只可以在特定場所使用,如果起地鐵或者Starbucks拎出來,一定俾愛潮的港喱串死。

大致上就係咁,不過差電時,機背有點熱,素聞強國產品易爆炸,希望不會發生在我身上,所以差電時,我勸大家都不要把機背向下。

其實如果想再買得便宜一點,可以上淘寶網買,我見到都只是$880人仔,計返港幣約$1000。
請見 : http://s8.taobao.com/search?q=epad

附上一些圖片 :

DSC00006-t.jpgDSC00007-t.jpgZT-180-DSC00009-t.jpgDSC00011-t.jpgDSC00003-t.jpgDSC00004-t.jpgDSC00005-t.jpg

2010年11月5日星期五

Silverlight 玩完???

還記得上一年,有一個新興名字叫RIA (Rich Internet Application),現在都已經沒有太多人在意這個字。
所謂RIA,正式定義可以上維基看看,但其實大家都知道這是泛指用Microsoft Silverlight / Adobe Air / Adobe Flex / JavaFX所寫的Web Apps。

Silverlight由1.0開始我都有隨意地學習,雖然目前還未基於興趣或工作上做過任何Production的Project,但
對Silverlight有一定的情意結。

不過這幾天在我的Google Reader中的Silverlight,WPF,Windows Phone 7的subscription都看到很多類似說"Silverlight已死"的標題。

細看之下,原來不是激進人士的空談說話,只是微軟"今天的我打倒昨日的我"。
在上星期的Professional Developers Conference (PDC)上,微軟親口說出日後方針把Silverlight發展放在Client上,而HTML5則才是Web上的重點。
與兩年前說的不一樣,當時在推廣Silverlight時,說RIA會在Web的平台上大行其道,當時甚至有人擔心微軟會忽略ASP.NET。

不過其實有留意的話都知道,其實無論Adobe Air,Adobe Flex,還是Sun Java FX都已經很早就放慢腳步了。
用的人不多,寫的人亦不多,RIA佔有率雖然或多或少都受高效能的javascript Framework影響,但事實上做這類RIA的開發門檻較高,需要的人力或資源都較多,而且未來5大Browser,IE9/Chrome 8/Firefox 4.0/Opera 11/Safari都已經對HTML5作好準備,而用HTML5的Canvas做遊戲甚至用WebGL做3D遊戲都已經有多人做範例去實現,所以要做一些較動態的網頁已經不用靠RIA了。

而且Cross Platform依然是一個問題,就我自己工作上來說,早一兩年還可以只兼顧IE和Firefox就可以,但現在實在不能再忽視WebKit的Safari和Chrome。
Silverlight的Player雖然也有Firefox和Safari版本,但到現在有多流通性亦存有疑問,始終這並不是硬性要安裝的東西。

而所謂Silverlight for client,其實就是指Out-Of-Browser的Silverlight Apps和Windows Phone 7,但為什麼要說到要"死亡"就是Out-Of-Browser的Silverlight根本沒有太大存在價值,要做Client軟件的,自然會用WPF去做真正的Desktop Apps,至於WP7.......我還是那句...來得太遲了。

所以還在想學Silverlight的人可能要重新考慮一下,或許我自己都應該準備一下HTML5了。

外國有很多Blogger都對這個消息作出回應,值得睇睇。
Silverlight is Dead, the Moon is Made of Cheese, and HTML 5 is Ready for Prime Time
Silverlight Is for the Client, HTML5 for the Web
Microsoft Shifts From Silverlight to HTML5
Microsoft: Our strategy with Silverlight has shifted