架構(gòu)設(shè)計(jì)90-學(xué)習(xí)總結(jié)06-【翻譯】處理遺留系統(tǒng)替換的模式

本文是martinfowler上關(guān)于真對遺留系統(tǒng)的處理的文章郎哭。原文地址為:Patterns of Legacy Displacement顿颅。如有侵權(quán)請聯(lián)系我。


對遺留軟件系統(tǒng)進(jìn)行有效現(xiàn)代化

當(dāng)面臨更換現(xiàn)有軟件系統(tǒng)的需求時(shí)灶挟,團(tuán)隊(duì)經(jīng)常會(huì)陷入半完成狀態(tài)的循環(huán)中汞扎。根據(jù)我們的經(jīng)驗(yàn)我們可以使一系列的模式來打破這種循環(huán)膏潮,這依賴于:有意識(shí)地了解替換遺留軟件的預(yù)期結(jié)果,以逐步交付部分的方式打破并替換遺留系統(tǒng)祟同,并改變組織文化有意識(shí)的傳播世間不變的只有變化。


目錄

本系列具體模式

側(cè)邊欄

延伸閱讀:

企業(yè)架構(gòu)
演進(jìn)式設(shè)計(jì)


在過去幾十年的時(shí)間里晕城,我們經(jīng)常在幫助大型組織處理他們的遺留系統(tǒng)。在這樣做的過程中窖贤,我們學(xué)到了很多關(guān)于什么是有效的方法砖顷,并看到了許多導(dǎo)致失敗的過程。我們決定在工作中留出一些時(shí)間赃梧,用我們看到的滤蝠、使用過的各種方法以模式的形式記錄下我們學(xué)到的東西。

本文充當(dāng)這些模式的概覽授嘀。我們經(jīng)澄锟龋看到在組織在半途而廢的更換遺留系統(tǒng)的跑步機(jī)上奔跑。我們認(rèn)為打破這個(gè)循環(huán)的關(guān)鍵是需要按順序完成三項(xiàng)活動(dòng)蹄皱,并在公司的生命周期中反復(fù)進(jìn)行览闰。我們使用這些方式作為描述遺留系統(tǒng)替換模式的主要結(jié)構(gòu)芯肤。

我們一直相信,有效的軟件開發(fā)需要逐步發(fā)布有價(jià)值的功能压鉴,寫作也是如此—— 尤其是在網(wǎng)絡(luò)時(shí)代崖咨。我們從這篇敘述性文章開始,隨著我們寫下它們的詳細(xì)信息晴弃,將逐漸添加模式掩幢,以及展示它們?nèi)绾谓M合的其他示例。我們不能保證系列文章的完成時(shí)間上鞠,因?yàn)槲覀兊氖滓蝿?wù)是客戶工作际邻,這里有很多需要替換的遺留系統(tǒng)。如果您有興趣了解這項(xiàng)工作的更多部分芍阎,它們將在Martin的twitter和本網(wǎng)站的RSS上公布世曾。


遺留系統(tǒng)替代過程中的死循環(huán)

和我們合作的許多組織,都多次嘗試刪除遺留系統(tǒng)谴咸。在一個(gè)相當(dāng)?shù)湫偷陌咐新痔麄兘?jīng)歷了長達(dá)3-5年的一系列現(xiàn)代化計(jì)劃。每次他們都會(huì)定義一種新的技術(shù)方法岭佳,然后添加到大型多年現(xiàn)代化計(jì)劃并朝著這個(gè)目標(biāo)努力血巍。

在每個(gè)項(xiàng)目中客戶會(huì)在的某個(gè)時(shí)候遇到了一個(gè)危機(jī)點(diǎn),不斷變化的業(yè)務(wù)需求將超過他們當(dāng)前的技術(shù)戰(zhàn)略珊随。這時(shí)的第一種情況是觸發(fā)他們將軟件從頭再開始述寡,他們會(huì)對程序采取瀑布式“大爆炸”的方式設(shè)計(jì)與實(shí)現(xiàn)。這意味著放棄了先前大部分的工作叶洞。而第二種情況是采用增量交付方式鲫凶,采取這種方法的更多的只是在已經(jīng)很復(fù)雜的環(huán)境之上添加一層稍微較新的技術(shù)。對于這兩種情況衩辟,他們都無法停用任何遺留系統(tǒng)的堆積螟炫,成本節(jié)約和風(fēng)險(xiǎn)降低的關(guān)鍵業(yè)務(wù)目標(biāo)仍未實(shí)現(xiàn),這對于許多遺留替換工作來說是非常普遍的結(jié)果艺晴。

他們屢次失敗有幾個(gè)關(guān)鍵因素:

  • 首先昼钻,看到他們糟糕結(jié)果在很大程度上是組織不合理的產(chǎn)物;特別是它的領(lǐng)導(dǎo)力封寞、組織結(jié)構(gòu)和工作方式换吧。他們認(rèn)為只要選擇更新的技術(shù),而其他一切都保持不變钥星,他們會(huì)得到與過去不同的結(jié)果沾瓦。事后看來,這顯然是不現(xiàn)實(shí)的。

  • 其次贯莺,通過一個(gè)大型變革計(jì)劃來實(shí)現(xiàn)現(xiàn)代化风喇,計(jì)劃本身又包括一系列項(xiàng)目和團(tuán)隊(duì)。這些項(xiàng)目被視為與任何現(xiàn)有項(xiàng)目(BUA缕探,一切照舊魂莫,Business As-Usual)工作無關(guān)。因此爹耗,BAU繼續(xù)根據(jù)現(xiàn)有系統(tǒng)交付業(yè)務(wù)需求耙考,而新項(xiàng)目團(tuán)隊(duì)則根據(jù)替換計(jì)劃開始時(shí)的內(nèi)容進(jìn)行新的開發(fā)。
    隨著時(shí)間的推移潭兽,他們發(fā)現(xiàn)企業(yè)實(shí)際需要的東西與替換計(jì)劃開始時(shí)的需求之間的差距越來越大倦始。項(xiàng)目運(yùn)行的時(shí)間越長,項(xiàng)目計(jì)劃山卦、BAU鞋邑、未來需求三者之間的差距就越大。雖然變更控制流程已向計(jì)劃添加新要求账蓉,但這些流程非常耗時(shí)枚碗。而且由于前期與項(xiàng)目實(shí)施方的合同變更造成成本高得令人望而卻步。

  • 再次铸本,希望與現(xiàn)有系統(tǒng)的業(yè)務(wù)流程集實(shí)現(xiàn)功能對等肮雨。一開始這些嘗試是承諾以某種方式在幕后“改進(jìn)”技術(shù),為企業(yè)提供他們今天所擁有的一切箱玷。到后期酷含,業(yè)務(wù)領(lǐng)導(dǎo)者看到在替換過程中的多次失敗并擔(dān)心替換中斷,開始認(rèn)為這是一種風(fēng)險(xiǎn)較低的策略汪茧。這是一項(xiàng)定義對支持的“原樣”功能巨大的挑戰(zhàn),它導(dǎo)致了一個(gè)“大爆炸”式的大型單一版本切換計(jì)劃限番。

我們對這些組織的觀察結(jié)論是技術(shù)最多只占遺留問題的50%舱污,工作方式、組織結(jié)構(gòu)和領(lǐng)導(dǎo)力對成功同樣重要弥虐。


打破循環(huán)

顯然有必要打破“遺留系統(tǒng)替代計(jì)劃”的循環(huán)扩灯。但組織需要能夠繼續(xù)滿足業(yè)務(wù)需求的同時(shí)更換過時(shí)的技術(shù),而且所有這些都是在富技術(shù)和嚴(yán)峻的競爭環(huán)境下進(jìn)行的霜瘪。

我們發(fā)現(xiàn)有一系列方法可以幫助我們應(yīng)對這些挑戰(zhàn)珠插。它們將問題分解為更小的部分,以便在改進(jìn)技術(shù)的同時(shí)滿足新要求颖对。從廣義上講捻撑,它們分為四類:

  • 了解您想要達(dá)到的結(jié)果
  • 決定如何將問題分解成更小的部分,并成功交付零部件
  • 改變組織以允許這種情況持續(xù)發(fā)生

了解您想要達(dá)到的結(jié)果

對于一個(gè)組織來說,在處理遺留問題時(shí)就他們想要實(shí)現(xiàn)的結(jié)果達(dá)成一致至關(guān)重要顾患。雖然這似乎很明顯番捂,但組織的不同部分往往對預(yù)期結(jié)果有截然不同的看法。大多數(shù)遺留系統(tǒng)現(xiàn)代化的過程涉及我們下面列出的幾個(gè)結(jié)果江解,但在開始替換之前確定哪些是優(yōu)先事項(xiàng)是至關(guān)重要的设预。

  • 降低變更成本
    許多組織在決定解決遺留問題時(shí)的一個(gè)關(guān)鍵轉(zhuǎn)折點(diǎn)是:開始業(yè)務(wù)變更所需的成本遠(yuǎn)高于任何預(yù)期收益,而變更成本由于機(jī)會(huì)成本(也稱為延遲)或?qū)嵤┏杀驹龈呃绾印R粋€(gè)預(yù)警信號(hào)是:為業(yè)務(wù)績效只帶來小幅的提升鳖枕,必須花費(fèi)數(shù)周、數(shù)十或數(shù)以千計(jì)的工期來對網(wǎng)站進(jìn)行更改桨螺。
    在這一點(diǎn)上宾符,通常證明進(jìn)行任何大量投資的變更不再可能帶來回報(bào)。換句話說彭谁,技術(shù)現(xiàn)在的狀態(tài)已經(jīng)決定企業(yè)的業(yè)務(wù)變更規(guī)模吸奴。對于許多組織而言,這意味著進(jìn)行“BAU”更改或發(fā)起大項(xiàng)目之間的區(qū)別是:較大的項(xiàng)目會(huì)把以前所有不合理的小變化都吸引過來缠局,從而增加其范圍则奥、成本和風(fēng)險(xiǎn)。

  • 改進(jìn)業(yè)務(wù)流程
    我們也經(jīng)诚猎埃看到業(yè)務(wù)流程在遺留系統(tǒng)旁邊發(fā)展读处,而流程又與遺留系統(tǒng)緊密耦合。通常方式是在“線下”塑造一個(gè)人工業(yè)務(wù)流程來完成工作唱矛。
    我們來看一個(gè)例子:使用“綠屏”終端的航空公司執(zhí)機(jī)系統(tǒng)罚舱,由于舊系統(tǒng)的限制,必須按照嚴(yán)格的順序執(zhí)行該過程绎谦,這意味著更正或錯(cuò)誤就需要重新開始執(zhí)機(jī)過程管闷。同樣最初航空公司沒有提供轉(zhuǎn)機(jī)航班,當(dāng)添加此功能時(shí)窃肠,由于該技術(shù)的限制包个,它必須作為遺留系統(tǒng)中的單獨(dú)工作流程來完成。因此冤留,如果在辦理登機(jī)手續(xù)時(shí)碧囊,乘客沒有提到他們有轉(zhuǎn)機(jī)航班,則會(huì)遵循錯(cuò)誤的流程纤怒,包括打印錯(cuò)誤的行李標(biāo)簽糯而,只有在此之后系統(tǒng)才會(huì)標(biāo)記轉(zhuǎn)機(jī)航班。鑒于此泊窘,更新和更改業(yè)務(wù)流程反過來需要變更值機(jī)人員和乘客的工作方式也就不足為奇了熄驼。試圖在不改變技術(shù)的情況下改變工作流程通常會(huì)導(dǎo)致“線下”流程像寒,在這種情況下,人們會(huì)將數(shù)據(jù)提取到電子表格或類似工具中谜洽,在那里進(jìn)行處理萝映,然后再將數(shù)據(jù)導(dǎo)入到遺留系統(tǒng)中。
    在一個(gè)組織中阐虚,整個(gè)股票訂購過程實(shí)際上是在運(yùn)行在團(tuán)隊(duì)經(jīng)理 PC 上的 Microsoft Access DB 上的序臂。由于遺留系統(tǒng)無法支持供應(yīng)商的新工作流程,他們變得沮喪实束。他們每周會(huì)進(jìn)行幾次數(shù)據(jù)的導(dǎo)入和導(dǎo)出奥秆,與此同時(shí),組織的其他成員會(huì)看到過時(shí)的數(shù)據(jù)咸灿,因?yàn)闆]有人意識(shí)到發(fā)生了什么构订。
    這里值得注意的是,支持?jǐn)?shù)據(jù)導(dǎo)入和導(dǎo)出的遺留系統(tǒng)替換的需求通潮苁福可能是這種變通方法造成的悼瘾。

  • 淘汰舊系統(tǒng)
    需要淘汰舊系統(tǒng)是遺留系統(tǒng)現(xiàn)代化的常見原因。這通常是由舊硬件或軟件支持服務(wù)的挑戰(zhàn)所驅(qū)動(dòng)的审胸,這些問題包括軟件支持服務(wù)成本上升和硬件和軟件支持合同到期等問題亥宿。
    我們發(fā)現(xiàn)通過業(yè)務(wù)的視角來查看舊系統(tǒng)很有用。因此砂沛,建立將舊系統(tǒng)替換本身理由不充分烫扼。相反,我們需要查看不替換舊系統(tǒng)對業(yè)務(wù)的影響碍庵,不替換會(huì)導(dǎo)致運(yùn)行成本不斷上升映企,或者由于缺乏系統(tǒng)支持服務(wù)或支持知識(shí)而產(chǎn)生的風(fēng)險(xiǎn)。
    雖然一些組織確實(shí)為舊技術(shù)的淘汰做好了計(jì)劃静浴,但許多組織似乎在問題達(dá)到危機(jī)點(diǎn)之前忽略了這個(gè)問題堰氓。反過來,這往往會(huì)促使組織采用看起來像低中斷選項(xiàng)或快速獲勝的現(xiàn)代化方法苹享,這些通常是反模式双絮,我們稍后會(huì)描述其中的一些陷阱。
    多年來富稻,我們一直震驚于有多少大型組織在不受支持的硬件和軟件上運(yùn)行他們的業(yè)務(wù),常見故事的且令人驚訝的是在 eBay 上購買備件白胀。如果您擁有遺留技術(shù)椭赋,則非常值得創(chuàng)建包含各種終止支持日期的日歷。
    雖然許多組織將舊系統(tǒng)的退役作為遺留系統(tǒng)現(xiàn)代化的關(guān)鍵結(jié)果或杠,但在不少的例子中發(fā)現(xiàn)這種情況實(shí)際上并沒有發(fā)生哪怔,遺留系統(tǒng)最后仍在使用,相關(guān)的業(yè)務(wù)目標(biāo)仍未實(shí)現(xiàn)。

  • 即將中斷
    對于某些組織而言认境,處理遺留問題的實(shí)際臨界點(diǎn)可能會(huì)由于外部因素而出現(xiàn)胚委,例如監(jiān)管變更、新的“初創(chuàng)”競爭對手或現(xiàn)有競爭對手的重大變化叉信。通常在這一點(diǎn)上亩冬,當(dāng)面臨“必須做”的更改時(shí),資金和響應(yīng)所需的時(shí)間變得過長硼身。
    外部事件使組織的領(lǐng)導(dǎo)層清楚他們不再有能力以成比例的成本進(jìn)行更改硅急。

  • 較新的技術(shù)
    采用新技術(shù)不應(yīng)該成為遺留系統(tǒng)現(xiàn)代化的原因,僅僅為了自己的利益而擁有更新技術(shù)很少是任何組織的關(guān)鍵目標(biāo)佳遂。相反营袜,它應(yīng)該以最能滿足企業(yè)當(dāng)前和未來需求的方式進(jìn)行選擇。這里的一個(gè)挑戰(zhàn)是技術(shù)變革的步伐正在加快丑罪,技術(shù)的“有用”壽命越來越短荚板。“有用”的實(shí)際定義取決于組織吩屹,但通常我們需要考慮以下事項(xiàng):

    • 允許競爭優(yōu)勢
    • 匹配競爭對手或市場產(chǎn)品
    • 允許更快的變化速度
    • 更換更便宜
    • 運(yùn)行成本較低

    我們今天做出的關(guān)于最好和最有用的技術(shù)的選擇很可能會(huì)在相對較短的時(shí)間內(nèi)被更好的替代品所取代跪另。這使得在尋找技術(shù)以滿足未來需求方面做出正確的決定可能非常危險(xiǎn)。
    這里的一個(gè)好方法是不要做出任何在 2-3 年內(nèi)無法輕易“完成”的選擇祟峦。這對技術(shù)選擇以及整體設(shè)計(jì)和方法都有影響罚斗。當(dāng)我們承認(rèn)這種加速的變化步伐時(shí),選擇一個(gè)具有 5 到 10 年回報(bào)時(shí)間的大型平臺(tái)是很難證明的宅楞。

側(cè)框內(nèi)容:我們想像 Netflix 一樣
我們多次看到的一個(gè)問題是我們所說的“Netflix Envy”针姿。這就是組織的技術(shù)領(lǐng)導(dǎo)者專注于像 Netflix 或其他一些成功的大型科技公司一樣的地方。這意味著他們試圖模仿工作方式或選擇相同的技術(shù)解決方案厌衙。如果他們也經(jīng)常從事流媒體電影業(yè)務(wù)距淫,這可能是合適的,但這會(huì)導(dǎo)致選擇不合適的技術(shù)婶希。這些技術(shù)通常具有擴(kuò)展能力榕暇,但也具有大多數(shù)企業(yè)根本不需要的更高程度的復(fù)雜性和成本。

決定如何將問題分解成更小的部分

從廣義上講喻杈,這涉及在當(dāng)前的業(yè)務(wù)和技術(shù)架構(gòu)中找到正確的“接縫”彤枢。重要的是,您必須考慮當(dāng)前解決方案的元素如何映射到不同的業(yè)務(wù)能力筒饰。對于遺留系統(tǒng)缴啡,這通常意味著發(fā)現(xiàn)一個(gè)大型技術(shù)解決方案如何滿足多種業(yè)務(wù)需求,然后查看是否可以使用新解決方案提取單獨(dú)的需求以進(jìn)行獨(dú)立交付瓷们。理想情況下业栅,這些應(yīng)該是可交付的秒咐,彼此之間的依賴性最小。

一個(gè)普遍的反對意見是找到這些接縫太難了碘裕。雖然我們同意它起初具有挑戰(zhàn)性携取,但我們發(fā)現(xiàn)它是一種比通常導(dǎo)致功能對等和大爆炸發(fā)布的替代方法更好的方法。我們還觀察到帮孔,許多組織排除了這種方法雷滋,因?yàn)樗麄児铝⒌乜创夹g(shù)或業(yè)務(wù)流程。只改變技術(shù)的一部分你弦,或者只獨(dú)立更新一個(gè)業(yè)務(wù)流程很可能會(huì)失敗惊豺,但如果我們可以考慮然后將兩者一起實(shí)施,就有辦法“吃大象”禽作。

  • 入門
    在旅程開始時(shí)尸昧,遺留系統(tǒng)現(xiàn)代化似乎是一個(gè)最令人生畏的命題。像任何旅程一樣旷偿,我們必須首先嘗試了解要采取的初始方向烹俗。此外,像所有旅程一樣萍程,您必須從您所在的地方開始幢妄。我們遇到的一個(gè)常見問題是,我們似乎經(jīng)常從茂密森林開始茫负,看不到前方的道路蕉鸳,因此不知道要采取的方向。那么忍法,第一步就是爬上一棵樹潮尝,環(huán)顧四周!這意味著在最短的時(shí)間內(nèi)盡可能地了解當(dāng)前的系統(tǒng)和架構(gòu)饿序。這通常很難做到勉失,而且很容易陷入過多的細(xì)節(jié)中。
    幸運(yùn)的是原探,有許多非常有用的工具可以協(xié)同使用以獲得足夠好的理解以繼續(xù)進(jìn)行乱凿。這些工具在別處詳細(xì)討論,但匯總列表將包括 事件風(fēng)暴咽弦、 沃德利映射徒蟆、業(yè)務(wù)能力映射和域映射。請注意型型,在此列表中段审,我們主要著眼于業(yè)務(wù)概念如何映射到系統(tǒng)架構(gòu)中,進(jìn)而了解該架構(gòu)如何 支持價(jià)值生成输莺。這是一個(gè)經(jīng)常缺失的視圖戚哎,尤其是對于遺留系統(tǒng)。
理解問題的模式 理解問題的模式
價(jià)值流圖 ? 描述用戶如何完成工作的人工制品
事件風(fēng)暴 ? 用于理解業(yè)務(wù)流程的技術(shù)

? 目前只是一個(gè)介紹嫂用,還沒有進(jìn)行填充

側(cè)邊欄內(nèi)容:事件風(fēng)暴 - 現(xiàn)代流程映射的瑞士軍刀
關(guān)于該技術(shù)的文章很多型凳,作者發(fā)現(xiàn)它是一種非常通用的工具,可以在多種情況下使用嘱函。事實(shí)上甘畅,除了繪制業(yè)務(wù)流程和領(lǐng)域外,作者還使用它進(jìn)行價(jià)值流映射和可視化生產(chǎn)路徑往弓。

具體來說疏唾,我們發(fā)現(xiàn)人們經(jīng)常在遺留系統(tǒng)的邊界處停止發(fā)現(xiàn)活動(dòng),“這里有溝”函似,就沒有了進(jìn)一步槐脏。如果不跨越邊界并揭示遺留系統(tǒng)如何支持(或阻礙)業(yè)務(wù)流程和活動(dòng),則很難找到并提取要交付的薄片撇寞。
另一個(gè)經(jīng)常被忽視且非常有價(jià)值的信息來源是系統(tǒng)的用戶本身顿天。事實(shí)上,在筆者經(jīng)驗(yàn)蔑担,這是經(jīng)常在那里你可以找到令人驚訝的數(shù)額個(gè)有用的東西牌废,尤其是暴露出許多變通方法,并影子IT生態(tài)系統(tǒng)啤握,通常積聚圍繞舊的系統(tǒng)-也就是Access數(shù)據(jù)庫和版本的Excel電子表格實(shí)際上經(jīng)營業(yè)務(wù)鸟缕。客戶旅程圖排抬、創(chuàng)建服務(wù)藍(lán)圖和價(jià)值流圖是用來表現(xiàn)這種細(xì)節(jié)的良好效果的工具懂从。

解決問題的模式 解決問題的模式
提取產(chǎn)品線 按產(chǎn)品線識(shí)別和分離系統(tǒng)。
提取價(jià)值流 ? 識(shí)別和分離關(guān)鍵價(jià)值流
功能奇偶校驗(yàn) 使用新技術(shù)堆棧復(fù)制遺留系統(tǒng)的現(xiàn)有功能畜埋。
一個(gè)真戒指 ? 通過識(shí)別獨(dú)特和共享的業(yè)務(wù)能力來細(xì)分問題

? 目前只是一個(gè)介紹莫绣,還沒有進(jìn)行填充

  • 成功交付零件
    需要更快的更改以及在沒有大量依賴的情況下增量交付和獨(dú)立更改業(yè)務(wù)元素的能力通常會(huì)導(dǎo)致“敏捷”交付方法以及基于微服務(wù)的架構(gòu)。持續(xù)交付成為這些可單獨(dú)部署的組件的必備條件悠鞍。使這一挑戰(zhàn)超出普通軟件交付范圍的原因在于对室,尋找從現(xiàn)有大型解決方案的元素中切入、共存并最終替換元素的策略咖祭。存在幾種成功的策略掩宜,包括并行運(yùn)行、入口分叉和流量分流么翰。
交付模式
金絲雀發(fā)布 ? 對部分用戶進(jìn)行更改
停止世界切換 ? 在切換到新系統(tǒng)的同時(shí)暫停正常的業(yè)務(wù)活動(dòng)
恢復(fù)到源 ? 確定數(shù)據(jù)的原始來源并與之整合
轉(zhuǎn)移流量 ? 首先將關(guān)鍵業(yè)務(wù)活動(dòng)和流程從遺留系統(tǒng)中轉(zhuǎn)移出去
黑暗發(fā)射 ? 在不使用結(jié)果的情況下調(diào)用新的后端功能以評估其性能影響牺汤。
傳統(tǒng)模擬 ? 新系統(tǒng)以舊系統(tǒng)不知道任何更改的方式與遺留系統(tǒng)交互。
事件攔截 ? 攔截系統(tǒng)狀態(tài)的任何更新并將其中一些路由到新組件

? 目前只是一個(gè)介紹浩嫌,還沒有進(jìn)行填充

改變組織以允許這種情況持續(xù)發(fā)生

如果我們退后一步并查看交付新業(yè)務(wù)需求的整個(gè)過程檐迟,我們會(huì)很快發(fā)現(xiàn)這只是部分技術(shù)問題补胚。如果我們使用更新的技術(shù)來減少構(gòu)建解決方案的時(shí)間和成本,那么我們將強(qiáng)調(diào)與達(dá)成一致的要求和將更改投入生產(chǎn)的任何問題追迟。

我們需要改變組織結(jié)構(gòu)和流程以充分利用更好的技術(shù)溶其,根據(jù)“康威定律”,我們還需要一個(gè)促進(jìn)這一點(diǎn)的技術(shù)架構(gòu)敦间。如果團(tuán)隊(duì)和他們的溝通是圍繞現(xiàn)有的遺留解決方案和流程組織的瓶逃,我們可能需要使用康威逆定律來重組他們, 以匹配新的解決方案及其架構(gòu)廓块。

側(cè)邊框內(nèi)容: 最難的轉(zhuǎn)變是范式轉(zhuǎn)變
在傳奇管理顧問 Eli Goldratt 發(fā)表《目標(biāo)》 20 年后厢绝,他參加了《財(cái)富》小型企業(yè)的采訪,有人問他為什么這么多組織變革緩慢带猴。他解釋說昔汉,大多數(shù)人會(huì)盡其所能避免像當(dāng)時(shí)的約束理論那樣根本性的變化。他繼續(xù)說拴清,他們將盡其所能避免范式轉(zhuǎn)變挤庇。
他繼續(xù)建議,為了成功地改變范式贷掖,需要三件事嫡秕。
1.必須有真正的壓力來改善結(jié)果
2.并且,同一范式中的其他一切都已經(jīng)嘗試過
3.他們在邁出第一步時(shí)得到了幫助

遺留系統(tǒng)可以約束和限制采用替代現(xiàn)代工程實(shí)踐的能力苹威,尤其是那些與極限編程和持續(xù)交付相關(guān)的實(shí)踐昆咽。在更換遺留系統(tǒng)時(shí),重要的是要確保改變工作方式牙甫,以確保我們最終不會(huì)返回一個(gè)緩慢掷酗、困難且更改成本高的系統(tǒng)。

遺產(chǎn)系統(tǒng)也是組織文化和領(lǐng)導(dǎo)力的產(chǎn)物窟哺,如果沒有更廣泛的變化泻轰,您應(yīng)該期待與之前看到的相同的結(jié)果。我們已經(jīng)觀察到許多遺留系統(tǒng)現(xiàn)代化工作由于“企業(yè)抗體”而失敗且轨,這些抗體發(fā)現(xiàn)新發(fā)生的事情并采取行動(dòng)將其從組織中拒絕浮声。

舉一個(gè)廣泛拒絕變革的組織的例子;我們與一家非常大的電信公司合作旋奢,該公司希望為手機(jī)開發(fā)軟件泳挥。領(lǐng)導(dǎo)層都明白這意味著比他們看到的專注于固定基礎(chǔ)設(shè)施的現(xiàn)有計(jì)劃更快的反饋周期和更頻繁的變化。

雖然領(lǐng)導(dǎo)層理解這一點(diǎn)至朗,但沒有對現(xiàn)有的工作實(shí)踐或運(yùn)行這些流程的中層管理人員進(jìn)行任何更改屉符。因此,現(xiàn)有的變更控制流程得到了嚴(yán)格的應(yīng)用。最后矗钟,軟件團(tuán)隊(duì)花在填寫變更控制表格和參加變更控制會(huì)議上的時(shí)間比他們制作軟件的時(shí)間要多唆香。“企業(yè)抗體”成功地拒絕了新的工作方式吨艇。

組織變革是一個(gè)大話題袋马,已有很多文獻(xiàn)可用,遺留問題的關(guān)鍵挑戰(zhàn)通常與時(shí)間相關(guān)秸应。很少有組織能夠在重新設(shè)計(jì)(或重建,對于外包受害者)整個(gè)交付方法以及組織結(jié)構(gòu)和關(guān)鍵業(yè)務(wù)流程的同時(shí)延遲遺留現(xiàn)代化碑宴。雖然更廣泛的組織轉(zhuǎn)型主題超出了我們的范圍软啼,但我們確實(shí)推薦了一些策略,用于在遺留環(huán)境中應(yīng)用和保護(hù)新的工作方式延柠。如果你只是改變傳統(tǒng)而不做其他事情祸挪,那么期望你會(huì)在幾年內(nèi)再次取代傳統(tǒng)是公平的。

持續(xù)組織變革的模式
按您的意思開始繼續(xù) ? 以您需要在上線后繼續(xù)的方式創(chuàng)建您的舊版替代品贞间。
受保護(hù)的飛行員 ? 為新工作創(chuàng)建一個(gè)試點(diǎn)計(jì)劃贿条,并將其與正常的公司治理流程分開
新公司 ? 組建全新公司,追求市場顛覆

? 目前只是一個(gè)介紹增热,還沒有進(jìn)行填充

組織轉(zhuǎn)型肯定還有其他策略和方法整以,我們只是強(qiáng)調(diào)了這兩種策略和方法,因?yàn)樗鼈冊谀撤N程度上允許盡早開始遺留現(xiàn)代化的工作峻仇。

示例:集成中間件移除

這個(gè)例子描述了我們的一個(gè)團(tuán)隊(duì)如何使用許多遺留系統(tǒng)現(xiàn)代化模式來成功替換對其客戶業(yè)務(wù)運(yùn)營至關(guān)重要的集成中間件公黑,作為更大的遺留現(xiàn)代化計(jì)劃的一部分。他們將模式和重構(gòu)相結(jié)合摄咆,成功地管理了業(yè)務(wù)風(fēng)險(xiǎn)凡蚜,并促進(jìn)了“吃大象”時(shí)特別堅(jiān)硬的部分的食用。

了解結(jié)果

我們團(tuán)隊(duì)面臨的挑戰(zhàn)是如何用新的可支持吭从、靈活的業(yè)務(wù)解決方案替換不受支持朝蜘、難以變更且成本高昂的集成中間件翘瓮。不會(huì)破壞現(xiàn)有業(yè)務(wù)運(yùn)營或?qū)⑵渲糜陲L(fēng)險(xiǎn)之中祸轮。有問題的中間件用于在后端系統(tǒng)和店面之間進(jìn)行集成馆蠕。這些系統(tǒng)共同負(fù)責(zé)每天銷售價(jià)值數(shù)千萬英鎊的高價(jià)值獨(dú)特產(chǎn)品憔晒。

這項(xiàng)工作是更大計(jì)劃中的一個(gè)高度優(yōu)先的部分缤灵。支持業(yè)務(wù)的整個(gè)后端系統(tǒng)正在被替換妒御,店面也將在幾年內(nèi)進(jìn)行現(xiàn)代化計(jì)劃佩厚。

因此蚊惯,按照上面的第 1 步辆床,團(tuán)隊(duì)需要實(shí)現(xiàn)的業(yè)務(wù)成果被定義為:

  1. 改善業(yè)務(wù)流程
    如何佳晶?這個(gè)特定的集成中間件解決方案包含大量邏輯,包括業(yè)務(wù)核心規(guī)則讼载,例如在哪個(gè)渠道銷售產(chǎn)品轿秧,或如何以及何時(shí)在店面內(nèi)展示待售產(chǎn)品中跌。這個(gè)現(xiàn)有的系統(tǒng)很難改變,扼殺了業(yè)務(wù)創(chuàng)新菇篡,邏輯上的缺陷導(dǎo)致了產(chǎn)品甚至沒有銷售的時(shí)期等問題漩符!

  2. 盡快淘汰舊系統(tǒng)
    為什么?減少現(xiàn)有(和增加)的許可和支持成本驱还。此外嗜暴,為了降低因在過時(shí)的支持中間件和數(shù)據(jù)庫技術(shù)上運(yùn)行關(guān)鍵功能而對業(yè)務(wù)造成的風(fēng)險(xiǎn)。


高級(jí)系統(tǒng)處理:用戶使用遺留后端系統(tǒng)中的屏幕單獨(dú)管理產(chǎn)品的定價(jià)和發(fā)布议蟆。對于每個(gè)發(fā)布的產(chǎn)品闷沥,該系統(tǒng)都會(huì)將一條消息放入 SwiftMQ 隊(duì)列。集成中間件將使用該消息咐容,創(chuàng)建其自己的產(chǎn)品狀態(tài)視圖舆逃,并調(diào)用商店前臺(tái)的遺留 SOAP API 來發(fā)布它。隨著時(shí)間的推移戳粒,集成中間件將使用 API 更新產(chǎn)品的狀態(tài)路狮,以更改產(chǎn)品向客戶提供的方式(例如,將產(chǎn)品從“僅預(yù)覽”更改為“新可用”等)蔚约。當(dāng)客戶購買產(chǎn)品時(shí)奄妨,舊店面將調(diào)用集成中間件提供的 API。

分解問題:第一個(gè)接縫和重構(gòu)

Inception期間苹祟,團(tuán)隊(duì)與對遺留系統(tǒng)有深入了解的人舉辦了一個(gè)研討會(huì)展蒂,以協(xié)作可視化原樣和未來的軟件架構(gòu)。完成此操作后苔咪,他們發(fā)現(xiàn)了一個(gè)技術(shù)接縫锰悼,可以在遺留后端和集成中間件之間以基于消息傳遞的集成形式加以利用。遺留后端团赏,一個(gè)老化的 J2EE 應(yīng)用程序箕般,將“發(fā)布產(chǎn)品”消息放置到一個(gè)非常舊版本的 SwiftMQ 提供的隊(duì)列中。該事件攔截模式在這里很有用舔清,如果作為實(shí)現(xiàn)基于內(nèi)容的路由 將允許控制如何路由來自舊后端的消息丝里,并創(chuàng)建一個(gè)選項(xiàng),使消息能夠路由到新系統(tǒng)体谒。

集成中間件還處理來自店面的消息(例如用于產(chǎn)品銷售)杯聚,使用 JDBC 直接更新遺留后端后面的主數(shù)據(jù)庫中的狀態(tài)。通過 SwiftMQ 的異步消息傳遞和 JDBC 數(shù)據(jù)庫更新共同構(gòu)成了傳統(tǒng)后端和集成中間件之間的接口抒痒。


盡管當(dāng)時(shí)沒有發(fā)現(xiàn)幌绍,該團(tuán)隊(duì)能夠在子系統(tǒng)規(guī)模上使用抽象分支模式作為替代遺留中間件的策略。抽象層是隊(duì)列和 JDBC。通過確保新的實(shí)現(xiàn)遵循該抽象層傀广,它可以被替換為“有缺陷的供應(yīng)商”而不會(huì)影響業(yè)務(wù)運(yùn)營颁独。

該團(tuán)隊(duì)所做的第一件事是通過重構(gòu)添加一個(gè)事件路由器來實(shí)現(xiàn)事件攔截。


創(chuàng)建事件路由器 (1) 時(shí)考慮了三個(gè)主要功能:

高級(jí)系統(tǒng)處理:這里選擇術(shù)語 重構(gòu)伪冰,因?yàn)橄到y(tǒng)的結(jié)構(gòu)發(fā)生了變化誓酒,而沒有任何可觀察到的行為變化。現(xiàn)在贮聂,當(dāng)用戶發(fā)布產(chǎn)品時(shí)靠柑,遺留后端系統(tǒng)仍會(huì)將發(fā)布消息放置到 SwiftMQ 隊(duì)列中。事件路由器現(xiàn)在使用來自該隊(duì)列的消息吓懈,而不是使用它的集成中間件歼冰,并將其排入隊(duì)列,不變地骄瓣,到另一個(gè) SwiftMQ 隊(duì)列中。集成中間件使用來自這個(gè)替代隊(duì)列的消息耍攘,通過簡單的配置設(shè)置可以進(jìn)行更改榕栏。

  1. 將消息從一個(gè) SwiftMQ 隊(duì)列中取出,并將它們放入另一個(gè) SwiftMQ 隊(duì)列中 (2)蕾各。一些配置的微不足道的更改使集成中間件能夠使用來自這個(gè)新隊(duì)列 (2) 的消息扒磁。
    總的來說,重構(gòu)使可觀察的系統(tǒng)行為保持不變式曲,但事件路由器現(xiàn)在是過渡架構(gòu)的一部分妨托,已插入到消息處理管道中。

  2. 事件路由器的愿景是通過配置將消息路由到替代目的地——使新實(shí)現(xiàn)能夠處理發(fā)布消息吝羞。事件攔截

  3. 事件路由器還將提供從舊的 SwiftMQ 技術(shù)到為目標(biāo)架構(gòu)選擇的新 ActiveMQ 技術(shù)的橋梁兰伤。

實(shí)現(xiàn)事件路由器并不像它本來的那么簡單。由于缺乏可用的驅(qū)動(dòng)程序/庫钧排,與 SwiftMQ 的集成存在問題敦腔,并且該方法多次受到挑戰(zhàn)。該團(tuán)隊(duì)了解這種方法將解鎖的選項(xiàng)的價(jià)值恨溜,并完成了工作并發(fā)布到生產(chǎn)中符衔。他們在野外監(jiān)控新組件,并準(zhǔn)備使用新的持續(xù)交付管道逐步增強(qiáng)其能力糟袁。

成功交付零件:構(gòu)建功能判族,維護(hù)合同

新的店面經(jīng)理 (1) 現(xiàn)在由團(tuán)隊(duì)迭代構(gòu)建。與此示例相關(guān)项戴,該構(gòu)建包括實(shí)現(xiàn) Legacy Mimic 模式的主數(shù)據(jù)庫適配器 (2)形帮。這是抽象層的一部分,需要使用從店面收到的銷售信息更新主數(shù)據(jù)庫。由于事件路由器不轉(zhuǎn)換消息沃缘,因此創(chuàng)建了 Legacy Event Adapter (3) ( Message Translator ) 以將消息轉(zhuǎn)換為新格式躯枢,而不是將舊世界暴露給新格式,并與新架構(gòu)的原則保持一致槐臀。傳統(tǒng)店面適配器(4) 也在新店面經(jīng)理 (1) 和舊店面之間實(shí)施锄蹂,以將新實(shí)施與店面更換時(shí)即將發(fā)生的未來變化隔離開來。

在舊店面 (5) 上引入了新的店面經(jīng)理將使用的新 API水慨。此外得糜,還添加了一項(xiàng)功能,可以將在新 API 上發(fā)布的產(chǎn)品的回調(diào)發(fā)送到新店面管理器的適配器 (4)晰洒。至關(guān)重要的是朝抖,這使遺留實(shí)現(xiàn)和新實(shí)現(xiàn)能夠并行運(yùn)行。

成功交付零件(續(xù)):過渡到實(shí)時(shí)服務(wù) - 使用第二個(gè)接縫

有了所有的部分谍珊,企業(yè)就能夠測試新的解決方案治宣,但如何以風(fēng)險(xiǎn)管理的方式將其推廣到實(shí)時(shí)服務(wù)中。

為此砌滞,他們利用了另一個(gè)接縫——這次使用的是按產(chǎn)品細(xì)分模式侮邀。事件路由器得到了增強(qiáng),可以按產(chǎn)品類型和唯一的產(chǎn)品 ID 添加可配置的路由 (6)贝润。該團(tuán)隊(duì)能夠通過 ID 測試單個(gè)產(chǎn)品的發(fā)布绊茧、管理和銷售,然后隨著時(shí)間的推移為路由器配置越來越多的產(chǎn)品類型打掘,從根本上增加了新解決方案處理的產(chǎn)品百分比华畏。

當(dāng)所有產(chǎn)品都由新系統(tǒng)處理時(shí),舊的集成中間件退役尊蚁,實(shí)現(xiàn)了許可證亡笑、支持和數(shù)據(jù)中心托管費(fèi)用的顯著節(jié)省。


高級(jí)系統(tǒng)處理:除非企業(yè)另有規(guī)定横朋,否則對給定產(chǎn)品的處理與以前一樣進(jìn)行况芒。對于企業(yè)樂于通過新系統(tǒng)路由它們的產(chǎn)品,處理現(xiàn)在如下叶撒。發(fā)布消息被放置在 SwiftMQ 隊(duì)列中绝骚。事件路由器將檢查消息有效負(fù)載并檢查產(chǎn)品制造商。如果已配置祠够,事件路由器會(huì)將這條消息原封不動(dòng)地放到 ActiveMQ 隊(duì)列中压汪。Legacy Event Adapter 將消息轉(zhuǎn)換為符合目標(biāo)架構(gòu)原則的業(yè)務(wù)事件。New Storefront Manager 應(yīng)用程序?qū)⒋鎯?chǔ)它自己的產(chǎn)品表示古瓤,并通過要發(fā)布的產(chǎn)品的隊(duì)列轉(zhuǎn)發(fā)命令消息止剖。
根據(jù)業(yè)務(wù)的要求腺阳,除了經(jīng)理通過發(fā)出新命令來更改加班時(shí)間之外,用戶現(xiàn)在還可以操縱產(chǎn)品在店面上的展示方式穿香。
當(dāng)產(chǎn)品(通過 v2 API 發(fā)布)售出時(shí)亭引,Legacy Store Front 會(huì)回調(diào) Legacy Storefront Adapter 提供的 API,該 API 將調(diào)用轉(zhuǎn)換為業(yè)務(wù)事件并將該事件放置到 ActiveMQ 隊(duì)列中皮获。新店面管理器和主數(shù)據(jù)庫適配器使用這些事件焙蚓。新店面經(jīng)理更新其產(chǎn)品的內(nèi)部狀態(tài),主數(shù)據(jù)庫適配器使用銷售信息更新舊主數(shù)據(jù)庫洒宝。

改變組織以允許這種情況持續(xù)發(fā)生

我們的團(tuán)隊(duì)已經(jīng)在組織的另一部分與客戶合作购公,并且已經(jīng)成功取代了不同的遺留系統(tǒng)。

在整個(gè)組織的工程級(jí)別雁歌,持續(xù)交付和良好的支持質(zhì)量實(shí)踐現(xiàn)在已成為既定規(guī)范宏浩,微服務(wù)風(fēng)格的架構(gòu)支持定期和獨(dú)立地將容器化服務(wù)部署到基于云的平臺(tái)上。

新計(jì)劃的團(tuán)隊(duì)與新的利益相關(guān)者合作靠瞎,需要在相同的“敏捷和持續(xù)交付”之旅中承擔(dān)業(yè)務(wù)的另一部分比庄,并且早期風(fēng)險(xiǎn)管理發(fā)布能夠贏得信任。隨著時(shí)間的推移乏盐,可以證明包括持續(xù)交付在內(nèi)的新工程和質(zhì)量實(shí)踐如何減輕歷史上導(dǎo)致更高級(jí)別官僚主義和治理的相同風(fēng)險(xiǎn)佳窑。因此,不那么頻繁丑勤、更大范圍的發(fā)布也被更小华嘹、更頻繁吧趣、更高置信度的部署所取代法竞,并在他們準(zhǔn)備好接受更改時(shí)切換到業(yè)務(wù)。

結(jié)束語

當(dāng)然强挫,與上面的簡化故事所暗示的相比岔霸,復(fù)雜性和集成要求要高得多。在生產(chǎn)中測試新實(shí)現(xiàn)后不久俯渤,考古學(xué)需求的一個(gè)例子就自我介紹了呆细。許多關(guān)鍵業(yè)務(wù)的管理信息報(bào)告不符合要求——產(chǎn)品正在“迷失”。

經(jīng)過大量挖掘八匠,團(tuán)隊(duì)發(fā)現(xiàn)集成中間件使用的數(shù)據(jù)庫(用于存儲(chǔ)長期運(yùn)行的業(yè)務(wù)事務(wù)的狀態(tài))已復(fù)制到組織的數(shù)據(jù)倉庫中絮爷。通過大量批處理作業(yè)、存儲(chǔ)過程和視圖梨树,這些數(shù)據(jù)可用于關(guān)鍵業(yè)務(wù) KPI 報(bào)告中坑夯。


需要額外的 Legacy 模擬來確保這些報(bào)告不會(huì)中斷。該團(tuán)隊(duì)對來自店面的銷售消息使用 Wire Tap抡四,并使用 JDBC 將數(shù)據(jù)注入到數(shù)據(jù)倉庫內(nèi)的適當(dāng)表中柜蜈。這些額外的模仿也成為過渡架構(gòu)的一部分仗谆,并在可能的情況下被刪除。

抽象分支的方法以及上述模式和實(shí)踐的使用是一種旨在降低風(fēng)險(xiǎn)的方法淑履。

使用事件攔截(技術(shù)接縫)隶垮、Legacy Mimics 和 Transitional Architecture 使客戶能夠解決問題。然后按產(chǎn)品(業(yè)務(wù)接縫)(在本例中為產(chǎn)品類型)進(jìn)行細(xì)分秘噪,從而能夠?qū)Ω鼜V泛的部署進(jìn)行精細(xì)控制并進(jìn)一步管理風(fēng)險(xiǎn)狸吞。總體而言缆娃,該方法使企業(yè)能夠以他們認(rèn)為合適的速度進(jìn)行系統(tǒng)更換捷绒。

這種方法允許管理風(fēng)險(xiǎn),但需要付出代價(jià)贯要。因此暖侨,需要考慮的一個(gè)問題是“企業(yè)對這種風(fēng)險(xiǎn)緩解有什么價(jià)值?” 對其進(jìn)行明確和量化崇渗,將使團(tuán)隊(duì)能夠根據(jù)它跟蹤投資字逗。事件路由器和傳統(tǒng)模擬是對旨在管理風(fēng)險(xiǎn)的過渡架構(gòu)投資的一部分。他們的角色是創(chuàng)造能夠管理風(fēng)險(xiǎn)的選項(xiàng)宅广。此類工作很容易被視為“扔掉”——因此盡可能避免這種成本葫掉。在這種“風(fēng)險(xiǎn)緩解的價(jià)值”與“過渡架構(gòu)的成本”的權(quán)衡中要明確和透明。

致謝

Bill Codding跟狱、Chris Ford俭厚、James Emmott、Kief Morris驶臊、Mark Taylor挪挤、Meaghan Waters、Peter Gillard-Moss关翎、Rebecca Parsons 和 Simon Brunning 在我們的內(nèi)部郵件列表中討論了這些模式的草稿扛门。James Emmott 建議在標(biāo)題中使用“置換”。

卡片插圖中使用的新舊曼徹斯特電車照片由Picasa 提供纵寝,經(jīng)過裁剪和顏色處理论寨。


作者介紹

2021 年 7 月 20 日


伊恩卡特賴特(Ian Cartwright)是 Thoughtworks 的技術(shù)總監(jiān),他在那里用他作為架構(gòu)師和開發(fā)人員的二十年經(jīng)驗(yàn)來幫助客戶提高他們的技術(shù)水平爽茴。

羅伯·霍恩(Rob Horn)是 Thoughtworks 的技術(shù)總監(jiān)葬凳。作為一名經(jīng)驗(yàn)豐富且充滿激情的技術(shù)顧問和敏捷實(shí)踐者,他在其 25 年以上的職業(yè)生涯中約有 15 年與客戶合作解決金融室奏、社會(huì)火焰、旅游和公共部門的遺留現(xiàn)代化挑戰(zhàn)。

詹姆斯·劉易斯(James Lewis) 是 Thoughtworks 的技術(shù)總監(jiān)和技術(shù)顧問委員會(huì)的成員窍奋。當(dāng)他經(jīng)常在會(huì)議上就分布式系統(tǒng)架構(gòu)和組織設(shè)計(jì)方面發(fā)表演講荐健,也會(huì)花時(shí)間為客戶提供這方面的建議酱畅。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市江场,隨后出現(xiàn)的幾起案子纺酸,更是在濱河造成了極大的恐慌,老刑警劉巖址否,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件餐蔬,死亡現(xiàn)場離奇詭異,居然都是意外死亡佑附,警方通過查閱死者的電腦和手機(jī)樊诺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來音同,“玉大人词爬,你說我怎么就攤上這事∪ň” “怎么了顿膨?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長叽赊。 經(jīng)常有香客問我恋沃,道長,這世上最難降的妖魔是什么必指? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任囊咏,我火速辦了婚禮,結(jié)果婚禮上塔橡,老公的妹妹穿的比我還像新娘梅割。我一直安慰自己,他們只是感情好谱邪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布炮捧。 她就那樣靜靜地躺著庶诡,像睡著了一般惦银。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上末誓,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天扯俱,我揣著相機(jī)與錄音,去河邊找鬼喇澡。 笑死迅栅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晴玖。 我是一名探鬼主播读存,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼为流,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了让簿?” 一聲冷哼從身側(cè)響起敬察,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尔当,沒想到半個(gè)月后莲祸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椭迎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年锐帜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畜号。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缴阎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出简软,到底是詐尸還是另有隱情药蜻,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布替饿,位于F島的核電站语泽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏视卢。R本人自食惡果不足惜踱卵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望据过。 院中可真熱鬧惋砂,春花似錦、人聲如沸绳锅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳞芙。三九已至眷柔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間原朝,已是汗流浹背驯嘱。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喳坠,地道東北人鞠评。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像壕鹉,于是被迫代替她去往敵國和親剃幌。 傳聞我的和親對象是個(gè)殘疾皇子聋涨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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