Showing posts with label Software Design. Show all posts
Showing posts with label Software Design. Show all posts

Saturday, March 12, 2011

軟體設計:設計是什麼?從自身經驗說起

在1992年,Jack W. Reeves發表了一篇"What is Software Design"。主要的論述就是表達"Source code is the design."的看法。

這點也和我自己的經驗不謀而合。在專案的規劃中,我們都把需求(Requirement), 設計(Design)和建構(Construction)分開成為一個循序的過程。設計過程是確保你可以建構出符合需求的working software/component。但是在真實的情況下,我所經歷的設計過程其實是一些不同的Activities不停的來回,而且沒有一定的順序。譬如說:


  • 首先要了解需求,開始設計。
  • 如果設計發現有定義模糊的需求,要進一步和stakeholder釐清。
  • 為了要確保設計是可行的,也須需要做POC(Proof of Concept)。
  • 魔鬼都在細節中。所以POC也不能馬虎,幾乎就是要做到Production品質的Code。
  • 如果POC發現問題,要回頭修正設計。
  • 如果POC發現其他Dependency的元件的問題,也要回頭在設計中考慮workaround。
  • 如果設計怎麼調整都沒有辦法解決,又要回頭修正需求/規格。
  • 甚至設計也有可能會發現需求/規格從未考慮過的事情,必須回頭和stakeholder反應。
  • 需求會中途改變,要重新修正設計,同時又要做POC。
  • ...


這一切的活動幾乎不會有停下來的一天,不過這個過程會逐漸收斂(當然也有可能不會收斂,那可能是某種大災難的指標。)。最終確保我可以建構出符合需求的程式碼,這個過程中也有個副產品,就是程式碼本身。

就譬如設計一台太空梭,為了要驗證太空梭的設計藍圖,團隊就必須打造出一台太空梭來通過各式各樣的測試。團隊可能先做出第一版的太空梭,發現一些問題,在重頭修正,打造第二版的太空梭,不停的重複這個過程,直到打造出大家都有信心把太空人送上天的太空梭。

這真的很難區分工程師到底是在建造還是在設計。很有可能在動手做的過程中,卻啟發了他可以改善設計元素。這就是真實世界的情況。

回到Jack的文章,對我來說Jack就只是希望軟體業界能夠承認這個事實,"Source code is the design."。基於這個事實,我們可能需要一些討論來看"需求, 設計, 建構"這樣的模型,到底適不適合用來詮釋軟體開發的過程。

P.S. 其實軟體專案開發過程中還有品質控管(Quality Control)的階段,為了方便說明,在此簡化了這個部分。

Friday, September 04, 2009

軟體除錯《Cross-DLL Hazard: Multi Copies of Template Class》

在編譯 DLL 的時候,Template Class 的 Code 都會被編譯 DLL 當中。因此若整個專案裡面有數個 DLL 分享同一份定義在 .hpp 的 Template Class,那麼你就有可能會有好幾份同樣 Type 的 Template Class 的 Code 落在數個 DLL 中。如果把物件轉成指標 Cross DLL 互傳,可能會遇到底下幾個問題。

不同的DLL可能使用不同版本的 .hpp。如果在這種情況下,Template Class 沒有做到 Binary Compatibility,那麼 A DLL 傳給 B DLL 的物件,操作一定會有問題。

就算不同的DLL使用同樣版本的 .hpp,還是會有問題。舉例,A DLL 傳給 B DLL 的物件之後,最後 A DLL 先 Unload,而 B DLL 手上握的物件洽好有參考到 Virtual Method Table,那麼此時對物件做動作,會嘗試去執行 A DLL 中的程式碼,然後位址早已被 Unloaded,操作也一定會有問題。

基本上 Cross-DLL 還是秉持一個原則,只 Export C Linkage 的函式。雖然這樣做還是不能一勞永役,不過能讓事情簡化。

 

用簡單的方式來做事,永遠都是一個 Good Practice。

註:最近在用 boost::shared_ptr 就遇到這類的問題,shared_ptr 裡面有參考到一個 Template Base Class,踩到了第二個地雷。

Sunday, August 09, 2009

軟體設計備忘錄《Btrfs & B-tree Shadowing》

Valerie Aurora在LWN上面寫了一篇關於Btrfs的短篇專文,簡短的介紹了Btrfs的歷史。Btrfs是由Chris Mason所開發的File System,即將取代Ext4成為Linux上預設的File System。Chris引進Ohad Rodeh在USENIX FAST '07發表的B-tree on Shadowing研究成果,改良Btrfs的設計。簡單整理了Rodeh的成果:

  1. Proactive Split/Merge on B-tree Updating:在Insertion或Deletion,在尋訪的過程中先做Split/Merge的動作。於是乎消除了Backtrace回去修改Parent Node的行為,如此一來就不會有Multi-thread Deadlock的情況發生。
  2. Reference Counting for COW:在做Snapshot的時候,會Shadow每個node都需要維護一個Counter。若是目前的Clone需要寫入任何的Node,那麼就會檢查Counter決定是否要COW;或者是直接覆寫。

 

相較於Reference Counting,WAFL(另一個File System)是用32-bit bitmap來1-to-1對應每一份Clone,所以最多只能有32個Clones,此稱之為Block-map File(謎之聲:怎麼會有這樣的設計呢?…)。關於Block-map的設計,本人猜測是因為原有的Block Entry就已經有Free Flag的設計,若是用Bitmap的設計來對應Clone可能較容易實做。

 

參考資料:

A short history of btrfs

http://lwn.net/Articles/342892/

B-trees, Shadowing, and Clones [PDF]

http://www.cs.tau.ac.il/~ohadrode/papers/btree_TOS.pdf

The Berkeley DB Book: B-tree Deadlock

http://books.google.com.tw/books?id=_WWbpeG9aOIC&pg=PA91&lpg=PA91&dq=Btree+deadlock&source=bl&ots=lKxZJg1G4R&sig=ZSYxO72Gv1EQSzJLbkEh9JVtDsI&hl=zh-TW&ei=EK99StvCEI_-tQP6vLjvCg&sa=X&oi=book_result&ct=result&resnum=1#v=onepage&q=Btree%20deadlock&f=false

Saturday, August 08, 2009

軟體設計備忘錄《IWebBrowser2 Hosting》

在Win32的環境下,要開發Web-UI Application的其中一個選擇就是Web Browser Control。

 

Topic:用程式化去捕捉Script Error:

Script error notification is not sent to Exec method of WebBrowser Host (註:Disable Script Debugging的解法)

http://support.microsoft.com/?scid=kb%3Ben-us%3B317024&x=6&y=8

How to handle script errors as a WebBrowser control host

http://support.microsoft.com/default.aspx?scid=kb;en-us;Q261003

 

Topic:防止Web Browser Control的蹦現視窗:

IWebBrowser2 Stopping and Disabling Popups

http://www.nathanm.com/iwebbrowser2-stopping-and-disabling-popups/

Friday, August 07, 2009

IE AJAX & OnUnload 疑難排除

最近開發Web Application,和IE的整合上遇到了一些問題,這裡整理一些目前找到資料。
  1. 在OnUnload時,若執行了一個AJAX call,非同步的回應將不會觸發原本設定的callback。
    [Solution] 改用Synchronous XHR。
  2. 若離開頁面時,還有任何Pending的XHR物件,將有可能佔用IE的Connection Pool。
    [Solution] Tracking所有的XHR物件,在unload時,Abort所有的XHR Connection。
  3. 若有任何XHR物件的onreadystatechange沒有被重設(reset),會有memory leak。
    [Solution] readyState是DONE的時候就重設onreadystatechange。

參考資料:

Tuesday, August 04, 2009

IE JScript 效能校調原則

IE Blog上列舉了許多針對JScript效能校調的指南。雖然有些看起來似乎沒有順應Modern JavaScript的Programming Model。Anyway, 開發JScript應用程式的人還是可以看看自己的程式碼還可以擠出多少效能。

  1. Symbolic Look-up Recommendations
    • Evaluating Local Variables
    • Cache Variables Whenever Possible
    • Cache Function Pointers at all costs
    • Avoid Using the ‘with’ Keyword
  2. JScript Code Inefficiencies
    • Optimize String Manipulations by Avoiding Intermediate Results
    • Running Code Using the ‘eval’ Statement is Expensive
    • Requirements of Eval for JSON Expressions
    • Switch Blocks are Linear Evaluation Tables
    • Avoid Closures if Possible
    • Don’t use Property Accessor Functions

如果你想要直接Hack JScript Garbage Collection的機制,這邊請吧。

 

Reference:

IE + JavaScript Performance Recommendations - Part 1
http://blogs.msdn.com/ie/archive/2006/08/28/728654.aspx

IE+JavaScript Performance Recommendations Part 2: JavaScript Code Inefficiencies
http://blogs.msdn.com/ie/archive/2006/11/16/ie-javascript-performance-recommendations-part-2-javascript-code-inefficiencies.aspx

IE+JScript Performance Recommendations Part 3: JavaScript Code Inefficiencies
http://blogs.msdn.com/ie/archive/2007/01/04/ie-jscript-performance-recommendations-part-3-javascript-code-inefficiencies.aspx

You may experience slow performance when you view a Web page that uses JScript in Internet Explorer 6
http://support.microsoft.com/?scid=kb%3Ben-us%3B919237&x=9&y=9

Monday, August 03, 2009

軟體設計備忘錄《QueryPerformanceCounter()》

星期天沒出去玩,在家裡寫一個Anonymous Pipe Client & Server小程式來熟析Win32的Pipe IPC機制。寫完之後就想來測測看Pipe和另外某個Design的效能差異,就來評測一下IPC的Round-Trip Time。Win32底下要拿到High Resolution的CPU Tick,大概就屬QueryPerformanceCounter()最方便。不過在Modern Architecture下,有幾件事情要注意:

  1. 現代的CPU都有動態調頻的機制,就算你把Escaped CPU Tick算出來,要還原成Second還是需要功夫。
  2. 在SMP的環境下,CPU Tick不是同步的,要把你計算的目標都綁在同一個CPU上,這樣量出來Tick才會準。
  3. 千萬不能假設QueryPerformanceFrequency()就是CPU Clock Freq. (同樣的也不能假設QPC就是CPU Tick?)

另外,有誰可以和我清楚解釋AMD的TSC-Drift問題嗎? XD

 

延伸閱讀:

http://www.virtualdub.org/blog/pivot/entry.php?id=106

http://forums.indiegamer.com/showthread.php?p=95424

http://lkml.org/lkml/2005/11/4/173

http://blogs.msdn.com/oldnewthing/archive/2008/09/08/8931563.aspx