2009年8月18日 星期二

面試系統分析設計的好題目

今天終於下定決心update面試考題,看過SAD方面有一篇很好的文章,轉仔原文如下。

(原文轉載自 克明老師Blog 從 Google 書籤看標籤與資料夾的設計觀 ─ 設計篇 )
如果我是某大軟體公司的主管,要應徵軟體結構性的設計人員 (偏對技術性,而非需求分析),一般的職稱是稱之為 系統設計師 (SD, System Designer),或者號稱為架構師 (Architect)、資深技術人員等。 若他們在履歷表上寫著擅長或懂 "O-O (Object Oriented)" 或 "UML"、結構設計 等,那麼,我不會考他們什麼 UML 語法還是 設計樣式 (Design Pattern) 等等。 那只是 "背書" 而已,一點意義都沒有。 要背書的話,不如直接給個電腦上網,然後要應徵人員展現如何透過 Google 查詢找到如何實做設計樣式的方法還比較實在。
我會提供的考題,必然是針對應徵人員 "自我思考推理" 的能力驗證,答案的正確性完全不重要,重要的是你為什麼是這樣表達設計的,能否自圓其說。 具有獨立思考能力的設計師,這才是人才!
所以,我會提供一個如這樣的考題:

Google 書籤 (bookmark)是利用 標籤 (Tag)來作分類的。 一個書籤可以被 "標記" 為一到多個標籤,相對來說,一個標籤可以有一到多個書籤。 另外,標籤是不會含有子標籤 (Sub-Tag) 的。
如果我要改良 Google 書籤的設計,希望能再加上 "資料夾 (folder)" 的管理觀念,也就是說書籤必然會 "放" 在某一個資料夾目錄內 (也只能是唯一),而某一個資料夾可以擁有一到多個書籤,同時資料夾也能再包含子資料夾 (Sub-folder)。
同樣類似的應用,可以延伸至部落格 (Blog)的本文 (Content)與標籤、目錄 (category)的結構設計。
請你利用 UML 類別圖,來表達出關於 書籤、標籤與資料夾的結構關係,並簡單說明你的設計想法。


上述的考題是一個 "需求陳述",應該算是蠻普遍的一般應用常識了。 不過若還是不懂上述的敘述,那麼也可以再佐以範例,來解釋什麼是 書籤、標籤與資料夾的概念。
老實說,我是以為,這類的結構設計應該算是很基礎的了,事實上,答案也比想像得意外簡單。 但是,我也問過好幾個號稱對所謂 設計樣式 很熟悉的資深技術人員,最直接給我的答案就是說: 這不就是 "複合結構 (composite structure)" 樣式的應用嗎? 不管你說什麼,反正先把設計圖畫出來再說吧。 結果呢,也真的如我所料,表達不出所以然,真的就只是在背書而已。 最大的盲點,就是把 標籤 (Tag) 與 資料夾 (folder) 給關聯在一起,而其實這兩個是一點關係都沒有的;甚至有些還執著在因為 標籤與書籤 的多對多關係,所以又拉出了一個所謂的 "關聯類別 (Association Class)",卻又說不所以然,越弄越複雜。 因為既然是表達想法,所以類別圖自然是表達 概念 (concept)與概念之間 的關係,而至於那個多對多的關聯類別,是在更細節性的規格設計實做階段再來討論即可,太早論及,反而模糊了要突顯的概念。
表達這類結構性的設計圖,要先找出核心的類別是什麼。 在本例中, "書籤 (bookmark)" 即為本文主體,是最根本的核心類別。 再來當能分別出 標籤 與 資料夾 並沒有關連,而是各自與 書籤 建立關係,那麼,這個設計的表達就可以說對了一大半以上了。 參考的 UML 類別設計如下圖:

這張設計圖該如何解讀呢?
先觀察紅色區塊,也就是 書籤 與 標籤 的關係。 從 書籤 的角度來看,它可以被多個 標籤 標記,所以在多重性 (multiplicity)的表達,會是 1..* (一到多)。 再來從 標籤 的角度來看,一個標籤可以有一到多個 書籤,所以也是表達成 1..* 的多重性。圖上在 書籤與標籤 兩端是只使用 * 的符號來表達成 多對多 的關係也沒問題,大概知道意思就可以了。
再來就是觀察藍色區塊這邊,這就是典型的 "複合結構 (composite structure)" 樣式了,它可以呈現出 階層性 (hierarchy) 的樹狀結構關係。 把 書籤與資料夾 的共同特性抽象 (abstract)出來,成為 "Bookmark Entry" 這個抽象類別。 至於有哪些共同的特性呢? 諸如 add(), remove(), getName() 等這樣的行為都可定義在這個抽象類別內。 而資料夾 (folder)則是 "聚合 (aggregiate)" 了 書籤與資料夾,在 UML 符號是以 空心菱形 來表示。 從 書籤 的角度來看與 資料夾的關係,它必然被包含 (也就是聚合關係)在某一個 資料夾 內,所以在 資料夾 類別這邊的 多重性 是表達為 1;而一個 資料夾 可以有 一到多 個書籤與子資料夾,所以在 "Bookmark Entry" 類別這邊,多重性是表達為 1..* 。
說實在的,即使不會複合結構的表達也沒關係,若能明確地抓出 書籤與資料夾 的關係 (去掉 Bookmark Entry 這個類別),這就夠了,在這個考題當中,反而要突顯的不會是資料夾的樹狀結構,再次強調,是 書籤、標籤與資料夾 的結構關係。 知道你要表達的焦點何在,這才是關鍵。
再來,又如何知道上述的設計圖是正確的呢? 那當然就需要驗證了。 不一定非得要寫成程式碼後才能知道設計得正不正確,那太耗時費工了;我強烈建議使用 物件圖 (object diagram),利用實際的案例,對應所設計的類別,很快就能對比出結構設計的正確性與否了。 物件圖的表達在此就略過不談了,讀者若有興趣,可以利用 UML 工具(如 EA)來練習看看,然後也可以把 Model 檔寄給我,多少我還能協助 Review 驗證的。
※ 延伸參考: o 從 Google 書籤看標籤與資料夾的設計觀 ─ 觀念篇

2009年8月17日 星期一

Windows XP瘦身

近來頗為disk space所苦,50G的C槽剩2G不到,連要 Update魔獸3.2都沒辦法(需要3.98G)。
安裝 TreeSize Free分析目錄佔用空間,可以自行處理的如 CClean先清一便,system page size改小一點(原開機級配置2048M改為 1024M),然後關閉系統 休眠功能(release出3G空間)。
進一步分析,發現 \Windows\Installer\ 佔了頗大的容量,查找相關資料:
(以下內容轉載自 愈來愈肥的Windows XP 要做瘦身(Windows Installer實在是很失敗的設計呀) )
用TreeSize Free也發現在C:\WINDOWS\installer底下有超級多沒用的東西....
上網發現....用SmallFrogs寫了Windows Installer UnUsed Files Cleanup Tool這個工具....就可以輕鬆移除了將近1G的空間...
以下是網友鳥毅的心得分享給大家參考....
============================================
作者:鳥毅
來源:http://blog.tenyi.com/2008/04/windows.html
自從2002年用Windows XP到現在,已經不記得重裝過多少次。重灌不止只系統會變快,還會變小,就算是安裝相同的程式。鳥毅一 直很疑惑為什麼會有這種事?最近有兩台Server的C碟也隨著同事的使用爆掉,昨天赫然發現自己在用的XP的C碟也爆了,只剩幾MB。這絕對不是 一般使用者能解決的事情,雖然鳥毅在2003年上過MCSE Part I的課程,也只有學到把%SystemRoot%下$開頭的Windows Update備份檔砍掉,但我全都砍光了呀?於是下載WinDirStat這 個Open Source的工具對目錄分析,原來是%SystemRoot%\installer這個目錄搞的鬼。裏面的東西全砍的話,以後Windows Update別想成功,已安裝的軟體也別想移除了。(唉,Windows Installer實在是很失敗的設計呀!)搜尋一下相關訊息,看到時本來以為無望了,實在有點麻煩。再看到說明 Windows Installer CleanUp 公用程式時露出一線曙光,仔細看看只是修正跳出找不到原來msi視窗的問題,並不是我要的工具。最後,皇天不負苦心人(我找了半小時)終於看到冗餘 Windows Installer 文件的清理,SmallFrogs寫了Windows Installer UnUsed Files Cleanup Tool這個工具。在使用此工具後發現:還有個%SystemRoot%\Installer\$PatchCache$的目錄,會再cache一份這些資料,而WICleanup並不會刪除這個目錄,咱們必須自個兒動手。幹這些事實在很辛苦,而且Windows一天到晚出update,垃圾超級多;用Ubuntu可以apt-get autoclean,為啥windows做不到呢?

2009年8月15日 星期六

資料存取新境界 - LINQ

LINQ - Language-Integrated Query:微軟於Visual Studio 2008版本同步發表的新技術。
這個時代(早在幾年前)的程式開發過程,對於Data的存取、操作議題即已不可分離,甚至成為程式開發過程中的核心,但以往存取各種不同型態的資料來源,如Access、SQL等關聯式資料庫,txt、csv、XML等Flat file,程式執行過程中的memory data...這類都泛稱的「DATA」,各自有其專屬的開關檔、存取、操作方式,一種資料型式就對應一套以上的方法必須學習。LINQ技術的出現,讓人為之眼睛一亮之處,即為對上述窘境的一線曙光,並且LINQ是程式語言層級,在其中崁入自訂函式的應用是再自然不過的事,從此以後,資料的"取得"與"處理"由原本的溝通過程變為整合在一起;姑且不論目前只針對Object(.NET內的)、XML、ADO.NET(SQL、Dataset)的支援 (幾乎足夠了!),至少,它敢用「Integrated 」這個字,就我對Micro$oft的了解,應是可以期待的。
LINQ的另一層意義,對於我們團隊目前需從 .NET 1.1跨上 .NET 3.5的挑戰來說,它背後蘊含了很多核心概念與技術:匿名型別(Anonymous type)、泛型(Generic) - 尤其泛型介面 IEnumerable、擴展方法 (Extension method)、甚至 Lambda表達式 (Lambda expression)... 等 都需深入了解。

.NET 學習地圖

(轉載自 康廷數位 .NET學習地圖一文)
雖說已是一年前(2008)的文章,但對於本部門落後的資訊技術而言(慚),仍然受用。

2009年8月13日 星期四

泛型場合-使用C#

(全篇轉載自 .NET Midway )
自C++以來, Generic(泛型) 始終是我很喜歡的一種機制, 在.NET 2.0終於納入後, 當然也把它實作在我們的系統中. 以自己的使用心得來說, 我覺得, 這個世界因為有Generic而變得更美好~ ha ha.或許一般最常提出的問題就是:為什麼要用Generic? 是的, 沒有Generic也活的好好的, 看不出差別在什麼地方.當我們廣泛的去使用物件繼承關係, 當我們習慣不去考慮彈性問題, 通常會變成大量物件去繼承某一個基底型別時, 而同時不自覺得習慣用該基底型別當作參數傳遞, 函式傳回的型別. 因此我們的程式碼中, 就會出現大量的轉型動作, Boxing動作.而Generic出現的場合正是:1. 針對某一系列的型別進行處理, 特別當是用集合型別來處理時.若系統中有許多ArrayList, 那就該考慮改用List<>之類的泛型集合.2. 若系統必須將一堆ValueType變數以集合型別暫存(像 array, ArrayList), 也可以用泛型來取代, 用以避免Boxing的出現.3. 程式中的集合型別只能處理特別型別時採用例如:某一函式所傳入的參數, 只能是繼承BusinessEntity基底類別時, 我們可以這樣寫..
4. 最佳化程式碼的重複使用.就像System.Collections.Generic.List<>來說, 在經過最佳化之後的集合類別, 可以提供給任何型別來使用, 不必再自行定義多組特別型別的集合.5. 不只是集合.雖然上例提到的多是集合的用法(這也是Generic最好發揮之處), 但無論是interface, method, parameter, delegate..., 只要有需要, Generic都能幫助我們做好該做的事.若再進一步, 讓Generic與Reflection結合在一起, 所產生的威力更是強大. 例如將它們套用在Factory Pattern中, 或是應用在ORM中, 用以產生persistence object.無論如何, 在有Generic的世界, 不去善用它, 就像是自廢武功一樣. 當然, 我們的前提是使用泛型時必須經過良好的物件導向設計, 分析出需要Generic的場合, 而必須避免over design, 將一切都給泛型化.

2009年8月12日 星期三

取得重返戰場的第一塊敲門磚~ 考取OMG-Certified UML Professional Fundamental


自從2009/ 6/27、6/28參加 邱郁惠老師開的「OCUP/UML初級認證課程」,算是這10年職涯中真正踏實的進入了系統分析、設計領域,我想,這真的是我要的,短期內我可以不必再左顧PG領域的MCSD、DBA、LINQ、ASP 3.x,右盼PMP~~
2009/7/31 拿到OCUP的認證算是踏出了第一步,看到Prometric上show出的"Congratulation"時,似乎一點感覺也沒有,這應該就代表了真的是第一步,因為,在工作上我一樣無法如法如行雲流水般的將心中的系統分析、設計概念轉化為UML notation(即使已杵在那2個多小時之久了,仍不知如何下手...)。
我想,我缺的是經驗~ 缺少實際參與多樣的case study設計核心中,缺少實際自頭到尾的分析、設計過程,包含對 tool的熟悉、概念的表達...。