每一个架构师都应该研究下康威定律

摘要:这篇文章的分享者杨波具备超过10年的互联网分布式系统研发和架构经验,曾前后就任于 eBay 中国研发中心(eBay CDC)、携程、惟品会(VIPShop)等。本文由攀爬的蜗牛以及田光整理。

  今天的分享主要来自我以前的工做经验以及平时的学习总结和思考。我以前的背景主要是作框架、系统和平台架构,以前工做过的公司 eBay、携程、惟品会都是平台型互联网公司,因此今天主要带着平台架构视角和你们分享心得体会。架构的视角每一个人都不同,能够说一万种眼光,有业务架构、安全架构、平台架构、数据架构,各不相同,这里仅是个人一家之言,欢迎你们加入『聊聊架构』社群参与讨论。今天聊的话题主要包括如下几点: html

  • 我对架构定义的理解
  • 架构的迭代和演化性
  • 构建闭环反馈架构(Architecting for closed loop feedback)
  • 谈谈微服务架构和最新主题
  • 架构和组织文化关系
  • 架构师心态和软技能
  • 我对一些架构师争议主题的见解

  我对架构定义的理解 安全

  大概在7~8年前,我曾经有一个美国对口的架构师 mentor,他对我讲架构实际上是发现利益相关者(stakeholder),而后解决他们的关注点(concerns),后来我读到一本书《软件系统架构:使用视点和视角与利益相关者合做》,里面提到的理念也是这样说:系统架构的目标是解决利益相关者的关注点。 微信

  这是从那本书里头的一张截图,我以前公司分享架构定义经常用这张图,架构是这样定义的: 网络

  • 每一个系统都有一个架构
  • 架构由架构元素以及相互之间的关系构成
  • 系统是为了知足利益相关者(stakeholder)的需求构建的
  • 利益相关者都有本身的关注点(concerns)
  • 架构由架构文档描述
  • 架构文档描述了一系列的架构视角
  • 每一个视角都解决而且对应到利益相关者的关注点。

  架构系统前,架构师的首要任务是尽最大可能找出全部利益相关者,业务方,产品经理,客户 / 用户,开发经理,工程师,项目经理,测试人员,运维人员,产品运营人员等等都有多是利益相关者,架构师要充分和利益相关者沟通,深刻理解他们的关注点和痛点,并出架构解决这些关注点。架构师常犯错误是漏掉重要的利益相关者,沟通不充分,都会形成架构有欠缺,不能知足利益相关者的需求。利益相关者的关注点是有可能冲突的,好比管理层(可管理性)vs 技术方(性能),业务方(多快好省)vs 技术方(可靠稳定),这须要架构师去灵活平衡,如何平衡体现了架构师的水平和价值。 架构

  关于架构的第二点定义是说架构主要关注非功能性需求(non-functional requirements),即所谓的-abilities。 并发

  这个是我上次公司内分享的一个图。 app

每一个架构师都应该研究下康威定律

  这个是 slideshare 一个 ppt 里头截取的,两个图都是列出了架构的非功能性关注点;关于架构的水平该如何衡量,去年我看到一句话,对我影响很大。 框架

Architecture represents the significant design decisions that shape a system, where significant is measured by cost of change. 运维

  翻译为中文就是,架构表示对一个系统的成型起关键做用的设计决策,架构定系统基本就成型了,这里的关键性能够由变化的成原本决定。这句话是 Grady Booch 说的,他是 UML 的创始人之一。 分布式

  进一步展开讲,架构的目标是用于管理复杂性、易变性和不肯定性,以确保在长期的系统演化过程当中,一部分架构的变化不会对架构的其它部分产生没必要要的负面影响。这样作能够确保业务和研发效率的敏捷,让应用的易变部分可以频繁地变化,对应用的其它部分的影响尽量地小。

  我刚入软件开发这个行业之初,谈的架构主要是性能,高可用等等。如今,见过无数遗留系统,特别是国内企业 IT 的现状,无数耦合性系统的遗留系统,不良的架构象手铐同样紧紧地限制住业务,升级替换成本很是巨大, 因此我更加关注可理解,可维护性,可扩展性,成本 。我想补充一句,创业公司创业之初得到好的架构师或技术 CTO 很是重要。

  架构的迭代和演化性

  我是属于老一代的架构师,99年参加工做。职业初学了不少 RUP,统一软件过程的理念。RUP 的理念对个人架构有很深的影响,RUP 总结起来就是三个特色:

  • 用例和风险驱动 Use Case and risk driven
  • 架构中心 Architecture centric
  • 迭代和增量 Iterative and incremental

  RUP 很注重架构,提倡以架构和风险驱动,该开始必定要作端到端的原型 prototype;经过压测验证架构可行性,而后在原型基础上持续迭代和增量式开发,开发->测试->调整架构->开发,循环,以下图所示:

每一个架构师都应该研究下康威定律

  从上图能够看出架构师要尽量写代码,作测试,纸上谈兵式作架构然后丢给团队的做法很是不靠谱(除非是已经很是清晰成熟的领域)。另外,作技术架构的都有点完美主义倾向,一开始每每喜欢求大求全,忽视架构的演化和迭代性,这种倾向易造产品和用户之间不能造成有效快速反馈,产品不知足最终用户需求,继续看下面两个图:

每一个架构师都应该研究下康威定律

每一个架构师都应该研究下康威定律

  第一个图是讲最小可用产品(Minimum Viable Product, MVP)理念,作出最小可用产品,尽快丢给用户试用,快速获取客户反馈,在此基础上不断迭代和演化架构和产品。第二个图是过分工程(Over Engineering)的问题,其实也是讲产品架构和用户之间没有造成有效的反馈闭环,架构师想的和客户想的不在一个方向上,经过最小可用产品,快速迭代反馈的策略,能够避免这种问题。注意,在系统真正地投入生产使用以前,再好的架构都只是假设,产品越晚被使用者使用,失败的成本和风险就越高,而小步行进,经过 MVP 快速实验,获取客户反馈,迭代演化产品,能有效地减小失败的成本和风险。

  另外,多年的经验告诉我,架构,平台不是买来的,也不是用一个开源就能得到的,也不是设计出来的,而是长期演化才能落地生根的。给你们推荐两篇不错的微信文章:

  • 58 同城沈剑:好的架构源于不停地衍变,而非设计
  • 宜人贷系统架构–高并发下的进化之路

  两篇文章其实都是讲架构的迭代和演化性,值得每一个架构师学习吸取。

  构建闭环反馈架构

  先分享一个连接,这几年对我架构影响最深的一篇文章。这篇文章是关于 DevOps 的,但对系统架构一样适用:The Three Ways: The Principles Underpinning DevOps

  第一条道路,系统思惟,开发驱动的组织机体,其能力不是制做软件,而是持续的交付客户价值,架构师须要有全局视角和系统思惟(System Thinking),深刻理解整个价值交付链,从业务需求、研发、测试、集成,到部署运维,这条价值链的效率并不依赖于单个或者几个环节,局部优化的结果每每是全局受损,架构师要站在系统高度去优化整个价值交付链,让企业和客户之间造成快速和高效的价值传递。

每一个架构师都应该研究下康威定律

  第二条道路,强化反馈环,任何过程改进的目标都是增强和缩短反馈环。刚入行的工程师,也是中国学生的广泛问题,就是生产运维意识不足(监控是系统反馈的重要环节)。有两种花这样讲的:

  • no measurement, no improvement 没有测量,就没有改进和提高
  • What your measure is what you get 你测量什么,就获得什么

  没有监控或者监控不完善的系统至关于裸奔,开车上高速无仪表盘。有一篇不少错的关于测量驱动开发的文章,在 InfoQ 上的,向你们推荐:度量驱动开发 。

  这篇文章提出了度量驱动开发的理念,即所谓 MDD,在系统,应用和业务,经过三级监控,构建三个反馈环,在监控测量基础上持续改进系统和架构,我最近也在参考这个理念设计一个电商平台的技术架构,见下图:

每一个架构师都应该研究下康威定律

  这是一个电商平台的架构,整个体现了闭环架构的思想,右侧是整个平台的反馈监控环节。具体以下:

  • 系统层监控计算网络存储,构建系统层的反馈环
  • 应用服务层,监控业务、应用、服务,甚至整个研发流程,构建应用和服务层的反馈环
  • 客户体验层,监控端用户和分析网站用户的行为,构建和客户的反馈环

  下面这个图展现了系统提高和改进的通常方法:

每一个架构师都应该研究下康威定律

  收集->测量->调整->闭环重复,在有测量数据和反馈的基础上,系统、应用、流程和客户体验才有可能得到持续的提高和改善,不然没有数据的所谓改进只能靠拍脑壳或者说猜想。

每一个架构师都应该研究下康威定律

  第三条道路,鼓励敢于承担责任,冒险试错和持续提高的文化。这点是最难的,通常和企业人才密度有关。工具,技术,流程只是一个公司的冰山浮出水面的部分,而真正对企业效能影响大的则是冰山水下的部分,即企业的人和文化,架构师做为技术和架构的布道者,有责任义务鼓励和推进试错文化。

  架构师要深刻领会这三条道路,关注整个价值交付链的效率,关注每一个环节的闭环反馈,鼓励和推进公司的试错文化,打造全系统的闭环架构(Architecting for closed loop feedback),提高整个系统效能。下图的 DevOps 和每日交付是每个互联网系统架构师的梦想和努力的方向。

每一个架构师都应该研究下康威定律  谈谈微服务架构微服务

  我想你们都听得不少了,我本人也很是关注和推崇微服务,从技术角度讲,我认为微服务主要体现的是单一职责和关注分离的思想,从单进程模块化进一步拓展到跨进程分布式的模块化。微服务是独立的开发、测试、部署和升级单元,正如我在第一点架构定义中提到的,微服务中每一个服务能够独立演变,它的 cost of change 比较小,总体架构比较灵活,是一种支持创新的演化式架构。去年 Martin Fowler 写了两篇文章,给微服务泼冷水的,建议你们好好读下。

每一个架构师都应该研究下康威定律

  这个图讲何时该引入微服务。微服务有额外成本的,须要搭建框架、发布、监控等基础设施。初创和小规模团队不建议采用。主要决定因素系统复杂性和团队规模,当到达一个点,单块架构严重影响效率才考虑 。另外补充一点,微服务更可能是关于组织和团队,而不是技术。

  架构和组织文化关系

  再谈一下康威定律:

Conway’ s law: Organizations which design systems [...] are constrained to produce designs which are copies of the communication structures of these organizations.

(设计系统的组织,其产生的设计和架构等价于组织间的沟通结构。 )

  从单块架构到微服务架构是这个定律的很到体现。

每一个架构师都应该研究下康威定律

  团队是分布式的,系统架构是单块的,开发,测试,部署协调沟通成本大,严重影响效率,严重时团队之间还容易起冲突 conflict。

每一个架构师都应该研究下康威定律

  将单块架构解耦成微服务,每一个团队开发,测试和发布本身负责的微服务,互不干扰,系统效率获得提高。

  可见,组织和系统架构之间有一个映射关系(1 ~ 1 mapping),二者不对齐就会出各类各样的问题,一方面,若是你的组织结构和文化结构不支持,你也没法成功创建高效的系统架构,例如集中式和严格职能(业务, Dev, QA, Deployment, Ops)的企业,很难推行微服服务和 DevOps,推行 Docker/PaaS 平台也会比较困难,这样的组织职能之间都倾向于局部优化(local optimization),没法造成有效和合做和闭环。

  反过来也是成立的,若是你的系统设计或者架构不支持,那么你就没法成功创建一个有效的组织;做为系统架构师,必定要深刻领会康威定律,设计系统架构以前,先看清组织结构,也要看组织文化(民主合做式,集权式,丛林法则式,人才密度),再根据状况调整系统架构或者组织架构。

  架构师心态和软技能

  空杯,或者说开放心态(open minded)是一个成熟架构师的应有心态,stay hungry,stay foolish, 心态有多开放,视野就有多开阔。来自《高效能人士的七个习惯~史蒂芬~柯维》的一句话送给每个架构师 :

若是一位具备至关聪明才智的人跟我意见不一样,那么对方的主张必有我还没有体会的奥秘,值得加以了解。与人合做最重要的是,重视不一样个体的不一样心理、情绪与智能,以及我的眼中所见的不一样世界。与所见略同的人沟通,益处不大,要有分歧才有收获。

  另外再推荐一个本书《软件架构师的 12 项修炼》,这书中三个观点很值得每一个架构师学习领会:

  • soft skills are always hard than hard skills,软技能比硬技能难
  • choosing relationship over correctness ,注重关系重于谁对谁错
  • 架构的政治性,在中大型公司里混的架构师尤为要学习

  政治指的是和他人协做将事情搞定的艺术,架构是一种社交活动,在技术的世界里,我的主义很容易被战胜,即便你的目的是好的技术是最优的,技术决策是政治决策(technical decisions are political decisions),一个技术产品,一波人能够作,另外一波人也能够作,到底谁作的好,真很差说,无论谁作,都给业务套上了一副手铐。

  架构师如何提高?实战,实战,实战!规划职业,找好的团队和项目,总结分享,学习 GitHub 开源项目,尽量参与和开创本身的开源项目和产品,并长期积累。

  我对一些架构师争议主题的见解

  主要争议是两个话题:

  • 技术和业务的关系。
  • 架构师要写代码吗?

  架构师怎么回答这类问题?一个成熟架构师的口头禅:视状况而定,不必定,是也不是,it depends。技术和业务,架构师要理解业务吗,看产品和客户,若是是业务性产品,确定要理解业务,若是是技术型产品,就不必定。

  架构师要写代码?也不必定,我的以为尽量要写,若是你写过十年以上代码了,每一年很多于 2 万行,都玩通了,能够不写。另外架构师若是写代码,要把控度,不要一头钻入代码,花大量时间解决细节和复杂性问题,忽视全局和系统性问题。

  最后

  我想说中国如今的互联网发展趋势很好,愈来愈多的人加入架构师这个行业,这个行业正在 “万物生长”。 可是咱们如今尚未马丁·福勒,adrian cockcroft 这样的架构牛人物,我辈需不断努力,期待中国 10~20年后出现超过十个马丁福勒,adrian cockcroft 这样的大牛神级人物。咱们必不可中止探索,而一切探索的尽头,就是重回起点,并对起点有首次般的认识。

相关文章
相关标签/搜索