阅读本文大概需要 6 分钟。

很多人都想知道架构师是做什么?我们看看下面的一段对话。

菜鸟 —— 刚入门的程序员

老鸟 —— 资深架构师

老鸟:菜鸟,你的目标是什么?

菜鸟:我要成为一个软件架构师。

老鸟:对一个年轻的工程师来说,这是一个很好的目标。那你为什么要成为架构师呢?

菜鸟:我要领导一个团队,还要做所有关于数据库、框架和Web服务器的重要决定。

老鸟:好吧,如果是这样,你就没必要成为一个软件架构师了。

菜鸟:当然有必要了!我要成为一个能够做所有重要决定的人。

老鸟:这样很好,只是你没有列出哪些才是重要的决定。你刚才说的那些跟重要的决定没有什么关系。

菜鸟:你说什么?难道数据库不重要?你知道我们在数据库上面花了多少钱吗?

老鸟:可能很多。不过数据库仍然不是最重要的。

菜鸟:你怎么能这么说呢?数据库可是整个系统的心脏啊!所有的数据都保存在这里,它们在这里被排序,被索引,被访问。如果没有数据库,整个系统就无法运作!

老鸟:数据库只不过是一个IO设备,它提供了一些有用的工具对数据进行排序、查询,并生成报表,但这些工具都只是整个系统的附属品。

菜鸟:附属品?真是不可思议。

老鸟:是的,附属品。你的系统业务逻辑或许会用到这些工具,但这些工具并非业务逻辑固有的组成部分。如果有必要,你可以随时替换掉这些工具,但业务逻辑还是那些业务逻辑。

菜鸟:好吧,不过如果把这些工具替换掉,我们就要重新实现业务逻辑了。

老鸟:那是你的问题。

菜鸟:为什么这么说?

老鸟:你认为业务逻辑依赖数据库,但实际上不是这样的。如果你的架构足够好,最起码业务逻辑不应该依赖数据库。

菜鸟:这太疯狂了。我怎么可能创建出不使用这些工具的业务逻辑?

老鸟:我并没有说业务逻辑不要使用数据库工具,我的意思是它们不应该依赖这些工具。业务逻辑不应该知道使用的是哪一种数据库。

菜鸟:如果业务逻辑对数据库一无所知,它怎么使用这些工具呢?

老鸟:依赖反转。你要让数据库依赖业务逻辑,而不是让业务逻辑依赖数据库。

菜鸟:你的话让人费解。

老鸟:费解吗?我讲的可是软件架构。这个就是依赖反转原则,让下层策略来依赖上层策略。

菜鸟:那就更加费解了!既然上层策略(假设你指的是业务逻辑)要调用下层策略(假设你指的是数据库),那么就应该是上层策略依赖依赖下层策略,就像调用者依赖被调用者一样。这是众所周知的!

老鸟:在运行时确实是这样的,但在编译时我们要把依赖反转过来。上层策略的代码里不要引用任何下层策略的代码。

菜鸟:拜托!不引用代码就无法调用它们。

老鸟:当然可以调用了。面向对象就可以做到。

菜鸟:面向对象对真实世界进行建模,把数据和函数组合到对象里,把代码组织成直观的结构。

老鸟:这是他们告诉你的吗?

菜鸟:所有人都知道的,这不是很明显的事情吗?

老鸟:确实如此。不过,面向对象是可以做到不引用也能调用的。

菜鸟:好吧,那它是怎么做到的?

老鸟:你应该知道,在面向对象系统里对象会给其它对象发送消息的,对吧?

菜鸟:是的,当然。

老鸟:那么你就该知道,消息发送者是不知道消息接收者是什么类型的。

菜鸟:这要看使用的是哪一种语言了。在Java里,发送者最起码要知道接收者的基本类型。在Ruby里,发送者知道接收者一定会处理它所发送的消息。

老鸟:是的。不过不管是哪一种情况,发送者都不知道接收者具体的类型。

菜鸟:嗯,是的。

老鸟:所以发送者可以给接收者传递一个函数,让接收者执行这个函数,这样发送者就不需要知道接收者是什么类型了。

菜鸟:没错。我了解你的意思。不过发送者仍然依赖接收者。

老鸟:在运行时确实是的,但在编译时不是这样的。发送者的代码里并没有引用接收者的代码。实际上,是接收者的代码依赖了发送者的代码。

菜鸟:啊!但发送者仍然会依赖接收者的类。

老鸟:看来需要用代码来说明了,我用Java来写些代码。首先是发送者代码:

老鸟:下面是接收者代码:

老鸟:可以看到,接收者代码依赖了发送者代码,也就是说SpecificReceiver依赖了Sender。同时可以看到,发送者代码对接收者代码一无所知。

菜鸟:哈,你作弊了。你把接收者的接口放到了发送者的类里了。

老鸟:你开始明白了。

菜鸟:明白什么?

老鸟:当然是架构原则啊。发送者持有接收者必须实现的接口。

菜鸟:如果这意味着我要使用内部类,那么……

老鸟:使用内部类只是方法之一,还有其它的方法。

菜鸟:请等一下。最开始我们讨论的是数据库,那这些跟数据库又有什么关系呢?

老鸟:让我们来看一下其它代码吧。首先是一个简单的业务逻辑

菜鸟:这个业务逻辑没有做什么事情啊。

老鸟:这只是个例子。在实际实现业务逻辑的时候,不会有很多类似这样的类的。

菜鸟:好吧。那么Gateway是用来做什么的呢?

老鸟:它为业务逻辑提供了所有访问数据的方法。下面是它的代码:

老鸟:要注意,这个接口是在businessRules包里面的。

菜鸟:好吧。那Something这个类又是用来做什么的呢?

老鸟:它代表一个简单的业务对象。我把它放在另一个叫entities的包里。

老鸟:最后需要实现BusinessRuleGateway接口,这个实现类会知道相关的数据库细节:

老鸟:可以看到,业务逻辑是在运行时对数据库进行调用的。而在编译时,是database包引用了businessRules包。

菜鸟:好吧,我想我明白了。你用多态性隐藏了数据库实现。不过在业务逻辑里,仍然引用了数据库的工具接口。

老鸟:不,不是这样的。我们并没有打算为业务逻辑提供所有的数据库工具接口,而是业务逻辑创建了它们所需要的接口。在实现这些接口的时候,可以调用相应的工具。

菜鸟:嗯,这样的话,如果业务逻辑需要所有的工具,那么你必须把所有工具都放到Gateway接口里。

老鸟:哈,我觉得你还是没有明白。

菜鸟:不明白什么?我觉得已经很清楚了。

老鸟:每个业务逻辑只定义它所需要的接口。

菜鸟:等等,什么意思?

老鸟:这个叫作接口分离原则。每个业务逻辑只使用一部分数据库工具,所以每个业务逻辑只定义能够满足需要的接口。

菜鸟:这样的话,你就会有很多接口,而且有很多实现类。

老鸟:哈,是的。你开始明白了。

菜鸟:这样子很浪费时间!我为什么要这样做呢?

老鸟:这样做是为了让代码更干净,并且节省时间。

菜鸟:算了吧,这样只会增加更多的代码。

老鸟:相反,这其实是很重要的架构决定,这跟你之前所说的那些所谓的重要决定是不一样的。

菜鸟:什么意思?

老鸟:还记得你刚开始说你要成为一个软件架构师吗?你还想要做所有重要的决定?

菜鸟:是啊,我是这么想过。

老鸟:你想做所有关于数据库、Web服务和框架的决定。

菜鸟:是啊,而你却说它们都不重要,还说它们其实跟重要的决定不相干。

老鸟:没错,它们确实跟重要的决定不相干。一个软件架构师真正要做的重要决定都在数据库、Web服务器和框架之外。

菜鸟:但首先要先决定用什么数据库、Web服务器或框架啊!

老鸟:实际上应该在开发后期才开始做这些事情——在你掌握了更多信息之后。

老鸟当架构师草率地决定要使用一个数据库,后来却发现使用文件系统效率更高

老鸟当架构师草率的决定使用一个Web服务器,后来却发现团队需要的不过是一个socket接口

老鸟当架构师草率地决定使用一个框架,后来却发现框架提供的功能是团队不需要的,反而给团队带来了诸多约束

老鸟当架构师在掌握了足够多的信息后才决定该用什么数据库、Web服务器或框架

老鸟当架构师为团队鉴别出运行缓慢、耗费资源的IO设备和框架,这样他们就可以构建飞速运行的轻量级测试环境

老鸟:当架构师把注意力放在那些真正重要的事情上,并把那些不重要的事情放在一边。

菜鸟:我完全不知道你在说什么了。

老鸟:好吧,如果在若干年后你还没有转做管理,或许会明白这一切的……

对话来源网络,若有侵权,请联系删除

通过上面的对话,让我们对架构师有了个简单的了解,那么架构师在一家公司有多重要呢?架构师对一家公司、一个项目有多重要?

我们来看一看调查的数据

架构师在公司中担当着「IT架构灵魂人物」的角色,因为他们不仅做着架构师的本职工作,还同时做程序开发,写核心代码。另外,架构师依旧是技术高手,编程能力依然是一流的。

从图表结果来看,架构师必须具备出色的设计能力、编程能力和沟通能力,在完成本职的架构工作外,还要协调好项目中人员的关系,做出合理的分工,最终完成全部工作。

最后,看下企业对Java架构师的职位描述与职位要求

从招聘信息来看,架构师们必须是具有多年的从业经验,有过项目开发经历,精通多门编程语言且熟悉数据库的大咖。所以,想以架构师为目标的读者,就要加倍努力了!

·END·

路虽远,行则必至

本文原发于 同名微信公众号「程序员的成长之路」,回复「1024」你懂得,给个赞呗。

微信ID:cxydczzl

往期精彩回顾

程序员接私活的7大平台利器

教你一招用 IDE 编程提升效率的骚操作!

作为程序员的你,一年看几本技术相关的书

大学期间的副业赚钱之道

5个相见恨晚的Linux命令

缓存穿透,缓存击穿,缓存雪崩解决方案分析

为啥程序员下班后只关显示器从不关电脑?

送给程序员们的经典电子书大礼包

面试时如何优雅地自我介绍?

支撑百万并发的数据库架构如何设计?

一千行MySQL详细学习笔记

一个对话让你明白架构师是做什么的?相关推荐

  1. 对话京东安全首席架构师:电商平台构建安全防护体系关键点

    近年来,在不断发展的互联网技术和因疫情而兴起的"宅家经济"的共同推动下,电商平台已成为各大零售企业争相"抢滩登陆"的主战场.为了吸引更多消费者关注和购买,各类福 ...

  2. 要成为一个好的前端架构师需要做的事情

    要成为一个好的前端架构师需要做的事情: 了解业务:全面调研当前业务和竞品的现状,充分理解当前渲染链路和节点,确认当前存在的问题 寻找方案:预估未来发展的方向,尽可能多的了解相关解决方案或创新自己的方案 ...

  3. 云架构师是做什么的_为什么以及如何成为云架构师

    云架构师是做什么的 这当然不是新闻. 我们之前已经讨论过学习OpenStack是如何启动IT事业的好方法 . 但是它到底有多有价值? 而且,如果您想从传统的IT基础架构管理过渡到成为云架构师,您将如何 ...

  4. 测试架构师应该做和不应该做的事情

    内容大纲 原文解读 测试架构师是产品测试专家,是测试团队的灵魂人物,也是测试工程师在软件测试技术上的一个重要发展方向. 在需求分析阶段,首先要理解产品的商业目标和核心价值,了解我们的公司.客户及商务, ...

  5. python架构师是做什么的_【图片】架构师速成-一个10多年架构师的总结_架构师吧_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 架构师速成5-小学 很高兴你很快的进入了小学,小学的东西会让你更加的耀眼. 阶段: 小学 学时:2-3个月 升学标准 能自己制定目标及计划,get thi ...

  6. 如何带领团队“攻城略地”?优秀的架构师这样做

    阿里妹导读:架构师是一个既能掌控整体又能洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物.看似完美的"人格模型"背后,是艰辛的探索.今天,阿里巴巴技术专家九摩将多年经验 ...

  7. 程序员听爵士,架构师学做交响指挥

    爵士精神和古典大师,在蓝色狂想曲里达到一个平衡 在一班从洛杉矶回北京的飞机上,我刚一坐下,旁边的一个美国老人就很热情的和我打招呼,他的名字是Bill,是和一个旅行团一起来中国来玩的,先是聊了聊紫禁城, ...

  8. 业务架构师应该做些什么?

    一.前言 接触业务架构工作之后,除了单位提供的方法论外,为了做好这项工作,认真学习了软件过程.系统分析与设计.架构设计.设计模式.Java 语言等内容,并研读了敏捷开发.领域驱动设计.工作流分析等方面 ...

  9. python架构师是做什么的_架构师成长之路(1)--什么是架构师

    前言: 哲学家常思考的问题:" 我是谁?"" 我从哪里来?"" 要到哪里去?不只是哲学家,我想每个人都有自己对这三个问题的认知. 如果我们要成为架构师 ...

  10. python架构师是做什么的_什么是架构师?架构师应该具备什么样的能力?

    前段时间网上最流行的三个问题:" 我是谁?"." 我从哪里来?"." 要到哪里去?".这三个问题不只是网上流行的问题也是哲学家们最常思考的问 ...

最新文章

  1. 用python+pillow模块实现抖音晃眼睛的特效,图像处理之路(附源码)
  2. 从零开始学ios开发(十二):Table Views(中)UITableViewCell定制
  3. CTFshow 命令执行 web122
  4. 五天带你学完《计算机网络》·第三天·传输层
  5. Java黑皮书课后题第3章:*3.32(几何:点的位置)给定一个从点p0(x0,y0)到p1(x1,y1)的有向线段,可以用以下公式判定定点p2(x2, y2)是在线段的左侧、右侧,或者在该线段上
  6. bat 启动 不弹出对话框_CAD中转换出的PDF文件模糊要怎么办
  7. android8.1新功能,Android 8.1新特性:烦人的“正在后台运行”,拜拜
  8. 原生JS数组去重的几种方法
  9. java 类加载生命周期_Java类的加载与生命周期
  10. php7 mcrypt模块_Linux下PHP安装mcrypt扩展模块笔记
  11. 两个iOS应用之间的跳转
  12. mysql找不到服务_win7系统安装mysql后找不到服务或提示找不到指定文件如何解决...
  13. 贴片钽电容,P型 A型 B型 C型 D型 E型怎么区分?
  14. 武汉互联网公司和生活成本
  15. 我的python笔记06
  16. everedit选择_everedit选择_文本编辑器软件EverEdit怎么样?EverEdit相关功能介绍
  17. MySQL学习笔记——多表查询
  18. 成信大808计算机基础历年真题及答案
  19. [LeetCode] 871. Minimum Number of Refueling Stops @ python
  20. 购房卖方违约 买方如何维护自己的合法权益?

热门文章

  1. 安卓gridview控件的使用
  2. 奖励 CSDN 社区的领军人物
  3. Jenkins+Gitlab+Ansible自动化部署(六)
  4. linux启动项加命令,启动项 命令(linux 添加开机启动项的三种方法)
  5. 发现的一点点QQ使用技巧
  6. 可视化2D动画—cavas旋转的圈
  7. amh在linux下修改伪静态,伪静态规则大全 - AMH云主机面板 - AMH开源社区 - amh.sh
  8. UCB CS285课程笔记目录
  9. Python案例实操3-电影数据分析
  10. 联想y7000 Linux显卡驱动,联想Y7000安装显卡驱动