软件架构师如何工作?
软件架构师要想开展工作必然要先掌握基本的概念和技能。
比如说什么是架构,架构是用来做什么的,如何成为一名软件架构师 等等问题。
我们先谈谈什么是架构 Architecture (Latin architectura, from the Greek ἀρχιτέκτων arkhitekton"architect", from ἀρχι- "chief" and τέκτων "builder") is both the process and the product of planning, designing, and constructing buildings and other physical structures。维基百科的英文定义说的架构好像是一个过程,一个计划,设计,建造产品的过程。本质上是对产品的有序化重组。从人类发展的过程上来看,人类经历了愚昧无知的阶段走向了社会的形态最早出现了奴隶社会的形态,实际上这也是一种架构。将人类从平等的无序的状态转变为了有序的有阶级的社会形态。而中国历史上的朝代更迭也是用架构的改变来消除矛盾,将无序的状态逐渐转变为有序的状态。
架构的作用又有哪些呢?架构实际上是用来解决人的问题的,软件上的问题都是由于人对软件的预期有了偏差才出现的。而软件是用来解决人的问题,当然了软件架构师设计软件时就要预先考虑到人到底要解决谁的问题,那些问题。当找找上架构师的问题都不是绝对的问题。Why?如果是真正的问题的话,提问的人就会自己解决了,不在需要找架构师。架构师都要有这个自觉:发现问题永远都比解决问题来的更加重要。当他们有了问题的时候要找到问题的主体,主体就是问题的边界
要正确的认识问题,需要问两个问题:
1. 这是谁的问题?
2. 有什么问题?
当得到的回答是支支吾吾的时候,我们就知道正确的方向在哪儿,以及需要做哪些事了。问题1会花比较多的时间,也是支支吾吾最多的地方,因为架构要解决的问题都是人的问题。但是一旦确定了答案,问题2就会变得非常容易。可以这样说,架构师的能力大部分会体现在问题1的识别上。
做好架构首先需要做的就是识别出需要解决的问题。一般来说,如果把真正的问题找到,那么问题就已经解决80%了。这个能力基本上就决定了架构师的水平。
一名合格的软件架构师要具备充足的能力,,是能够正确的认识概念,能够发现概念背后所代表的问题,进而才能够认识目标领域所需要解决的问题,这样才能够为设计好架构打好基础。
兼具技术的广度(多领域知识)和深度(技术前瞻)
兼具思维的高度(抽象思维)
兼具感性(沟通)和理性(平衡)
做软件架构师的重要的任务之一就是切分。
切分就是利益的调整。
由于每个人的能力有限而想要得到更多的利益而导致的。而要想获得更多的利益就需要付出更多的劳动,为社会做出更多的贡献,这也倒逼我们做自己更擅长的事情。也就导致了社会分工的出现。 对比一个人干所有的事情,结果就是大家都能够得到更多,当然也产生了一个互相依赖的社会,互相谁都离不开谁。这就是自然而然而产生的架构切分,背后的原动力就是人们对自己利益的渴望。每个人必须要舍掉自己的东西,才能够得到更多的东西。有些人不愿意和别人进行交换,不想去依赖于别人,这些人的生活就很明显的差很多,也辛苦很多,自然而然的就被社会淘汰了。如果需要在这个社会上立足,判断标准就变成了:如何给这个社会提供更好更有质量的服务。提供的更好更多的服务,自然就能够换取更多更好的生活必需品。实际上这就是我们做人的道理。
切分的原因是权力和义务的不对等。实际上就是利益的分配不均。由于不均导致矛盾的产生,也就需要新的架构进行重新划分。重新切分也要准守几个原则。
1. 必须在连续时间内发生的一个活动,不能切分。
2. 切分出来的部分的负责人,对这个部分的权利和义务必须是对等的。
3. 切分出来的部分,不应该超出一个自然人的负载。当然对于每个人的能力不同,负载能力也不一样,需要不断的根据实际情况调整,这实际上就是运营。
4. 切分是内部活动,内部无任怎么切,对整个系统的外部应该是透明的。如果因为切分导致整个系统解决的问题发生了变化,那么这个变化不属于架构的活动。当然很多时候当我们把问题分析的比较清楚的时候,整个系统的边界会进一步的完善,这就会形成螺旋式的进化。但这不属于架构所应该解决的问题。进化的发生,也会导致新的架构的切分。
总结一下
架构的切分的导火索是人的负载太重。
架构的切分实际就是对stakeholder的利益进行切分或合并,使得每个stakeholder的权责是对等的,每个stakeholder可以为自己的利益负责。
架构切分的最终结果都会体现在组织架构上,只有这样才能够让架构落地并推进。
架构切分的结果一定是一个树状,这也是为什么会产生分层。层数越多沟通越多,效率越低,分层要越少越好。尽可能变成一颗平衡树,才能让整个系统的效率最大化
切分的意义和价值
分的过程是把系统拆分为各个子系统 / 模块 / 组件,拆的时候,首先要解决每个组件的定位问题,然后才能划分彼此的边界,实现合理的拆分。合就是根据最终要求,把各个分离的组件有机整合在一起,相对来说,第一步的拆分更难。
拆分的结果使开发人员能够做到业务聚焦、技能聚焦,实现开发敏捷,合的结果是系统变得柔性,可以因需而变,实现业务敏捷。