个人从2001年开始参加工作,从最初的软件开发到架构设计,再到当前围绕SOA,微服务和云原生解决方案的一线项目规划建设实践,同时也负责公司的整体研发规划和平台架构路线设计。
因此想和大家分享下架构设计和架构师能力成长方面的感悟。
01-从几个常见的案例说起
在讲具体的内容前,我准备从几个我身边最近几年经常看到的案例说起,这些案例均为真实案例而非个人虚构案例,从这些案例可以触发我们更多思考。
案例一:技术狂热下不断推翻重建的技术框架
小张在一家从事企业信息化软件开发的公司担任研发管理和软件架构师多年,在这几年里面最喜欢的就是研究新技术和热门技术,不论是前端框架,还是当前微服务,基本都每2年左右就会把公司已有的技术框架或平台全部重新推广新搭建一遍技术平台。
案例二:技术驱动还是业务驱动
小李做了软件开发多年,最近被公司提升为软件架构岗位。但是小李完全不熟悉和不懂业务,只有看网上主流的架构搭建方法而照搬。最终是公司基于小李搭建的架构出现业务和技术架构两张皮的情况,而IT系统上线后也在可靠性,性能,可扩展性和后期的功能变更运维方面均出现了问题。
案例三:架构师不是技术平台搭建师
小王一直从事Java企业级应用系统的开发和设计工作,在前几年大数据火热,自己花了3个月左右的时间熟悉Hadoop技术平台,也在家搭建了平台进行了功能验证,然后是顺利跳槽薪资翻倍。最近听说已经被公司劝退,重新在找工作。
案例三:脱离一线实践,搭建空中楼阁
最近经常看到头条上关于架构师培训的网课的广告,宣传语就是早日脱离编码,成为高级架构师人才。而这个也是很多架构师的一个误区,即认为升级为架构师后就可以脱离一线实践,也不用再编码了。而实际上脱离一线后,你最终设计的架构都变成了空中楼阁而无法落地。
以上几个都是发生在我身边的常见案例,相信大家也经常会遇到过类似的场景。而这些也是我今天重新在整理这篇文章的一个原因。
02-架构师的角色和职责
架构师是整个软件工程和软件生命周期里面相当重要的一个角色,介于软件需求和开发之间的一个承上启下的关键角色,即能够实现业务需求和场景到最终软件实现的第一次高度抽象建模。在更早的阶段一般会谈系统分析员角色,那么这个角色往往会同时兼顾软件需求和软件架构的工作。
软件架构简单来说就是将业务或软件需求进行高度抽象,形成静态和动态的模型,通过形式化的模型来表达和阐述真实的业务需求。 同时这个抽象化的模型又能够很好的指导后续的开发实现。
软件架构要做三个方面的工作:
第一:针对软件需求中的业务场景和流程,功能性需求进行功能性架构设计
其中包括了核心的功能架构设计,子系统和模块的划分,接口和集成模式的设计,数据架构和数据模型的设计等。即通过概念模型,类图或数据库设计等静态模型+用例,序列图等动态模型共同来抽象表达出完整的业务需求。
第二:通过软件需求中的非功能性需求,来考虑整个系统的技术架构设计
技术架构本身又包括了类似消息,缓存,安全,日志,分布式等关键技术的实现,也包括了IT基础设施和部署架构的设计,同时还包括了类似高可用,高可靠,高性能,高扩展等非功能性需求满足的架构设计。
第三:对于软件生命周期和软件工程域标准内容的设计
其中包括了开发框架,技术选型,软件生命周期,持续集成模式,架构标准规范,开发规范,测试规范,以及各种架构规约和约束等方面的内容设计。同时还需要基于上面内容进行相应的架构原型搭建和验证工作,确保架构设计内容能够真正落地。
要能够做好上面三方面的内容,一个真正架构师必须既懂技术又懂业务,而对于当前很多互联网应用,由于本身工作相对细分,可以看到很多架构师往往仅仅只需要专研深核心技术领域的技术和某一垂直业务场景即可。在这点上企业内部信息化架构师和互联网本身还是存在区别,即。
企业内部架构师更加强调业务+技术综合能力
架构设计的核心目的是全面的理解业务需求后给出整体的技术方案,避免后续在开发实现中遗漏。架构设计内容不仅仅是指导后续的详细设计和开发,同时更加重要的是通过组件和划分和接口的设计,让后续的开发工作真正能够并行起来,最终再进行集成,以降低软件研发的复杂度,同时又缩短软件开发周期提升效率。
架构工作不仅仅是分解,更加重要的是集成。 能够把一个复杂的大系统真正想清楚和透彻,同时还能够把大系统拆散为松耦合的多个模块,最终又在各个模块独立并行完成开发后,能够通过预先定义的接口将这些模块又组装和集成起来,这就是一个真正架构师应该做的事情。
我们也可以看到,一个好的建筑工程师往往就具备如上能力。
技术最终是解决业务问题和为业务目标服务,也正是整个原因, 一个好的架构师不应该陷入到技术驱动,而是业务驱动;不是选择最新,最热的技术或框架,而是应该选择当前最合适的技术和框架。架构师应该避免过度设计和技术狂热,而是真正做好业务和技术的适配,成本和收益的分析工作 。
胸有成竹,那么一定是自己已经画过无数次的竹子,也正是这个原因架构师往往都是从一线技术开发多年的实践积累后组建锻炼出来的,好的架构师一定来源于实践而非理论,只有这样既保证了架构设计的高屋建瓴,又确保了最终的架构设计能够真正落地。
长期脱离实践的架构师往往很容易犯经验主义错误,设计出空中楼阁式的架构,看起来完美,实质上却浮于表面而无法落地。
有人问过我:架构的最主要产出是什么?我的答案是图。这里面有两层含义:一层含义是如同建筑师描绘的蓝图一样,用于引导实施者;另一层含义是架构师头脑中清晰的目标系统。如果架构师头脑中没有清晰的图像,他是没有办法把它画出来的。架构是一个过程,而非一个结果。架构是架构师洞见内在结构、规律、原则和逻辑的过程。真正的架构师是可以将自己放在系统中去的(例如作为系统中的任何一个角色),只有清晰地理解系统,才能简洁的描述它。--摘录自《架构之美》
03-典型的架构思维
对于架构思维本身仍然是类似系统思维,结构化思维,编程思维等诸多思维模式的一个合集。由于架构的核心作用是在业务现实世界和抽象的IT实现之间建立起一道桥梁。
因此架构思维最核心的就是要理解到业务驱动技术,技术为最终的业务服务。要真正通过架构设计来完成 业务和技术,需求和实现,软件和硬件,静态和动态,成本和收益等多方面的平衡。
分解是最基础的 ,架构的重点就是要对复杂问题进行分而治之,同时保证分解后的各个部分还能够高内聚,松耦合,最终又集成为一个完整的整体。分解核心是定义问题,因此架构首先仍然需要理解清楚需求。
集成是配合分解完成的动作,最终分解完成的各个组件或子系统,通过合适的接口设计,最终还能够集成为一个完整的整体,分解仅仅是加速开发和降低问题复杂度,如果分解后的内容无法集成在一起,那么分解就没有任何意义。分解+集成可以理解为架构最核心的思考方式和方法。
动态+静态: 一直是我强调的重要思维模式,架构思考里面一定要注意这两者的结合,即涉及到流程,用例等动态分析内容,又涉及到数据,类等静态建模内容,而是两者要高度协作起来完成整个架构思考。
架构工作仍然包括静态和动态两个方面而且要相互结合。动态重点是用例分析和建模,通过用例来分析和考虑业务功能的可实现性,具体的实现流程和机制;静态的重点是概念模型,类关系图或数据库设计,解决最终的持久化和数据交互。RUP里面谈的用例驱动,架构为核心可以看到用例分析是在前,通过用例分析找寻核心对象,然后分析对象间交互关系形成抽象为接口。
复用是另外一个重要的思维 ,也可以理解为SOA参考架构的核心思考模式,包括最近谈的最多的业务能力组件化,组件能力服务化,平台+应用,共享中心建设,共性能力下沉等都是谈的复用的概念。即使你架构设计一个小系统,你也需要将各个模块需要用的共性功能抽取为可复用的共性组件。
分层相对重要,架构在设计中要考虑分层,而核心仍然是资源+服务+应用的三大层 ,分为这三层仍然是SOA参考架构的核心思想。对于平台+应用更多只是上面分层模式的一个变形。分层的目的是通过分层既理清了整个应用的构建过程,又保证了各层之间的独立设计和松耦合。
模式匹配: 可以讲是所有思维模式里面的一个重点,而架构设计中的模式匹配就是要将最终的业务域问题匹配到对应的技术实现上面。即根据业务需求来挑选最适合的技术,而不是用主流和最先进的技术去反推业务。
抽象是架构思维里面的一个重点 ,这里面包括了两个层面的内容,一个是常说的归纳方法,即各种类似场景的实现见的太多了,自然就归纳了一个规则或方法出来供以后的设计用。但是抽象更加重要,即将非类似场景中的共性内容也总结出来,进一步抽象为类似的东西,以更加方便的适应变更和各种变化。
结构化思维是架构思维必须具备的,最常用的两种结构就是二维的表格和树模型 ,通过结构化思维引入了维度和XY概念后,可以帮助我们更好的分析和比对,结构化决策等。对于多维模型,我们也要有意识的将其转换为多个平面二维模型,方便我们进行分析。
迭代思维是架构思考中需要考虑的另外一个内容,没有最优的架构,只有不断进化的架构,只有最适合的架构。因此架构本身也在随着业务需求的变化不断的迭代和演化,而不是追求用最新的技术一步到位。
最后即我们常说的系统思维,系统思维是架构思维中最重要的思维模式,一个架构师必须要有充分的全局思考的能力,做好前面谈到各种平衡,追求整体的最优化而不是单个目标的最优。
架构师应该培养自己的大架构观
最近这几个月招人,发现一个很普遍的现象,就是你要是招聘开发人员或高级开发人员,收到的简历很少而且很难有合适的,但是你要是招架构师往往就能收到一堆的简历,即使薪酬待遇一样的情况下也是如此。
对于软件开发这个行业,相信能够做架构师是很多人的职业规划和努力的目标,这不仅仅是待遇方面的能力,也和个人的职业成就有很大的关系。
但是真正从业务,技术和管理各方面能力都能够胜任的架构师却少之又少。
对于架构和架构设计,本质上是解决从业务现实到技术实现之间的抽象问题。在很多时候,技术实现或最终的产品还没有做出来,但是你的模型已经拿出来了,你能够拍着胸脯说按照这个模型去实现肯定没有问题。要做到这点,那么需要的绝对不是简单的自信,而是真正的前期大量项目实践,设计和编码能力的积累,包括抽象等各种架构思维能力的锻炼,最终才能够水到渠成。
要成为架构师,大量的项目和设计编码积累是必须的,而且这种编码积累还不能是简单重复,还是必须得有抽象,复用等各种思维,不断重构的设计意识。走的路多了,各种业务到实现的匹配方式验证的多了,各种大型项目经历和解决复杂问题多了,你自然就有了这种能力。
一个架构,很多时候并不是说创新或学习能力就有多强,而是他们的实践经验积累的知识库很强大,见多才能够识广,大量的模式匹配库随时可以使用,而对于一般人你经常发出的感慨就是我怎么没有想到那里去?知识经验库很值钱,但是这个是长期大量的实践换来的,投入的是大量的时间和金钱成本。
在前面我们谈到了分解,集成,抽象,复用,组合,系统化等多方面的架构思维能力,这些思维能力都相当重要,但是本质都是我们看待和理解事物的方式。
架构师一定要不断提升自我思维能力
大架构观本质就是我们如何看待和理解一个产品,那么最终这个产品的实现就是按照你理解或建模的方式进行开发和产出。所有产品后期可能出现的问题都可能是我们理解出现了问题。
架构首先要解决的是产品内部组件如何高效协同,产品和外围系统间如何高效协同并满足业务和用户需求的问题。这就是最基本的功能性需求,架构必须要搭建这种业务场景和需求和最终产品实现之间的桥梁。这么多年下来,我们还是发现,很多人对架构的理解有很大的偏差。
在现实中我们经常看到会用多层框架了就是J2EE架构师,会用SpringCloud了就是微服务架构师,会Hadoop了就是大数据架构师,这是对架构一个巨大的误解。
能够基于开源项目或框架来搭建一个基础开发平台确实是一个架构师应该具备的基本能力,但是这个能力仅仅是架构能力很小的一部分,因为技术框架不是业务需求,而实现在技术框架上的业务功能组件才能够满足业务需求。在业务需求没有最终实现前,技术框架本身并没有得到充分的验证,也没有和最终的业务需求匹配,这种空框架搭建并没有很高的技术含量。
或者说大部分人将架构理解为技术架构,而忽视了业务抽象和建模能力,但是脱离业务的技术架构,连自己都无法验证最终架构原型对现实业务的支撑能力,即架构师最终设计的东西无法自己进行实证,这本身就是一个要命的事情。架构师变成了纸上谈兵,设计的模型变成了空中楼阁,这显然不是我们想要的。
一个好的架构师,一定是给出当前业务场景和需求下,最合理的架构模型设计,而不是什么理想化的模型,什么网上顺手搬来的现成架构模型。架构师追求的不是理想化,而是当下最合理。
从分解到集成,从宏观到微观
我们如何分析和理解产品,这里的大架构观的一个重点就是能够深入细节又能够跳出盒子的双重思维,既能够宏观全局又能够微观局部,既能够分解又能够集成回去。既追根究底又不求甚解,置身产品之中又能够跳出产品做用户视角的思考。
要具备这种架构能力,需要的是业务建模,业务到技术分解转化能力,随时都是业务和需求导向,技术为需求服务。没有盲目的技术堆积,只有合理的技术采用。没有理想化的模型,只有验证过的技术。
一个好的架构一定是同时解决功能性架构和非功能性架构两方面的问题。
而非功能性架构包括了可靠性,性能,高可用性,高扩展性等多方面的内容。这些都需要架构师在搭建模型的时候进行考虑,好的架构就是稳如泰山,灵活扩展,具备弹性的以不变应万变的能力。好的架构就是充分考虑到各种异常边界,并发峰值,安全攻击等场景下,系统仍然能够平稳可靠运行。
不论出现任何的突发情况,产品都能够灵活应对,这往往就是靠的架构师设计产品时候的架构能力。
就如建造一座高楼,外部上看上去都一模一样,但是有的高楼刮大风都能够吹倒,但是有些高楼却能够扛住10级地震,这要的就是内功积累,否则就是绣花枕头。
越是复杂的业务,往往构建的业务系统和架构设计也就越复杂,但是对于架构师而言一定要意识到,任何架构的复杂性都应该作为黑盒,屏蔽在架构设计内部。
即架构的复杂性应该在架构设计的时候被隐藏掉,通过粗粒度的接口将这种复杂性屏蔽在内部。即对于最终的开发人员往往并不需要关心这些复杂性,而只是按照架构原则和开发指南进行开发即可。这本身也是架构设计的一个重要考虑点。
大架构观,本质就是我们分析和理解事物的思维观,而架构本身解决的是从业务需求到技术实现间的关键衔接,而这个衔接的呈现是模型,解决的关键问题是抽象。 大架构观,既需要我们通过分解和集成来理解事物的组成和内部运作协同机制,更加重要的是需要我们跳出盒子来看待整个事物或产品的运行。
原文 http://blog.sina.com.cn/s/blog_493a84550102z8l0.html