偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

架構(gòu)治理基石:基于規(guī)范 + 模式的工具化

開發(fā) 架構(gòu)
在我們的行業(yè)里,會(huì)將解決特定問(wèn)題的解決方案稱之為模式,如設(shè)計(jì)模式、架構(gòu)模式。這些廣為流傳的編程模式,都是好的、最佳的實(shí)踐。

圍繞于 ArchGuard,我們一直在探索適合于大多數(shù)企業(yè)的治理模式。通常來(lái)說(shuō),對(duì)于應(yīng)用架構(gòu)的治理來(lái)說(shuō),我們的預(yù)期目標(biāo)是,對(duì)應(yīng)的 架構(gòu)設(shè)計(jì) (廣義上的)能被采納和遵守。如果過(guò)程中出現(xiàn)有流程上的問(wèn)題,導(dǎo)致了架構(gòu)在實(shí)施過(guò)程中,架構(gòu)會(huì)不斷偏離預(yù)期的設(shè)計(jì)。那么,我們就會(huì)致力于匹配設(shè)計(jì)相應(yīng)的規(guī)范、規(guī)則和函數(shù),來(lái)確保后續(xù)在實(shí)施過(guò)程中是能正確的落地。

也因此,在架構(gòu)治理上,我們可以用一些簡(jiǎn)單的元素來(lái)進(jìn)行概括。

  • 模式。尋找壞的味道,并使用好的設(shè)計(jì)來(lái)改進(jìn)它。
  • 規(guī)范。一個(gè)關(guān)于架構(gòu)決策的文檔化。
  • 規(guī)則 。規(guī)范的工具化與形式化表示

于是乎,在我們的場(chǎng)景下,架構(gòu)治理方案就可以圍繞于三個(gè)要素來(lái)構(gòu)建。

模式:壞的味道與好的方案

在我們的行業(yè)里,會(huì)將解決特定問(wèn)題的解決方案稱之為模式,如設(shè)計(jì)模式、架構(gòu)模式。這些廣為流傳的編程模式,都是好的、最佳的實(shí)踐。但是,就個(gè)人而言,而另外一類,不好的模式其實(shí)也是模式,不過(guò),我們往往把它們稱為有味道(Smell)的,代碼里的是 代碼壞味道 ,架構(gòu)里的便是 架構(gòu)的壞味道 。

在一個(gè)組織里,代碼隨著人員的內(nèi)部流動(dòng)、自定義框架的編碼風(fēng)格、公司級(jí)別的規(guī)范定義,使得整體的代碼模式會(huì)趨向于一致。這種一致性會(huì)受到人員變更帶來(lái)短期的影響,些許的高水平 “新人” 可能會(huì)帶給團(tuán)隊(duì)一股新鮮備注;大量的新人的涌入,也會(huì)可能使得原來(lái)的好的模式被沖淡。但是呢,不論如何,替換的只是模式本身,而不是模式的存在。而壞味道本身即是與好的模式進(jìn)行比較,即好的實(shí)踐應(yīng)該是怎樣的。

也因此,在治理的第一步就是讓壞味道能浮出來(lái)。它可以是通過(guò)人為地看項(xiàng)目代碼,進(jìn)而得到一些初步的結(jié)論,并基于結(jié)論構(gòu)建出洞見;也可以是像 ArchGuard 一樣的專家系統(tǒng),可以通過(guò) AST 從語(yǔ)法中分析到壞的味道,并將它們可視化出來(lái)。

規(guī)范:架構(gòu)決策的文檔化

規(guī)范是我們?cè)谌粘5拈_發(fā)過(guò)程中約定俗成的標(biāo)準(zhǔn),其本質(zhì)是對(duì)于一系列架構(gòu)決策的文檔化。作為架構(gòu)師/開發(fā)者,我們定義所有的 API 應(yīng)該是怎樣的?如何去處理數(shù)據(jù)?如何構(gòu)建質(zhì)量防護(hù)?在另種一個(gè)話題: 輕量級(jí)架構(gòu)決策 里,我們定義的是架構(gòu)決策應(yīng)該編寫出來(lái),以格式化的文檔。

好的規(guī)范的本質(zhì)是 推薦 一系列的 最佳實(shí)踐 ?!澳贻p” 的開發(fā)者往往不能理解諸多實(shí)踐的意義,為什么它應(yīng)該這么做?不這么做會(huì)影響到什么?有時(shí)候,需要經(jīng)驗(yàn)豐富的開發(fā)者告他們,WHY + WHAT + HOW。不過(guò)呢,在一些大型 IT 組織的里,人們往往依舊會(huì)采用 “考試” 的方式,用一種簡(jiǎn)單粗暴的方式來(lái)確保:對(duì)于什么是好的模式/實(shí)踐認(rèn)知是一切的。

而規(guī)范不論是明文規(guī)定,還是約定俗成,我們都可以發(fā)現(xiàn),在業(yè)務(wù)繁榮或者新的加入的時(shí)候,慢慢都會(huì)被破壞。所以,我們又開始尋找一些能讓規(guī)范有效力的方式。

規(guī)則:規(guī)范的工具化與形式化表示

規(guī)則從某種意義上來(lái)說(shuō),是一種規(guī)范的工具化手段。其最常見的方式是 Linter,一種基于語(yǔ)法樹/語(yǔ)法結(jié)構(gòu)的規(guī)則化工具。

這種規(guī)則可以是我們?cè)趯W(xué)習(xí)英語(yǔ)時(shí)的語(yǔ)法規(guī)則,它是語(yǔ)言中高度抽象的組合關(guān)系和聚合關(guān)系的約定俗成的語(yǔ)言的規(guī)則,包括組合規(guī)則和聚合規(guī)則。諸如于在英語(yǔ)中,常見的句型可以是:主語(yǔ)-謂語(yǔ)-賓語(yǔ)-賓語(yǔ)補(bǔ)足語(yǔ)(英語(yǔ)四級(jí)沒過(guò),這簡(jiǎn)直是噩夢(mèng))。圍繞于這些規(guī)則,便可以構(gòu)建一系列的自動(dòng)化檢測(cè)工具。

這樣的工具,也可以是我們使用 Java 編寫企業(yè)應(yīng)用時(shí),用的 Checkstyle;又或者是使用 TypeScript 編寫前端應(yīng)用時(shí),用的 ESLint。從這一點(diǎn)上來(lái)說(shuō),它們就是對(duì)于常見規(guī)則的形式化。

治理:匹配模式,展示問(wèn)題,規(guī)則化與演進(jìn)

模式、規(guī)范、規(guī)則都依賴于編寫工具的人,他應(yīng)該即是一個(gè)架構(gòu)上的專家,又需要精通 編碼 + 語(yǔ)言 本身。又或者是兩者一起進(jìn)行結(jié)對(duì),才能設(shè)計(jì)一個(gè)如此的系統(tǒng)。

回到編程來(lái)治理問(wèn)題上,從過(guò)程上來(lái)說(shuō),我們治理架構(gòu)問(wèn)題的方式是:

  1. 設(shè)計(jì)、尋找對(duì)應(yīng)的規(guī)范(即最佳實(shí)踐)
  2. 人為識(shí)別代碼中的模式,隨后通過(guò)編寫代碼匹配,即規(guī)則。
  3. 通過(guò)可視化 + 分析的方式,展示出代碼中的問(wèn)題。
  4. 將規(guī)范規(guī)則化,并配合上度量指標(biāo)
  5. 構(gòu)建適應(yīng)度函數(shù),指導(dǎo)系統(tǒng)進(jìn)行演進(jìn)。

以 ArchGuard 中的 SQL 規(guī)則檢查為例,如下是代碼中的 SQL(經(jīng)過(guò)修改):

override fun getById(systemId: Long): SystemInfo? {
val sql = "select * from system_info where id=:systemId"
return jdbi.withHandle<Long, Nothing> {
it.createQuery(sql)
.bind("systemId", systemId)
.mapTo(SystemInfo::class.java)
.firstOrNull()
}
}

從 SQL 性能等角度來(lái)說(shuō),這里的 select *? 應(yīng)該是禁止的。但是呢,從識(shí)別的難度來(lái)說(shuō),它是存在的,我們需要結(jié)合著語(yǔ)法分析的結(jié)果,即 createQuery 的被調(diào)用 + 參數(shù)表中對(duì)應(yīng)值的存在,才能將 SQL 從代碼中解析出來(lái)。展開來(lái)說(shuō),在這個(gè)案例里,因?yàn)橄胫卫淼氖?SQL,所以我們所做的是:

  1. 尋找通用的 SQL 規(guī)范。
  2. 結(jié)合人為查閱的方式,從 SQL 規(guī)范中尋找第一個(gè)易于實(shí)現(xiàn)的案例
  3. 編寫代碼,從語(yǔ)法樹抽取 SQL,和對(duì)應(yīng)的 SQL 規(guī)則
  4. 將所有的問(wèn)題展示到一起

從治理的層面來(lái)說(shuō),最大的難點(diǎn)在于 模式逃逸 —— 即開發(fā)者可能根據(jù)識(shí)別的模式,修改代碼的實(shí)現(xiàn)方式,導(dǎo)致度量無(wú)用。不過(guò),這就是另外一個(gè)關(guān)于度量如何改進(jìn)的問(wèn)題。

責(zé)任編輯:張燕妮 來(lái)源: Phodal全棧工程師
相關(guān)推薦

2017-12-11 15:34:26

數(shù)字化API架構(gòu)

2023-11-02 17:52:30

架構(gòu)模式微服務(wù)服務(wù)治理

2021-04-13 11:32:34

開源開源治理開源代碼項(xiàng)目

2014-09-22 15:07:03

普元

2021-03-04 22:11:08

區(qū)塊鏈架構(gòu)金融

2023-09-13 07:19:46

數(shù)據(jù)開發(fā)平臺(tái)治理平臺(tái)

2013-08-05 09:45:16

云計(jì)算桌面虛擬化

2017-09-06 15:16:54

微服務(wù)數(shù)字化云遷移

2009-11-23 20:22:10

ibmdwSOA

2025-01-09 14:39:40

2019-12-09 08:00:00

GraphQLAPI架構(gòu)

2018-11-07 10:00:00

微服務(wù)Service MesIstio

2021-07-18 07:59:42

RedisRDBAOF

2022-11-16 09:03:35

Sentry前端監(jiān)控

2021-11-08 10:45:26

架構(gòu)軟件技術(shù)

2025-09-02 01:33:00

2022-08-01 15:45:43

數(shù)據(jù)治理數(shù)據(jù)集成數(shù)據(jù)驅(qū)動(dòng)

2011-07-15 16:33:29

2025-04-07 08:00:00

大數(shù)據(jù)數(shù)字化數(shù)據(jù)治理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)