目前,讨论架构实践(技术)的文章多,讨论架构概念(道)的文章少之又少。本文基于笔者的实践与思考,与大家聊聊建筑的概念性事物,希望能够抛砖引玉,促进大家对建筑的认识。什么是道,什么是艺?道是事物发展的本质规律,艺术是事物发展的具体方式。法则只有一个,方法有很多种,条条大路通罗马,罗马就是道路,道路就是艺术。道为本,艺为道,如果提前知道罗马在哪里,那么处处都是路,路是相通的。建筑也是如此。如果你能理解架构的本质,你就不会拘泥于现有的实践和理论框架,而是以最直接的方式解决问题。本文内容包括架构的本质、架构的服务对象、架构师的能力模型、架构的境界等。.根据热力学第二定律,自然界中一切自发过程都具有方向性,孤立的系统会从有序变为无序。它是无序的,即它的熵会不断增加,最终消亡。但生物体可以与外界相互作用,主动进行新陈代谢,制造“负熵”来保证自身秩序,继续生存下去。同样,随着一个软件系统的功能越来越多,调用次数急剧增加,整个系统逐渐碎片化、无序化,最终无法维护和扩展。因此,在经过一段时间的野蛮生长之后,系统也需要适时介入,以避免生长紊乱。架构的本质是有序地重构系统,不断降低系统的“熵”,使系统不断进化。架构如何实现无序到有序?基本方法是分而结合,先打散系统,再重新组装。划分的过程就是将系统拆分成各个子系统/模块/组件。拆解的时候首先要解决好各个部件的定位问题,然后才能划分出彼此的边界,做到合理的拆分。组合就是将各个独立的组件按照最终的需求进行有机的整合。相对而言,第一步拆分难度更大。拆分的结果使得开发人员可以专注于业务和技能,实现敏捷开发。集成的结果是系统变得灵活,可以根据需要进行更改,实现业务敏捷性。例如,在Web1.0时代,HTML和脚本代码在ASP或JSP页面中混合在一起。这时候脚本代码越多,系统就越混乱(也就是熵增),最终连开发者自己都看不懂。这时候就需要对系统进行重新架构。方法是引入viewhelper模式,将html和script分开,html变成view,script变成helper类。然后简单地把它放在一起。通过重新划分和整合,整个系统层次清晰,职责明确,减少了系统的混乱,便于扩展。同时,UED、程序员等不同技能的开发人员可以分管不同的部分,有效提高开发效率。好的建筑就像一篇飘逸的散文,形散神不散,表面看起来杂乱无章,实际上是高度有序的。架构分类和服务对象架构一般可以分为业务架构、应用架构和技术架构。那么他们解决什么问题,为谁服务呢?先来看一个系统实现的过程:对于开发负责人来说,最怕的就是业务太复杂,代码逻辑太乱,超出自己的理解范围,系统无法维护。因此,开发的要求是系统的整体概念清晰,易于理解,易于扩展。对于负责运行的机器来说,最怕的是业务并发量过大,系统核心资源不够用(比如数据库连接)。希望在业务量增大时,系统能够支持水平扩展,支持硬件容错(比如避免单点故障)。开发的痛点主要通过业务架构和应用架构来解决。业务架构有助于从概念层面开发和理解系统(动态的包括业务流程/节点/输入输出,静态的包括业务领域/业务模块/文档模型)。应用架构从逻辑层面(应用类型/应用形式/数据交互关系/交互方式等)帮助开发落地系统,整个系统在逻辑上易于理解。近来被人津津乐道的SOA,属于应用架构的范畴。机器的痛点主要通过技术架构来解决,比如技术平台的选择(操作系统/中间件/设备等),部署希望支持多机房,横向扩展,不单机观点。强调一下,系统是人的系统,架构首先是为人服务的。业务概念清晰、应用逻辑合理、易被人理解为先(即系统有序度高)。现在大家都在讨论更多的技术架构,比如高并发设计,分布式事务处理等等,就是因为这个不需要业务上下文,相互交流比较好。在设计具体的架构时,首先要关注业务架构和应用架构,这个架构新手要特别注意。建筑师能力模型建筑师只会做分而合之的事情,但是对综合能力的要求很高,需要内外兼修,厨房能用,厅堂能用。下图通过一个典型的架构方式介绍了架构师的能力要求:这里基本上架构师必须具备技术广度(多领域知识)和深度(技术远见),对主流公司的系统设计有很好的理解。进行评估。抽象思维是架构师最重要的能力。架构师必须善于对对象进行概念化和分类。比如面对大型B2C网站,可以快速抽象为采购->运营->前台搜索->订单->履行。抽象思维是总结和升华到一个较高的层次,由实到虚;而透过问题看本质,则是化虚为实,深入挖掘。比如你看到一段Java代码,就知道它在JVM中是如何执行的;如果进行跨网调用,就知道数据是如何通过各种介质(操作系统内核/网卡端口/电磁介质等)到达目标的。透过问题看本质,能够让架构师敏锐地发现背后的现实,系统地、端到端地思考问题,找出木桶的不足并加以解决。能实现的架构才是好的架构。良好的沟通能力确保各方对架构达成共识并愿意采取行动;良好的平衡和选择能力,保证了在现有资源的约束下,架构是最合理的,理想最终会体现在现实中。概括起来,架构师的能力要求包括:既有技术的广度(多领域知识)又有深度(技术前瞻性)既有思维的高度(抽象思维)又有深度(问题到本质)既有感性(沟通)又有理性(平衡)建筑境界建筑师从浅到深分为四个层次:第一,山不是山;第二,山就是山。第三,山不是山。第四,山就是山。刚接手这个项目的时候,我对业务了解不多,总是被业务方冒出来的术语吓一跳。如果我把现有的问题比作山,我看到的就是山丘和山峰,我根本想不通。此时,山非山。业务梳理和对系统深入了解后,可以设计一个笨方案,连接各个系统来解决当前的问题,就可以看清当前山的全貌。这时候看山就是山。通过进一步抽象,发现了问题的本质。原来这个问题很普遍,以后还会有很多类似的问题。对设计进行总结升华,得出一个通用的解决方案,既能解决当前的问题,又能解决潜在的问题。这时候看到的才是问题的本质,山不是山。最后,回到问题本身,去掉过多的抽象,给出简洁明了的设计。一分太肥,一分太瘦。既解决了现在的问题,又保留了最基本的扩展。这个时候,问题还是那个问题,山还是那山。第一境界给不了合适的解决方案,就不展示了。二级方案只解决表面问题,往往设计不够。如果其他类似问题或问题稍有变形,则需要返工系统。第三境界的解决方案往往设计过度,过于追求泛化会产生过多的抽象,产生概念,难以理解和实施。这时,系统的混乱程度反而会增加。第四境界的计划,在了解问题本质的基础上,同时考虑现状,评估未来,不多做,少做。佛教讲空与色。色是事物的现象,空是事物的本质。从这个意义上讲,第一层是无色空,第二层是色,第三层是空,第四层是立。色空之间,色空兼有,不着现在,不着未来空。非空非色,非空非色,道随性,如来之性,结构之本质。
