一均澳、生命周期
一個(gè)事物一旦出生恨溜,就必然會(huì)長(zhǎng)大,變異找前,一旦長(zhǎng)大糟袁,就面臨著衰老,接下來就是消亡了躺盛,這個(gè)過程就稱為一個(gè)事件的生命周期项戴,實(shí)際上就是指的生滅
每一個(gè)活動(dòng)都是一個(gè)生命周期,生命周期中包含生命周期槽惫,一個(gè)生命周期消亡會(huì)產(chǎn)生另一個(gè)生命周期
生命周期里包含有各種活動(dòng)周叮,這些活動(dòng)是推進(jìn)這個(gè)生命周期的必要因素,并且這些活動(dòng)之間有時(shí)間上的推進(jìn)關(guān)系
生命周期總是有一個(gè)主體界斜,因此更多的是明確指出某某的生命周期仿耽,所以識(shí)別出生命周期的主體是至關(guān)重要的事情
一個(gè)生命周期里面的活動(dòng)可以進(jìn)行拆分,拆分的原則就是形成若干個(gè)新的生命周期各薇,每個(gè)新的生命周期都有自己的主體项贺,拆分之后主體不變的子生命周期君躺,稱為核心生命周期,主體改變的稱為非核心生命周期开缎,尋找核心生命周期的過程實(shí)際上也就是一個(gè)發(fā)現(xiàn)內(nèi)聚的過程
拆分出來的生命周期各自都有自己的邊界棕叫,不會(huì)影響到其他的生命周期,因?yàn)楦髯缘淖兓荚谧约旱纳芷趦?nèi)確定奕删。每個(gè)主體的生命周期活動(dòng)的變化都累積在該主體本身俺泣,這就是內(nèi)聚。要做到內(nèi)聚完残,必然要先確定生命周期的主體和生命周期本身
空間上連續(xù)的限制可以通過生命周期拆分來打破伏钠,形成空間上并行和時(shí)間上串行執(zhí)行的狀況
非核心生命周期的管理和執(zhí)行、核心生命周期的管理和執(zhí)行可以在時(shí)間和空間上并行坏怪,但執(zhí)行仍然還是要依照拆分之前的大生命周期的順序
從生命周期內(nèi)部來看贝润,生命周期的每個(gè)階段是隨著時(shí)間的推進(jìn)而發(fā)生變化的绊茧,因此呈現(xiàn)出來的是一個(gè)按時(shí)間順序發(fā)展的狀況铝宵,當(dāng)啟動(dòng)一個(gè)核心子生命周期的時(shí)候,必須把樹上該節(jié)點(diǎn)的所有父生命周期啟動(dòng)才可以华畏,也就是所謂的業(yè)務(wù)流程鹏秋,因?yàn)榇笊芷诒旧韮?nèi)部活動(dòng)還是按照時(shí)間順序連續(xù)發(fā)生的
非核心子生命周期處于一種服務(wù)的狀態(tài),要按需給出結(jié)果亡笑,執(zhí)行時(shí)間足夠短的可以在請(qǐng)求的時(shí)候?qū)崟r(shí)執(zhí)行侣夷,太長(zhǎng)的則需要預(yù)先執(zhí)行好,需要時(shí)直接給出結(jié)果仑乌。非核心子生命周期拆分出來成為服務(wù)后百拓,這個(gè)服務(wù)不再僅僅給一個(gè)人用,而變成了所有人都能夠共享晰甚,不在局限于原有的大生命周期衙传,而大核心生命周期則變得更加精簡(jiǎn),可以專注于自己的核心生命周期活動(dòng)
二厕九、時(shí)間
生命周期的變化體現(xiàn)的就是時(shí)間蓖捶,而時(shí)間只不過是人們對(duì)事物變化的一個(gè)度量
在同樣的時(shí)間內(nèi)創(chuàng)造出更多的產(chǎn)出,相當(dāng)于把自己的生命延長(zhǎng)了扁远,盡量做自己擅長(zhǎng)的事情 俊鱼,以期獲得最大的產(chǎn)出
三、為什么會(huì)產(chǎn)生架構(gòu)
除了那些別人無(wú)法替代必須要由自己來完成的核心生命周期活動(dòng)外畅买,把其他的生命周期活動(dòng)并行起來并闲,在同樣多的時(shí)間內(nèi)做更多的事情,也相當(dāng)于延長(zhǎng)了自己的生命
原來需要一個(gè)人完成所有事情谷羞,生命周期被細(xì)分為很多小的非核心生命周期焙蚓,這些小的非核心生命周期,就可以由另外一個(gè)人來負(fù)責(zé),在空間上和時(shí)間上都得以并行购公,原來那個(gè)人只需要獲得另一個(gè)人的結(jié)果就可以了
四萌京、什么是架構(gòu)
架構(gòu)產(chǎn)生的動(dòng)力:必須由人執(zhí)行的工作、每個(gè)人的時(shí)間有限宏浩、對(duì)目標(biāo)系統(tǒng)有更高的要求知残、目標(biāo)系統(tǒng)的復(fù)雜性使得單個(gè)人完成這個(gè)系統(tǒng)時(shí)會(huì)受限于時(shí)間
架構(gòu)的思考來源于對(duì)生命周期的識(shí)別,以及對(duì)生命周期的拆分比庄,如果沒有生命周期拆分的思考求妹,就不能算架構(gòu)
建筑架構(gòu)按照人類生命周期的需求,對(duì)地球上的空間進(jìn)行切分佳窑,并通過門窗制恍、地基等技術(shù),保持和地球以及空間的有機(jī)的溝通
什么是架構(gòu):
根據(jù)要解決的人類的問題神凑,對(duì)目標(biāo)系統(tǒng)的邊界進(jìn)行界定
圍繞目標(biāo)系統(tǒng)核心生命周期進(jìn)行切分净神,切分的原則是要讓非核心生命周期獨(dú)立出來,便于不同的角色并行地開展工作
對(duì)這些切分出來的部分溉委,確立各自的生命周期及其主體鹃唯,以及負(fù)責(zé)的角色
在這些拆分出來的非核心生命周期和核心生命周期之間設(shè)立溝通機(jī)制,使得這些非核心生命周期能夠圍繞核心生命周期瓣喊,通過樹狀架構(gòu)組裝起來成為一個(gè)整體坡慌,共同為核心生命周期做出貢獻(xiàn)
人類架構(gòu)實(shí)際上就是指人們根據(jù)自己對(duì)世界的認(rèn)識(shí),為解決某個(gè)問題藻三,主動(dòng)地洪橘、有目的地去識(shí)別問題,并根據(jù)核心生命周期進(jìn)行分解棵帽、合并熄求,以解決這個(gè)問題的實(shí)踐活動(dòng)
人類的架構(gòu)總是在人類的業(yè)務(wù)遇到瓶頸的過程中產(chǎn)生,在瓶頸的解決中應(yīng)用岖寞,在業(yè)務(wù)消亡時(shí)抡四,也跟著消亡
架構(gòu)的生命周期被拆分為兩個(gè)子生命周期:
架構(gòu)設(shè)計(jì)生命周期,研究業(yè)務(wù)本身的生命周期仗谆,根據(jù)問題發(fā)現(xiàn)瓶頸指巡,進(jìn)行架構(gòu)拆分,把非核心生命周期拆分出來
架構(gòu)實(shí)施生命周期(核心)隶垮,為了把架構(gòu)的拆分落實(shí)到組織架構(gòu)上藻雪,讓每一個(gè)人能夠按照架構(gòu)的職責(zé)拆分,并行工作狸吞,執(zhí)行各自的生命周期
五勉耀、架構(gòu)和樹
主干就相當(dāng)于核心生命周期指煎,決定樹的生死至壤。枝葉是非核心生命周期
樹狀結(jié)構(gòu)特別適合于增長(zhǎng),圍繞著核心生命周期枢纠,把非核心生命周期剝離像街,也可以使得核心生命周期更加精簡(jiǎn)、輕量化晋渺,更容易應(yīng)對(duì)周圍環(huán)境的變化镰绎,樹干也更容易長(zhǎng)得壯實(shí)
分層實(shí)際上就是架構(gòu)樹拆分的結(jié)果,跨層訪問就形成了圖
不是樹狀結(jié)構(gòu)木西,嚴(yán)格來說不算架構(gòu)畴栖,因?yàn)椴⒉荒鼙WC權(quán)責(zé)對(duì)等,業(yè)務(wù)會(huì)受其阻礙不能順利長(zhǎng)大八千,甚至導(dǎo)致業(yè)務(wù)的失敗
架構(gòu)是順應(yīng)業(yè)務(wù)生命周期規(guī)律的一種拆分吗讶,這個(gè)拆分始終是圍繞著業(yè)務(wù)的核心生命周期的,結(jié)果也只有一種叼丑,就是一顆樹关翎,只有權(quán)責(zé)對(duì)待才能夠保證參與人能從其自身的工作中獲利星立,才能夠保障參與人能夠持續(xù)不斷地推進(jìn)業(yè)務(wù)的生命周期
六火焰、概念
人類架構(gòu)實(shí)際上解決的是人的問題,而概念是人互相溝通并認(rèn)識(shí)這個(gè)世界的基礎(chǔ)谦疾,對(duì)概念的認(rèn)識(shí)因而變得非常的重要
名相:名字指代的看到的東西就是相峰伙,就是事物的相狀。相實(shí)際上代表的是影像,以及這個(gè)影像背后所產(chǎn)生的作用,是人對(duì)這個(gè)作用的認(rèn)識(shí),并不是具體的某個(gè)東西霜第。而名是用來標(biāo)識(shí)這個(gè)影像和作用刃榨,用來溝通交流的
每個(gè)概念實(shí)際上所解決的苞轿,還是人遇到某個(gè)特定的問題秀睛,把解決問題的解決方案給定了一個(gè)名字,這個(gè)名字就是對(duì)應(yīng)的某個(gè)特定的概念
要做好架構(gòu)首先必須具備的能力就是要能夠正確地認(rèn)識(shí)概念畜号,能夠發(fā)現(xiàn)概念背后所代表的問題痹升,找出核心生命周期艺配,進(jìn)而才能夠認(rèn)識(shí)目標(biāo)領(lǐng)域所需要解決的問題
做架構(gòu)的時(shí)候赠法,很多時(shí)候都是在一個(gè)新的領(lǐng)域解決問題镶苞,必須要快速進(jìn)入并掌握這個(gè)領(lǐng)域聋涨,才能夠真正的解決問題
七茂腥、什么是抽象
抽象是“abstract”,是“抽取、摘要”的意思
每個(gè)事物本身都有其獨(dú)特的地方,我們稱為事物的個(gè)性,要定義一個(gè)事物只能用這個(gè)事物獨(dú)特的地方淘这,也就是它的個(gè)性剥扣,而不是共性,但抽象恰恰主要關(guān)注在共性上铝穷,要找出事物的個(gè)性钠怯,就必須要深入分析和理解 這個(gè)事物的核心生命周期,核心生物周期明確了躏筏,事物的個(gè)性也就明確了
不能用抽象來定義一個(gè)事物名党,抽象實(shí)際上是一個(gè)分類的過程,抽取出事物中抽取人所關(guān)心的一些特征盹牧,并且不同的人抽取的側(cè)重點(diǎn)是不一樣的,甚至完全不同
做架構(gòu)需要具備識(shí)別個(gè)性的能力骡技,也就是要有發(fā)現(xiàn)獨(dú)特問題的能力滚婉,必須親自體驗(yàn)業(yè)務(wù),感受業(yè)務(wù),才可能真正認(rèn)識(shí)業(yè)務(wù)的個(gè)性攻冷,真正認(rèn)識(shí)業(yè)務(wù)所面臨的問題震糖,在理解業(yè)務(wù)個(gè)性的基礎(chǔ)上,才能夠談共性徙缴,否則這個(gè)抽象就像是無(wú)根之木试伙,局限于個(gè)人的主觀認(rèn)識(shí)嘁信,是很難長(zhǎng)大的
八于样、識(shí)別問題
識(shí)別問題的能力基本上就決定了架構(gòu)師的水平
當(dāng)我們?nèi)ソ鉀Q一個(gè)問題的時(shí)候疏叨,一定要克服對(duì)時(shí)間的焦慮,耐心地先把問題搞清楚穿剖,只有真正敢投入思考“是誰(shuí)的問題”蚤蔓,關(guān)心“真正的問題是什么”的工程師,才有可能成為真正的架構(gòu)師
識(shí)別問題的一個(gè)最重要的前提就是要搞清楚:是誰(shuí)的問題糊余,也就是要先明確問題的主體是誰(shuí)秀又。主體搞清楚了,問題的邊界也跟著確定了贬芥,再去討論問題才有意義吐辙。
當(dāng)我們處理問題的時(shí)候,如果發(fā)現(xiàn)自己正在致力于把自己的工作完成蘸劈,就要馬上警惕起來昏苏,因?yàn)檫@樣下去會(huì)演變成沒有主人翁精神(Ownership)的工作態(tài)度。在面對(duì)概念的時(shí)候威沫,也會(huì)不求甚解贤惯,最終會(huì)導(dǎo)致無(wú)法真正的正解概念
架構(gòu)師要解決的基本問題,都是別人的問題棒掠,別人的問題解決了孵构,自己的問題才能解決掉:任何找上架構(gòu)師的問題,絕對(duì)都不是真正的問題烟很,發(fā)現(xiàn)問題永遠(yuǎn)比解決問題更加重要
明白了問題的主體颈墅,人們才可能真正地認(rèn)識(shí)問題是什么。因?yàn)閱栴}的主體是問題的隱含邊界雾袱,邊界不確定下來恤筛,問題就是不確定的。常用的方式就是直接面對(duì)主體進(jìn)行訪談谜酒,深入到主體的工作生活當(dāng)中叹俏,體驗(yàn)并感受這些問題,識(shí)別關(guān)鍵生命周期僻族,進(jìn)而識(shí)別出非關(guān)鍵生命周期
從問題暴露的點(diǎn)粘驰,一點(diǎn)點(diǎn)地去溯源查找,一定會(huì)找出來究竟是誰(shuí)的問題述么,以及是誰(shuí)的問題
要正正確的認(rèn)識(shí)問題蝌数,需要問兩個(gè)問題:這是誰(shuí)的問題、有什么問題
九度秘、切分的原則
很多時(shí)候問題的產(chǎn)生都是因?yàn)闇贤ǖ恼`解顶伞,或者主觀上有過多不必要的利益訴求導(dǎo)致的
架構(gòu)師要非常清楚饵撑,所有的切分調(diào)整,都對(duì)相關(guān)人的利益進(jìn)行調(diào)整唆貌,分工背后的動(dòng)力來自于每個(gè)人尋求自己的利益最大化的沖動(dòng)
所謂利益滑潘,其實(shí)就是保障自身的生命周期活動(dòng)推進(jìn)的質(zhì)量。人們需要放棄一些自己不擅長(zhǎng)的事情 锨咙,分工的結(jié)果讓大家都能夠得到更多语卤。人們對(duì)自己利益的渴望也是推動(dòng)社會(huì)物質(zhì)發(fā)展的原動(dòng)力
如何提供更好更有質(zhì)量的服務(wù)給這個(gè)社會(huì),提供的服務(wù)更好更多酪刀,就能夠換取更多更好的生活必需品粹舵,這也是人們?cè)谌祟惿鐣?huì)生存、立足骂倘、做人的基本道理和原則:先要付出才能夠有收獲
當(dāng)人們認(rèn)識(shí)到要主動(dòng)地去切分一個(gè)系統(tǒng)的時(shí)候眼滤,就不能忘掉利益這個(gè)原動(dòng)力,所有的切分決策都不能夠違背這一點(diǎn)
利益相關(guān)人負(fù)載太重是導(dǎo)致切分的原因历涝,權(quán)責(zé)不對(duì)等是切分不合理而導(dǎo)致的新問題诅需,對(duì)于負(fù)載太重的問題,本質(zhì)都是時(shí)間上的負(fù)載過重睬关,有限的時(shí)間內(nèi)無(wú)法得到期望的產(chǎn)出诱担。只有把該利益相關(guān)人在時(shí)間上連續(xù)的動(dòng)作,切分成時(shí)間或空間上可以并行的動(dòng)作电爹,在時(shí)間或空間上橫向擴(kuò)展蔫仙,讓更多的人并行工作來提升產(chǎn)出
架構(gòu)切分的原則:
被切分的生命周期,如果必須要生命周期的主體在連續(xù)時(shí)間內(nèi)持續(xù)執(zhí)行丐箩,而且不能夠被打斷并更換生命周期主體的話摇邦,就不能切分出去
每個(gè)生命周期的負(fù)責(zé)人,對(duì)所有負(fù)責(zé)生命周期的權(quán)力和義務(wù)必須是對(duì)等的屎勘,權(quán)責(zé)不對(duì)等最終會(huì)導(dǎo)致架構(gòu)無(wú)法落地施籍,甚至導(dǎo)致業(yè)務(wù)失敗
切分出來的生命周期,不應(yīng)該超出一個(gè)自然人的負(fù)載
切分是內(nèi)部活動(dòng)概漱,內(nèi)部無(wú)論怎么切丑慎,對(duì)整個(gè)系統(tǒng)的外部都應(yīng)該是透明的,如果因?yàn)榍蟹謱?dǎo)致整個(gè)系統(tǒng)解決的問題發(fā)生了變化 瓤摧,那么這個(gè)變化就不屬于架構(gòu) 的活動(dòng)
所有的架構(gòu)拆分都應(yīng)該形成樹狀的結(jié)果竿裂,不應(yīng)該變成有向釁,更不應(yīng)該是無(wú)向圖
權(quán)責(zé)不對(duì)等的情況一旦出現(xiàn) 照弥,架構(gòu)師必須馬上意識(shí)到富岳,這個(gè)問題持續(xù)時(shí)間越長(zhǎng)颈走,企業(yè)的動(dòng)作效率就會(huì)受到越大的影響罩驻,對(duì)利益相關(guān)人的利益是非常不利的,同樣對(duì)于企業(yè)的利益也是不利的
樹的層次越深影斑,溝通損失就越大,效率也就越低机打,平衡樹的深度可以做到比較均衡
架構(gòu)的切分過程就是建模的過程矫户,核心生命周期模型把所有的模型通過樹組織起來,形成一個(gè)新的模型
架構(gòu)的輸出實(shí)際上就是一個(gè)系統(tǒng)的模型姐帚,一棵以業(yè)務(wù)生命周期為樹干的樹吏垮,要識(shí)別出有多少個(gè)相關(guān)方障涯,每個(gè)相關(guān)方需要承擔(dān)哪些權(quán)力和義務(wù)罐旗,不同的相關(guān)方是以什么方式組合起來完成整個(gè)系統(tǒng)
在進(jìn)行架構(gòu)切分的時(shí)候,往往也是組織在長(zhǎng)大的時(shí)候
總結(jié):
架構(gòu)的拆分的導(dǎo)火索是人的負(fù)載太重唯蝶,也就是時(shí)間不夠
架構(gòu)的切分實(shí)際就是對(duì)利益相關(guān)人的利益進(jìn)行切分或合并九秀,使得每個(gè)利益相關(guān)人的權(quán)責(zé)對(duì)待,每個(gè)利益相關(guān)人可以為自己的利益負(fù)責(zé)
架構(gòu)切分的最終結(jié)果都會(huì)體現(xiàn)在組織架構(gòu)上粘我,只有這樣才能讓架構(gòu)落地并推進(jìn)
架構(gòu)切分的結(jié)果一定是一個(gè)樹狀鼓蜒,這也是為什么會(huì)產(chǎn)生分層 ,盡可能變成一棵平衡樹征字,才能讓整個(gè)系統(tǒng)的效率最大化
十都弹、架構(gòu)與流程
流程就是多個(gè)角色為了把一件事情做好,按時(shí)間順序協(xié)作并完成的整個(gè)過程匙姜,包含了很多的活動(dòng)畅厢,很多的判斷,很多的分支氮昧,本質(zhì)上也是一個(gè)生命周期
流程關(guān)注的是多個(gè)人如何把同一個(gè)目標(biāo)完成框杜,是描述整個(gè)事物發(fā)展各種可能性的樹
對(duì)業(yè)務(wù)流程梳理是非常重要的事,往往就代表了業(yè)務(wù)的核心袖肥。不要被樹枝咪辱、樹葉迷惑,樹干樹根才是真正的核心
流程的推動(dòng)都是和人相關(guān)的椎组,流程實(shí)際上串聯(lián)出來的是不同角色協(xié)作的過程
生命周期拆分之后油狂,就意味著權(quán)力的下放,因此往往會(huì)產(chǎn)生審批的流程
核心是業(yè)務(wù)生命周期寸癌,業(yè)務(wù)為了長(zhǎng)大专筷,發(fā)生了架構(gòu)拆分,形成了一顆樹灵份,而流程則把拆分之后的業(yè)務(wù)進(jìn)行組合仁堪,通過遍歷樹,重新形成了業(yè)務(wù)生命周期整體
十一填渠、什么是架構(gòu)師
架構(gòu)的目的就是為了增長(zhǎng)
架構(gòu)師會(huì)把需要增長(zhǎng)的業(yè)務(wù)了解清楚弦聂,挖掘出核心生命周期鸟辅,并確定核心生命周期的主體,就是要發(fā)現(xiàn)問題的主體莺葫,并確定核心問題匪凉,還需要對(duì)業(yè)務(wù)核心生命周期進(jìn)行分析,剝離出非核心生命周期捺檬,并根據(jù)當(dāng)前人員的狀況再层,合理地分配非核心生命周期的權(quán)責(zé)
還需要更進(jìn)一步,那就是根據(jù)對(duì)不同的生命周期的運(yùn)營(yíng)情況堡纬,對(duì)未來的增長(zhǎng)做一定的預(yù)判聂受,提前做好規(guī)劃,做相應(yīng)人員烤镐、技術(shù)的儲(chǔ)備——這就是戰(zhàn)略架構(gòu)
任何一個(gè)人蛋济,只要他在思考如何做得更好,如何做得更多炮叶,必然會(huì)導(dǎo)致他去思考核心生命周期碗旅,那么他已經(jīng)在做架構(gòu)的思考了
做架構(gòu)師,必須要具備調(diào)動(dòng)資源的能力镜悉,只能具備權(quán)力落地的人才能叫架構(gòu)師祟辟,架構(gòu)師本質(zhì)上就是權(quán)力的代名詞。
架構(gòu)師要把增長(zhǎng)放在自己的第一考慮要素侣肄,把識(shí)別核心生命周期及其主體作為第一思考旧困,這樣才能確保權(quán)力的合理分配,保證增長(zhǎng)的效率茫孔。必須深入到業(yè)務(wù)的核心領(lǐng)域叮喳,親身體會(huì)業(yè)務(wù)的痛點(diǎn),業(yè)務(wù)的個(gè)性缰贝,這樣才能夠挖掘出業(yè)務(wù)的核心生命周期馍悟,才能夠做好拆分
十二、什么是軟件
軟件實(shí)際上是人類有意無(wú)意地在計(jì)算機(jī)上模仿自己這種原始動(dòng)機(jī)的體現(xiàn)剩晴,讓人們能夠節(jié)省大量的工作時(shí)間锣咒,有更充足的時(shí)間去關(guān)注并推進(jìn)自身的核心生命周期
邱奇—圖靈論題:一切直覺上能靠可計(jì)算的函數(shù)都可用圖靈機(jī)計(jì)算,反之亦然
成本是我們?yōu)槭裁床捎糜?jì)算機(jī)和軟件的主要?jiǎng)恿υ廾郑梢詭椭藗児?jié)省大量的人員培訓(xùn)毅整,減少雇員的數(shù)目,使得人們脫離重復(fù)的勞動(dòng)
我們常說軟件或技術(shù)(軟件當(dāng)然也是一種技術(shù))是業(yè)務(wù)的使能者(Enabler)绽左,實(shí)際就是把業(yè)務(wù)的成本從原來很高降到了很低的程度而已悼嫉,并不是有了什么新的業(yè)務(wù)。另外拼窥,軟件也不是降低業(yè)務(wù)成本的唯一方式
軟件的出現(xiàn)讓機(jī)器的生命周期產(chǎn)生了分工戏蔑,形成了硬件生產(chǎn)生命周期和軟件生產(chǎn)生命周期兩種形式
軟件的出現(xiàn)蹋凝,讓只有“身體”的機(jī)器具備了“大腦”。機(jī)器通過更新“大腦”中軟件的方式不斷地學(xué)習(xí)总棵,變成了一個(gè)“活著”的虛擬“人”鳍寂。虛擬人的出現(xiàn),導(dǎo)致人類社會(huì)也開始軟件化情龄、互聯(lián)網(wǎng)化
軟件模擬出了一個(gè)虛擬世界迄汛,打破了物理時(shí)空的限制,極大地提高了生產(chǎn)力骤视,從而完成更多的生命周期
十三鞍爱、軟件的生命周期
一個(gè)軟件,因?yàn)槟硞€(gè)業(yè)務(wù)虛擬化的需要而產(chǎn)生尚胞;后續(xù)不斷地更新硬霍、修改,推動(dòng)軟件逐漸變異笼裳、長(zhǎng)大;當(dāng)該軟件不再被需要(因業(yè)務(wù)的變化)粱玲,或有更多好的軟件來替代時(shí)躬柬,該軟件就會(huì)被廢棄,完成使命而消亡
軟件的整個(gè)生命周期也會(huì)發(fā)生切分抽减,從而形成兩個(gè)子生命周期:軟件開發(fā)生命周期和軟件運(yùn)行生命周期
軟件運(yùn)行生命周期是核心生命周期允青,因?yàn)檐浖\(yùn)行生命周期的主體和大的生命周期一致。從另一個(gè)角度來說卵沉,人們真正需要的是軟件啟動(dòng)后為我們帶來的服務(wù)颠锉,也就是說軟件運(yùn)行生命周期才是人們真正需要軟件的地方
非核心生命周期:
軟件的開發(fā)生命周期:產(chǎn)生可運(yùn)行的軟件,內(nèi)部還會(huì)發(fā)生切分史汗,如需求生命周期琼掠、代碼開發(fā)生命周期、測(cè)試生命周期等
軟件的運(yùn)行生命周期:核心生命周期停撞,又包含軟件的訪問生命周期瓷蛙、軟件的功能生命周期、軟件的監(jiān)控生命周期
ROI(Return On Investment)在軟件開發(fā)組織的時(shí)候戈毒,是否需要?jiǎng)?chuàng)建一個(gè)軟件艰猬,要由大家一起來討論,認(rèn)證其必要性埋市,確定代價(jià)和所獲得價(jià)值的對(duì)比
從軟件運(yùn)行生命周期角度來說冠桃,一個(gè)可運(yùn)行的獨(dú)立部署單元才算是一個(gè)軟件
從決定開始生產(chǎn)一個(gè)軟件,到軟件真正地運(yùn)行起來道宅,會(huì)經(jīng)歷一段時(shí)間的代碼積累食听,這個(gè)過程就是軟件開發(fā)的生命周期
軟件開發(fā)過程中所有活動(dòng)都是為了幫助軟件工程師能夠把代碼寫對(duì)套么,把業(yè)務(wù)虛擬出來,工程師必須要理解日常生活中是怎么完成業(yè)務(wù)工作的碳蛋,然后才能在計(jì)算機(jī)中用代碼模擬出來
要想對(duì)軟件和計(jì)算機(jī)之外 的行業(yè)業(yè)務(wù)實(shí)現(xiàn)模擬胚泌,軟件工程師還要對(duì)該業(yè)務(wù)所在行業(yè)的專業(yè)知識(shí)進(jìn)行一定的積累,并要超越聽懂和能執(zhí)行兩個(gè)階段肃弟,才能夠用另外一種語(yǔ)言玷室,也就是計(jì)算機(jī)語(yǔ)言表達(dá)出來,這是一個(gè)相當(dāng)高的要求
因?yàn)榈拇嬖隗允埽浖?huì)產(chǎn)生不同的版本穷缤,每個(gè)版本的軟件都是一個(gè)完事的開發(fā)生命流程,版本疊加的過程也就是軟件不斷長(zhǎng)大的過程
線上版本的運(yùn)行是軟件生命周期的核心箩兽,不管有多少個(gè)開發(fā)生命周期并行津肛,線上版本都只有一個(gè),必須確保版本上線的順序發(fā)生
十四汗贫、什么是軟件架構(gòu)
軟件要解決的問題:
業(yè)務(wù)的問題:需要明確業(yè)務(wù)的主體身坐,并深入到業(yè)務(wù)的生命周期變化中,找到業(yè)務(wù)獨(dú)特的個(gè)性
計(jì)算機(jī)的問題:在軟件開發(fā)生命周期中落包,如何用計(jì)算機(jī)語(yǔ)言來表達(dá)業(yè)務(wù)的生命周期部蛇,明確軟件的拆分及軟件的內(nèi)部組織;在軟件運(yùn)行生命周期中咐蝇,硬件涯鲁、擴(kuò)展、保證可用性有序、收集數(shù)據(jù)
業(yè)務(wù)問題的本質(zhì)是業(yè)務(wù)所服務(wù)對(duì)象的利益問題抹腿;軟件工程師的問題本質(zhì)就是要用代碼將業(yè)務(wù)模擬出來,形成軟件旭寿,交給計(jì)算機(jī)運(yùn)行
簡(jiǎn)單地增加軟件工程師并不能有效地提高產(chǎn)出警绩,因?yàn)闃I(yè)務(wù)的生命周期只有一個(gè),對(duì)業(yè)務(wù)的理解并不是簡(jiǎn)單增加人手就可以解決的许师。只有老老實(shí)實(shí)地分析業(yè)務(wù)的生命周期房蝉,通過拆分才能提升并行度。因此需要把軟件生命周期中的活動(dòng)列出來微渠,逐個(gè)進(jìn)行分析
對(duì)于軟件開發(fā)生命周期搭幻,也就是軟件工程師的核心生命周期,虛擬化業(yè)務(wù)需要完成:
學(xué)習(xí)業(yè)務(wù)知識(shí)逞盆,認(rèn)識(shí)生命周期檀蹋,以及生命周期中所涉及的利益相關(guān)人的核心利益訴求
通過對(duì)業(yè)務(wù)知識(shí)的學(xué)習(xí),確定核心生命周期和非核心生命周期,以及這些生命周期的組織方式俯逾。對(duì)業(yè)務(wù)進(jìn)行建模贸桶,并把建模結(jié)果交給編程語(yǔ)言實(shí)現(xiàn),這就是業(yè)務(wù)的動(dòng)作模型桌肴,也是虛擬人的組織架構(gòu)
理解參與業(yè)務(wù)的利益相關(guān)人是如何和業(yè)務(wù)打交道皇筛,并為每個(gè)角色的權(quán)力和義務(wù)進(jìn)行代碼描述并落地實(shí)現(xiàn)的
考慮如何把業(yè)務(wù)運(yùn)行的結(jié)果持久化,并通過合適的手段把持久化后的數(shù)據(jù)在合適的時(shí)間合適的地點(diǎn)加載出來
對(duì)于軟件運(yùn)行生命周期坠七,即如何讓軟件運(yùn)行起來水醋,需要完成:
需要多少硬件設(shè)備來滿足訪問?
軟件要如何拆分部署到哪些硬件設(shè)備上彪置?
這些軟件如何通過硬件設(shè)備連接到一起拄踪?
軟件能否支持通過部署到新增機(jī)器上的方式擴(kuò)大對(duì)業(yè)務(wù)的支撐?
當(dāng)硬件失效時(shí)拳魁,軟件是否能夠不影響用戶的訪問惶桐?
軟件產(chǎn)生的數(shù)據(jù),能否支持提取出來并分析
按照軟件開發(fā)核心生命周期的流程潘懊,把不同的非核心生命周期串聯(lián)起來姚糊,使得這些非核心生命周期能夠并行開展工作,這就是軟件工程卦尊。所形成的就是軟件開發(fā)團(tuán)隊(duì)的組織架構(gòu)
軟件架構(gòu)就是通過對(duì)軟件生命周期的拆分叛拷,在符合業(yè)務(wù)架構(gòu)的前提下,以達(dá)到軟件本身訪問增長(zhǎng)目的的方式岂却。這個(gè)增長(zhǎng)需要軟件開發(fā)的增長(zhǎng),也需要軟件運(yùn)行的增長(zhǎng)裙椭,由此達(dá)到所支撐業(yè)務(wù)的增長(zhǎng)
離開了組織架構(gòu)躏哩,任何軟件架構(gòu)都是紙上談兵,因?yàn)榧軜?gòu)的核心生命周期就是架構(gòu)的執(zhí)行
業(yè)務(wù)相當(dāng)于基因揉燃,而架構(gòu)樹狀拆分則相當(dāng)于細(xì)胞的分裂
十五扫尺、什么是軟件架構(gòu)師
具備架構(gòu)師頭銜的人并不一定是架構(gòu)師
如果一個(gè)人在工作中,只是致力于完成自己的工作炊汤,以做好自己的工作為主要目標(biāo)正驻,那么用自己行業(yè)的知識(shí)去理解另一個(gè)行業(yè),就很容易出現(xiàn)溝通的困境抢腐,造成很多理解上的困難
要想成為架構(gòu)師姑曙,則必須超越對(duì)時(shí)間的恐懼,看清楚要解決問題的主體是業(yè)務(wù)人員迈倍,而不是自己伤靠,即需要解決的問題是另一個(gè)行業(yè)的問題,自己是在幫助業(yè)務(wù)人員解決問題啼染。工作是否完成由業(yè)務(wù)人員決定宴合,而不是軟件工程師自己焕梅。
軟件工程時(shí)對(duì)時(shí)間有恐懼和壓力,是因?yàn)樗麄儼寻磿r(shí)完成自己的工作當(dāng)成了自己的最大利益卦洽,人對(duì)時(shí)間的壓力是與生俱來的贞言,并且對(duì)業(yè)務(wù)的不了解也會(huì)導(dǎo)致他們沒有太大的把握
軟件行業(yè)通常是以業(yè)務(wù)的問題是否解決為判斷標(biāo)準(zhǔn),是在解決另一個(gè)行業(yè)的問題阀蒂,要求架構(gòu)師把完成業(yè)務(wù)的工作當(dāng)成自己的最大利益该窗,對(duì)業(yè)務(wù)領(lǐng)域理解得越深入,就越知道如何去發(fā)現(xiàn)問題脂新,慢慢就成為業(yè)務(wù)專家了挪捕,只有做到這一點(diǎn)才能在業(yè)務(wù)領(lǐng)域建立自信,成為一個(gè)合格的軟件架構(gòu)師
軟件架構(gòu)師需要去拆分生命周期争便,并要形成組織架構(gòu)去落實(shí)架構(gòu)執(zhí)行级零,而且要平衡別人的利益,甚至去調(diào)整別人的利益滞乙,必須要具備權(quán)力去調(diào)整軟件的開發(fā)生命周期和軟件的運(yùn)行生命周期
架構(gòu)師的核心在于架構(gòu)的執(zhí)行奏纪,軟件架構(gòu)師必須是一個(gè)組織的領(lǐng)導(dǎo)人,有權(quán)力調(diào)動(dòng)這個(gè)組織的架構(gòu)斩启,才能夠更好地發(fā)揮架構(gòu)師的作用
軟件開發(fā)團(tuán)隊(duì)的組織領(lǐng)導(dǎo)人其實(shí)都是架構(gòu)師序调,只是沒有這個(gè)頭銜而已,真正的架構(gòu)師不一定具備架構(gòu)師的頭銜
人類架構(gòu)的核心就是組織架構(gòu)兔簇,正確的組織架構(gòu)才能保證架構(gòu)的執(zhí)行
架構(gòu)師面對(duì)技術(shù)很冷靜发绢,很平等地對(duì)待所有的技術(shù),只要場(chǎng)景適合就會(huì)采納垄琐,是技術(shù)的使用者边酒,將技術(shù)當(dāng)作解決增長(zhǎng)問題的手段和工具,而不是被技術(shù)束縛住
架構(gòu)師必須深入地了解不同的技術(shù)狸窘,知道這些技術(shù)的強(qiáng)項(xiàng)和弱點(diǎn)墩朦,懂得合適的取舍,不一定是所有技術(shù)的專家翻擒,沒有永遠(yuǎn)最好的技術(shù)氓涣,也沒有永遠(yuǎn)最差的技術(shù),而問題總是在不斷發(fā)生變化 的陋气,對(duì)于這一點(diǎn)劳吠,架構(gòu)師要有清醒的認(rèn)識(shí)
架構(gòu)師拆分生命周期,技術(shù)人員實(shí)現(xiàn)生命周期
架構(gòu)師思考技術(shù)時(shí)更多地考慮技術(shù)對(duì)生命周期拆分的支撐恩伺,以及不同技術(shù)實(shí)現(xiàn)拆分時(shí)落地的成本和收益赴背,以最少的成本達(dá)到更高的增長(zhǎng)
技術(shù)是架構(gòu)師手中的工具,當(dāng)沒有合適的技術(shù)時(shí),架構(gòu)師會(huì)去創(chuàng)造技術(shù)凰荚,或者催生出新的技術(shù)
技術(shù)包括軟件技術(shù)和業(yè)務(wù)技術(shù)
技術(shù)人員如果想成為架構(gòu)師燃观,就必須跳出技術(shù)的視角,換一個(gè)角度去看技術(shù)便瑟。要把時(shí)間花在研究生命周期規(guī)律和業(yè)務(wù)的增長(zhǎng)上缆毁,花在選擇合適的技術(shù)上,而不只是追求新潮的或自己喜歡的技術(shù)
十六到涂、業(yè)務(wù)脊框、架構(gòu)和技術(shù)三者的關(guān)系
軟件工程師的誤區(qū):
架構(gòu)和技術(shù)實(shí)際上是等同的,學(xué)的技術(shù)越多践啄,架構(gòu)水平越高
看不上業(yè)務(wù)浇雹,覺得業(yè)務(wù)太平凡、太低調(diào)屿讽,并且業(yè)務(wù)人員總是來挖坑
通過人為創(chuàng)造條件昭灵,讓指定的規(guī)律按照人類的意愿發(fā)生,這就是技術(shù)
所謂業(yè)務(wù)伐谈,就是要解決人類的問題烂完,目的是為了支撐人類自身的生命周期,使人類獲得利益
技術(shù)總是在人類對(duì)業(yè)務(wù)目標(biāo)要求不斷提高的情況下產(chǎn)生的诵棵,其目的是為了獲取更大的利益:
技術(shù)是為了解決業(yè)務(wù)問題而產(chǎn)生的抠蚣,沒有了業(yè)務(wù),技術(shù)也就沒有了存在的前提
有了更好的技術(shù)后履澳,效率較差的技術(shù)嘶窄,就會(huì)慢慢地被淘汰,從而消失距贷,一切都遵從人類的利益訴求
不同技術(shù)之間有兩種關(guān)系:
在解決同一個(gè)業(yè)務(wù)的前提下护侮,更高效、更低成本的技術(shù)储耐,會(huì)淘汰低效、高成本的技術(shù)滨溉。這是人類利益訴求所決定的什湘。
通常剛開始解決核心業(yè)務(wù)問題的核心技術(shù)的效率是比較低的,只是把不可能變成了可能晦攒,慢慢就會(huì)有提高效率的需求出現(xiàn)闽撤,改進(jìn)技術(shù)的要求就會(huì)變得很迫切
業(yè)務(wù)是核心,技術(shù)是解決業(yè)務(wù)問題的工具脯颜,而架構(gòu)是讓業(yè)務(wù)長(zhǎng)大的組織方法哟旗。架構(gòu)需要用技術(shù)來實(shí)現(xiàn)拆分,而技術(shù)需要架構(gòu)來合理組織,以提升效率
產(chǎn)生沖突往往都是因?yàn)闃I(yè)務(wù)團(tuán)隊(duì)和技術(shù)團(tuán)隊(duì)的組織架構(gòu)不匹配導(dǎo)致的闸餐,只有從組織架構(gòu)上溝通才能解決饱亮,所以說,業(yè)務(wù)人員和技術(shù)人員的組織架構(gòu)相互匹配舍沙、對(duì)應(yīng)十分重要近上,可以減少大部分的溝通問題
很多架構(gòu)師、技術(shù)人員主要專注于計(jì)算機(jī)相關(guān)的技術(shù)拂铡,看不上業(yè)務(wù)壹无,背后的主要原因是對(duì)業(yè)務(wù)恐懼,更愿意專心于自己擅長(zhǎng)的軟件技術(shù)感帅,因而忽略了業(yè)務(wù)斗锭,這也是為什么技術(shù)總是和業(yè)務(wù)相沖突的部分原因
架構(gòu)師應(yīng)該承擔(dān)起解決業(yè)務(wù)問題的角色,專注于業(yè)務(wù)和軟件本身的架構(gòu)失球,通過對(duì)軟件開發(fā)生命周期和軟件運(yùn)行生命周期的拆分岖是,讓技術(shù)人員合理地分工
是否重新發(fā)明輪子?
當(dāng)技術(shù)所要解決的問題和拆分出來要解決的問題完全匹配時(shí)她倘,這是最完美的
當(dāng)技術(shù)所提供的能力遠(yuǎn)遠(yuǎn)超過需要解決的問題時(shí)璧微,往往掌握技術(shù)和維護(hù)技術(shù)就會(huì)成為負(fù)擔(dān)
當(dāng)技術(shù)所提供的能力和我們所要解決的問題部分匹配時(shí),要判斷是否要采用硬梁,最終還是要看成本
開源的僅僅是代碼前硫,而代碼并非是軟件生命周期的核心,軟件生命周期的核心是代碼的運(yùn)行生命周期和用戶訪問生命周期荧止,而不是代碼建立生命周期屹电。很少企業(yè)會(huì)把自己的軟件運(yùn)營(yíng)體系拿出來說事兒。
要想采用開源技術(shù)跃巡,就要理解這些開源技術(shù)往往都有其特定的使用場(chǎng)景危号,一般先從理解作者面對(duì)的問題入手,也就是從業(yè)務(wù)入手素邪,分析作者是如何拆分業(yè)務(wù)生命周期的
十七外莲、軟件研發(fā)
軟件最初的編寫人員本身就是業(yè)務(wù)專家,業(yè)務(wù)非常精通兔朦,然后才學(xué)習(xí)用軟件來提升業(yè)務(wù)的
編寫軟件從科學(xué)計(jì)算中拆分出來偷线,變成了一個(gè)能用的服務(wù),成為了一個(gè)獨(dú)立的職業(yè)沽甥,具有獨(dú)立的生命周期
軟件工程師先學(xué)習(xí)計(jì)算機(jī)和軟件知識(shí)声邦,再學(xué)習(xí)行業(yè)知識(shí),并且軟件工程師對(duì)行業(yè)知識(shí)的掌握往往不像研究人員對(duì)科學(xué)領(lǐng)域所掌握的那樣精通
在業(yè)務(wù)領(lǐng)域摆舟,大多是如何把現(xiàn)有的業(yè)務(wù)在軟件中模擬出來的問題亥曹,并沒有太多高深的數(shù)學(xué)問題邓了。如何能夠高效地把業(yè)務(wù)用軟件表達(dá)出來,并能夠隨著業(yè)務(wù)的增長(zhǎng)媳瞪,讓軟件也快速地長(zhǎng)大骗炉,則變成了一個(gè)更重要的問題
軟件和業(yè)務(wù)最終還是要合體的
傳統(tǒng)行業(yè)的軟件虛擬化是對(duì)傳統(tǒng)行業(yè)的顛覆,但是業(yè)務(wù)本身的規(guī)律是不變的材失。用戶訪問企業(yè)的生命周期從現(xiàn)實(shí)空間轉(zhuǎn)到了虛擬空間痕鳍,長(zhǎng)大的方式從以人和空間為主變成了以計(jì)算機(jī)和軟件為主,而計(jì)算機(jī)和軟件長(zhǎng)大的成本要遠(yuǎn)遠(yuǎn)你玩人的增長(zhǎng),虛擬空間的增長(zhǎng)要遠(yuǎn)遠(yuǎn)低于真實(shí)空間的成本
把企業(yè)的業(yè)務(wù)自動(dòng)化,把員工從粗糙缚柳、重復(fù)的工作中解放出來,釋放更大的生產(chǎn)力诗赌,成為一件必須要做的事情。而軟件在業(yè)務(wù)自動(dòng)化中扮演了至關(guān)重要的角色
軟件的開發(fā)生命周期基本上都包含:確定業(yè)務(wù)需求秸弛、編碼铭若、測(cè)試、上線
軟件開發(fā)生命周期本身就要求前一個(gè)階段完成才能夠產(chǎn)生下一個(gè)階段递览,因而瀑布式的時(shí)間推進(jìn)過程是無(wú)法避免的叼屠,也不應(yīng)該避免
軟件無(wú)法一次性地把所有的業(yè)務(wù)都模擬出來,必須要分步驟的一個(gè)一個(gè)階段做出來绞铃,通過用戶的反饋镜雨,一點(diǎn)點(diǎn)的長(zhǎng)大,這就是所謂的迭代儿捧。每一個(gè)小的迭代都是瀑布式的推進(jìn)荚坞。
迭代的前提是,必須要先確定優(yōu)先級(jí)菲盾,而理清楚業(yè)務(wù)的核心生命周期是最高優(yōu)先級(jí)
軟件的開發(fā)生命周期要允許犯錯(cuò)颓影,因?yàn)檐浖M的是人,人與人合作總是會(huì)因?yàn)闇贤ǖ葐栴}犯錯(cuò)懒鉴,只要犯的錯(cuò)誤能夠得到快速地反饋和糾正就不會(huì)造成問題诡挂。所謂“敏捷”(Agule)核心就在于快速迭代并得到反饋
為了組織好代碼,架構(gòu)師需要去理解業(yè)務(wù)的核心生命周期以及業(yè)務(wù)的架構(gòu)拆分临谱,形成代碼的架構(gòu)咆畏;為了組織好軟件工程師,需要把軟件拆分為組件吴裤,或者拆分軟件,盡可能的讓軟件工程師之間并行工作溺健,減少?zèng)_突麦牺;為了組織好軟件工程師钮蛛,就需要形成軟件工程師的組織架構(gòu),與軟件剖膳、組件進(jìn)行對(duì)應(yīng)魏颓,與業(yè)務(wù)的組織架構(gòu)對(duì)應(yīng)
把軟件開發(fā)的核心生命周期精簡(jiǎn),把非核心生命周期拆分吱晒,用軟件來實(shí)現(xiàn)自動(dòng)化甸饱,讓軟件工程師能專注于寫代碼,提升軟件工程師的效率仑濒。軟件開發(fā)業(yè)務(wù)本身也是軟件的一個(gè)業(yè)務(wù)
兩種開發(fā)模型:
以不信任軟件開發(fā)工程師為基礎(chǔ)叹话,以避免軟件開發(fā)工程師犯錯(cuò)為核心的開發(fā)模型
以信任軟件開發(fā)工程師為基礎(chǔ),以軟件開發(fā)工程師為核心的開發(fā)模型
軟件開發(fā)的整個(gè)過程墩瞳,參與其中的所有角色驼壶,都應(yīng)該以軟件工程師為核心,幫助軟件工程師理解業(yè)務(wù)喉酌,讓軟件工程師成為業(yè)務(wù)專家热凹。只有軟件工程師成為業(yè)務(wù)專家,寫出來的軟件才是靠譜的
軟件架構(gòu)師要學(xué)習(xí)業(yè)務(wù)的架構(gòu)泪电,根據(jù)業(yè)務(wù)特點(diǎn)確定軟件開發(fā)的核心生命周期般妙,根據(jù)業(yè)務(wù)組織架構(gòu)確定軟件的拆分和架構(gòu):
組織軟件工程師進(jìn)行有效的分工,形成軟件開發(fā)團(tuán)隊(duì)的組織架構(gòu)
減輕軟件工程師的負(fù)擔(dān)相速,要把軟件開發(fā)過程中的非核心生命周期拆分出來碟渺,形成軟件開發(fā)本身的業(yè)務(wù)架構(gòu),并通過自動(dòng)化來提升軟件工程師的開發(fā)效率
軟件所面對(duì)共有三大業(yè)務(wù)領(lǐng)域及其所對(duì)應(yīng)的架構(gòu):
業(yè)務(wù)領(lǐng)域和蚪,由業(yè)務(wù)組織架構(gòu)來推動(dòng)業(yè)務(wù)的架構(gòu)止状,即業(yè)務(wù)生命周期的拆分
軟件開發(fā)業(yè)務(wù)領(lǐng)域,由軟件開發(fā)的業(yè)務(wù)組織架構(gòu)來推動(dòng)軟件的業(yè)務(wù)架構(gòu)攒霹,形成的是軟件開發(fā)模式怯疤,不同角色的分工模型
軟件運(yùn)行業(yè)務(wù)領(lǐng)域,由軟件的開發(fā)工程師來負(fù)責(zé)編寫代碼催束,形成軟件架構(gòu)集峦,并支撐軟件的運(yùn)行,對(duì)不同的軟件開發(fā)工程師進(jìn)行分工抠刺,形成不同的軟件開發(fā)工程師組織架構(gòu)塔淤,以支撐不同的軟件,與軟件的架構(gòu)相匹配
軟件業(yè)務(wù)組織架構(gòu)和軟件開發(fā)組織架構(gòu)共同組成了軟件研發(fā)團(tuán)隊(duì)速妖,業(yè)務(wù)特性和軟件開發(fā)業(yè)務(wù)的特性同時(shí)累積到軟件中高蜂,形成了軟件的架構(gòu)
軟件工程師負(fù)責(zé)建設(shè),軟件架構(gòu)師負(fù)責(zé)組織
為了支持軟件工程師的工作罕容,軟件架構(gòu)師的主要職責(zé)包括:
理解業(yè)務(wù)組織架構(gòu)备恤,業(yè)務(wù)組織架構(gòu)支撐并推進(jìn)業(yè)務(wù)架構(gòu)稿饰,背后的原因是地業(yè)務(wù)生命周期的拆分
根據(jù)業(yè)務(wù)生命周期的特點(diǎn)和軟件開發(fā)生命周期的特點(diǎn),形成了軟件開發(fā)本身的業(yè)務(wù)體系露泊,以及對(duì)軟件開發(fā)生命周期的拆分喉镰,也就是軟件開發(fā)的業(yè)務(wù)架構(gòu)
根據(jù)對(duì)業(yè)務(wù)生命周期的以及軟件開發(fā)生命周期的拆分,形成了和兩者都相匹配的軟件開發(fā)團(tuán)隊(duì)的組織架構(gòu)
對(duì)軟件進(jìn)行架構(gòu)拆分惭笑,匹配業(yè)務(wù)架構(gòu)和軟件開發(fā)的業(yè)務(wù)架構(gòu)
十八侣姆、軟件的架構(gòu)拆分
軟件拆分的原動(dòng)力實(shí)際上是來源于業(yè)務(wù)本身的拆分所形成的組織架構(gòu)
軟件是為人服務(wù)的,是為業(yè)務(wù)服務(wù)的沉噩,先有人捺宗,有業(yè)務(wù),才有軟件屁擅,這個(gè)次序絕不可以顛倒偿凭。沒有人,軟件就推動(dòng)了模擬的目標(biāo)派歌,軟件也就沒有價(jià)值了
每個(gè)業(yè)務(wù)部門形成一個(gè)軟件開發(fā)團(tuán)隊(duì)弯囊,這個(gè)軟件開發(fā)團(tuán)隊(duì)為這個(gè)部門生成相應(yīng)的軟件,提升該部門的價(jià)值和生產(chǎn)力胶果,如果業(yè)務(wù)部門內(nèi)部劃分為多個(gè)子團(tuán)隊(duì)匾嘱,則軟件開發(fā)團(tuán)隊(duì)也應(yīng)該一樣劃分相應(yīng)的內(nèi)部子團(tuán)隊(duì)
軟件開發(fā)團(tuán)隊(duì)的利益來自于對(duì)業(yè)務(wù)部門需求的實(shí)現(xiàn),也就是來源于業(yè)務(wù)部門對(duì)軟件開發(fā)團(tuán)隊(duì)的訪問早抠,業(yè)務(wù)團(tuán)隊(duì)對(duì)軟件開發(fā)團(tuán)隊(duì)的訪問通道也不能夠重用霎烙,避免不同業(yè)務(wù)部門的訪問互相沖突
從軟件團(tuán)隊(duì)到人,從人到組件蕊连,形成的還是一顆樹悬垃。軟件和組件,組件和組件之間甘苍,形成的也是一顆樹
軟件的利益通過用戶的訪問來實(shí)現(xiàn)尝蠕,和業(yè)務(wù)人員的利益保持一致,因?yàn)檐浖M的就是業(yè)務(wù)人員载庭,避免不同的用戶訪問通道相互影響看彼,因此,軟件在訪問通道問題上也不能重用
重用訪問通道的結(jié)果囚聚,既損傷用戶的利益靖榕,也損傷軟件的利益,還會(huì)損傷軟件開發(fā)團(tuán)隊(duì)和企業(yè)的利益
軟件架構(gòu)把軟件看成虛擬的人顽铸,實(shí)際上就是虛擬人的組織架構(gòu)茁计。架構(gòu)拆分的原則首先來源于業(yè)務(wù)自身的組織架構(gòu),使得軟件架構(gòu)保持和業(yè)務(wù)組織架構(gòu)的匹配關(guān)系谓松;其次來源于軟件開發(fā)團(tuán)隊(duì)的組織架構(gòu)簸淀;最后來源于用戶的流量對(duì)軟件本身的沖擊
十九瓶蝴、如何寫好代碼
代碼主要由兩部分組成:
表達(dá)業(yè)務(wù)生命周期的代碼,也叫做業(yè)務(wù)邏輯(Domain Logic)或業(yè)務(wù)模型(Domain Model)租幕,要和現(xiàn)實(shí)生活中業(yè)務(wù)人員的職責(zé)拆分一致,并保持內(nèi)聚
表達(dá)用戶訪問生命周期的代碼拧簸,就是業(yè)務(wù)生命周期對(duì)外的訪問通道劲绪,軟件的核心價(jià)值通過這部分代碼展現(xiàn)出來
內(nèi)聚,是指某個(gè)生命周期的變化是累積在一個(gè)生命周期主體上的盆赤,而不是分散在不同的主體上贾富,在代碼中表示一個(gè)生命周期主體,就是指一個(gè)對(duì)象牺六。要確保一個(gè)事物的生命周期是完整的颤枪,而不是分裂的。所謂完整淑际,就是指一個(gè)生命周期的主體畏纲,從生到死之間的整個(gè)過程中,所發(fā)生的行為和狀態(tài)是累積在一個(gè)主體上的
馮·諾伊曼體系架構(gòu)春缕,把存儲(chǔ)和執(zhí)行分開盗胀,同時(shí)把操作也數(shù)據(jù)化,實(shí)際上都是為了模擬人锄贼。業(yè)務(wù)的操作編程票灰,就是屬于行為的記憶
要模擬一個(gè)完整的人,就需要業(yè)務(wù)(Business)部分來實(shí)現(xiàn)業(yè)務(wù)的邏輯宅荤,完成對(duì)業(yè)務(wù)生命周期的模擬屑迂。業(yè)務(wù)的狀態(tài)要靠存儲(chǔ)(Repository)來存儲(chǔ)持久化,相當(dāng)于現(xiàn)實(shí)生活中的文件柜
服務(wù)(Service)的作用:
由于計(jì)算機(jī)和軟件沒有自己的意志冯键,因此其內(nèi)部生命周期的變化就要由外部的人來推動(dòng)惹盼,這時(shí)需要提供一個(gè)訪問通道給外部的用戶。通道就是只負(fù)責(zé)調(diào)用業(yè)務(wù)邏輯琼了,但不包含業(yè)務(wù)邏輯逻锐。也就是服務(wù)代碼中是不包含業(yè)務(wù)邏輯的。
企業(yè)為了接待用戶的訪問雕薪,一定會(huì)設(shè)一個(gè)前臺(tái)昧诱。這個(gè)前臺(tái)就是一個(gè)服務(wù)
不同的用戶訪問,也要提供不同的服務(wù)所袁,以避免不同的用戶之間互相影響盏档,因?yàn)榉?wù)的重用就是自找麻煩
用戶要完成訪問業(yè)務(wù)邏輯生命周期,需要做(三個(gè)子生命周期燥爷,Service->Glue Code->Business):
服務(wù)首先要把業(yè)務(wù)的狀態(tài)從存儲(chǔ)中加載
服務(wù)調(diào)用并組合業(yè)務(wù)邏輯完成業(yè)務(wù)的訪問(核心)
服務(wù)把業(yè)務(wù)邏輯執(zhí)行后的狀態(tài)保存到存儲(chǔ)中
黏合代碼:業(yè)務(wù)邏輯屬于行為是沒有記憶的蜈亩,而存儲(chǔ)屬于記憶是沒有邏輯的懦窘,要把行為和記憶黏合在一起,才能夠模擬一個(gè)人
采用存儲(chǔ)掛在黏合代碼上的方式稚配,就可以讓黏合代碼成為一個(gè)完整的虛擬人畅涂,虛擬人具備記憶和行為,可以均衡地處理上述兩個(gè)問題道川,代碼也就劃分出了以下幾個(gè)特性:
服務(wù)專注于用戶(User)的需求午衰,通過組織黏合代碼,也就是虛擬人所提供的生命周期活動(dòng)完成需求
黏合代碼專注于管理業(yè)務(wù)中對(duì)象的生命周期冒萄,并且通過存儲(chǔ)保存或加載業(yè)務(wù)中對(duì)象的狀態(tài)臊岸,實(shí)現(xiàn)對(duì)業(yè)務(wù)虛擬人的模擬
業(yè)務(wù)專注于實(shí)現(xiàn)業(yè)務(wù)的生命周期活動(dòng)
存儲(chǔ)專注于數(shù)據(jù)的保存和加載,并讓數(shù)據(jù)和存儲(chǔ)設(shè)備的存儲(chǔ)粒度一一對(duì)應(yīng)
訪問邏輯的特點(diǎn)是組合代碼尊流,即常見的順序調(diào)用帅戒。這種代碼里既不會(huì)有計(jì)算也不會(huì)有if else等判斷,只有簡(jiǎn)單的組合代碼崖技,用于組合下一層的節(jié)點(diǎn)所提供的功能逻住,方便上一層節(jié)點(diǎn)的調(diào)用
業(yè)務(wù)邏輯是以業(yè)務(wù)核心生命周期為主線,切分出的一個(gè)樹狀架構(gòu) 响疚,樹上的每個(gè)節(jié)點(diǎn)都有其獨(dú)有的生命周期鄙信,每個(gè)節(jié)點(diǎn)都有一個(gè)獨(dú)立的概念來表達(dá)這個(gè)生命周期的特質(zhì)
業(yè)務(wù)邏輯不是內(nèi)聚的就會(huì)散落到很多其他地方去,會(huì)造成的問題:
如果服務(wù)代碼中混入了業(yè)務(wù)邏輯忿晕,則服務(wù)做了兩件或者兩件以上的事情:
典型的情況就是兩個(gè)不同的訪問生命周期合并在一個(gè)服務(wù)中來實(shí)現(xiàn)
如果是有計(jì)算的邏輯的話装诡,比如受益計(jì)算、訂單金額計(jì)算等践盼,那么這部分應(yīng)該是業(yè)務(wù)代碼需要完成的鸦采,不能交給服務(wù)代碼來實(shí)現(xiàn)
黏合代碼里面如果包含業(yè)務(wù)邏輯的話,也會(huì)做兩件或者兩件以上的事情 咕幻,會(huì)和服務(wù)代碼一樣渔伯,遇到同樣的問題
存儲(chǔ)代碼里面如果混入了業(yè)務(wù)邏輯,則會(huì)導(dǎo)致業(yè)務(wù)邏輯進(jìn)入到存儲(chǔ)設(shè)備中
存儲(chǔ)一旦變成了邏輯計(jì)算的主體肄程,綁定數(shù)據(jù)的邏輯計(jì)算就成了一個(gè)巨大的限制 锣吼,會(huì)導(dǎo)致存儲(chǔ)設(shè)備無(wú)法通過增加機(jī)器 的方式橫向擴(kuò)展長(zhǎng)大,只能換性能更好的機(jī)器縱向擴(kuò)展(Scale up)蓝厌,而縱向擴(kuò)展不僅程度有很而且成本也很高
業(yè)務(wù)邏輯內(nèi)聚的好處:
由于服務(wù)玄叠、黏合代碼和存儲(chǔ)里面的代碼都是嚴(yán)格的訪問代碼,而訪問代碼的特征就是簡(jiǎn)單的順序調(diào)用拓提,因此這些代碼只要做連通性測(cè)試即可读恃,不需要單元測(cè)試
由于業(yè)務(wù)不訪問任何計(jì)算機(jī)設(shè)備相關(guān)的上下文,不訪問任何具體的設(shè)備,如數(shù)據(jù)庫(kù)寺惫、緩存疹吃、中間件等,因?yàn)槠錉顟B(tài)是靠黏合代碼來填充的西雀,因此這部分代碼是非常容易寫單元測(cè)試的萨驶,而且單元測(cè)試必須保證100%覆蓋
存儲(chǔ)如果沒有邏輯,則很容易按照存儲(chǔ)設(shè)備本身的最小訪問粒度來完成工作艇肴,不需要Join
服務(wù)代碼篡撵、黏合代碼和存儲(chǔ)代碼只有變簡(jiǎn)單了,才可以讓開發(fā)人員投入更多時(shí)間來研究業(yè)務(wù)
代碼架構(gòu)需要注意的地方:
不能把業(yè)務(wù)模型(Business Model)當(dāng)作數(shù)據(jù)對(duì)象來處理:黏合代碼需要把業(yè)務(wù)模型轉(zhuǎn)換為存儲(chǔ)設(shè)備的實(shí)體(Entity)豆挽,實(shí)體和存儲(chǔ)設(shè)備里面的存儲(chǔ)粒度一一對(duì)應(yīng);同樣業(yè)務(wù)模型不能拿來用作服務(wù)和用戶之間的數(shù)據(jù)交互媒介券盅,只能轉(zhuǎn)換為DTO(Data Transfer Object)來使用
服務(wù)代碼里不要考慮代碼重用:針對(duì)不同的角色要提供不同的在服務(wù)來服務(wù)帮哈,確保他們之間的訪問生命周期是隔離的,避免互相影響锰镀;盡量給不同角色不同的服務(wù)娘侍,既避免通道重用又降低溝通成本;服務(wù)多不是問題泳炉,服務(wù)的生命周期管理才是問題憾筏,服務(wù)治理(Service Governance)中心就是來解決這個(gè)問題的
業(yè)務(wù)模型是必須要重用的,因?yàn)檫@是所有用戶訪問的目標(biāo):所有服務(wù)代碼需要的花鹅,就是組合業(yè)務(wù)模型所代表的業(yè)務(wù)生命周期氧腰,用來完成用戶的訪問
服務(wù)代碼、黏合代碼和存儲(chǔ)代碼不能有邏輯刨肃,要克服對(duì)業(yè)務(wù)古拴,對(duì)時(shí)間的恐懼,真正的去研究業(yè)務(wù)核心生命周期真友,研究相關(guān)利益人的利益黄痪,把這個(gè)變成日常的習(xí)慣。寫代碼的時(shí)候讓該出現(xiàn)邏輯的地方出現(xiàn)邏輯盔然,讓不該出現(xiàn)邏輯的地方不要出現(xiàn)
軟件的拆分必須要和業(yè)務(wù)的拆分對(duì)應(yīng)起來桅打,此時(shí)就可看出業(yè)務(wù)生命周期分析的好處
二十、單元測(cè)試
“單元”(Unit)指的是代碼調(diào)用的最小單位愈案,實(shí)際上指的就是一個(gè)功能塊(Function)或者方法(Method)
單元測(cè)試是一種白盒測(cè)試挺尾,就是必須要對(duì)單元的代碼細(xì)節(jié)很清楚才能做的測(cè)試,所以刻帚,單元測(cè)試的編寫和執(zhí)行都是由軟件工程師來做的潦嘶。
集成測(cè)試是黑盒測(cè)試,主要是由測(cè)試人員根據(jù)軟件的功能手冊(cè)來進(jìn)行測(cè)試,需要有專門的測(cè)試環(huán)境配合掂僵。集成測(cè)試又分功能測(cè)試航厚、回歸測(cè)試等
服務(wù)代碼、管理者代碼和存儲(chǔ)代碼都是不需要寫單元測(cè)試的锰蓬,單元測(cè)試是用來測(cè)軟件工程師自己寫的邏輯幔睬,如果代碼里面沒有邏輯就不需要寫單元測(cè)試。單元測(cè)試代碼自身也是簡(jiǎn)單的順序執(zhí)行芹扭,并沒有邏輯麻顶,所以不需要測(cè)試。
只要出現(xiàn)了模擬舱卡,單元測(cè)試就開始失效了辅肾!
需要單元測(cè)試的代碼實(shí)際上是開發(fā)人員自己寫的邏輯,測(cè)試邏輯所依賴的環(huán)境是否正常不是單元測(cè)試的目的轮锥〗玫觯看方法能否用一個(gè)main函數(shù)直接運(yùn)行,如果可以的話就是可單元測(cè)試的代碼舍杜,該方法單元的參數(shù)新娜,開發(fā)人員可以自由模擬,并不需要依賴外部環(huán)境
如果代碼有邏輯但不可以單元測(cè)試的話既绩,就需要改造代碼概龄,就是要確保邏輯代碼和外部環(huán)境相關(guān)代碼隔離,把代碼的執(zhí)行順序饲握,也就是單元的執(zhí)行生命周期做架構(gòu)的拆分私杜,讓邏輯代碼單元只依賴于參數(shù),而不是依賴于環(huán)境(不用nginx互拾、apache等歪今,直接php就能運(yùn)行),開發(fā)人員可以自由地模擬輸入?yún)?shù)做單元測(cè)試颜矿。環(huán)境代碼不再包含邏輯寄猩,恢復(fù)了簡(jiǎn)單的順序執(zhí)行。
只要確保輸入?yún)?shù)不包含外部環(huán)境的上下文骑疆,同時(shí)內(nèi)部代碼對(duì)外部的調(diào)用也不包含對(duì)環(huán)境上下文的訪問田篇,這個(gè)方法就是可以單元測(cè)試的
寫單元測(cè)試要先搞清楚兩個(gè)問題:
要明確的是什么樣的代碼需要單元測(cè)試,要測(cè)的是什么——只有自己寫的邏輯才需要測(cè)箍铭,外部環(huán)境和別人的代碼不需要測(cè)
邏輯能否用單元測(cè)試來測(cè)泊柬,自己寫的邏輯單元是否可測(cè)——如果不可測(cè),說明邏輯和訪問代碼混合了诈火,必須讓自己寫的邏輯單元只依賴于輸入?yún)?shù)兽赁,就變成可測(cè)了,能夠通過main函數(shù)提供輸入?yún)?shù)就可以運(yùn)行起來的邏輯單元都是可測(cè)的
測(cè)試基本都分為三個(gè)步驟:
構(gòu)建輸入?yún)?shù),并預(yù)測(cè)該輸入所產(chǎn)生的輸出
調(diào)用要測(cè)試的目標(biāo)方法刀崖,獲取輸出
檢測(cè)目標(biāo)方法的輸出是否和預(yù)期的輸入一致(Assert)
二十一惊科、軟件架構(gòu)和面向?qū)ο?/p>
面向過程(Procedural Oriented),也叫過程式編程(Procedural Programming)亮钦,會(huì)把過程式的代碼封裝成代碼塊馆截,也叫功能(Function)或過程(Procedure),通過功能調(diào)用(Procedure Call)或者過程調(diào)用(Function Call)來組織調(diào)用的流程
越靠近硬件蜂莉,越會(huì)使用面向過程的語(yǔ)言來編寫蜡娶,比如操作系統(tǒng)底層、硬件驅(qū)動(dòng)等映穗,因?yàn)橛布翘烊坏捻樞驁?zhí)行窖张,必須采用流程式的思維
事物生命周期推進(jìn)的過程中,生命周期活動(dòng)的主體是不變的蚁滋,其生命周期活動(dòng)的承受者就是該事物本身荤堪,這就是權(quán)責(zé)對(duì)等,也就是所謂的“自作自受”枢赔,有權(quán)力“作”,就要有相同的義務(wù)承受“作”的結(jié)果拥知。所有的生命周期活動(dòng)都作用并積累在該事物的本身踏拜,這就是面向?qū)ο螅@一特性也被稱為面向?qū)ο蟮摹皟?nèi)聚”
面向?qū)ο笞屓藗冊(cè)诖a世界中低剔,用對(duì)象來描述人類在現(xiàn)實(shí)生活中的分工(即生命周期的拆分)速梗,并且能夠用對(duì)象來描述自然界的分工
面向過程反映的是生命周期按時(shí)間推進(jìn)的特質(zhì),而面向?qū)ο蠓从车膭t是事物生命周期活動(dòng)內(nèi)聚的特質(zhì)
過程本身一定是某個(gè)主體生命周期中的一個(gè)過程襟齿,也就是某個(gè)對(duì)象的一個(gè)過程姻锁。面向?qū)ο蟮姆绞奖硎隽耸挛锏膬?nèi)聚,但是面向?qū)ο蟛荒茈x開面向過程的基礎(chǔ)猜欺,也就是順序執(zhí)行位隶。對(duì)象的生命周期推進(jìn)一定是通過一個(gè)個(gè)過程實(shí)現(xiàn)的。所以面向?qū)ο蟮木幊陶Z(yǔ)言开皿,代碼塊還是順序執(zhí)行的
大部分時(shí)候涧黄,業(yè)務(wù)的變化都是流程的變化,并且都是和用戶打交道的部分赋荆,也就是用戶訪問生命周期笋妥,所以這一部分的變動(dòng)最頻繁
業(yè)務(wù)對(duì)象是很穩(wěn)定的,因?yàn)榉止さ淖兓⒉皇墙?jīng)常發(fā)生窄潭,其內(nèi)存邏輯也是相對(duì)很穩(wěn)定的春宣,值得依賴
繼承和多態(tài),更多的是指事物的共性。只有封裝和面向?qū)ο蟮膬?nèi)聚有關(guān)系月帝。要想真正做到面向?qū)ο篚锿铮捅仨氁ビH身體驗(yàn)事物的個(gè)性,也就是事物本身獨(dú)特的生命周期嫁赏,才能夠真正地明白對(duì)象本身
事物有其共性其掂,也有其自身的個(gè)性,或者說特性潦蝇,最關(guān)鍵的就是其自身的特性
組合實(shí)際就是面向過程款熬,組合其他拆分出去的對(duì)象來完成自己的生命周期。實(shí)際上已經(jīng)包含了面向過程和面向?qū)ο蟮膬蓚€(gè)特質(zhì)攘乒,因?yàn)榻M合要使用拆分的對(duì)象來完成過程的實(shí)現(xiàn)
對(duì)象的大小不是對(duì)象的分割因素贤牛,對(duì)象的設(shè)置要和現(xiàn)實(shí)的生命周期拆分,也就是分工相匹配
架構(gòu)師要解決對(duì)象劃分的問題则酝,一定要先對(duì)現(xiàn)實(shí)生活中的業(yè)務(wù)有親身的體驗(yàn)才行殉簸。不親身體驗(yàn)業(yè)務(wù)生命周期,就無(wú)法理解分工沽讹,也就是業(yè)務(wù)的架構(gòu)拆分般卑,也就無(wú)法識(shí)別生命周期的主體
對(duì)象的創(chuàng)建不是對(duì)象本身,而是對(duì)象的管理者
二十二爽雄、軟件架構(gòu)與設(shè)計(jì)模式
模式就是在自然界或者人類設(shè)計(jì)中產(chǎn)生的一種可識(shí)別的規(guī)律蝠检,其重要的特征是重復(fù)性和周期性,能夠產(chǎn)生模式的一般稱為模板(Template)挚瘟。要想得到模式叹谁,往往要結(jié)合抽象的思維,通過分析不同事物的共性乘盖,去掉差異焰檩,提取共同點(diǎn),從而得到規(guī)律
設(shè)計(jì)模式是把模式的范圍縮小限定在設(shè)計(jì)的范圍订框,可以理解為一種有計(jì)劃析苫、有目的的活動(dòng),針對(duì)問題穿扳,通過對(duì)人或物進(jìn)行合適的擺放藤违,做出一個(gè)解決方案,并且還要考慮實(shí)現(xiàn)的成本
設(shè)計(jì)的共同點(diǎn):
設(shè)計(jì)是用來解決人的問題的
設(shè)計(jì)往往要借助已有的東西為基礎(chǔ)纵揍,對(duì)它們重新進(jìn)行合適的定位和組合顿乒,來達(dá)到或滿足人的目標(biāo)
面向?qū)ο筌浖_發(fā)中的三類設(shè)計(jì)模式:
創(chuàng)建型(Creational):如何生成對(duì)象,就是把產(chǎn)生對(duì)象的生命周期單獨(dú)拆分出來
結(jié)構(gòu)型(Structural):專注于對(duì)象的不同組合方式
行為型(Behavioral):針對(duì)對(duì)象之間的溝通
設(shè)計(jì)模式都是把原有對(duì)象的訪問生命周期拉長(zhǎng)泽谨,增加了環(huán)節(jié)璧榄,在不修改原有對(duì)象的基礎(chǔ)之上特漩,添加新的能力或者獲得新的自由度
站在原有對(duì)象的角度來看,設(shè)計(jì)模式基本都是組合現(xiàn)有對(duì)象的能力骨杂,通過對(duì)原有對(duì)象訪問生命周期進(jìn)行架構(gòu)拆分涂身,形成一個(gè)新的解決方案來解決特定的問題。站在業(yè)務(wù)的角度搓蚪,人們創(chuàng)造一個(gè)事物的過程總是先建設(shè)好事物本身蛤售,再考慮如何更好地把業(yè)務(wù)和用戶連接起來
設(shè)計(jì)模式所以要解決的問題和原有對(duì)象所要解決的問題并不相同。站在組合的角度妒潭,設(shè)計(jì)模式是集合現(xiàn)有對(duì)象的能力悴能,針對(duì)要解決的問題,通過某種方式的組合來形成問題的解決方案雳灾∧穑“可重用”(Reusable),即盡可能利用現(xiàn)有對(duì)象的能力谎亩,通過某種形式的組合朋沮,形成新的對(duì)象和能力提供給外部
設(shè)計(jì)模式內(nèi)部的分工其實(shí)是在模擬現(xiàn)實(shí)生活的分工稽鞭。并且設(shè)計(jì)模式內(nèi)部的分工往往更加的抽象,是更簡(jiǎn)化的方式感耙,而現(xiàn)實(shí)生活往往更加復(fù)雜骗随,只有去除了具體問題的獨(dú)特性象迎,才能讓設(shè)計(jì)模式更普遍地重復(fù)使用
軟件設(shè)計(jì)模式本身就是一個(gè)架構(gòu)拆分的結(jié)果悼瘾,只是這個(gè)拆分被標(biāo)準(zhǔn)化了赴邻,可以被重復(fù)使用而已。而設(shè)計(jì)模式在被使用的時(shí)候紊选,則不需要再進(jìn)行設(shè)計(jì),直接使用即可道逗。因此設(shè)計(jì)模式就變成了一個(gè)成熟的技巧或者技術(shù)了兵罢。
軟件設(shè)計(jì)模式這部分的代碼其實(shí)是有自己的業(yè)務(wù)領(lǐng)域的,這個(gè)領(lǐng)域就是軟件的訪問生命周期
只有從訪問代碼中剝離了所服務(wù)業(yè)務(wù)的邏輯滓窍,才有可能討論軟件訪問生命周期自身的業(yè)務(wù)模型卖词。后續(xù)軟件訪問生命周期部分,會(huì)展開對(duì)這個(gè)業(yè)務(wù)領(lǐng)域的進(jìn)一步討論
一個(gè)模式重復(fù)周期性的出現(xiàn)吏夯,是外在的表現(xiàn)此蜈,這些類似的現(xiàn)象是人們對(duì)共性抽象的結(jié)果。但是一些模式外在的表現(xiàn)一樣噪生,并不代表它們背后產(chǎn)生的原理也不一樣裆赵,解決的問題也不一樣;同樣一個(gè)問題表現(xiàn)出來的模式可能并不一樣跺嗽;
畢竟模式只是關(guān)注到了共性战授,共性只會(huì)讓解決問題變得更容易页藻、更輕松,因?yàn)閯e人解決過了植兰,有參考份帐,但無(wú)法解決真正的問題。而真正要解決問題則是要發(fā)現(xiàn)問題的個(gè)性楣导,發(fā)現(xiàn)了個(gè)性废境,共性才能發(fā)揮更大的作用。
要真正用好設(shè)計(jì)模式筒繁,就要和使用技術(shù)一樣噩凹,不但要理解設(shè)計(jì)模式能解決的問題,還要深刻地理解自己要解決的問題
什么代碼都考慮重用也是一個(gè)誤區(qū)膝晾,業(yè)務(wù)對(duì)象應(yīng)該被重用栓始,但是對(duì)于服務(wù)、黏合代碼和存儲(chǔ)而言血当,它們都有自己獨(dú)特的業(yè)務(wù)問題幻赚,即它們處理訪問通道的,目的并不是給大家共享臊旭,也不是訪問的目標(biāo)落恼,而處理好通道,則需要按照不同角色的用戶來進(jìn)行分析离熏,提供不同的通道佳谦,讓它們之間的訪問互不影響。訪問通道是不能重用的滋戳。
二十三钻蔑、軟件架構(gòu)和軟件框架
業(yè)務(wù)呈現(xiàn)給客戶,并讓用戶能夠獨(dú)立訪問奸鸯,形成軟件咪笑,會(huì)遇到兩大問題:
如何把業(yè)務(wù)用軟件表達(dá)出來
軟件如何被放入計(jì)算機(jī),提供給用戶訪問
計(jì)算機(jī)軟件內(nèi)部所模擬的生命周期變化 娄涩,都是要由外部被模擬的人通過個(gè)人意志來推動(dòng)窗怒。而在推動(dòng)的過程中,通常會(huì)有下面這些問題:
提供給用戶什么樣的訪問界面蓄拣?
用戶訪問時(shí)扬虚,如何和用戶進(jìn)行交互?
用什么方式組織業(yè)務(wù)邏輯并對(duì)外提供訪問球恤?
業(yè)務(wù)邏輯的狀態(tài)如何從存儲(chǔ)(Repository)中存裙缄恰?
軟件以什么方式在計(jì)算機(jī)中運(yùn)行起來咽斧?
針對(duì)用戶的訪問問題路鹰,設(shè)計(jì)模式的典型作用就是把用戶的訪問和最終的存儲(chǔ)連接起來贷洲,形成訪問通道,為用戶訪問業(yè)務(wù)邏輯提供便利
模式都有一些典型特點(diǎn):對(duì)用戶訪問輸入端會(huì)提供訪問的方式晋柱,并且這些訪問點(diǎn)可以橫向擴(kuò)張优构;對(duì)通道下一節(jié)點(diǎn)訪問的輸出端也會(huì)橫向擴(kuò)張,而其本身則是實(shí)現(xiàn)這個(gè)設(shè)計(jì)模式背后的業(yè)務(wù)雁竞。經(jīng)常修改的部分钦椭,往往是輸入輸出部分的擴(kuò)張,比如添加功能或者新的訪問點(diǎn)
MVC框架碑诉,對(duì)控制器(Controller)進(jìn)行了封裝彪腔,作為其自身的核心業(yè)務(wù),對(duì)用戶不可見进栽,即變成透明的德挣。模型更多的是指對(duì)視圖的數(shù)據(jù)支持,一般用DTO來表達(dá)快毛。而業(yè)務(wù)模型關(guān)注的是業(yè)務(wù)生命周期及其行為格嗅,業(yè)務(wù)模型的內(nèi)部數(shù)據(jù)只是這些行為的結(jié)果,兩者不同唠帝,但可以通過數(shù)據(jù)轉(zhuǎn)換結(jié)合來連接溝通使用屯掖,需要類似于適配器(Adapter)的模式來解決這個(gè)問題
所有通道型的框架,背后都有控制器的特質(zhì)襟衰,以方便前后端接入點(diǎn)的擴(kuò)展贴铜;也會(huì)有數(shù)據(jù)轉(zhuǎn)換的要求,以方便前后端數(shù)據(jù)的傳遞
行業(yè)類框架瀑晒,是為了給整個(gè)行業(yè)提供解決方案绍坝,既要考慮整個(gè)行業(yè)的業(yè)務(wù)模式,還需要適應(yīng)行業(yè)內(nèi)不同企業(yè)的區(qū)別苔悦,因而往往會(huì)形成一個(gè)行業(yè)的框架
框架基本上都是根據(jù)業(yè)務(wù)模型轩褐,或設(shè)計(jì)模式等,把模型中穩(wěn)定的部分進(jìn)行封裝间坐,形成一個(gè)大的邊界,但是具體內(nèi)容仍留有余地邑退。往往是為了方便本地定制的竹宋,在本地進(jìn)行改造,和自己的軟件結(jié)合在一起地技。
框架和服務(wù)的一個(gè)區(qū)別是:軟件引用是本地引用的方式蜈七,而服務(wù)是用來遠(yuǎn)程調(diào)用的
要想應(yīng)用個(gè)框架,首先需要理解好這個(gè)框架所能解決的問題莫矗,然后才能理解這個(gè)框架本身的業(yè)務(wù)模型和架構(gòu)的拆分方式飒硅,最終才能把其他人的工作變成自己軟件的一部分
二十四砂缩、軟件運(yùn)維
軟件的運(yùn)行生命周期所要達(dá)到的主要目的,則是為了能夠提供給用戶持續(xù)不斷的訪問三娩,因此軟件運(yùn)行生命周期的核心是軟件訪問生命周期庵芭。軟件的訪問生命周期,從軟件接收到用戶的訪問請(qǐng)求開始雀监,執(zhí)行用戶的請(qǐng)求到返回給用戶請(qǐng)求的結(jié)果為止双吆。
軟件運(yùn)維其實(shí)就是指軟件的運(yùn)行和維護(hù)。運(yùn)維工程師本質(zhì)上也是一個(gè)軟件工程師会前,只不過專注的領(lǐng)域就是計(jì)算機(jī)軟件本身的運(yùn)營(yíng)和維護(hù)好乐,一旦運(yùn)維軟件變得很成熟,軟件工程師就可以替代軟件運(yùn)維工程師的工作瓦宜,這個(gè)角色也會(huì)逐漸地回歸到業(yè)務(wù)的軟件工程師蔚万,發(fā)生樹的節(jié)點(diǎn)的合并。這就是所謂的自動(dòng)化临庇。
運(yùn)維的業(yè)務(wù)目標(biāo)是保證用戶的訪問生命周期不受影響反璃。也就是保證軟件穩(wěn)定地被用戶訪問是運(yùn)維的主要業(yè)務(wù)目標(biāo)。保持軟件的運(yùn)行穩(wěn)定苔巨,就要求運(yùn)維能夠感知軟件的運(yùn)行狀態(tài)版扩,能夠探測(cè)軟件的狀態(tài)是否超出邊界,并對(duì)之進(jìn)行處理侄泽,使軟件盡快恢復(fù)正常
“虛擬人”需要依賴電力礁芦、網(wǎng)絡(luò)和硬件等,這些設(shè)施本身也會(huì)遇到問題悼尾,運(yùn)維系統(tǒng)就相當(dāng)于“虛擬人”身上的免疫系統(tǒng)柿扣,軟件工程師就相當(dāng)于“虛擬人”的醫(yī)生
運(yùn)維的生命周期是從軟件部署開始的。任何對(duì)軟件的改變闺魏,都是風(fēng)險(xiǎn)未状,都是需要運(yùn)維關(guān)注的。每次變化的風(fēng)險(xiǎn)控制是最重要的任務(wù)析桥。
隔離司草,避免軟件出現(xiàn)在不安全的地方,可以控制所有對(duì)軟件的改變泡仗,對(duì)軟件所依賴的硬件埋虹、網(wǎng)絡(luò)和電力也是同樣的,只有設(shè)立隔離區(qū)才能保證軟件的安全娩怎。要區(qū)分出辦公環(huán)境和生產(chǎn)環(huán)境(Production)搔课。
生產(chǎn)環(huán)境一旦建立,那么生產(chǎn)環(huán)境就有了自己的生命周期截亦,其內(nèi)部就會(huì)開始持續(xù)不斷地發(fā)生生命周期變化爬泥,這些生命周期變化就是變更柬讨。無(wú)論是網(wǎng)絡(luò)上還是物理上,對(duì)生產(chǎn)環(huán)境上的訪問都是變更袍啡。分為:被動(dòng)發(fā)生的變更踩官、企業(yè)內(nèi)部主動(dòng)發(fā)起的變更
主動(dòng)變更所導(dǎo)致的軟件系統(tǒng)問題大約占所有線上問題的2/3以上。其中軟件本身的變更所千萬(wàn)的問題大約占所有線上問題的一半以上葬馋,占主動(dòng)變更中的絕大部分
線上問題無(wú)法完全避免卖鲤,唯一的辦法只能是減少問題產(chǎn)生后帶來的損失。減少損失的辦法畴嘶,要么提前預(yù)防問題蛋逾,要么縮短問題所影響的時(shí)間,兩者都要求運(yùn)維要具備快速發(fā)現(xiàn)并定位問題的能力窗悯。要具備這個(gè)能力就必須要時(shí)刻的感知系統(tǒng)的運(yùn)行狀態(tài)区匣,這就是監(jiān)控(Monitoring)。
監(jiān)控的目的就是把系統(tǒng)內(nèi)不同生命周期的當(dāng)前運(yùn)行狀態(tài)蒋院,通過探測(cè)器傳輸出來亏钩,展示到可視或可感知的設(shè)備上,來供人查看欺旧。非常重要的指標(biāo)就是實(shí)時(shí)度姑丑。
理解了軟件和業(yè)務(wù)本身的含義,才能得到軟件的數(shù)據(jù)和指標(biāo)辞友。理解了這些數(shù)據(jù)和指標(biāo)栅哀,監(jiān)控人員就可以對(duì)超出正常范圍的數(shù)據(jù)進(jìn)行報(bào)警,馬上采取行動(dòng)称龙,盡可能在問題造成實(shí)際損害前就把問題解決掉留拾。這就是運(yùn)維的預(yù)警。
預(yù)警分為兩部分:
軟件本身業(yè)務(wù)的預(yù)警鲫尊,包括軟件痴柔、硬件、電力疫向、網(wǎng)絡(luò)等設(shè)備
軟件所實(shí)現(xiàn)業(yè)務(wù)的預(yù)警咳蔚,注冊(cè)量、訂單量等等
一旦理解了業(yè)務(wù)生命周期就會(huì)發(fā)現(xiàn)搔驼,業(yè)務(wù)的數(shù)據(jù)會(huì)成周期性的變化谈火,而周期性的變化就意味著可以用歷史生命周期的數(shù)據(jù)作為報(bào)警的基線
監(jiān)控是生成預(yù)警的數(shù)據(jù)基礎(chǔ)。對(duì)業(yè)務(wù)生命周期的理解則是是生成預(yù)警的規(guī)則基礎(chǔ)匙奴。
預(yù)警軟件本身也是需要監(jiān)控和預(yù)警的堆巧,也是預(yù)警的業(yè)務(wù)妄荔。
在生產(chǎn)環(huán)境做變更泼菌,也需要一個(gè)正向反饋環(huán)谍肤,這個(gè)正向反饋環(huán)核心環(huán)節(jié)就是監(jiān)控和預(yù)警
變更在生產(chǎn)環(huán)境的執(zhí)行一般稱為發(fā)布,對(duì)變更進(jìn)行管理的系統(tǒng)叫做發(fā)布系統(tǒng)
主導(dǎo)變更的策略主要就是讓變更逐步地發(fā)生哗伯,一般稱作“灰度發(fā)布”荒揣,其核心思想就是盡可用減少變更所影響的范圍。軟件要支持灰度發(fā)布焊刹,還要要求軟件本身能夠支持兩個(gè)不同版本的代碼同時(shí)運(yùn)行在線上系任,并且保證是對(duì)用戶透明的,不會(huì)影響到用戶的訪問
把代碼發(fā)布和功能啟用進(jìn)行架構(gòu)拆分虐块,先確保代碼上線沒有問題俩滥,再通過軟件開關(guān)來打開關(guān)閉某個(gè)功能,功能的打開和關(guān)閉就形成了一個(gè)新的發(fā)布生命周期
生產(chǎn)故障時(shí)要優(yōu)先恢復(fù)用戶的正常訪問贺奠,而不是在生產(chǎn)環(huán)境探查問題的根本原因霜旧。所有的發(fā)布都必須要做好回退的方案,一般沒有回退計(jì)劃的發(fā)布是不允許執(zhí)行的
回歸(Regression)測(cè)試環(huán)境儡率,或稱為Staging環(huán)境挂据,重點(diǎn)就是測(cè)試新舊功能是否都能夠正常地執(zhí)行,一般用自動(dòng)化來完成儿普,因?yàn)榇蟛糠譁y(cè)試都是原有的功能崎逃。
功能測(cè)試環(huán)境,建立多個(gè)眉孩,供測(cè)試人員做不同版本的新功能測(cè)試
開發(fā)測(cè)試環(huán)境个绍,避免開發(fā)人員和測(cè)試人員工享,避免發(fā)生沖突
軟件在幾個(gè)環(huán)境中發(fā)布的推進(jìn)管道(Pipeline):開發(fā)測(cè)試環(huán)境-功能測(cè)試環(huán)境-回歸測(cè)試環(huán)境-生產(chǎn)環(huán)境勺像,所有的變更障贸,包括軟件與硬件的變更 ,都沿著這個(gè)管道依次的通過吟宦,最終到達(dá)生產(chǎn)環(huán)境
軟件運(yùn)維生命周期的核心是預(yù)警生命周期篮洁。也就是說,保證軟件運(yùn)行生命周期的穩(wěn)定是運(yùn)維的核心工作
二十五殃姓、軟件訪問生命周期
訪問(Access)用更通俗的話來說就是使用(或操作)
訪問路徑:
最初:用戶->目標(biāo)軟件->硬件
硬件統(tǒng)一管理:用戶->目標(biāo)軟件->操作系統(tǒng)->硬件
網(wǎng)絡(luò)興起后:用戶->客戶端->網(wǎng)絡(luò)->目標(biāo)軟件->操作系統(tǒng)->硬件
服務(wù)端拆分:用戶->客戶端->網(wǎng)絡(luò)->目標(biāo)軟件->應(yīng)用服務(wù)器->操作系統(tǒng)->硬件
云服務(wù)時(shí)期:用戶->客戶端->網(wǎng)絡(luò)->目標(biāo)軟件->應(yīng)用服務(wù)器->容器->操作系統(tǒng)->硬件
云服務(wù)時(shí)期:用戶->客戶端->網(wǎng)絡(luò)->目標(biāo)軟件->應(yīng)用服務(wù)器->操作系統(tǒng)->虛擬化->硬件
訪問路徑上的業(yè)務(wù)袁波,都是計(jì)算機(jī)和軟件自身的業(yè)務(wù),是為降低軟件的開發(fā)難度而沿著訪問生命周期做架構(gòu)拆分而形成的
計(jì)算機(jī)和軟件自身的業(yè)務(wù)都可以歸結(jié)為訪問通道型的業(yè)務(wù)
兩種增長(zhǎng)模式:
以復(fù)制自己的方式增長(zhǎng)的蜗侈,叫做Scale-Out篷牌,或者叫做橫向擴(kuò)展
以增大個(gè)體能力的方式增長(zhǎng)的,叫做Scale-Up踏幻,或者叫做縱向擴(kuò)展
擴(kuò)張沒有最好的方式枷颊,選擇橫向擴(kuò)張還是縱向擴(kuò)張都要根據(jù)當(dāng)時(shí)社會(huì)的技術(shù)能力水平來判斷。判斷標(biāo)準(zhǔn)是對(duì)比兩種擴(kuò)張方式的成本和收益,同時(shí)也要看業(yè)務(wù)擁有者本身的擴(kuò)張意愿
集群就是裝有相同軟件夭苗,具備相同功能的一組計(jì)算機(jī)信卡,組織在一起共同服務(wù)于客戶的訪問。集群的路由主要考慮的因素是集群內(nèi)機(jī)器的負(fù)載均衡問題题造,路由必須定時(shí)檢查集群內(nèi)機(jī)器的健康和剩余訪問容量
多數(shù)據(jù)中心(Data Center)可以看成是集群的集群傍菇,裝有同一個(gè)軟件的集群會(huì)同時(shí)部署在多個(gè)不同的數(shù)據(jù)中心,集群在不同的數(shù)據(jù)中心各復(fù)制了一份
數(shù)據(jù)中心前置路由策略是要把數(shù)據(jù)中心所覆蓋地區(qū)的用戶訪問歸屬到相應(yīng)的數(shù)據(jù)中心界赔,要考慮的實(shí)際上是物理空間維度上用戶的覆蓋面丢习,避免數(shù)據(jù)中心過小而用戶過多,導(dǎo)致數(shù)據(jù)中心之間的負(fù)載不均衡
所謂的系統(tǒng)設(shè)計(jì)淮悼,目的就是為了處理好用戶的訪問生命周期咐低,必須深刻理解用戶的訪問生命周期,也要理解訪問生命周期是如何推動(dòng)并形成硬件的拆分和部署以及網(wǎng)絡(luò)的拆分和部署的
二十六袜腥、軟件架構(gòu)和大數(shù)據(jù)
大數(shù)據(jù)并非是某一種具體的數(shù)據(jù)渊鞋,也并非指數(shù)據(jù)是否大,而是相對(duì)于以前的數(shù)據(jù)處理方式而言的瞧挤,是對(duì)關(guān)系型數(shù)據(jù)庫(kù)處理方式的顛覆锡宋。其實(shí)說的是新的針對(duì)大量數(shù)據(jù)的處理技術(shù),并非“大數(shù)據(jù)”這個(gè)概念表面文字那樣是說“數(shù)據(jù)”本身
要做好大數(shù)據(jù)特恬,真正的焦點(diǎn)并不在“大”执俩,而在“數(shù)據(jù)”本身。真正的理解數(shù)據(jù)癌刽,才能夠處理好數(shù)據(jù)役首,讓數(shù)據(jù)產(chǎn)生價(jià)值
有了大數(shù)據(jù)這個(gè)工具,分析業(yè)務(wù)數(shù)據(jù)就可以得到不同生命周期的變化過程显拜,得到不同業(yè)務(wù)決策對(duì)用戶行為的影響衡奥,可以幫助判斷不同生命周期的運(yùn)轉(zhuǎn)是否良好以及整體業(yè)務(wù)運(yùn)營(yíng)是否和預(yù)想的一致等,這其實(shí)就是業(yè)務(wù)的監(jiān)控和預(yù)警远荠,或者叫做業(yè)務(wù)的運(yùn)營(yíng)
從另外一個(gè)角度看矮固,只要對(duì)實(shí)時(shí)度和數(shù)據(jù)集大小的要求不高,關(guān)系型數(shù)據(jù)庫(kù)還是可以很好地完成任務(wù)的譬淳,理解了業(yè)務(wù)档址,一樣可以把業(yè)務(wù)的監(jiān)控和預(yù)警做好,并不一定要采用大數(shù)據(jù)技術(shù)邻梆。真正的重點(diǎn)在于理解業(yè)務(wù)守伸,而不是技術(shù)本身。有些場(chǎng)景下浦妄,關(guān)系型數(shù)據(jù)庫(kù)還是有自己的優(yōu)勢(shì)的尼摹。
用戶對(duì)軟件的訪問生命周期體現(xiàn)了業(yè)務(wù)的訪問行為见芹,也同時(shí)體現(xiàn)了軟件本身的訪問行為,因此訪問日志(Access Log)可以被用于業(yè)務(wù)數(shù)據(jù)分析和軟件本身的業(yè)務(wù)分析蠢涝。所有的服務(wù)器都帶有訪問日志辆童,不需要額外的開發(fā)成本。
當(dāng)業(yè)務(wù)需要從大量的軟件訪問日志中抽取用戶的業(yè)務(wù)行為時(shí)惠赫,也是典型的大數(shù)據(jù)應(yīng)用場(chǎng)景
得到的數(shù)據(jù)只是一個(gè)表象,簡(jiǎn)單的收集數(shù)據(jù)并不能解決問題故黑,哪怕采用大數(shù)技術(shù)也是一樣儿咱。不理解這些架構(gòu)的拆分,不理解這些拆分出來的生命周期的積累场晶,是無(wú)法理解數(shù)據(jù)的混埠。因此,架構(gòu)對(duì)于大數(shù)據(jù)處理至關(guān)重要诗轻。
軟件的大數(shù)據(jù)分為兩部分:
一部分是業(yè)務(wù)的監(jiān)控和預(yù)警钳宪,由業(yè)務(wù)方來執(zhí)行
一部分是軟件本身的監(jiān)控和預(yù)警,由運(yùn)維團(tuán)隊(duì)來執(zhí)行
由于業(yè)務(wù)運(yùn)營(yíng)的數(shù)據(jù)往往來源于運(yùn)維團(tuán)隊(duì)扳炬,所以業(yè)務(wù)的運(yùn)營(yíng)少不了運(yùn)維的支持和參與吏颖,也就是說業(yè)務(wù)的運(yùn)營(yíng)會(huì)訪問運(yùn)維團(tuán)隊(duì)。針對(duì)不同的業(yè)務(wù)業(yè)務(wù)團(tuán)隊(duì)恨樟,運(yùn)維團(tuán)隊(duì)內(nèi)部還要對(duì)此進(jìn)行分工半醉,形成不同的訪問通道,避免不同的業(yè)務(wù)方互相干擾劝术,從而對(duì)自己產(chǎn)生不必要的溝通成本
二十七缩多、軟件架構(gòu)和建筑架構(gòu)
軟件架構(gòu)和建筑架構(gòu)都是為人服務(wù)的,兩者在這一點(diǎn)上是一致的养晋,都是為了解決人類自身生命周期的問題衬吆,對(duì)世界做的一個(gè)拆分。并且拆分的結(jié)果绳泉,都是對(duì)人類形成了分工逊抡。拆分的目的,也都是為了延長(zhǎng)人類的生命周期零酪,提升人類生命周期活動(dòng)的推進(jìn)質(zhì)量秦忿。
很多人認(rèn)為架構(gòu)就是一個(gè)框架或架子的原因就在于,要知道框架和架子的目的僅僅是為了實(shí)現(xiàn)架構(gòu)對(duì)空間的切分蛾娶,屬于實(shí)施的技術(shù)灯谣,并非架構(gòu)本身
軟件的目標(biāo)關(guān)注的是把人們所做的事情模擬出來,把人從重復(fù)的勞動(dòng)中解脫出來蛔琅。世界是周期變化 的胎许,意味著軟件一旦把這些周期模擬出來、管理起來,人們只需要按照自己的需要辜窑,推動(dòng)這些生命周期為自己服務(wù)即可钩述,不需要親自去執(zhí)行這個(gè)周期,軟件所關(guān)心的是人類生命周期的切分穆碎,把人類自身執(zhí)行生命周期活動(dòng)以外的非核心生命周期用軟件來模擬實(shí)現(xiàn)牙勘,讓人可以有更多的時(shí)間來算下推進(jìn)自己的生命周期,提升生命質(zhì)量
建筑的設(shè)計(jì)建造往往是由建筑公司來做的所禀,運(yùn)營(yíng)可以完全交給物業(yè)公司方面;而軟件目前做不到,必須要自己運(yùn)營(yíng)色徘;建筑可以出租給其他的用戶來使用恭金,軟件的出租比較難,只有娛樂軟件或標(biāo)準(zhǔn)化的軟件相對(duì)容易些褂策;
有了軟件之后横腿,人的一輩子能夠作出更多的創(chuàng)造,達(dá)成更多的目標(biāo)斤寂,也相當(dāng)于延長(zhǎng)了人的生命
建筑擴(kuò)展主要是橫向擴(kuò)展耿焊,由一個(gè)一個(gè)的個(gè)體建筑,形成了社區(qū)遍搞、城市和國(guó)家搀别,縱向擴(kuò)展可以理解為重新裝修,改善居住空間
像建筑一樣的瀑布式開發(fā)并不理想:
一是由于人們對(duì)軟件的認(rèn)識(shí)還遠(yuǎn)遠(yuǎn)達(dá)不到對(duì)建筑的認(rèn)識(shí)程度
二是建筑的訪問增長(zhǎng)是可以預(yù)測(cè)的尾抑,而軟件則不可預(yù)測(cè)
軟件的優(yōu)勢(shì)是建造非常簡(jiǎn)單的代碼歇父,不僅原有的設(shè)施可以直接使用,而且每次發(fā)布都可以重用以前寫好的代碼再愈,只需要做增量的修改即可榜苫;建筑的模塊化程度也遠(yuǎn)低于軟件;
二十八翎冲、交易
交易就是人們各自拿自己多余的物品垂睬,從其他人手上換取自己必須的物品,從而雙方都獲得利益的過程
所謂市場(chǎng)抗悍,就是指集中發(fā)生交易的地方驹饺,每個(gè)人都可以在市場(chǎng)上賣自己的物品,也可以在市場(chǎng)上尋找自己想買的物品
用單位時(shí)間增加的產(chǎn)出去換取另一個(gè)人對(duì)應(yīng)時(shí)間增加的產(chǎn)出缴渊,大家都用比較少的時(shí)間得到了更多的回報(bào)赏壹。因此,慢慢也出現(xiàn)了很多人直接用自己的時(shí)間與人交易衔沼,得到自己的生活必須品蝌借,這就形成了雇傭關(guān)系昔瞧,從而變成了職業(yè)
企業(yè)通過對(duì)生產(chǎn)的生命周期分工,雇傭更多的人菩佑,組織他們并行工作自晰,可以得到更大的產(chǎn)能,甚至1+1>2的效果稍坯,這就是企業(yè)的組織架構(gòu)
促使用戶訪問軟件的動(dòng)力酬荞,就在于軟件的虛擬化極大地減少了人們獲得物品的難度,所有獲取的信息量更大瞧哟,因此混巧,要評(píng)價(jià)一個(gè)軟件的價(jià)值,它的訪問量是一個(gè)至關(guān)重要的衡量標(biāo)準(zhǔn)绢涡,因?yàn)槊恳淮斡脩舻脑L問,就相當(dāng)于該軟件所產(chǎn)生的一個(gè)交易
交易的背后實(shí)際上是人們互相之間時(shí)間的交換遣疯,而不是貨幣雄可。貨幣只是對(duì)時(shí)間的定價(jià),方便交易的一個(gè)工具缠犀。對(duì)于不同的商業(yè)模式数苫,交易都有自己的形態(tài),需要人們識(shí)別出來
企業(yè)的生命長(zhǎng)度可以遠(yuǎn)遠(yuǎn)超過一個(gè)人的生命長(zhǎng)度辨液,所以很多人會(huì)把企業(yè)當(dāng)作自己生命的延長(zhǎng)來付出虐急。企業(yè)要具有比人長(zhǎng)的壽命,就要超出個(gè)人的訴求滔迈,不再為某個(gè)個(gè)人服務(wù)止吁,而是為了一個(gè)群體服務(wù),形成了企業(yè)的核心訴求和目標(biāo)燎悍,也就是人們常說的企業(yè)愿景(Vision)
企業(yè)在達(dá)成愿景的過程中敬惦,其生命周期由一個(gè)一個(gè)和用戶的交易積累而成。交易又由一次一次的訪問生命周期積累而成谈山,這就是企業(yè)生命周期的動(dòng)作過程俄删,也是企業(yè)生命周期的架構(gòu)拆分
組織架構(gòu)的目的就是通過更多人的并行工作,來支撐更多用戶的訪問生命周期奏路。無(wú)論哪種企業(yè)畴椰,交易的最終實(shí)現(xiàn),都是通過用戶的訪問來達(dá)成的鸽粉。訪問是如何達(dá)成的斜脂,訪問生命周期是如何切分的,則是不同企業(yè)的區(qū)別之處触机,也是不同企業(yè)愿景的入手點(diǎn)
二十九秽褒、產(chǎn)品
交易過程中壶硅,人們交換的物品被稱為產(chǎn)品(Product),有時(shí)也被稱為商品(Good)销斟。產(chǎn)品配上主語(yǔ)就是:誰(shuí)生產(chǎn)的一個(gè)東西
人類要訪問產(chǎn)品庐椒,首先要有一個(gè)訪問目標(biāo),即產(chǎn)品本身蚂踊,其次還需要一個(gè)訪問的途徑约谈,兩者都具備才能夠達(dá)成對(duì)產(chǎn)品的訪問
制造類的產(chǎn)品要能夠讓人類訪問,必須要到達(dá)人類的感覺范圍內(nèi)犁钟。因此必須要建立空間的渠道棱诱,經(jīng)歷時(shí)間傳輸?shù)接脩舻母杏X范圍內(nèi),用戶通過自己的感覺器官才能夠接觸訪問到產(chǎn)品
為人類提供對(duì)制造類產(chǎn)品訪問的空間通道涝动,所形成的便是服務(wù)類的產(chǎn)品迈勋,也就是通道類的產(chǎn)品
產(chǎn)品更多的是表達(dá)生產(chǎn)屬性,而商品則更多的是表達(dá)交易屬性醋粟。產(chǎn)品本身不一定能夠售賣靡菇,但是售賣的東西一定是某個(gè)產(chǎn)品,也就是說一定是某個(gè)主體所生產(chǎn)的產(chǎn)品
從用戶角度看米愿,在達(dá)成交易之前 厦凤,用戶尋找的是解決自己?jiǎn)栴}的產(chǎn)品。而在尋找到自己想要的產(chǎn)品之后交易時(shí)育苟,用戶考慮的則是數(shù)量和價(jià)格较鼓,交易時(shí)購(gòu)買的是商品。在用戶使用的時(shí)候仍然是產(chǎn)品违柏,也就是產(chǎn)品屬性
對(duì)于一個(gè)企業(yè)來說潮模,如果這個(gè)企業(yè)的領(lǐng)導(dǎo)人對(duì)自己企業(yè)的愿景不夠清晰的話罢缸,往往會(huì)帶來一個(gè)嚴(yán)重的問題找筝,就是這個(gè)企業(yè)的產(chǎn)品往往是模糊的瑟曲。產(chǎn)品不清晰導(dǎo)致的結(jié)果就是:目標(biāo)人群不清楚,產(chǎn)品體系混亂闲孤,進(jìn)而導(dǎo)致組織架構(gòu)混亂 谆级,交易很難增長(zhǎng),企業(yè)也會(huì)陷入困境
要讓用戶知道這個(gè)產(chǎn)品讼积,就必須要把產(chǎn)品所解決的問題等信息傳播出去肥照,使得目標(biāo)用戶能夠訪問到這些令牌,通過這些令牌吸引用戶來訪問產(chǎn)品的入口勤众,讓用戶產(chǎn)生交易的意愿舆绎,這就叫做市場(chǎng)營(yíng)銷(Marketing)
產(chǎn)品本身就是最好的營(yíng)銷。產(chǎn)品系統(tǒng)實(shí)際上是市場(chǎng)營(yíng)銷的起點(diǎn)们颜,也是交易的起點(diǎn)吕朵,也是企業(yè)用來實(shí)現(xiàn)自己愿景的工具猎醇,是愿景的具體化
產(chǎn)品列表(產(chǎn)品目錄)要展示的信息,就是把企業(yè)的愿景傳遞給用戶努溃,取得用戶的認(rèn)同并購(gòu)買硫嘶。把產(chǎn)品列表向目標(biāo)人群分發(fā),就是產(chǎn)品的營(yíng)銷
商品規(guī)則:
從商品本身為出發(fā)點(diǎn)的梧税,一般是來提升商品本身的銷量沦疾。比如優(yōu)惠價(jià)格、評(píng)價(jià)優(yōu)惠等
從客戶本身為出發(fā)點(diǎn)的第队,一般是用來提升用戶的數(shù)量哮塞,或者提升用戶的活躍度。比如新用戶優(yōu)惠等
從支付推廣為出發(fā)點(diǎn)的凳谦,一般是用來提升某個(gè)支付方式的使用率忆畅。比如啊啊服務(wù)號(hào)信用卡優(yōu)惠等
三十、用戶
用戶尸执,用的是某個(gè)主體生產(chǎn)的產(chǎn)品家凯。當(dāng)某人正在使用某個(gè)主體生產(chǎn)的產(chǎn)品時(shí),一般會(huì)說此人就是這個(gè)產(chǎn)品的用戶剔交。用戶表達(dá)的是產(chǎn)品運(yùn)行生命周期中所服務(wù)的人或人群
客戶(Customer)肆饶,更多的是關(guān)注在交易層面改衩,是產(chǎn)品銷售的對(duì)象岖常,也是交易的對(duì)象,目標(biāo)是為了讓產(chǎn)品的客戶成為產(chǎn)品的用戶
用戶這個(gè)概念是針對(duì)產(chǎn)品生產(chǎn)者葫督,也就是企業(yè)而言的竭鞍,目的是為了把用戶處的信息,通過某種方式搜集到企業(yè)這里橄镜,是企業(yè)對(duì)其產(chǎn)品使用方建檔并跟蹤的一個(gè)原始數(shù)據(jù)組織
任何產(chǎn)品都需要用戶偎快,因?yàn)楫a(chǎn)品的生產(chǎn)都是為人服務(wù)的。用戶對(duì)于企業(yè)是至關(guān)重要的洽胶,任何企業(yè)都是由人推動(dòng)往前發(fā)展的晒夹。企業(yè)只是人類需求的一個(gè)實(shí)現(xiàn)形式,因此企業(yè)時(shí)刻都要以人為本
要讓人們成為企業(yè)產(chǎn)品的用戶姊氓,企業(yè)必須要把產(chǎn)品賣給客戶
用戶的產(chǎn)品使用行為記錄基本上靠用戶主動(dòng)反饋的產(chǎn)品使用信息丐怯,企業(yè)有責(zé)任幫助用戶解決產(chǎn)品訪問和使用上的任何問題,這就是產(chǎn)品的運(yùn)營(yíng)翔横。用戶的信息一直保留在企業(yè)處读跷,這是企業(yè)非常寶貴的數(shù)據(jù),也是下一輪銷售生命周期的起點(diǎn)
企業(yè)應(yīng)該投入資源從通道處獲取自己產(chǎn)品的訪問情況禾唁,用來提升自己的產(chǎn)品
三十一效览、訂單
訂單无切,就是指和客戶的一次交易的生命周期過程,實(shí)際上是所售賣產(chǎn)品的訂單丐枉,表述的是產(chǎn)品的售賣過程哆键,售賣的東西是產(chǎn)品中的某個(gè)商品。訂單所代表的就是一次交易的整個(gè)生命周期過程矛洞,從交易生成開始產(chǎn)生訂單洼哎,到交易結(jié)束為止完成訂單
其實(shí)復(fù)雜的事情一開始都是簡(jiǎn)單的,簡(jiǎn)單的東西逐漸地發(fā)生拆分就變得越來越復(fù)雜了
三十二沼本、交易系統(tǒng)
一個(gè)交易是需要兩方來形成的噩峦,一是賣方,還有一個(gè)愿意購(gòu)買的買方抽兆。要兩方同時(shí)達(dá)成一致才能夠形成一個(gè)交易识补。
企業(yè)愿景的達(dá)成依靠企業(yè)所生產(chǎn)產(chǎn)品的售賣,通過交易建立起客戶獨(dú)占訪問產(chǎn)品的通道辫红,使企業(yè)和客戶都獲得更大的利益凭涂,形成雙贏的結(jié)果
企業(yè)的交易生命周期是核心生命周期,企業(yè)的生產(chǎn)是為交易服務(wù)的
產(chǎn)品訪問通道是交易系統(tǒng)能夠運(yùn)作的前提贴妻。為了把產(chǎn)品展示給客戶切油,一般就會(huì)要求產(chǎn)品的負(fù)責(zé)人把所有產(chǎn)品整理好,用來供用戶查詢名惩,這就是產(chǎn)品系統(tǒng)
為了跟蹤客戶使用產(chǎn)品的問題澎胡,還需要把客戶的信息和購(gòu)買行為記錄下來,這就形成了客戶系統(tǒng)
有了用戶的購(gòu)買行為和聯(lián)系方式娩鹉,客戶的通道就建立了攻谁。利用這個(gè)通道就可以在適當(dāng)?shù)臅r(shí)機(jī)推薦合適的產(chǎn)品,或者在客戶兩次購(gòu)買的時(shí)候弯予,快速的幫助客戶選擇到更合適的產(chǎn)品戚宦,這就是營(yíng)銷推薦系統(tǒng)
一個(gè)企業(yè)的交易生命周期和訂單生命周期是核心生命周期,而產(chǎn)品锈嫩、用戶等生命周期都可以不用自己親自來做受楼,但訂單是非要自己來做不可的
對(duì)于架構(gòu)師和軟件工程師來說,如何快速識(shí)別模型需要對(duì)業(yè)務(wù)的生命周期進(jìn)行深入了解呼寸,要對(duì)業(yè)務(wù)的特性有足夠的認(rèn)識(shí)和體會(huì)艳汽。對(duì)業(yè)務(wù)系統(tǒng)的建模來源于業(yè)務(wù)本身生命周期的拆分,即組織架構(gòu)的拆分等舔。建模實(shí)際上就是把人虛擬化骚灸,把各業(yè)務(wù)系統(tǒng)負(fù)責(zé)人的工作用模型表達(dá)出來。模型中的每一個(gè)對(duì)象慌植,代表的就是現(xiàn)實(shí)生活中一個(gè)個(gè)活生生的人甚牲。這個(gè)對(duì)象的方法义郑,代表的就是這個(gè)人所負(fù)責(zé)的業(yè)務(wù)生命周期行為
“阻抗不匹配(Impedance dismatch)”,兩個(gè)東西完全不匹配丈钙,放在一起反而會(huì)互相干擾造成更大的問題
業(yè)務(wù)模型完全就是現(xiàn)實(shí)社會(huì)中已存在的分工非驮,建模的人只需要識(shí)別出來就可以,不需要再絞盡腦汁用不同技術(shù)抽象出來另外建一個(gè)模型來表達(dá)業(yè)務(wù)
軟件模擬業(yè)務(wù)的展現(xiàn)方式總是盡量模擬現(xiàn)實(shí)生活雏赦,讓用戶感到是“真實(shí)的人”人在服務(wù)于自己劫笙。軟件的一切都是在模擬人的行為
訪問通道的另一個(gè)非常重要的要求就是,不同類型的用戶訪問要提供單獨(dú)的訪問通道
很多架構(gòu)師喜歡做訪問通道的重用星岗,往往會(huì)導(dǎo)致不相干的另一類用戶訪問受影響填大。不重用訪問通道的目的是為了重用業(yè)務(wù)對(duì)象。一旦重用訪問通道俏橘,業(yè)務(wù)對(duì)象中的業(yè)務(wù)邏輯一定會(huì)分散到訪問通道中允华,業(yè)務(wù)邏輯反而得不到重用了
在計(jì)算機(jī)軟件中,服務(wù)的本身是客戶端訪問服務(wù)端的訪問通道寥掐,是不包含所服務(wù)的業(yè)務(wù)的靴寂。一旦軟件發(fā)生了架構(gòu)拆分,原來的本地調(diào)用就變成了服務(wù)調(diào)用
服務(wù)有自己獨(dú)立的生命周期召耘,會(huì)形成自己獨(dú)立的業(yè)務(wù)百炬,不再依賴于原核心生命周期,煥發(fā)出新的活力
架構(gòu)拆分最終都會(huì)形成最小粒度的生命周期污它,粒度有多小取決于業(yè)務(wù)本身的規(guī)律剖踊,也取決于當(dāng)前技術(shù)的發(fā)展水平
用戶系統(tǒng)的核心是為了能夠標(biāo)識(shí)用戶,讓用戶能夠以獨(dú)立的身份訪問系統(tǒng)轨蛤,從而軟件可以識(shí)別并跟蹤用戶
做架構(gòu)的拆分不會(huì)影響外部蜜宪,而影響外訪問行為的拆分都是業(yè)務(wù)的破壞虫埂,應(yīng)該叫做結(jié)構(gòu)變化或業(yè)務(wù)變化
三十三祥山、事務(wù)
在英文中,Transaction的含義是交易的意思掉伏,指的是物物交換缝呕。
在軟件中實(shí)現(xiàn)交易的時(shí)候,一般是通過訂單來記錄各方的當(dāng)前狀態(tài)斧散。交易中過往行為的記錄供常,則是通過操作日志來實(shí)現(xiàn)的。操作日志和訂單記錄結(jié)合起來模擬人類大腦的記憶鸡捐。所謂回滾栈暇,也是通過已執(zhí)行操作的日志記錄,按發(fā)生順序反向執(zhí)行恢復(fù)反向操作來進(jìn)行的箍镜。因此源祈,交易日志在軟件中是至關(guān)重要的煎源。
軟件把內(nèi)部運(yùn)行中的生命周期狀態(tài)交換給數(shù)據(jù)庫(kù)來保存,而數(shù)據(jù)庫(kù)本身獲得了生存香缺,有了自己的生命周期手销,形成了新的存儲(chǔ)技術(shù)。而為了確保把軟件的狀態(tài)可靠的存儲(chǔ)图张,可靠的獲取锋拖,就需要一定的機(jī)制來保障這個(gè)交易,這就是數(shù)據(jù)庫(kù)的Transaction技術(shù)祸轮,也就是所謂的事務(wù)兽埃,應(yīng)該就是要達(dá)到可靠數(shù)據(jù)交換的緣故
數(shù)據(jù)庫(kù)應(yīng)該完全和軟件所模擬的業(yè)務(wù)脫離關(guān)系,應(yīng)該恢復(fù)到其本身的作用上來适袜,即持久化軟件的狀態(tài)讲仰,并且僅僅持久化軟件的狀態(tài)
數(shù)據(jù)庫(kù)事務(wù)只應(yīng)該存在于和數(shù)據(jù)庫(kù)打交道的存儲(chǔ)代碼中
假設(shè)被調(diào)用的兩個(gè)服務(wù)不是在同一個(gè)事務(wù)中:
第一個(gè)服務(wù)不成功,說明整個(gè)調(diào)用操作是失敗的痪蝇,沒有影響
兩個(gè)服務(wù)都調(diào)用成功鄙陡,說明整個(gè)操作是成功的
一個(gè)成功一個(gè)失敗
調(diào)用方收到錯(cuò)誤提示后自行
重試每個(gè)服務(wù)的調(diào)用
將第一個(gè)服務(wù)做反向操作,恢復(fù)現(xiàn)場(chǎng)躏啰,需要操作日志的幫助趁矾,如果不能恢復(fù),則需要人工介入解決给僵,恢復(fù)數(shù)據(jù)
導(dǎo)圖:
https://github.com/zhangyue0503/blogfile/tree/master/%E8%81%8A%E8%81%8A%E6%9E%B6%E6%9E%84