用A-Spice思路解讀“西門慶和潘金蓮的不可描述之事”,不信你看不懂
四大名著之一《水滸傳》,我想很多人都看過吧,你是不是對“西門慶和潘金蓮的橋段”反復琢磨呢?哈哈,我想你是個好學的人,施耐庵也不惜重墨描繪這一章節(jié)。
王婆的“十分光”計謀簡直讓我“虎軀一震”,瞬間感慨這婆子肯定是一個思維縝密的程序員,軟件界少了她都黯淡了不少。
你沒看過《水滸傳》也沒關系,《金x梅》也有相同的情節(jié),后者算是基于前者的二次開發(fā)了,描述更刺激,對,我是說王婆是個狠角色。
Note:《水滸傳》的第二十四回“王婆貪賄說風情 鄆哥不忿鬧茶肆”和《金x梅》的第三回“定挨光王婆受賄 設圈套浪子私挑”有相同的情節(jié)。
上車坐穩(wěn)扶好,下面用A-Spice的方式解讀下這個故事情節(jié)。
為了到了更刺激更震撼的理解體驗,我們先復習下什么是V模型。不要想歪,不是女主的深V也不是大V,是A-Spice里面的V模型,管理設計流程用的,或者你戳這文章看《A-Spice中性感的V》。
完全不懂A-Spice或者V-Cycle也沒關系,你看下圖,按V字母筆順就是產品和軟件的開發(fā)過程。

話說,《水滸傳》是講忠義豪杰的故事的,為了更能讓故事情節(jié)更加“引人入勝”,于是“甲方”提了個需求:
撮合潘金蓮和西門慶搞點不可描述的事情,以凸顯武松的嫉惡如仇,然后逼上梁山。
要求“乙方”要想辦法實現(xiàn)這個需求。
“甲方”的需求往往就這么簡陋無比,作為優(yōu)秀的“乙方”不能看著需求就直接瞎掰,還需要進一步去挖掘更多信息。這個“進一步挖掘更多信息的過程”就叫SYS.1 需求挖掘。即在整個開發(fā)過程保持各方溝通以獲得更多需求信息,保持你做的跟甲方要的是同一個。
那么這個故事,怎么挖掘需求?就好像做項目,要知道項目的背景,為什么要搞一段潘金蓮和西門慶之間的齷齪之事。
那你就要去看看《水滸傳》的上一回,就是武松打虎回來之后的事。在這里,挖掘點重要信息:
-
潘金蓮原是清河縣某大戶的使女,這大戶想潛規(guī)則她,但她不愿意,向主人婆報告了這事。這大戶一怒之下,將潘金蓮“送給”了武大郎,不用錢的那種(羨慕吧,不要臆想哈)。
- 這武大郎是誰?“矮矬窮”,原文說是“三寸丁谷樹皮”。
- 漂亮媳婦配矮丑丈夫容易惹麻煩,從清河縣搬到陽谷縣。
- 武松是武大郎弟弟,高大威猛,醉打吊睛白額虎。
- 潘金蓮看著武松胸肌勃勃,激發(fā)了其雌性荷爾蒙,芳心蕩漾,想方設法勾引武松。
- 武松是誰,堂堂正正的男子漢,怎么可以做這等勾當。于是在他出差之前,告訴他哥哥要看好這媳婦,不要被人勾走了哦。
-
...
以上,就是把這些信息挖掘出來,用粗略點的圖示可以大概勾畫出來人物的關系和行為動作:

這還要挖掘下系統(tǒng)硬件上的信息,大戶家和武大郎家是在清河縣住的,而王婆、武松和后面出場的西門慶在陽谷縣住的。
怎么才能客戶的需求順理成章地實現(xiàn)呢?這就需要做需求分析了,即SYS.2 系統(tǒng)需求分析過程。
其實系統(tǒng)需求分析和需求挖掘是分不開的。前者注重“分析”,有疑問需要跟甲方溝通,繼續(xù)挖掘更詳細的信息,即后者注重“挖掘”。做項目過程中一般通過QA的方式跟甲方澄清需求,甲方也會通過CR方式來增加或變更需求。
那么,系統(tǒng)需求分析,做些啥?
講點項目上的話題:系統(tǒng)需求分析跟后面要講的軟件需求分析是有區(qū)別的。前者注重系統(tǒng)層面的需求,后者關注軟件上的需求。能不能說前者包含后者。內容上是可以的,但是細節(jié)、邏輯表達上是不行的。這導致有些公司,只有需求分析這個崗位,而不分系統(tǒng)需求還是軟件需求,節(jié)省不少人力成本。但是嚴格按A-Spice流程做項目是有問題的,對下面的軟件設計和測試都有非常大的影響。
挖掘出的一堆需求,不一定全部都有用,需要提取分析,做好整理。例如清河縣的大戶一家,其實沒必要關注的了,只需做個參考,知道潘金蓮的來歷即可。后面潘金蓮勾引小叔子武松,這條需求有沒有用。有用,可以給潘增加一個屬性,即不安分、水性楊花等,容易出軌。
武松提醒其大哥,要看好嫂嫂。那么就給了建議,天還沒黑就關窗拉簾子了。
就在此時,關鍵信息來了,關窗的時候,木棍不小心掉下了,又恰好砸到了西門慶的頭上,那么西門慶抬頭一看,哎呀不得了,就這樣迷上了這小娘子。這西門慶偏偏又是個破落戶,特點好色。這個潘金蓮偏偏又是個水性楊花。
就這樣,故事快要發(fā)生了,差點啥來著。
王婆,就這樣出現(xiàn)了,是武大郎鄰居,干過媒婆角色,業(yè)務能力奇強,沒有撮合不了的。這能力強的人往往表面不表現(xiàn)在這一行的,對,她開個了茶坊,平時蒼蠅都沒幾只都無所謂,不影響她是干媒婆角色的。
說到這,系統(tǒng)需求可以整理出哪些?
-
潘金蓮水性楊花,不愛武大郎,卻被管住了,按奈不住要出軌;
- 西門是個破落戶,有點錢,特別好色,按奈不住要拈花惹草;
- 王婆,拉皮條能力一絕,還貪財;
- 武大郎家有個門窗,木棍是搞活動的,容易掉;
- 這個門窗是正對著外面大街的;
- 武大郎家和王婆的茶坊很近,算是鄰居;
- 西門慶被潘金蓮木棍砸到,抬頭望,被迷?。?/span>
- 西門慶跟王婆很熟,常在茶坊喝茶;
- 王婆看出西門慶的心事;
-
王婆給西門慶獻計。
這里,做系統(tǒng)需求分析的時候要做好分類,有靜態(tài)的有動態(tài)的,有硬件需求也有軟件需求,同時要做好需求可行性分析。
我們這里把人物和其活動歸類為軟件需求,家、茶坊以及門窗木棍等這類的當做是硬件需求。
可行性呢?就是這些需求分析下來,能不能讓王婆撮合這對J夫Y婦干出不可描述的事。其實上面的分析已經(jīng)分析出來了,一個水性楊花,一個好色,一個擅長撮合,都是鄰里街坊。你說,可行么?
接下來,要干嘛呢?大家不要猴急,接下來是SYS.3 系統(tǒng)架構設計。
要將上面系統(tǒng)需求表達到系統(tǒng)框架中,例如這個靜態(tài)的系統(tǒng)框圖:

那要不要動態(tài)行為圖呢,我覺得系統(tǒng)層面的,是要的。限于篇幅,我們再軟件架構處在講解吧。
這里還要提的,系統(tǒng)設計也有很多要求的,不僅僅是這個框圖,還有需求的部署,資源預估,例如干成這勾當要多少銀子,買點布料讓潘金蓮做針線等等。還有這系統(tǒng)方案后面怎么實施,如何測試驗證等。
系統(tǒng)方面的,就簡要講這么多吧。下面講重點,軟件過程的設計。
接下來就是SWE.1 軟件需求分析了。
也許還是很多人要問,軟件需求跟系統(tǒng)需求的區(qū)別。
軟件需求是來源于系統(tǒng)需求和系統(tǒng)架構的,但是側重點不一樣。
例如,系統(tǒng)需求的1/2/3/7/8/9/10都可以認為是軟件需求,對其加以在軟件層面的分析即可。例如這個人物的設計,可以將其設計成一個類,帶著很多屬性(水性楊花、好色等)和方法(開窗、喝茶、獻計等)。

也許你會認為,這不是軟件設計的事情嗎,其實你是在軟件設計的時候把軟件需求的事干了而已。
這里,我們要重點研究獻計這個方法,可以理解它是一個很重要的算法,在王婆這類里面實現(xiàn)。
原文說,這個計謀叫做“十分光”計。我把幾千字的計謀內容提煉以下:
-
一分光:西門慶送點衣料給王婆做壽衣,王婆約潘金蓮來做針線活,看她肯不肯;
- 二分光:做針線的地點約在王婆家,看肯不肯;
- 三分光:第二日看潘金蓮是否繼續(xù)愿意在王婆家做針線;
- 四分光:第三日,西門慶出現(xiàn),看看潘金蓮是否回避回家;
- 五分光:王婆夸西門慶發(fā)善心,西門慶夸潘金蓮針線活好,看能否聊下去;
- 六分光:王婆出去買酒,買零食,看潘金蓮是否回避回家;
- 七分光:王婆要潘金蓮跟西門慶獨處,聊聊天,看潘金蓮是否回避回家;
- 八分光:吃酒嗑瓜子,看潘金蓮愿不愿意跟西門慶坐同桌;
- 九分光:吃到差不多,突然沒酒了,王婆去買酒,把這兩人關一屋子,看啥反應;
-
十分光:西門慶甜言蜜語、得寸進尺,看啥反應……
到這一步,軟件分析其實已經(jīng)很詳細了,這個算法思路也很清晰的了。
你按奈不住要寫代碼來實現(xiàn)這段不可描述的事情了?別急,接下來是SWE.2 軟件架構設計。
軟件架構設計討論跟系統(tǒng)架構設計的討論很相似,前者是關注軟件層面的。
我們可以把每個類設計成一個組件,并把類的接口定義清楚。
上專業(yè)的設計工具EA,為了簡要說明這個不可描述的情節(jié),部分需求沒有完全體現(xiàn)在這架構里面。(這里省略了WuDalang的角色)


以上是簡單的靜態(tài)圖描述,還要做動態(tài)行為描述:

注意這個動態(tài)時序的接口要和組件提供的接口一一對應,如果前后不一致就是做設計不嚴謹。
除了組件框圖、類圖和時序圖,還要有其他的設計,例如資源預估,線程任務等。(本文重點討論不可描述的情節(jié),其他工作暫且省略)
接下來,能寫代碼了嗎?看你急的,SWE.3 軟件詳細設計才是下一步(心急吃不了熱豆腐)。
一般,詳細設計用什么方法做呢?類圖和流程圖是最常用的,還有接口描述以及其注意事項。以下挑幾個來講解:
1. 類圖
2. 接口說明
接口名 |
bool TenSteps_Trap(int money) |
說明 |
“十分光”計謀?!暗厕吖庾铍y,十分光時,使錢到九分九厘,也有難成就處。”這計謀“端的強如孫武子教女兵,十捉九著?!本褪潜容^費錢。 |
參數(shù) |
money 買酒買零食的錢,還有衣料錢,酬謝金等 |
返回值 |
成功與否 |
注意事項 |
須占一個線程,非可重入函數(shù)。中途遇到拒絕退出,不可強求。 |
3. 流程圖

可以寫代碼了嗎?我知道你忍不住了,下面就是Coding了。
從這里看,Coding只占整個A-Spice很小一部分。所以說走A-Spice流程的項目需要比不需要A-Spice流程的多很多很多時間。
以上的,“十分光”計流程圖足夠清晰了嗎?并不是。流程圖里面的01,02...10,以及“不可描述”部分都是一個單元,應該要設計對應子函數(shù)的。
對于“十分光”計流程圖的邏輯,是不是一眼看出,通過10對“if-else”語句就搞定了?
其實這里有N種實現(xiàn)方法,最原始最直觀最遵守規(guī)則的是這樣的:
bool TenSteps_Trap(int money){ if(do_needlework()) // 01 { if(at_wangpohome(day1)) // 02 { if(at_wangpohome(day2)) // 03 { if(PanJinlian.meet_happy_with(XimenQing)) // 04 { if(PanJinlian.chat_happy_with(XimenQing)) // 05 { if(at_wangpohome(Wangpo_leave)) // 06 { if(PanJinlian.state_along_with(XimenQing)) // 07 { if(at_the_same_table(PanjinLian, XimenQing)) // 08 { if(lock_in_a_room(PanjinLian, XimenQing)) // 09 { if(XimenQing.molest(PanjinLian)) // 10 { run_xxoo_thread() } else { go_exit(); } } else { go_exit(); } } else { go_exit(); } } else { go_exit(); } } else { go_exit(); } } else { go_exit(); } } else { go_exit(); } } else { go_exit(); } } else { go_exit(); } } else { go_exit(); }}
本文只討論A-Spice的不可描述,其他的函數(shù)實現(xiàn)方式,另找時間討論。
以上就是設計過程域的內容,即V-Cycle左邊的內容,那右邊就是測試的內容。
這計謀設計好后,王婆還真按照這套路實施一遍,還沒啥差錯,比設想的更加順暢。小說生活里面的情節(jié)是無法測試的,運行測試就是真實執(zhí)行了。
《水滸傳》還真有描述后續(xù)的執(zhí)行情況,而《金x梅》輸出更多不可描述的logs。
我說王婆是個狠人,她還藏著一個環(huán)節(jié)沒寫在A-Spice的詳細設計中。