聊聊架构设计做些什么来谈如何成为架构师

一、架构的定义

  在软件开发领域,自从架构这个词被广泛传播之后,产生的架构模式也非常多,架构关注点也在增加。但回到“道”的层面,架构的定义或者说本质还是:

  架构,又名软件架构,是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。

                                 ————摘自《百度百科》

二、架构是做什么?

  很多做业务功能的增删改查开发感受到无趣的小伙伴常把做架构想象成一片乐土,没有嘈杂的业务声音干扰,可以专心做一番牛X的技术。会把架构单纯的理解成,牛X的性能、牛X的TPS、高可用,支撑了多少PV等等。但是其实这些只是架构很小的一部分,并不是全部。在互联网时代之前都是C/S程序的天下,那个时候并没有对性能等有像现在这样的关注度,但是就已经有架构之说了。 世上本无架构,只是由于团队越大越需要对整体的规则做约定,好让大家往同一个方向发力,避免各自为战,产生大量的内耗,所以才逐渐形成了架构。这条路就是“世上本无路,只是因为走的人多了变成了路”。

  为什么说一个软件架构是很重要的呢?当我们的团队人数只有2、3个人,甚至只有1个人单枪匹马的情况下,可能架构凸显的作用不是那么的明显,但是如果团队大了之后相信下面的这些现象会比较常见:

  • 新上一个系统,往往不是独立存在的,一般都需要与现存的系统进行交互,而需要集成交互的地方可能还很多,哪些集成是本系统需要实现的?同时,一般会划分为多个阶段开发,怎样界定系统的边界呢?
  • 软件系统是一个由多个模块组成的整体。因此当上游开发与我们负责的模块衔接老是出问题时,自己再做更多的努力也无法扭转上游模块的质量差带来的负面效果。(我想大家这时候肯定是抓狂的。)
  • 每次看到别人写的代码,老觉得自己来写的话肯定不会这么写。比他写的更好。(我们做技术的,自我感觉良好是个常态:)。)
  • 在某些场景下,自己脑子里有多套方案来实现,但是对孰优孰劣没太大感觉,最终基本上就是拍脑袋选了一个。
  • 某块代码维护的次数多了,特别是中间由多个人接手过后,代码风格各异,难以理解。
  • 相似的代码在好几个地方出现,特别是一些非业务性的代码,比如日志处理等。再甚是在大型的分布式系统中,不同子程序使用了不同的同类型中间件,同样导致维护成本大增。
  • 在2个相依赖项目边界处的设计产生了分歧,并且站在各自的角度看都有道理。

  任何事物都是有两面性的,并不是说上面的这些问题,我们通过架构就要往另外一个极端去走。比如在大型的分布式系统中,不同子程序的确有必要在某些时刻选择同类型的其它中间件。如Kafka和RabbitMQ虽都是MQ,但在特定的场景下能发挥的价值是无法相互替代的。

  所以我们做架构有一点也是比较重要的,就是去Balance,选择一个投入产出比最优的方案。关于这点第四段中会多说几句。

  除此之外,架构的主要目的是为了让大家往同一个方向,在同一个标准之上去发散扩张。一是把控硬性的下限标准,提高整体的最短版,二是提高上限水平位,也就是天花板位置,提供更大的发展空间。好比造一幢大楼,把框架结构设计好搭好,让大家形成一个共识,什么是承重墙不能破坏,什么是创变空间可以自定义。在这样的基础下各自发展。这个看上去是个限制,但却是做架构最重要的任务,所谓再多的文档,再多的最佳实践都比不上一条约束。降低复杂度、降低理解难度,是实实在在的收益。最怕的就是凭空假设带来的过度浪费。

  更甚之,我们做架构追求的理想国度是一个大家拥有一致共识的世界,架构是大家都像吃饭喝水这样习以为常的习惯。去理解或者接手其它人负责的项目的时候就好像是自己写的一样。这个时候就消灭架构了,就好比现在没有人会教你如何吃饭一样。(就当YY一下吧:)。)

三、做架构的最佳实践

  上面提到更多的是做架构的目的,那么要做好架构,主要就是要做好抽象,做抽象的方式是类比,做类比的方式可以使用用例图。所以建议大家多画图,通过画图来将大脑中抽象的结果直观的体现在前面,再来进一步分析合理性。主要推荐2种图的类别,一种就是前面提到的用例图。如下图:

  另外一种是鲁棒图,如图:

  整个过程的主要目的是:

  • 描述其与外部实体(系统和最终用户)的交互。
  • 标识系统和外部实体间的信息和控制流。

  之前有一篇专门整理图的文章《软件开发中会用到的图》,有兴趣的小伙伴可以在我公众号中查阅。

  理想的世界里,我们程序的边界设计恰好匹配于业务边界。然而我们作为工程师首先要承担业务需求的压力,只能挤时间去做这些非业务性工作。也因此老项目的业务边界也并不总是如新项目那样明晰。

  这意味着做任何架构的改动要考虑优先级,特别在拆分业务领域之前认真地思考业务的边界。排定优先级,考量拆分的收益与风险。划分业务的边界,则需要更多的思考拆分后的未来将如何沟通协作,然后再考虑技术因素。在技术因素前,主要考量这几点:

  • 是否拥有独立的团队来维护,以及是否拥有发展为一项独立业务的潜力。(非必要的情况下,一定要避免共享内核的开发方式)
  • 围绕领域而非 feature,有明确的维护团队,避免过于细粒度。
  • 拆分或者组合之后,能否改善现有的协作流程。
  • 能否帮助区分核心、非核心业务,改善稳定性。

  上面这些完成了之后,便是选择合适的中间件、技术框架来满足技术层面的要求,这个的选拔主要以下面几点来考量:

  • 如果是直接引入第三方的中间件的话,成熟度如何?是否有大公司在用?(有大公司的口碑背书的肯定大大加分)
  • 近期的社区活跃度如何?(用于考量是否有更多的人在一起踩坑,降低各自遇到坑的数量和概率)
  • 硬指标,当前场景的硬性要求是否满足。如性能、对关键部分或者未来的可扩展性等。
  • 软指标,复杂度、可维护性等。这里可以罗列几个竞品的优劣势。
  • 最重要的是要自己去亲自验证上面的几点,并且做一定的模拟工作。
  • 如果曾经用过或者有其中一部分的经验可复用,这是加分项,毕竟在使用的过程中才发现hold不住它,那是灾难性的!

四、什么是好架构

  之前有听到过一句话,概括的很精辟。好的架构必须需要贴合业务,那么把业务+技术演变成一个数学公式来表达可以理解为:2个数字的和等于10,求如何组合能得到最大的乘积。那不是3*7,也不是4*6,而是5*5。

  所以架构不是生搬硬套,为了架构(搞事情)而架构,赶时髦,或者说装X。我们应避免通过个人的主观意愿来主导。比如自己觉得某个中间件好,就”拿着锤子到处找钉子“,这一敲下来,看着不错,但是带来的成本和风险被忽略了。可能有更好的解决方案,或者完全没必要在当下敲这一钉子下去。  

  好的架构需要评判投入产出比,收益更高的就是更好的架构,就如下图的公式。产出可以理解为我们因此获得的好处(诸如可靠性、安全性、可扩展性、可维护性、可伸缩性、性能等),成本是我们改造花费的投入,如人力物力和时间。特别注意的是风险这点,是很重要也是很容易被大家忽略的一点,是起到指数级作用的。选择的方案再好,如果都是一些hold不住的技术,那么风险就是无穷大,导致减号右侧无限趋近于0,最终的结果就是收益是负数,投入的成本打水漂,甚至还要加上其它额外的付出。

  

五、如何成为架构师

  上面提到的这些关注点都是架构师的职责,另外特别重要的一点是,架构师必须要是个有追求的“好码农”!!!(划重点)。软件架构师不像建筑师,其面对的本身是一个抽象的事物,如果再脱离了实操,这基本和纸上谈兵无异。所以实际工作中的难点、要点都得清楚,并且能够给出解决方案或者方向。另外只有熟悉实操才能更准确的评估成本

  成为了一个真正的“好码农”就向架构师迈出第一步了。而后呢,需要不断以深 --> 广 --> 深 --> 广的节奏去开疆扩土,扩大自己的知识领域,当然需要以贴近当前工作内容的知识为主,这是第二步。到了这还没完,还有打造三板斧:业务能力、沟通能力、个人魅力。

  题外话,在国内,纯技术的架构师没有应用型的架构师吃的开。所以此文皆以应用型架构师的职能要求为参考。

六、结语

  回到文章开头,架构的表现形式有很多,从本质上单体应用的架构设计思想和分布式系统是一致的,所谓服务化其实也是模块化的思想,只是维度的不同,导致用到的一些工具或者环境不同,但这都是“术”层面的东西。光学这些招数,永远也学不完。架构之路漫长,继续前行,共勉。

作者:Zachary_Fan
出处:http://blog.51cto.com/4596298/2147603

如果你想及时得到个人自写文章的消息推送,欢迎扫描下面的二维码~。

原文地址:http://blog.51cto.com/4596298/2147603

时间: 2024-12-19 10:03:44

聊聊架构设计做些什么来谈如何成为架构师的相关文章

架构设计:前后端分离之Web前端架构设计

在前面的文章里我谈到了前后端分离的一些看法,这个看法是从宏观的角度来思考的,没有具体的落地实现,今天我将延续上篇文章的主题,从纯前端的架构设计角度谈谈前后端分离的一种具体实现方案,该方案和我原来设想有了很大的变化,但是核心思想没变,就是控制层是属于Web前端的. 在以前文章里我说道前后端分离的核心在于把mvc的控制层归为前端的一部分,原方案的构想在实际的生产开发里很难做到,我觉得核心还是控制层和视图层的技术异构性,这样后果使得系统改造牵涉面太大,导致在项目团队里,沟通.协调以及管理成本相对较高,

MySQL提升课程 全面讲解MySQL架构设计 打造扛得住的MySQL数据库架构

第1章 实例和故事决定电商11大促成败的各个关键因素.1-1 什么决定了电商双11大促的成败1-2 在双11大促中的数据库服务器1-3 在大促中什么影响了数据库性能1-4 大表带来的问题1-5 大事务带来的问题 第2章 什么影响了MySQL性能详细介绍影响性能各个因素,包括硬件.操作系统等等.2-1 影响性能的几个方面2-2 CPU资源和可用内存大小2-3 磁盘的配置和选择2-4 使用RAID增加传统机器硬盘的性能2-5 使用固态存储SSD或PCIe卡2-6 使用网络存储SAN和NAS2-7 总

多研究些架构,少谈些框架(4):架构师是技术的使用者

架构师是技术的使用者而不是信徒 我承认我是标题党, 为什么要写这篇充满争议的文章?目前架构师这个职位特别火热,程序员的目标都是成为一个令人尊敬的架构师.但是我们真的理解架构师应该做些什么?很多人把架构师和框架师等同起来,认为研究框架多的才是架构师 下面说的情况请勿对号入座. 盲目的追新:技术人员的喜好往往是什么技术流行就追什么技术.现在的技术发展快,前后端不断涌现各种框架,我们恨不得把这些框架都用在自己的项目里才行,要不然怎么好意思和别人打招呼啊. 我亲身经历,有个技术人员一定要把原来单元测试框

电商峰值系统架构设计--转载

1.1 系统架构设计目录 摘要:双11来临之际,<程序员>以“电商峰值系统架构设计”为主题,力邀京东.当当.小米.1号店.海尔商城.唯品会.蘑菇街.麦包包等电商企业,及商派.基调网络等服务公司,分享电商峰值系统架构设计的最佳技术实践. 自2009年11月11日,淘宝商城(现名天猫)拉开网购狂欢节的序幕,各大电商的促销浪潮此起彼伏.此时的电商大战不仅是价格之争,更是技术的较量.如何设计电商峰值系统来更好地满足用户蜂拥而至的访问,如何在海量数据处理中实时发现有效信息并转化为商机,成为众多电商企业密

架构设计的方法学

约公元前25年,古罗马建筑师维特鲁威说:"理想的建筑师应该既是文学家又是数字家,他还应通晓历史,热衷于哲学研究,精通音乐,懂得医药知识,具有法学造诣,深谙天文学及天文计算."(好难哪,软件构架设计师的要求呢?大家好好想想吧.)   本文目录   一.与构架有关的几个基本概念:   二.构架设计应考虑的因素概揽:   三.程序的运行时结构方面的考虑:   四.源代码的组织结构方面的考虑:   五.写系统构架设计文档应考虑的问题   六.结语   一.与构架有关的几个基本概念:   1.模

滴滴出行分而治之的架构设计之道

[本文是WOT2016互联网运维与开发者大会的现场干货,  新一届主题为WOT2016企业安全技术峰会将在2016年6月24日-25日于北京珠三角JW万豪酒店隆重召开!] 如今,我们去任何一个地方都要先问问有没有Wi-Fi,网络已经明显影响到我们的生活. 互联网生下来就是为了服务海量用户,在这个时代,几乎没有哪个应用再为单机而生.每个公司的每个产品将要面临的都是不可预知的用户海量请求.显然这个靠分布式程序来解决,比依靠单机靠谱得多.然而不幸的是,如果一开始你的架构设计不可扩展,有再多的机器,有再

垂直型爬虫架构设计(2)

上文提到了关于爬虫的一些简单概念与爬虫真正要做的一些功能.简单的分析了一下垂直型爬虫与宽度(深度)遍历的一些特点.现在,我主要针对于垂直型爬虫的架构设计做一些简单的介绍. 1.垂直型爬虫的基本需求 目前企业级所需的基本上是垂直型爬虫.舆情分析,财经资讯资讯推荐等.基本山使用的都是垂直型爬虫来作为企业级使用的方案,企业级爬虫的特点我上篇博客里面已经讲过了,所以在做垂直型爬虫架构的时候只需要考虑抓去内容所需的功能.简单来说:拿到某篇资讯所需的方式或功能.例如:常见的 javascript方式,aja

软件系统的架构设计

软件系统架构(Software Architecture)是关于软件系统的结构.行为.属性.组成要素及其之间交互关系的高级抽象.任何软件开发项目,都会经历需求获取.系统分析.系统设计.编码研发.系统运维等常规阶段,软件系统架构设计就位于系统分析和系统设计之间.做好软件系统架构,可以为软件系统提供稳定可靠的体系结构支撑平台,还可以支持最大粒度的软件复用,降低开发运维成本.如何做好软件系统的架构设计呢?笔者就这一问题做如下探讨分析. 软件系统架构设计方法步骤 基于体系架构的软件设计模型把软件过程划分

万剑归宗—架构设计中的抽象思维与具象思维

新项目上线,用户量不断增加,工作中继续不断发现问题,解决问题.花一点时间来总结一下自己对架构设计的理解. 小小的打个广告.这篇文章是发布在neil的微信公众号上.neil的文章都会第一时间发布在微信公众号上.欢迎小伙伴们关注. 微信公众号:互联网与作曲家 武侠小说中的"万剑归宗"----极致的抽象思维 一点题外话.自己从小就是武侠迷,金庸古龙的经典作品都看过很多遍.最喜欢的女主,是<倚天屠龙记>中的赵敏:敢爱敢恨,邵敏郡主.其扮演者黎姿,是我心目中两位女神之一,性格与赵敏非