論概念模型的重要性--對(duì)一次 bug 的思考

背景

我們?cè)谧鲆粋€(gè) application engine 角撞,涉及到今天要講的內(nèi)容有兩部分,運(yùn)行時(shí)環(huán)境和對(duì)象解析庫(kù)。運(yùn)行時(shí)環(huán)境顧名思義就是用戶代碼運(yùn)行時(shí)的環(huán)節(jié)屠升,類似于 jvm ,而對(duì)象解析庫(kù)就類似于 javac + classloader 费奸。這兩部分基本上同時(shí)進(jìn)行開(kāi)發(fā)的弥激,也就是說(shuō)在運(yùn)行時(shí)環(huán)境還沒(méi)確定已何種方式使用對(duì)象解析庫(kù)時(shí),對(duì)象解析庫(kù)就開(kāi)始了設(shè)計(jì)和開(kāi)發(fā)的工作愿阐。而我就是那個(gè)設(shè)計(jì)和開(kāi)發(fā)的人微服。

需求

因?yàn)楫?dāng)時(shí)運(yùn)行時(shí)環(huán)境還在設(shè)計(jì)和開(kāi)發(fā)中,而我拿到的需求是寫一個(gè)較為通用的解析庫(kù)缨历,負(fù)責(zé)解析對(duì)象文件并裝配上一些預(yù)定義的方法以蕴。

設(shè)計(jì)

因?yàn)閷?duì)象具體的行為是由運(yùn)行時(shí)環(huán)境來(lái)執(zhí)行的,而解析庫(kù)又要負(fù)責(zé)解析對(duì)象應(yīng)該具備哪些行為辛孵,并把相應(yīng)的行為定義上去丛肮。所以我就定義了一個(gè)接口來(lái)表示所有的原子行為,然后解析對(duì)象并裝配上行為(有可能是原子行為或原子行為的組合)魄缚。當(dāng)運(yùn)行時(shí)環(huán)境需要使用解析庫(kù)時(shí)宝与,實(shí)現(xiàn)原子行為的接口即可。

選擇

解析庫(kù)是在運(yùn)行時(shí)之前開(kāi)發(fā)完成的冶匹,之后我又去做了別的事情习劫。等到運(yùn)行時(shí)需要使用解析庫(kù)時(shí),才發(fā)現(xiàn)兩個(gè)設(shè)計(jì)人員的概念模型是不一致的嚼隘。在我的想法里诽里,解析庫(kù)是可以運(yùn)行在不同運(yùn)行時(shí)環(huán)境的,所以我定義了一組原子行為由運(yùn)行時(shí)環(huán)境來(lái)實(shí)現(xiàn)飞蛹。而設(shè)計(jì)運(yùn)行時(shí)環(huán)境的人想法是由環(huán)境對(duì)外提供一個(gè)標(biāo)準(zhǔn)方法谤狡,解析庫(kù)通過(guò)這個(gè)方法實(shí)現(xiàn)所有對(duì)象的行為。

可以說(shuō)解析庫(kù)就是為運(yùn)行時(shí)環(huán)境而生的卧檐,所以解析庫(kù)要改墓懂。那么有兩個(gè)選擇擺在我面前。

  • 重構(gòu)解析庫(kù)

  • 寫一個(gè)適配器泄隔,適配器使用環(huán)境提供的標(biāo)準(zhǔn)方法實(shí)現(xiàn)解析庫(kù)借口定義的原子行為

其實(shí)我的優(yōu)先選擇是重構(gòu)拒贱,但考慮到時(shí)間因素,最后采取了第二個(gè)方案。

重點(diǎn)來(lái)了

適配器很快就寫完了逻澳,整個(gè)系統(tǒng)也通過(guò)跑了幾個(gè)簡(jiǎn)單的 demo 得到了驗(yàn)證闸天。于是我又去忙別的事情了。之后的莫一天斜做,有一個(gè)驗(yàn)證別的模塊的功能跑不通苞氮,于是懷疑是解析庫(kù)的 bug 。業(yè)務(wù)邏輯是這樣的:

環(huán)境先提供了一個(gè)標(biāo)準(zhǔn)方法來(lái)解析一批對(duì)象瓤逼,這時(shí)候?qū)ο蟮谋憩F(xiàn)是正常的笼吟。

環(huán)境又提供了另一個(gè)標(biāo)準(zhǔn)方法來(lái)解析另一批對(duì)象,這時(shí)候這批對(duì)象的表現(xiàn)也是正常的霸旗。

接著環(huán)境再調(diào)用第一批對(duì)象時(shí)就表現(xiàn)出了異常贷帮。

其實(shí)碰到這樣的問(wèn)題,最簡(jiǎn)單的方式就是在解析庫(kù)里加一個(gè)這種場(chǎng)景的測(cè)試诱告,就知道是不是解析庫(kù)的問(wèn)題了撵枢。然而當(dāng)時(shí)我的第一選擇是通過(guò)邏輯推斷來(lái)定位 bug ,因?yàn)楫?dāng)解析完成時(shí)精居,對(duì)象和方法的關(guān)系就已經(jīng)綁定了锄禽,如果起先沒(méi)有問(wèn)題,而后來(lái)出現(xiàn)問(wèn)題靴姿,那很有可能是這個(gè)方法被變更了沃但。所以基本上花了十幾分鐘來(lái)檢查環(huán)境的代碼和 demo 的代碼可能存在什么問(wèn)題。然后又大概花了五分鐘來(lái)說(shuō)明我推斷的理由佛吓,所以差不多浪費(fèi)了二十分鐘后宵晚,我終于選擇增加一個(gè)場(chǎng)景測(cè)試來(lái)判斷問(wèn)題。而加入這個(gè)測(cè)試只花了不到五分鐘维雇,然后兩分鐘后就定位到問(wèn)題了坝疼,最后修改的代碼在十行內(nèi),當(dāng)然修改方案想的時(shí)間比較久谆沃。

事后下班回家的路上我在想當(dāng)時(shí)的選擇是否正確?在我聽(tīng)完 bug 描述之后仪芒,幾乎本能的要寫一個(gè)測(cè)試來(lái)證明這不是解析庫(kù)的問(wèn)題唁影,然而后來(lái)我的選擇卻不是這個(gè),我試著分析自己的心理掂名。首先無(wú)論引起 bug 真實(shí)的原因是什么据沈,這個(gè)測(cè)試都是要加的。但如果加了測(cè)試以后證明不是解析庫(kù)的 bug 饺蔑,問(wèn)題還是沒(méi)有解決锌介,需要繼續(xù)尋找問(wèn)題的所在。而當(dāng)時(shí)聽(tīng)完描述之后我自信的認(rèn)定這不可能是解析庫(kù)的問(wèn)題,所以想要跳過(guò)寫測(cè)試的那一階段孔祸,直接進(jìn)入找問(wèn)題的階段隆敢。

這里看上去是我過(guò)分自信的問(wèn)題,其實(shí)自信不是問(wèn)題崔慧,而是我的判斷依據(jù)出了問(wèn)題拂蝎。在我的概念模型里對(duì)象和方法的關(guān)系在解析時(shí)就做了綁定,而解析庫(kù)在解析時(shí)實(shí)際的行為是綁定對(duì)象和原子行為實(shí)現(xiàn)類的關(guān)系惶室。運(yùn)行時(shí)雖然定義了兩個(gè)不同的方法温自,但原子行為實(shí)現(xiàn)類卻是一個(gè)(原先的概念模型里一個(gè)環(huán)節(jié)一個(gè)實(shí)現(xiàn)類是合理的)。問(wèn)題就在于我腦子里的概念模型與系統(tǒng)實(shí)際的概念模型不一致皇钞,所以才導(dǎo)致我認(rèn)為不會(huì)出問(wèn)題的地方出了問(wèn)題悼泌。這其實(shí)也是當(dāng)初我優(yōu)先選擇重構(gòu)解析庫(kù)的原因。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末夹界,一起剝皮案震驚了整個(gè)濱河市馆里,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掉盅,老刑警劉巖也拜,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異趾痘,居然都是意外死亡慢哈,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門永票,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)卵贱,“玉大人,你說(shuō)我怎么就攤上這事侣集〖悖” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵世分,是天一觀的道長(zhǎng)编振。 經(jīng)常有香客問(wèn)我,道長(zhǎng)臭埋,這世上最難降的妖魔是什么踪央? 我笑而不...
    開(kāi)封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮瓢阴,結(jié)果婚禮上畅蹂,老公的妹妹穿的比我還像新娘。我一直安慰自己荣恐,他們只是感情好液斜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布累贤。 她就那樣靜靜地躺著,像睡著了一般少漆。 火紅的嫁衣襯著肌膚如雪臼膏。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天检疫,我揣著相機(jī)與錄音讶请,去河邊找鬼。 笑死屎媳,一個(gè)胖子當(dāng)著我的面吹牛夺溢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烛谊,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼风响,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了丹禀?” 一聲冷哼從身側(cè)響起状勤,我...
    開(kāi)封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎双泪,沒(méi)想到半個(gè)月后持搜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焙矛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年葫盼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片村斟。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贫导,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蟆盹,到底是詐尸還是另有隱情孩灯,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布逾滥,位于F島的核電站峰档,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏寨昙。R本人自食惡果不足惜面哥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毅待。 院中可真熱鬧,春花似錦归榕、人聲如沸尸红。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)外里。三九已至怎爵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盅蝗,已是汗流浹背鳖链。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留墩莫,地道東北人芙委。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像狂秦,于是被迫代替她去往敵國(guó)和親灌侣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理裂问,服務(wù)發(fā)現(xiàn)侧啼,斷路器,智...
    卡卡羅2017閱讀 134,628評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,742評(píng)論 25 707
  • 時(shí)間:2017.11.20上午8:00 天氣:陰堪簿,零下一攝氏度 地點(diǎn):公園 人物:五個(gè)七旬老人 事件:年紀(jì)最大老人...
    胡胡丫丫閱讀 149評(píng)論 0 0
  • 繼續(xù)進(jìn)行
    今天雨閱讀 167評(píng)論 2 4
  • 昨日閱讀1小時(shí)痊乾,總計(jì)253小時(shí),第239日椭更。 讀呂思勉《兩晉南北朝史》至35% 中書之職哪审,舊掌機(jī)務(wù)。漢元以令甜孤、仆用...
    龍?zhí)赘缢_克海龍閱讀 408評(píng)論 0 0