前言
程序员和架构师之间差异的是什么?我认为程序员关注的是代码程序的实现,架构师关注的是代码程序的设计。
前者追求的是可能是基于代码实现的个人价值,比如用最短的时间完成xxx功能、程序的执行效率超过了xxx市面上其他程序……而后者更关心的是代码与人或组织的关系,比如这段代码为什么而生,能给别人带来什么价值,如何更好地让自己以及他人去理解代码……
同时程序员与架构师是没有高低之分的,顶尖的程序员可以让一段代码的执行效率优化上百倍上千倍,这是架构师使用再多的设计模式、引用再多的中间件都无法实现的。
但是顶尖的程序员太少了,这需要大量的天赋与练习,并且往往更需要的是天赋。所以当大家作为一个正常人时,想要在技术路线上再向前一步,更推荐的是大家往架构师这条路上走,因为架构是有套路的,靠学习和努力,是可以理解与复制的。
一、举一个例子
比如,你有一个任务:两天的时间实现一个用户登录的接口。
程序员的第一反应是什么?肯定是涉及一张用户表,存储用户名、密码信息。再引入一个登录框架,如SpringSecurity或shiro,然后基于登录框架实现一个认证接口来对用户名密码进行验证。
如果你是一名经验丰富的程序员,那么你可能在半天的时间内就能实现该段功能,再用半天的时间(可能还不需要)去mock测试,当然在测试的过程中,你可能会发现一些空指针、接口调用数据异常等问题。再补充了各种单元测试与接口测试后,你发现还有一天的时间,那么为什么不摸个鱼 充个电,给自己补充一些课外知识呢?
架构师看的任务后,脑海中也会浮现出数据库表、登录框架等信息。但在实现这段逻辑之前,他至少会按照定义用例->定义领域模型->定义交互图->定义设计类图这样的逻辑去思考问题。也就是说,除了代码实现之外,架构师需要将一个任务通过某种方式重新表达出它的业务模型。
程序的实现,基于分支逻辑的不同,可能是一个线性的表达,也可能是一个树形的表达。而程序的设计,一般都会先将程序对应的业务模型,划分出不同的领域,然后基于领域之间的交互来设计代码。
你可能会说,架构师做的这些事,最后还是要靠代码实现,那我如果能省去这些事直接实现代码,岂不是优化了效率,提升了效能😉。当然你的理解还是很有道理的,只是我们从某些方面去思考该问题时,比如该登录接口除了要支持用户名密码登录,还需要支持短信验证码登录,以及该接口还要扩展支持单点登录功能。那么基于你之前实现的代码,不免要经过n次的迭代修改,并且修改这么多次后,你还能保证你之前的登录逻辑就一定不会受到影响吗?
二、简单示例
1.定义用例
首先是需求分析,这可能会包括人们如何使用应用的情节或场景,这些情节或场景可以被编写成用例(use case)。
用例是需求分析中的一种常用工具。用例不是具体的代码实现,而只是对情节或场景的描述。
例如,下面是一个简单的登录场景的用例。
登录场景:用户请求登录。系统展示登录页面,提供登录方式,如果登录信息校验通过则返回登录成功信息,否则提示登录失败。
2.定义领域模型
代码如下(示例):
以Java为例,面向对象的分析关注从对象的角度来创建领域描述。面向对象分析需要鉴别其中的重要的概念、属性和关联。
面向对象分析的结果可以表示为领域模型
(domain model),在领域模型中展示重要的领域概念或对象:
上面的模型描述了重要的概念(User、Login和Valid)及其关联和属性。
需要注意的是,领域模型并不是对软件对象的描述,它使真实世界领域中的概念和想象可视化。因此,它也被称为概念对象模型(conceptual object model)。
3.定义交互图
面向对象设计中,往往会关注软件对象的定义,即领域之间的的职责和协作。时序图(sequence diagram,UML的一种交互图)是描述协作的常见表示法。它展示出领域对象之间的消息流,和由消息引起的方法调用。
4.定义设计类图
除了在时序图中显示对象协作的动态视图外,还可以用设计类图(design class diagram)来有效地表示类定义的静态视图。
这样可以描述类的属性和方法。例如,在登录场景中,通过观察时序图可以生成如下所示的局部设计类图。因为向Valid对象发送认证校验消息,所以Valid类需要valid方法;同理,Login类需要login和getValidType方法。
总结
要想迈向架构师的专业技术道路,程序员需要具备一种深入的洞察力和系统化思维。这要求他们在分析问题时,能够将复杂的业务场景拆解为最基础的领域对象,并深刻理解这些领域对象之间的相互依赖与作用关系。通过这种精确的业务建模,他们不仅能够构建出符合现实需求的软件结构,而且能以模型为基础,灵活地映射和应对现实中的各种复杂业务需求,从而在不断变化的商业环境中保持高度的适应性和竞争力。
这样的技术路线,使得程序员在面对诸如数据膨胀、并发压力、系统维护等挑战时,能够设计出具有弹性、可扩展和易于维护的系统,有效地抵御技术债务的累积。同时,它也支持了快速迭代、持续集成和部署,实现敏捷开发和精益创新,为企业带来更高效的运营模式和更快速的市场响应能力。