热文索引,坚持原创不易,请小伙伴们不吝「点赞」支持:程序员
架构师,老兵哥刚参加工做那些年业界尚未这个职位,那时候跟技术相关的岗位就是开发工程师、测试工程师和系统工程师,后来随着软件规模不断增加而产生的,尤为是在互联网浪潮下用户数和访问量都是海量化的。在各类机缘巧合下,老兵哥结合我的喜爱选择了走架构师路径,从懵懵懂懂边作边学,到如今总算摸出了些门道,回顾这个过程仍是有不少经验能够分享的,接下来我准备把这些内容梳理后分享出来,给须要的小伙伴参考。今天咱们先来看看什么是软件架构?它对软件研发来讲有什么独特的价值?面试
1. 教科书式定义算法
软件体系结构,又称软件架构,目前业界尚无统一的定义,常见定义以下:segmentfault
在必定的设计原则基础上,从不一样角度对组成系统的各个部分进行搭配和安排,由造成系统的多个结构组成了架构。它包括该系统的各个组件,组件的外部可见属性及组件之间的相互关系。组件的外部可见属性,指其余组件对该组件所作的假设。软件架构,还包括符合系统完整性、经济约束条件、审美需求和样式,它并不只注重对内部的考虑,并且还在用户环境和中对系统进行总体考虑,即同时注重对外部的考虑。软件架构,输出系统总体结构与组件的抽象描述,一系列关联的抽象模式,一个系统的草图,用于指导大型软件系统构建的各个方面设计。
通常而言,软件架构是一个软件系统从总体到部分的最高层次的划分。一般,一个系统是由元件组成的,而这些元件如何造成、相互之间如何发生做用,则是关于这个系统自己结构的重要信息,主要包括:数据结构
软件架构,是构建系统时所作出的最高层次的决定,以后很难被更改,这个决定不仅仅是技术维度的,还包括商业维度的。在建造一个系统以前,许多重要决定须要事先做出,而一旦系统开始详细设计甚至进行建造,那这些决定就很难被更改,甚至没法被更改。显然,这样的决定一定是有关系统设计成败的最重要决定,必须通过很是慎重的研究和考察。架构
## 2. 大神们怎么说框架
上述教科书式的定义是很是专业、抽象和完整的,但对于缺少架构工做经验的人来讲,这类风格的定义是难以理解吸取的,读仍是能够读懂,可是无感。接下来,咱们先听一听行业内的大神是怎么定义软件架构的。Mary Shaw、David Garlan,经典书籍《软件体系结构》的做者,曾给出相对简化的定义:运维
软件体系结构 = { 构件(Component),链接件(Connector),约束(Constrain)}。
软件体系结构,以构件、构件之间的关系、构件与环境之间的关系为内容的某一系统的基本组织结构,以及指导上述内容设计与演化的原理。在软件设计过程当中,它是超越算法和数据结构设计的一个层次。体系结构问题包括各个方面的组织和全局控制结构,通讯协议,同步机制,数据存储,给设计元素分配特定功能,设计元素的组织、规模和性能,在各设计方案之间进行选择等。微服务
## 3. 接地气的阐述工具
最近这些年,老兵哥我常常要给应届生同事培训应用架构,起初我就采用教科书上的定义,再附上大神的阐述,心想新同事们应该可以理解。但后来有机会给非计算机专业的学员介绍架构师相关工做职责时,我才发现人家没法理解这么专业抽象的答案,毕竟人家没有专业背景,也不曾作过相关工做。虽然上述定义都很好,但若是学员们没法体会理解并使用它的话,再正确也毫无心义。基于这层考虑,我开始采用学员们有亲身体验的案例来作类比。
计算机软件,是构成虚拟世界的基本元素。它的历史开始于二十世纪五十年代,很是短暂,而构成物理世界的建筑从石器时代就开始出现了,人类在几千年的建筑实践中积累了丰富的经验和教训。若是将软件比做虚拟世界的建筑,而软件架构就是建筑的主体框架。建造土坯房不须要复杂的框架,就是在地基上不断垒土,一样小型软件也不须要太过复杂的架构,面向过程、面向对象等就能知足须要了。但建造高楼大厦、小区楼盘等现代建筑就离不开复杂的框架,不然就建造不出来,即便建造出来了,但会存在坍塌的危险,大规模软件也依赖复杂的架构,不然没法化解其复杂度,没法持续更新升级、运维等。从这个角度看,架构师就至关于建筑设计师,这是须要创新创造的工做。
像构件、链接件和约束等软件架构概念,它们在建筑这个领域也可以找到对应,例如:建筑中的构件就是砖块、水泥立柱、预制板等,链接件就是连通每一个楼层的楼道、楼梯和电梯等,而约束就是根据所在地域位置的天然和社会条件来肯定建筑设计内容,可见咱们人类建造虚拟世界的经验主要源自改造物理世界的过程。
## 4. 高大上的阐述
程序员是最喜欢自黑的一群人,咱们经常用“码农”、“搬砖”来标榜本身,上面这种接地气的架构定义特别适合自黑的咱们,从“搬砖”、“砌墙”的建筑工人转型升级至设计师,这应该也算比较天然、优化的选择。对程序员新人来讲,上述阐述是比较形象易懂的,可是若是面向其余行业领域的人去解释,有没有更加高大上的阐述呢?老兵哥我常常要到外面作些职业发展类的培训授课,不论是学员仍是合做伙伴都是非技术人员,为了让他们也可以理解个人本职工做职责,我常常用组织架构来类比软件架构。咱们知道,组织架构是人力资源管理的重要工具,对于初创小企业来讲,组织架构应该是简单实用的,但对于中大规模的企业来讲,组织架构必须可以解决上规模员工的管理。
首先,人力资源可以为组织架构选择招聘合适的人才,并可以识别每一个人才的优劣势,而后将其安排到能够发挥其特长的岗位,最后让其在具体的业务项目当中创造价值,这是否是有点像古代战场上的选人用人、调兵遣将?那么软件架构跟组织架构是相似的,不一样是组织架构是用于人的,而软件架构是用于软件系统的。架构师要了解熟悉各类主流的技术栈、中间件产品等,知道它们身上的优劣势,并在系统设计中引用它们来解决特定问题,让每一个构件都可以发挥出最大的效用,最后经过优点互补、紧密协做来化解业务的各类挑战。这种阐述是否更高大上?俗话说学而优则仕,若是咱们可以把架构工做作好作到极致,那么等之后你晋升至管理层,这套方法论也是通用的。
看山是山,看山不是山,看山仍是山,好像这也是咱们学习技术的三重境界,穿越这三重境界离不开对软件架构这个领域作深刻专业的学习和实践,这也是老兵哥正在努力作的。今天暂时先分享到这里,接下来咱们还要继续剖析软件架构,看看架构是怎样演进变化的,都通过了哪几代迭代,每种类型的架构都有什么优缺点。
今天先分享到这里,今天暂时先分享到这里,接下来咱们还要继续剖析软件架构,看看架构是怎样演进变化的,都通过了哪几代迭代,每种类型的架构都有什么优缺点。坚持技术写做不容易,若是你以为有价值,麻烦动动手指点下文 「点赞 」按钮,让更多小伙伴能够看到,我也会更加有动力坚持分享。另外,老兵哥我后续还会分享职业规划、应聘面试、技能提高、影响力打造等经验,欢迎 关注 本专栏或公众号「IT老兵哥」,赋能程序人生!