对于一个架构师而言,进入一家新的公司,从0到1的去开发一个系统是不多的,更多的是要接一个“烂摊子”。这种情况下,是非常考验架构师的分析和治理能力;而且,这种情况下的价值兑现(薪资)也自然会更加丰厚。
引言:从“设计者”到“守护者”

在过去的十七篇中,我们一起讨论和学习的都是如何设计和构建----如何成为一名卓越的“设计师”——我们设计蓝图,构建能够抵御高并发洪峰、容忍硬件故障、拥抱业务变化、防范安全威胁、并能被清晰观测的宏伟“数字大厦”。
然而,软件系统天生就有腐烂的特性,迭代永不停歇的互联网系统更是如此。项目在初期无论是由多么优秀的架构师设计的、多么优雅的系统,如果在后续漫长的岁月里,缺乏有效的守护,它的结局几乎是注定的:
-
为了赶项目进度,应用层直接增加了对Redis的调用,后来发现这个功能很好用,然后就不停在这个Redis上加字段,导致value越来越大、性能越来越差
-
由于市场变化,新增了一个销售渠道,与现有规则比较大,就又“自立门户”重新搞一套,结果后面有8个销售渠道,维护了8个类似的系统
这个过程,我们称之为“架构腐化”或“软件熵增”。它是一种无声无息,却又不可逆转的“老化”过程。如果不加以控制,我们曾经引以为傲的“数字大厦”,最终会沦为一座谁也不敢碰、谁也维护不起的“技术危房”。
本文是架构思维系列的最后一个模块「架构治理、演进与影响力」的第一篇。我们对架构师的定位迎来一次重要的补充,架构师不仅是“设计者”,更要成为一名合格的“守护者”。我们将深入探讨架构治理的核心方法与工具,学习如何通过建立一套行之有效的流程和规范,确保我们的架构在一次次的版本迭代、一次次的人员变更中,依然能够坚守其核心原则,不偏离航道,从而真正成为一项可持续增值的、而非持续贬值的战略资产。
一、 沉默的杀手:理解架构为何会“腐化”

在寻找“解药”之前,我们必须先准确地诊断“病因”。架构腐化并非源于某个人的恶意破坏,而是一种系统性的、由多重因素共同作用的“自然趋势”。
-
业务压力下的“权宜之计”:这是最常见的原因。“这个需求下周就要上线!”在巨大的时间压力面前,坚持正确的架构原则,往往需要付出更高的短期成本。于是,“先这么搞,后面再重构”成了最诱人的魔咒。但我们都心知肚明,那个“后面”,往往遥遥无期。每一次的“权宜之计”,都是在架构的纯净画布上,留下的一块难以擦除的污迹。
-
团队认知的不一致:随着团队规模的扩大和人员的流动,不同背景、不同水平的工程师,对系统的理解千差万别。如果没有一套明确的、成文的“规范”,每个人都会基于自己的理解,去“创造性”地解决问题。这种个体上的“最优解”,往往是整体上的“灾难解”,最终导致系统架构呈现出“千层饼”式的混乱。
-
“技术热潮”的诱惑:技术世界永远不缺新的“银弹”。今天一个新框架,明天一个新数据库。如果缺乏统一的评估和引入机制,团队很容易陷入“技术选型联合国”的困境。系统中充斥着各种异构的技术栈,不仅极大地增加了维护成本和认知负担,也使得跨团队协作变得异常困难。
-
“破窗效应”的心理暗示:当架构的第一扇“窗户”被打碎(即第一个不合理的修改被接受),而没有得到及时的修复,它就会向所有人传递一个危险的信号:“这里的规则,是可以被打破的”。很快,第二扇、第三扇窗户也会被打碎,最终,整个社区都会变得混乱不堪。
架构腐化是非常难以发现的,而一旦爆发,其后果是灾难性的,它会让我们在之前文章讲过的“坏味道”集中爆发:研发效能断崖式下跌,线上故障率指数级上升,最终,技术彻底拖垮业务。
二、 治理的基石:架构原则与标准

要对抗混乱,首先需要建立秩序。架构治理的第一步,就是为我们的技术世界,制定一套清晰、共识的共识和规范。
1. 架构原则:指引方向的“北极星”
-
是什么:架构原则是高层次的、指导性的、相对稳定的价值宣言。它们定义了“我们信奉什么”,是我们做技术决策时的根本出发点。
-
特点:抽象、普适、不易变。
-
示例:
-
“高内聚、低耦合”:正如我们在之前的文章《架构原则(一):内聚与耦合 —— 衡量软件“健康度”的黄金法则》讲过的:模块内所有元素都为了完成一个单一、明确定义的功能而共同协作,实现高内聚;模块之间通过简单的数据参数进行通信,传递的都是“业务所需”的最小数据集,实现低耦合。
-
“SOLID原则”:单一职责、开放闭合、LSP&ISP&DIP铁三角,所构成的在软件设计时候需要充分考虑和权衡的原则。
-
2. 架构标准:必须遵守的“规范”
-
是什么:架构标准是具体的、强制性的、可落地的技术规范。它们定义了“我们应该怎么做”。
-
特点:具体、可检验、随技术发展而演进。
-
示例:
-
技术栈标准:“所有新的后端微服务,必须使用Java 17 + Spring Boot 3.x技术栈。”
-
API设计标准:“所有对外的RESTful API,必须遵循OpenAPI v3.0规范,并提供完整的Swagger文档。”
-
数据库标准:禁止在业务代码中使用
join超过三张表的复杂查询。” -
可观测性标准:“所有服务必须接入公司统一的Prometheus监控体系,并暴露‘四大黄金指标’;所有日志必须为结构化的JSON格式,并上报至集中式日志平台。”
-
原则和标准,绝不能是架构师团队“闭门造车”的产物。它们必须源于实践,通过与一线开发团队的广泛讨论,达成共识。一个好的原则和标准,应该是“赋能”而非“束缚”的,它能帮助团队减少不必要的决策,聚焦于真正有价值的创造。
三、 治理的核心:架构评审机制

有了共识和规范,就需要一个组织来解释和执行它。这个角色,通常由架构委员会或技术委员会来承担。
1. 架构委员会的使命:从“守门员”到“领航员”
我们必须警惕,将ARB变成一个拖沓的“审批机构”或脱离一线开发存在的独裁者。一个健康的架构委员会,其核心使命应该是:
-
确保一致性:确保重大的技术决策,与既定的架构原则和标准保持一致。
-
管理系统性风险:识别单个方案可能对整个系统生态带来的跨领域影响(如性能、安全、成本)。
-
促进知识共享:将优秀的架构设计和实践,通过评审过程,在不同团队间传播和复用。
-
赋能团队决策:为一线团队提供专家建议和指导,帮助他们做出更高质量的设计,而不是简单粗暴地“批准”或“驳回”。
2. 运作模式
-
谁来参与? 这个委员会应由来自不同核心业务域的资深架构师、首席工程师,以及安全、运维、数据等领域的专家共同组成。
-
评审什么? 并非所有设计都需要评审。我们需要明确定义评审的“触发条件”:
-
引入一个新的技术框架、中间件或数据库。
-
创建一个新的核心业务服务,或对核心领域模型或关键模块进行重大变更。
-
涉及跨多个业务域的复杂技术方案。
-
-
如何评审? 流程应尽可能轻量化:
-
提交:团队提交一份简洁的设计文档(可能就是一个草案),清晰地说明背景、方案和权衡。
-
评审会:委员会的成员与设计团队进行一次聚焦的讨论会。重点是提问、探讨和对齐,而非单向的“汇报”。
-
决议:形成清晰的、可执行的会议纪要,包括“同意”、“需要补充XX信息后再议”或“建议采用替代方案”等。
四、 治理的记忆:架构决策记录

如果说原则和标准是规范,架构委员会是决策者,那么架构决策记录(Architecture Decision Record, ADR)就是我们整个技术世界的“判例档案库”。
-
解决了什么问题? 它解决了架构演进中最致命的一个问题:我们知道“做了什么”,但我们忘记了“为什么这么做”。当新人接手一个老系统,看到一段“奇怪”的设计时,如果没有ADR,他很可能会认为这是个“错误”,并“好心”地将其“修正”,结果却可能破坏了当初为了解决某个隐晦问题而做的精妙权衡。
-
ADR的核心结构:一份好的ADR,通常是一份简单的文档,包含以下几个核心部分:
-
标题:简明扼要地描述决策内容。例如:“ADR-001: 采用Kafka作为订单业务事件总线”。
-
状态:已提议、已接受、已废弃、被取代。
-
背景:我们面临什么样的问题?有哪些业务或技术上的驱动力?有哪些约束条件?
-
决策:我们最终决定采用什么方案?清晰地、无歧义地描述方案的核心内容。
-
后果(这是核心价值的体现):
-
正面影响:这个决策会带来什么好处?(例如,提升了系统解耦度、支持了更高的吞吐量)
-
权衡:我们接受了哪些负面影响,以换取我们想要的正面影响?
-
负面影响:这个决策会带来什么新的问题或风险?(例如,引入了新的运维复杂性、需要关注消息的最终一致性)
-
-
-
如何实践? 将ADR文件,与技术方案和代码一起,存放在项目的版本控制库中(例如,
docs/adr/目录)。这样,ADR就成了代码的一部分,随之演进,任何人都可以随时查阅。
五、 案例实战:电商交易系统的持续治理

背景
我们的电商交易系统,经过多年发展,已经成为一个庞大而复杂的“巨石”。最近,业务方希望快速接入多种新兴的支付方式(如数字钱包、先买后付),同时,线上偶尔出现的“掉单”、“卡单”问题,也让团队疲于奔命。
第一步:建立共识
架构团队与核心开发人员一起,通过几次深入的研讨,达成了交易域的“三大原则”和三个“核心标准”的共识:
-
原则1:一致性高于一切。任何情况下,宁可交易失败,也绝不能出现资金和订单状态不一致的资损问题。
-
原则2:核心稳定,外围隔离。交易主流程必须保持极高的稳定性,所有外部依赖(如支付、营销、物流)都必须通过防腐层进行隔离。
-
原则3:状态驱动,幂等设计。所有交易操作,都必须基于清晰的状态机流转,并保证接口的幂等性。
-
标准1:所有新的支付渠道,必须通过统一的“支付网关适配器模式”进行接入。
-
标准2:所有核心状态变更(如“已支付”、“已发货”),必须产生标准的领域事件,发布到统一的Kafka集群。
-
标准3:所有涉及状态比变更和资金操作的API,必须记录详细的、不可篡改的审计日志。
共识非常重要,是一切工作往下开展的前提,如果不能达成共识,后续会陷入无尽的争吵和持续低效的沟通。结果可能就是不欢而散,一切照旧。
第二步:架构委员会为“先买后付”功能保驾护航
-
场景:业务方要求紧急上线“先买后付”功能。某个开发小组为了追求速度,提出了一个“绕开支付网关,直接在订单服务里调用第三方API”的方案。
-
评审:该方案触发了“引入新的核心交易方式”的ARB评审条件。
-
在评审会上,架构委员会的成员提出了尖锐但关键的问题:
-
“这个方案,严重违反了我们制定的‘核心稳定,外围隔离’原则和‘支付网关适配器’标准。为什么?”
-
“‘先买后付’涉及到复杂的授信、分期、还款流程,它的状态如何与我们的主订单状态进行同步?这是否满足‘一致性高于一切’的原则?”
-
“直接调用,如何处理网络超时和第三方系统抖动?失败后的重试和状态同步机制是什么?这是否会影响交易主流程的稳定性?”
-
-
决议:该“快捷方案”被否决,团队必须遵循既定标准,在支付网关中,为“先买后付”开发一个新的适配器。虽然短期内开发工作量稍有增加,但从长远看,它保障了整个交易体系的稳定性和一致性。
第三步:用ADR记录下“艰难的抉择”
在后续的方案设计中,团队遇到了一个新的抉择:是采用与第三方实时同步的模式,还是异步回调的模式? 最终,团队撰写了这样一份ADR:
-
ADR-042: 采用异步回调模式集成‘先买后付’渠道
-
状态:已接受
-
背景:集成“先买后付”功能时,需要在用户下单后,向第三方服务商申请授信。该过程耗时可能较长(1-5秒)。
-
决策:我们决定采用异步回调模式。即:下单接口在收到用户请求后,立即向第三方发起授信申请,并返回给用户“处理中”状态。当第三方完成授信后,通过一个独立的回调接口,通知我们的系统更新订单状态为“支付成功”或“支付失败”。
-
后果:
-
正面:极大地优化了用户体验,用户无需在下单页面长时间等待。降低了交易主流程与第三方系统的同步耦合,提升了系统的健壮性。
-
负面:引入了数据最终一致性的复杂性。需要设计一套完整的状态对账和超时补偿机制,来处理回调丢失或延迟的情况。
-
权衡:我们认为,对于“先买后付”这种非实时支付场景,用户体验的提升,其价值远高于处理最终一致性所带来的技术复杂性。我们接受这一挑战,并已设计了相应的对账和补偿方案。
-
这份ADR,清晰地记录了团队在特定历史背景下的思考与权衡,为未来的系统维护者,留下了一份宝贵的“架构决策地图”。
结语:治理,是为了更自由的创新
我们必须深刻地理解,架构治理,其目的绝不是为了创造束缚创新的繁文缛节,恰恰相反,它是一种更高层次的“赋能”。一个被良好治理的系统,就像一个有着清晰交通法规和信号灯系统的城市:
-
道路(规范)是清晰的,每个人都知道该靠右行驶。
-
路口(接口)是有序的,红绿灯(评审)确保了车流不会发生致命的碰撞。
-
城市的规划(原则)是明确的,我们知道哪里可以行驶,哪里不可驶入。
正是在这样一种有序的环境中,每个驾驶员(开发者)才能更安心、更高效地驾驶自己的汽车(编写代码),在每一条道路都能顺畅的驾驶(支持业务),而不必时刻担心会发生混乱的交通大拥堵。
作为架构师,我们的工作是持续的,不仅要创造,更要守护。通过建立一套轻量而有效的治理体系,我们将架构设计从一种“一次性”的创作,升华为一种“可持续”的工程实践。这,正是通往卓越架构师之路的、不可或缺的修炼。
架构治理:防止系统腐化

被折叠的 条评论
为什么被折叠?



