大道至簡——軟件工程實踐者的思想 第4章 流于形式的溝通

>>>  讀書—連接古今充實信仰  >>> 簡體     傳統

      第4章 流于形式的溝通
 
    “足下求速化之術,不于其人,乃以訪愈,是所謂借聽于聾,求道于盲。”
 
                           ——唐韓愈《答陳生書》
 
1. 客戶不會用 C,難道就會用 UML 嗎?
 
    我們總是要先接觸客戶的,是的,如果不這樣,我們將無法確知要做什么。
 
    作為開發人員,可能更希望客戶能學習或者精通 C語言,這樣客戶就知道開發人員正在做什么,以及有多么地勤勞。或者,這樣的客戶還能以 C 語言的方式告訴開發人員他們究竟想要什么。
 
    然而要求客戶學習 C 語言明顯是自殺式的行為。在客戶(的代表)學會用 C 語言來向開發人員描述他們的需求之前,可能他就已經被老板開掉了。因此沒有客戶會笨到愿意用 C 語言來描述他們的需求。
 
    C 語言是程序員與計算機交流的語言,而不是他與客戶交流的語言。程序員面對的是計算機,但計算機不是客戶。
 
    因此在前面所提到的 R 模型中,開發人員最好不要直接面對客戶。項目經理有這樣的一種優勢:他可以不用了解 C 語言,也可以用一種非 C 的語言來與客戶交流(比如說漢語)。
 
    ——或者你更愿意開發人員盡早地進入狀態,那么你可以讓開發人員以需求調研的身份出現在客戶面前。但是,請注意這個人員的角色將變成“需求調研”,如果他不能適應這種轉變,那就別讓他去。——那會是災難的開始。
 
    要深入項目的需求階段的項目經理或者調研人員,被
 
要求深諳項目所涉的業務。但這往往我們所做不到的,因
 
為我們是軟件公司,而不是做這些(客戶的)業務的公司。
 
這時慣常的做法是聘請行業咨詢公司(或者個人)來介入
 
需求階段,協助了解和分析需求。
 
    他們總是很喜歡把事情搞得很復雜,所以他們會說這
 
一切的過程有個專用名詞,“En...這叫需求建模”他們很
 
專業地說。
 
 
    現在你應該發現了差距。比如我們的項目經理,以及
 
那個被調來充當調研角色的程序員,他們就不會什么“需
 
求建模”。
 
 
    接下來咨詢公司會與我們的客戶一起做業務建模,然
 
后再做業務到需求的映射,再抽取需求并完成需求建模。
 
他們做業務建模的時候,可能使用一些客戶業務范疇內的
 
符號和標識;而在做需求建模時,則需要使用一些軟件行業中(的設計和分析人員)習慣的符號和標識。
 
     這些符號和標識也有個專用名稱,“En...這個叫模型
 
語言(ML)。”他們無時無刻不在向你展現他們的專業(這已
 
經是他們還存在的唯一原因了)。
 
     如果他們更加專業,他們會告訴你他們用的是 UML。
 
向你介紹這個名詞的時候,他們的眼鏡或者眼睛里通常將
 
大放異彩。
 
     UML是模型世界里的世界語①。
 
 
     到現在為止,你應該看到,咨詢公司除了把問題搞得
 
更加復雜之外,他們仍然需要面對最直接的問題:與客戶
 
如何交流?
 
     他們的解決之道是模型語言。
 
 
     有什么差別嗎?
 
     程序員不能要求客戶會 C Language,難道需求分析師
 
們就能要求客戶會 Modeling Language 嗎?!
 
 
 
2. 項目文檔真的可以用甲骨文來寫
 
 
     獨 孤 木 (http://www.javaworld.com.tw/) 曾 經 在 一 篇
 
《UML, OOAD and RUP》中討論到 UML 實際應用中的問
 
題。其中的兩個問題是:
 
 
① 現實的情況未必如此。但UML這個名詞起碼顯示了它本源性的 
期望:Unified Modeling Language(統一模型語言)。
 
 
        “大部分的使用者,以及客戶的信息人員,其實
 
        并沒有足夠的能力,來確認這些文件(User Case) 
        的正確性與完整性。”
 
        “除了客戶不了解 UML,OOAD 跟 RUP 以外, 
        另外一個更糟糕的現象就是 project team 里面 
        的人也不懂。”
 
 
    這實在是很有趣的事。
 
    看來在一些情況下,在項目中使用 UML 只是完全不
 
懂的老板,以及什么都懂的博士的主意,而真實的場景中
 
去做事的那些客戶與項目成員,其實是未見得就能用好
 
UML 的。
 
 
    僅以 UML 的 User Case 來說,由“用例圖”和“用
 
例規約”組成。規約跟我們寫的需求說明書差不多,不過
 
更加細節罷了,而且還有一套相應的方法論來闡述如果去
 
實作。圖則很簡單,就是幾個圖形符號來描述系統邊界和
 
角色關系。
 
    顯然甲骨文也能描述范圍與關系。例如甲骨文中的
 
“家”這個字,就是上有房子下有豬①,這個邊界就定義
 
得很好;在古文中,“三”通常是泛指,跟UML圖中的線
 
條上標注的那個“*”是同義的,而甲骨文中“眾”這個
 
① 至于是“內有豬”還是“下有豬”的問題,不是我們要爭論的。 
有些考古學家根據甲骨文的象形來認為古人與家豬是雜居的,但 
我想那時的豬可能還比較野性,因此這種可能性還是小些。
 
字,就是日字下立有三個人,也就是在同一個日頭下做事
 
的很多人即為“眾”,這個關系也描述得很確切。
 
 
     所以只要你運用得法,甲骨文一樣可以用來畫用例圖
 
和寫用例規約。同樣的,只要約定一套“語法”,你同樣
 
可以用甲骨文來做活動圖、類圖、構件圖……以及這些圖
 
相關的規約。相比來說,古巴比倫人使用的楔形文字“象
 
形性”差一些,因此我不建議用它來畫用例圖。
 
     既然甲骨文可以用來做為一種模型語言(同時它也是
 
一種文字和口頭的語言),那么,如果你的項目中面對的
 
對象是商周文化的考古學家,以及你的項目組都由精通這
 
種語言的成員構成,這時你就可以用甲骨文來做項目文
 
檔,以及畫各種模型圖例。
 
 
     你要明白,要讓考古學家看懂用例圖,難度遠大于看
 
懂甲骨文。與其要求他們學一種語言,不如使用他們那個
 
世界的通用語(當然,前提你的項目組也懂得這種語言)。
 
 
     在韓愈的《答陳生書》中,他因自己不會“速化之術”,
 
所以說陳生是“求道于盲”。然而他用了一個不恰當的比
 
喻:要知道盲人并非不知道路如何走,只是他不能象常人
 
一樣描述他所知道的路。因此“問道于盲”是沒有錯誤的,
 
真正錯誤的是你睜著眼睛問。
 
     我們需要在正常人與盲人之間建立一種溝通的方式,
 
既然盲人不能睜開眼睛,那么你就閉上眼睛好了。
 
 
 
                                               -48- 
 
                                              『大道至簡』
 
    UML 圖在一些客戶眼里無異于盲人的世界,如果需
 
要向他們做需求調研,你只能使用一種這些客戶能夠理解
 
和接受的方式,例如表格、流程圖以及……更深入的交談。
 
    你要確認你的溝通方式是否有效,而不是去追求這種
 
方式是不是 UML,以及用 UML 表達得是否正確。——客
 
戶是因為他認為你理解了他們的需求,而在“需求確認書”
 
上簽字,而不是因為你的 UML 畫得是否精準。
 
 
    現在來思考:為什么非要讓客戶看UML圖呢?如果 
有能夠滿足“極限編程(XP)”所要求的“現場客戶①”,那
 
當然可以不畫用例圖;相反,如果客戶雇了一個專家組來
 
評審需求,那么你就老老實實地畫用例圖好了。
 
    需要留意的是,專家組還要一種方式與客戶溝通,這
 
有可能不是 UML。——當然,客戶愿意增加溝通成本,
 
那是他們的事。
 
 
    一旦源頭確定,你就可以接下來約定在項目組中要使
 
用的溝通方式。愚公——這個偉大的項目經理——所使用
 
的“聚室而謀曰”,就是很好的溝通方式。當然,如果客
 
戶精通 UML,那么我想愚公采用的項目溝通方式將會是
 
“聚室而論 UML”。我想一定會這樣,因為愚公是很懂得
 
溝通的、偉大的項目經理。
 
 
① 這是極限編程的特征之一,指的是要求客戶可以在程序員開發 
的第一現場,隨時可以向程序員確認完成功能的有效性,以及修 
正需求或者先前的需求描述。
 
3. 最簡溝通
 
 
     在 D 項目中,我向我的項目組員提出在需求階段與
 
客戶的溝通計劃。這個計劃只有三條:
 
          在一個月中,只能跟客戶作三次聯系;
 
          三次聯系中,最多只能有一次面談的機會;
 
          一個月后,提交全部的需求調研報告、需求分析
 
          和關于該項目的遠景規劃。
 
 
     D 項目并不大,所以從主觀上來講,客戶(代表)并不
 
會為這個項目投入太多的精力。重要的是,我們在前期交
 
涉中已經發現:這個客戶代表為大量其它的項目和工作所
 
困擾,他不會有時間來處理我們的問題。因此,減少溝通
 
和保障溝通質量的問題就顯得非常突出。
 
     在大多數的項目中,這樣的問題都是存在的。真正能
 
滿足極限編程(XP)所提出的“現場客戶”的情形并不經常
 
出現。即使能將程序員送到客戶現場中去,溝通問題仍然
 
是不可避免的。
 
     因此在 D 項目中我提出了“最簡溝通”。
 
 
     我們開始在網絡上查看相關的軟件系統的特征以抽
 
取客戶所關注的內容;了解該客戶的公司、經營理念、組
 
織結構形式以及工作模式;了解同類公司的成功經驗和優
 
秀的管理模式,以及客戶的競爭對手在做什么和在關心什
 
么……
 
     最后,我們開始綜合以下兩個方面的因素:
 
 
        客戶在公司層面的外在表現、內部機制和運營管
 
        理手段。
 
        客戶在項目中既已明確的需求和可能發生的需
 
        求,以及客戶圍繞其公司行為(和方向)所提出的 
        需求。
 
    這樣我們就了解了客戶項目中所有會產生需求的信
 
息點。
 
    我們開始設計提問,每一個提問涵蓋盡可能多的信息
 
點,盡可能的具有發散性以便形成更多的推論和假設。
 
    我們把這些做成項目概要用 mail 提交給客戶,并在
 
第二天電話回訪他。他以口頭的形式回復了這封 mail,這
 
讓我們盡可能地得到了項目在方向上修正。
 
 
    我們確定了項目的實際目標,以及遠期的方向。接下
 
來就是設計需求條目。
 
    客戶已經先期提供了一些關于項目的文檔、報表和工
 
作數據。因此基于這些數據的需求分析,將是下一個溝通
 
前所進行的最堅苦的工作。項目組員被要求:
 
        分析用戶的每一個表格,以構建基礎數據庫;
 
        分析每一條數據的含義以確定它的上下限,以及
 
        數據間的相關性;
 
        從工作文檔中去了解客戶的組織機構及其相互
 
        關系,同時確定了每一類使用該系統的角色;
 
        從報表中去了解客戶關注的數據信息,以及被他
 
        們所忽略掉的數據信息。
 
    我們從數百條的需求條目中,整理出系統結構和模
 
塊,需求條目被映射到各個模塊。我們很快畫出了模塊間
 
的相互關系圖,并通過這個圖分析了數據交叉關系,設計
 
了相應的數據索引并增加了一些新的關系性數據。
 
     我們對用戶角色、原始數據和系統結構進行了梳理之
 
后,我們花了很短的時間實現了第一個系統模型。當然,
 
很多的功能項目,我們都只是簡單 show a dialog。但我們
 
優化了每一個操作流程,以保證不同的用戶(角色)在使用
 
時都盡可能流暢。
 
 
     這一次的溝通我們使用了面對面的模式。我們很慶幸
 
的得到了與這個系統的每一類用戶(角色)接觸的機會,而
 
正好我們有一個模型,我們便讓他們來操作并提出意見。
 
這一次我們終于有了一份詳盡的的調研報告。
 
 
     接下來的分析設計是順理成章的事。我們在一個月后
 
完成了這個項目的需求分析報告,以及在這個分析上的一
 
些框架型的設計。還有,一個被用戶所接受的原始模型。
 
     ——盡管,第三次的溝通中還發現了一些問題。但我
 
們終于有了一個好的開端。
 
 
     應該清楚的是,保障每一次溝通的有效性都是最重要
 
的事。溝通不是打電話或者請客戶吃飯那么簡單的事。你
 
得到的每一次溝通機會,都是向客戶了解更深層次的需求
 
的機會,因此最好在見到客戶之前,你就已經設計了所有
 
的問題和提問方式。
 
     吃飯并不是有效的溝通。大多數時候,那將以酒醉收場。
 
4. 為不存在的角色留下溝通的渠道
 
 
    大多數人不會知道,我們中國的“五千年文明史”實
 
際上僅有三千年“有史可查”。
 
    司 馬 遷 在 史 記 中 寫 道 :“ 維 三 代 尚 矣 , 年 紀 不 可
 
考,……于是略推,作三代世表”。也就是說,他在寫史
 
記時“(夏商周)三代”的年代已經不可考了,因此只能做
 
“世表”;而其后十二諸候國的年代才可考證,因而有“(十
 
二諸侯)年表”。
 
    世表和年表的準確性和可靠性有明顯的差異,因此我
 
國古代編年史能追溯到的上限,就成了《史記·十二諸侯
 
年表》中記載的西周共和元年,亦即公元前 841 年。
 
    司馬遷無法做夏商周三代的年表是因為其年代不可
 
考,這是因為自黃帝以來的許多文獻材料部分雖有年數,
 
但比較模糊且不一致,所以他只能棄而不用。
 
     現在國家在“夏商周斷代工程”中再次推算和考證編
 
年史,這些相關資料也同樣只做參考,實際采用的方法是
 
更有可信度的金文(記載)、歷史學、天文學、碳-14 測年
 
等。
 
     資料的缺失、及其有效性的缺乏,給中國編年史撰寫
 
帶來了莫大的困難。
 
 
     項目的中斷和中止,與歷史產生斷層的內因是一致
 
的。——我發現很多的項目(尤其是產品計劃)在負責人員
 
離開后,就自然而然地死掉了。我把這一切的原因歸咎于
 
“沒有 history”。
 
 
     在先人寫“譜牒”(簡、冊)時想必是沒有考慮過后人
 
要讀的,或者更為遠古的先人可能根本沒想過要留下他們
 
的生活和部落記錄,再加上有象秦始皇這樣的人在前面放
 
火燒東西,所以司馬遷拿不到夏商周三代的確切史料,也
 
是情理之中的事了。
 
     ——遠古的先人不知道司馬遷這一號角色的存在,司
 
馬遷也沒有辦法跟古人約定一下要留點記錄給他寫《史
 
記》。
 
 
     我 們 做 項 目 的 時 候 , 如 果 也 不 留 下 歷 史 記 錄
 
(History),那么以后別人來看這個項目,也會是兩眼一抹
 
黑,要么就象司馬遷一樣“存而不論”,項目便就此中止;
 
要么就象“夏商周斷代工程”一樣,花大量的人力物力來
 
攻關。
 
    維護舊項目比做新項目更難,許多人深有同感。然而
 
這些“有同感”的人又何曾想過,自己在做“新項目”的
 
時候,要為“項目維護”這種還不存在的角色,留下一個
 
溝道、對話的渠道呢?
 
 
    我把項目的 History 作為跟這種“不存在的角色”溝
 
通的一種方式。History 的豐富和準確為項目的后繼開發、
 
維護提供了可能。
 
 
    歷史記錄(History)與注釋(Comment)不是一回事。代
 
碼中的注釋是為閱讀代碼而留備的,而 History 是為整個
 
項目而記錄的。一些參考的記錄內容有:
 
        需求階段:與誰聯系,聯系方式、過程、結果以
 
        及由此引發的需求或變更;
 
        設計階段:如何進行設計、最初的構架、各個階
 
        段的框架變化、因需求變更導致項目結構上的變
 
        化(有助于了解構架的可擴充性); 
        開發階段:每一種技術選型的過程、每一種開發
 
        技巧的細節和相關文檔、摘引的每一段代碼、算
 
        法、開發包、組件庫的出處和評測;程序單元的
 
        測試框架;每一個設計和構架變更所導致的影
 
        響;
 
        測試階段:還記得測試用例和測試報告嗎?那是
 
        最好的 history 之一。
 
 
     當然,另一件最重要的事,是記得在每一筆記錄后寫
 
下時間和你的名字。你的每一筆記錄都是打算留給一些根
 
本不了解這個項目的人看的,之所以要記下你的名字,是
 
便于那些人能夠再找到你并溯源到問題的源頭。——當
 
然,這得趕在你和古人一樣“與天地共存”之前。
 
 
     我們知道,大多數的工具都有歷史記錄的功能。在開
 
發工具和測試工具中尤為突出。此外,版本管理工具也留
 
下了每個階段的印跡。然而,我不建議過于信任它們①,
 
如果不明確要求項目組員寫下詳細的History,那么他們可
 
能在每一次版本簽入時都只寫下兩個字的備注:“完成”。
 
 
 
5. 流于形式的溝通
 
 
     在很多的時候,我所聽到的溝通,都是一種形式。例
 
如與客戶吃飯或者打回訪電話。
 
     其實溝通是具有目的性的,如果在沒有明確目的的情
 
況下與客戶溝通,那將是浪費客戶和自己的時間。這種目
 
的,可以是了解項目的訊息、挖掘潛在的項目……最末了,
 
才是交流感情。
 
     然而大多數的情況下,它僅僅被看著交流感情。這便成了形式。且往往是客戶所討厭的一種形式。
 
① 大多數的軟件公司已經意識到版本管理的重要性。然而項目各個階段的文檔、代碼及其它輸入輸出都是具有版本問題的。單一的版本管理軟件并不能勝任這些。因此我仍舊采用相對原始的、編寫History這樣的方法,來彌補ClearCase、SourceSafe、CVS等這些軟件的不足。
 
 
    溝通問題不僅僅存在與客戶交流之中。還存在于與項
 
目的各個角色之間。項目的分析報告為設計人員所看不
 
懂,設計人員的方案為開發人員所看不懂,而開發的結果
 
以為測試人員所看不通。等等都是溝通問題。
 
    UML 的確是解決溝通問題的最佳手段之一。然而如
 
果項目一開始就不能用它,那么強求的結果必然是痛苦
 
的。——要讓 UML 在一個沒有經過相關培訓的團隊及其
 
各個角色之間用起來,幾乎是不可能的事。即使用得起來,
 
也存在經驗問題。千萬不要指望僅僅一個項目,就能讓你
 
的組員深刻的理解 UML 的思想。
 
    也不要指望在每個項目中都能用它,如果你的客戶能
 
理解并支持使用 UML,那以這個項目就會有一個良好的
 
UML 使用環境。否則,開發環節中資料的不一致性,將
 
會使得項目難以收場。
 
    使用與不使用 UML,其根本的問題在于溝通方式的選擇。只要是行之有效的、能在各個項目角色間通用的,就是好的溝通方式。
 
 
    在每一次回顧項目時都應該注意:流于形式的溝通,可能是使得你的項目被不斷推翻和不斷延遲的最直接原因。

周愛民(Aimingoo) 2013-08-24 22:23:02

[新一篇] 大道至簡——軟件工程實踐者的思想 第3章 團隊缺乏的不只是管理

[舊一篇] 大道至簡——軟件工程實踐者的思想 第5章 失敗的過程也是過程
回頂部
寫評論


評論集


暫無評論。

稱謂:

内容:

驗證:


返回列表