Framework Design Guidelines 筆記 (1) : 優良框架的特徵

8/31/2009

小引
網路上有不少人推薦這本書,我也覺得是本內容紮實的好書。原以為應該很快就能看到中文版了,但一直到第二版都沒看到影子(中國大陸有出第一版的簡體版)。我想,這多少是因為從書名來看,它似乎是專門寫給 framework designers 看的,目標讀者的市場太小了。

其實,在目前的程式設計環境,開發人員多少都得碰觸到共用類別/元件的撰寫,即便是元件的使用者(或 app programmers),瞭解好的程式寫法與設計原則,對提升軟體品質也大有幫助。

另一個原因,也許和書中所提的類別設計原則與程式寫法(如命名規則、exception 的處理建議等)比較細緻有關。撰寫一般的 app code 時,多以結果導向,即程式能跑、功能正確就行,至於 end users 看不到的程式碼,自己想怎麼寫就怎麼寫。尤其在專案時程很趕,與時間賽跑的情況下(哪個案子不是這樣?),哪還有閒功夫去琢磨:這個變數怎麼命名比較好、那些 code 是否要抽離成共用類別或函式、有哪些 patterns 可以 reuse 呢?

但我一直覺得,就像人品一樣,程式碼的品質會反映在軟體系統的外在行為上,使用者必定能感受到。也許他們看不到程式碼寫得怎麼樣,但是操作介面難用、執行效能差、不易擴充(要求稍微改一點東西就說程式很難改)、大小 bug 不斷...等等,都顯示出軟體系統的內在(架構與設計)出了問題。

我打算節譯部分內容,放在部落格上。一方面作筆記,一方面也向大家推薦這本書。至於會寫多少篇,倒也沒認真去想,若有時間的話,看到哪兒就寫到哪兒吧。

以下開始內容摘要,我自己的話是用暗橘色標示

優良框架的特徵
  1. 優良的框架一定很精簡

    大部分的框架都不缺功能,因為只要需求明確,增加功能就很容易。
    另一方面,當開發過程中出現時程壓力、功能蔓延(feature creep)等問題,或想要滿足每一項枝微末節的需求時,簡單性(simplicity)通常就會被犧牲掉。
    如果多考慮一下設計的複雜性,你會發現,把目前版本的一些功能砍掉,並將時間花在思考下一個版本該如何設計才適當,這麼做通常會有比較好的結果。
    如框架設計師常說的:「功能隨時可以加,但要將它移除可就難了。」
  2. 優良的框架須付出較高的設計成本

    框架設計應該是開發流程中的一項明確且專屬的工作,因為這項工作需要謹慎規劃、組織人力、並有效執行,它不應流於實作過程中的附屬產品。

    (問題是有多少軟體公司願意聘用專職的 framework designer?看他好像閒閒沒事在看書的時候,可能還是忍不住叫他去打雜吧。正所謂物盡其用..... >_<|||)
  3. 優良的框架充滿權衡取捨

    沒有所謂「完美設計」這種東西。設計其實就是一連串的權衡取捨,然後做出正確決定。你得瞭解各種選項的優點和缺點。如果在設計時都沒有碰到需要取捨的情況,那不是你發現銀彈了,而是可能很多重要的地方都沒考慮到。
  4. 優良的框架會善用既有成果
  5. 優良的框架能持續演進
  6. 優良的框架易於整合
  7. 優良的框架具備一致性
===================
說到設計的簡單性,還真的不簡單。
碰到需要處理大量資料的情況就直接開個超大陣列,這種寫法簡單嗎?簡單,而且通常過於天真。

我曾看過一個 .NET 類別庫裡面有個工具類別提供一個叫做 CreateDirectory 的 method。好奇它跟 System.IO.Directory 的 CreateDirectory 有甚麼不同,挖出原始碼一看:

public void CreateDirectory(string path)
{
  If (!System.IO.Directory.Exists(path))
  {
    System.IO.Directory.CreateDirectory(path);
  }
}

這函式設計得簡單嗎?簡單,但是多餘。這種連雞肋的價值都談不上的 method,除了增加類別庫的體積和重量之外,別無益處。

也許設計者希望使用此類別的程式設計師少寫一些 code,但問題是,當欲建立的目錄已經存在時,System.IO.Directory.CreateDirectory 本來就不會發生錯誤,何必多此一舉呢?

元件或框架設計師必須非常瞭解基礎類別庫的行為,才不會為了提供方便的工具而重新發明一堆輪子。增加 methods 時若未審慎考量,一旦使用類別庫的程式設計師用慣了,專案中到處充斥這些 method calls,將來要拿掉可就麻煩了。

請神容易送神難。框架設計師豈可不慎?

相關文章

審稿碎碎念:有審校人員把關,譯稿的品質會更好還是更差?

8/30/2009
有審校人員把關,譯稿的品質會更好還是更差?
類似的問題:有了測試人員,程式碼的品質會更好還是更差?

[C#] 泛型 = 樣板?

8/11/2009
Eric Lippert 的部落格看到一段挺有意思的 C# code,以下是我稍微修改過的版本:

《玫瑰的名字》閱讀筆記 3

7/04/2009
上一篇筆記一樣,這篇也是記錄我讀《玫瑰的名字》時碰到的怪句。
有時候,書上的每個字都認得,兜在一起卻完全看不懂。在《玫瑰的名字》裡面就有這麼一段,反覆看幾遍還是不懂:

《玫瑰的名字》閱讀筆記 2

7/03/2009
都說不雞蛋裡挑骨頭了,還是忍不住..... >_<|||

《玫瑰的名字》閱讀筆記 1

7/02/2009

書名:玫瑰的名字
作者:Umberto Eco/著
譯者:謝瑤玲
出版社:皇冠
出版日期:1993年09月15日


這本小說的中文版已經出版超過 15 年了。在網路上看到推薦文,便將屢屢啃食不下的《罪與罰》先晾在一邊,改看這本。

SQL Server Connection Forcibly Closed

7/02/2009
又一個有點麻煩的問題:在 server farm 環境下,利用 SQL Server 資料庫來儲存 ASP.NET 網站的 sessions,可就是有某一台 app server 會三不五時(每週一兩次或者完全沒有)出現無法連接 SQL Server 的錯誤訊息:
TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host

當此問題發生時,我的伺服器當機偵測程式會發送 MSN 通知和 e-mail 給我。麻煩的地方在於,如果在收到通知訊息時立刻用瀏覽器開啟出問題的 app server 的網頁,卻又發現是正常的。也就是說,這個問題既不定時出現,出現的時間也很短暫,很難將它「鎖定」。

在 MSDN 論壇上找到一帖相關討論:
http://social.msdn.microsoft.com/forums/en-US/sqlnetfx/thread/4895d56b-716f-4f82-860f-0aa161d327cc/

看來還挺多人碰到這種怪問題,但是對發生的原因仍莫衷一是,建議的解法也五花八門。大略爬完這一長串討論之後,打算嘗試兩種解法。

解法 (1):修改 SQL Server 的遠端登入逾時時間

如下圖所示:



此解法似乎有點駝鳥心態:反正可能是某種神祕未知的網路傳輸或連線資源管理問題所致,而且出現的時間很短暫,過幾十秒就恢復了,那就乾脆延長逾時時間,把這些可能發生的短暫延遲給壓下去。

解法 (2):關閉 Connection Pooling

這是我最不希望的做法(因為會影響效能),但不得已時也只能試試看了。

結果

先採用解法 (1) 之後,經過一個月了,一直都沒有再發生同樣的問題。

那就樂得當個鴕鳥吧 :)

後記:結果後來終於找到真正原因,說出來還真的很不好意思....原來,SQL Server Agent 的排程出了問題,無法正常執行定期刪除 ASP.NET session 的工作,以至於 session 資料表持續累積、長大,大到令我難以想像的地步,因而影響了 SQL Server 的運行。

天堂的階梯(The Good Death)

6/21/2009
偶然在延伸的網路連結中發現此書,書名 The Good Death(好死)頗吸引我,於是從圖書館借了一本。這本書詳細描述了多位病人臨終前的痛苦經歷,才看完第一個個案,便感受到很大的衝擊。當然,生病沒有不辛苦的,但書中描述的個案,看了實在是令人不忍......怎一個「慘」字了得!同時也才稍稍了解,當活下去已經沒有任何意義,連尋死都成為一種奢求時,是多麼的悲哀。

這些發生在美國的真實案例,有的是因為罹患癌症、愛滋病等疾病,有的則是因為用藥不當或車禍等意外而導致失去行為能力的病人。由於當時(大約 1970 年之前)醫界與一般民眾對於安寧療護、疼痛控制的認知還相當貧乏,對臨終病人與家屬能否決定拔管(呼吸器、鼻胃管)也存在歧見,使得那些重症病患在往生的前幾個月,不僅自己痛苦,家人也承受了極大的身心煎熬;有的家屬甚至奮戰近十年,與各種團體和政治勢力對抗,才促使美國政府制定相關法令,包括預立醫囑的合法性、將「全腦功能停止」納入死亡的定義(原本僅有心肺、呼吸功能停止)。作者透過採訪當事人所作的記錄,如實呈現臨終病人的心理變化與種種痛苦,同時對安寧療護、使用止痛藥與麻醉劑來控制疼痛的劑量如何才算適當、醫生的權威、病人與家屬自決的權利、安樂死等牽涉道德與法律層面的問題也多有探討。這才發現,原來這當中牽涉的問題是如此複雜:當我躺在病床上無法表達意見時,誰來決定我的生死?何時才應該放棄維持器官運作的治療?萬一還有一線生機呢?誰來執行(醫生也會擔心被告)?病人或家屬有權利不斷提高止痛藥的劑量嗎?

安詳離世:茱迪絲的旅程

書中的第一個案例,茱迪絲,因罹患乳癌而切除乳房,中間歷經數次化療和放射線治療,也試過各種非正統的醫療方法,如禪修冥想、印地安巫醫的召喚聖靈療法等(人到無可奈何時總會求助各種偏方),最終仍不幸離世。幸運的是,她最後選擇了與勇敢面對死亡,放棄進一步治療,而在家中與親人共同度過最後一段寧靜而美好的時光。就如茱迪絲的丈夫所說:

「很顯然,我的妻子過世了,但對我們所有人來說,她死去的方式是那麼強而有力、獨特非凡。它讓我體悟到,死亡是一段旅程,而茱迪絲的旅程是美好的。......我唯一能說的是,對於我、賈斯汀和希瑟莉而言,茱迪絲的死讓我們深覺自己何其有幸,也何其不幸。」

現代醫學訓練教些什麼?

作者在第二章討論了一些醫病關係與醫學倫理的議題。例如她提到,原本死亡是人生的最終結果,但是在醫生的手中死亡,卻似乎成了醫生的失敗或過失。「因此之故,教學醫院訓練年輕醫師不顧成功機率的多寡,盡可能去嘗試每一種賭博。他們一次只把焦點放在一個器官上,專科醫師的狹窄見識使他們不去質疑,一個經過修復的心臟,能否與一個受損的肺臟一起正常運作;或者,對於一個纏綿病榻、承受極大痛楚的人,或肺臟、腎臟衰竭的人來說,修復修臟有什麼幫助?」(p. 76)

原來,醫學技術的進步,不止延長了人的生命,也同時延長了病人的痛苦,以致於在這個國家,「死亡竟是如此艱難」。

艱難的休止符:只想從疼痛中解脫

第二個案例,彼得,是一名罹患愛滋病的同性戀者。當時(1986 年),人們對愛滋病幾乎一無所知,對愛滋病所引發的各種疼痛,包括頭痛、腹部絞痛、以及最棘手的神經病變引發的疼痛,也鮮少有醫生知道該如何給予適當的治療。經過一段時間,彼得終於認清自己的處境,有一天,他對他的伴侶朗恩說:「嘿,這病是一天天節節進逼。它現在在我的脊椎裡,一路往上進攻,等到它攻進橫膈膜,我就一命嗚呼了。朗恩,我們得談一談。我再也不想回醫院去了。」

彼得後來如願進入安寧病院(hospice)。剛開始,病院的醫師准許彼得日以繼夜的服用口服嗎啡,彼得總算有一段比較輕鬆的日子。但是到後來,疼痛愈加劇烈,他一而再,再而三的索求止痛藥,連護士和醫生都已經厭煩他的「討藥」行為,認為他對嗎啡已經上癮了,甚至有無病呻吟的嫌疑。朗恩回憶:

「當我坐在床邊,陪伴逐漸油盡燈枯的彼得時,聽到他一再懇請、拜託、哀求醫護人員給他更多嗎啡--即使當時已經每小時靜脈注射四十或五十毫克的嗎啡溶液--直到他再也無法言語為止。即使在那個時候,我還是聽到醫護人員說不。彼得終於放棄希望,不再哀求。當他呻吟時,我撫摸他的額頭,當他嘆息時,我握住他的手。他的疼痛似乎未曾稍停,除了生命終了的最後時刻。」(p.109)

真的是痛到死!

彼得過世後,當時負責治療他的醫生反問:「何謂適當醫療?難道是指醫師隨著病人的意思照辦嗎?還是讓病人服用麻醉藥物到飄飄欲仙?如果這才叫作適當的醫療,何必浪費良藥?......我們遇到一些病人要求高劑量的藥物,因為他們一心想死。我們不幫助病人安樂死。」

另一位醫生持不同看法:「對於一個垂死的愛滋病人而言,每小時五十毫克的靜脈注射嗎啡通常是不夠的。所謂足夠,乃是指舒解病人疼痛的劑量。『相信病人』是良醫良藥的首要原則。」也就是說,疼痛是主觀的,病人喊痛就是痛,應盡量給予治療。若懷疑病人過度索求止痛藥而不給予治療,這樣的醫師......病人碰到了恐怕只能自求多福。

到底該不該拔管?

第三個案例,凱倫,一個昏迷十年之後才過世的年輕女孩,她的父母為了讓她早日脫離人間煉獄,不惜和醫院打官司。而凱倫在生日時向朋友吐露的心聲,竟成為日後打官司時有力的證詞。當時,凱倫對朋友表示,如果有一天她回天乏術,活著只會延長痛苦折磨,她寧願死。

儘管美國最高法院最後判定醫院應依照凱倫父母的意願,拔除凱倫的人工呼吸器。但醫師還是不肯照做,只願意採用逐漸讓凱倫試著不依賴人工呼吸器一段時間的方式。結果等到正式將人工呼吸器關機時,凱倫卻奇蹟式的能夠自行呼吸了。這個「好消息」讓凱倫和家人陷入更長的磨難,直到昏迷十年後才得以解脫。

「醫師指出,事實上,當餵食管或靜脈注射點滴被移除,或停止洗腎,死亡就不那麼可怕或痛苦。如果能夠妥善控制,拔除所有的插管,身體將慢慢地停止運作,自然而然地進入自我麻醉的睡眠狀態,病人便能平靜安詳地死亡。」(p.162)

病人自決

在凱倫的案例中,法院後來雖然允許其父母拔除凱倫的餵食管,但他們卻一直沒有這麼做。而本書第四個案例的主角--南西--卻在其父母欲拔除其鼻胃管時引發激烈爭議。甚至有牧師帶頭策劃「營救行動」,欲強行進入醫院幫南西重新插上鼻胃管。他們的標語是「你想嚐嚐被餓死的滋味嗎?」「當所有美國人在聖誕節前大祭五臟廟,南西卻活活挨餓,脫水至死。」

歷經宗教團體、醫界、反墮胎委員會等各方政治角力,南西的鼻胃管終究被拔除了。而這些爭議也催生了各種臨終法的制定,包括「生前遺囑」、「醫療委任代理人委託書」、以及「家屬同意書」。這些法案的內容我並不清楚,但從字面上可大致了解,其核心概念就是要尊重病人對自己醫療方式的決定權。

這本書出版於 1999 年,距今已十個年頭,而且談的是美國的情況,不知道台灣是否有制定類似的生命臨終法案?萬一將來有一天我成了活死人,身上插滿各種管子,無法言語時,我應該也會希望盡快解脫,也免除家人的身心折磨吧。

ps. 本書已絕版,目前大概只能到圖書館或二手書店才找得到。
技術提供:Blogger.
回頂端⬆️