Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >小故事:架构师需要做什么?

小故事:架构师需要做什么?

作者头像
CSDN技术头条
发布于 2018-02-11 08:36:29
发布于 2018-02-11 08:36:29
6840
举报
文章被收录于专栏:CSDN技术头条CSDN技术头条

作者:Robert C. Martin

原文:A Little Architecture

译者:孙薇

责编:钱曙光

本文是一篇模仿问答的小故事,作者用幽默的风格简单分析了架构师要做的工作:

我想要成为一名软件架构师。

这是年轻软件开发者很好的选择。

我想要带领团队,并在数据库与框架、webserver等方面作出重要的决策。

噢,那你根本就不想成为软件架构师。

我当然想了,我想要成为重要决策的制定者。

那很好,不过你列出的内容中并不包含重要的决策,这些都是不相关的决策。

什么意思?你是说数据库并不是重要的决策,你知道我们在上面花了多少钱吗?

也许花的太多了。但是,数据库并不是重要的决策之一。

你怎么能这样讲?数据库是系统的核心,是进行所有数据系统化、分类、编入索引和存取工作的地方;没有数据库的话,就不会有系统。

数据库只是一个IO设备,它恰巧为分类、查询与信息报告提供了一些有用的工具,但这些都只是系统架构的辅助功能而已。

辅助?这太离谱了。

没错,就是辅助。系统的业务规则也许能够利用其中的一些工具,不过那些工具却并非相应业务规则所固有的。需要的话,可以用不同的工具来替换现有的这些;而业务规则不会改变。

嗯,没错,不过必须重新进行编码,因为在原本的数据库中这些工具都用到了。

那是你的问题。

什么意思?

你的问题在于,你以为业务规则是依赖数据库工具的,实际上并不是。或者说至少,在提供优秀架构前并不应当是这样的。

这简直是疯了。如何创建不使用那些工具的业务规则呢?

我不是说它们没使用数据库的工具,而是说它们并不依赖于此。业务规则无需知道你使用哪个数据库。

那么如何在不了解使用什么工具的情况下,获得业务规则呢?

让依赖倒置过来,使得数据库依赖业务规则。确保业务规则不依赖于数据库。

你在胡言乱语。

恰恰相反,我在使用软件架构的语言。这是依赖倒置原则:低层准则应当依赖高层准则。

一派胡言!高层准则(假设指的是业务规则)调用低层准则(假设指的是数据库)。因此高层准则会根据调用方依赖被调用方的原则,而依赖低层准则。这个谁都知道!

在运行时的确如此。不过在编译时,我们想要的是依赖倒置。高层准则的源代码应当不提及低层准则的源代码。

得了吧!怎么能在不提及的情况下进行调用呢?

当然没问题。这就是面向对象的所涉及的内容。

面向对象是关于真实世界的模型创建,将数据、功能与有凝聚力的对象相结合。是关于将代码组织成直观的结构。

他们是这么说的?

大家都知道,这是显而易见的真相。

没错,确实如此,然而,在使用面向对象准则时,的确可以在不提及的情况下进行调用。

好吧,那要怎么做?

在面向对象设计中,各个对象会彼此发送消息。

没错,这是当然的。

而sender在发送消息时,并不知道receiver的类型。

这取决于所使用的语言。在Java中,sender至少知道receiver的基础类型。在Ruby中,sender至少知道receiver能够处理所收到的消息。

没错。不过在任何情况下,sender都不知道receiver的具体类型。

是这样,好吧,确实如此。

因此,sender可以在不提及receiver具体类型的情况下,设计receiver执行某个功能。

是这样,没错。我了解了。不过sender仍旧依赖于receiver。

在运行时的确如此。不过编译时则不同。sender的源代码并不会提及或者依赖receiver的源代码。事实上receiver的源代码依赖于sender的源代码。

不会吧!sender仍依赖于它所发送的类。

也许从某些源代码来看,会更清楚一些。下面这段是Java写的。首先是sender:

代码语言:js
AI代码解释
复制
package sender;
public class Sender {
      private Receiver receiver;
  public Sender(Receiver r) {
    receiver = r;
  }
  public void doSomething() {
    receiver.receiveThis();
  }
  public interface Receiver {
    void receiveThis();
  }
}
下面是receiver:
package receiver;
import sender.Sender;
public class SpecificReceiver implements Sender.Receiver {
  public void receiveThis() {
    //do something interesting.
  }
}

注意:receiver依赖于sender,SpecificReceiver依赖于Sender,在sender中并没有receiver相关的信息。

是啊,不过你在撒谎,你把receiver的接口放在sender类中了。

你开始懂了。

懂什么?

当然是架构的原则。Sender拥有receiver必须实现的接口。

如果这意味着我必须使用嵌套类,那么……

嵌套类只是实现目的的手段之一,还有其他办法。

好吧,等一下。这又跟数据库有什么关系?我们最开始讨论的可是数据库。

再看一点代码吧。首先是一个简单的业务规则:

代码语言:js
AI代码解释
复制
package businessRules;
import entities.Something;
public class BusinessRule {
  private BusinessRuleGateway gateway;
  public BusinessRule(BusinessRuleGateway gateway) {
    this.gateway = gateway;
  }
  public void execute(String id) {
    gateway.startTransaction();
    Something thing = gateway.getSomething(id);
    thing.makeChanges();
    gateway.saveSomething(thing);
    gateway.endTransaction();
  }
}

业务规则没占多大份量。

这只是个例子。还能有更多这样的类,实现很多不同的业务规则。

好的,那么Gateway到底是什么?

它通过业务规则提供了所有数据存取方法。按以下方式实现:

代码语言:js
AI代码解释
复制
package businessRules;
import entities.Something;
public interface BusinessRuleGateway {
  Something getSomething(String id);
  void startTransaction();
  void saveSomething(Something thing);
  void endTransaction();
}

注意:这是在businessRules之中。

ok,Something类又是什么?

它代表着简单的业务对象。我将它放在entities之中。

代码语言:js
AI代码解释
复制
package entities;
public class Something {
  public void makeChanges() {
    //...
  }
}

最终BusinessRuleGateway实现,这个类知道真正的数据库:

代码语言:js
AI代码解释
复制
package database;
import businessRules.BusinessRuleGateway;
import entities.Something;
public class MySqlBusinessRuleGateway implements BusinessRuleGateway {
  public Something getSomething(String id) {
    // use MySql to get a thing.
  }
  public void startTransaction() {
    // start MySql transaction
  }
  public void saveSomething(Something thing) {
    // save thing in MySql
  }
  public void endTransaction() {
    // end MySql transaction
  }
}

另外,注意业务规则在运行时调用数据库;不过在编译时,数据库会涉及并依赖于businessRules。

好吧,我想我明白了。你只是在利用多态性来隐藏从业务规则实现数据库的事实。不过仍需要一个接口,向业务规则提供所有的数据库工具。

不,完全不是这样。我们没有尝试向业务规则提供数据库工具。而是通过业务规则,为它们所需要的内容创建接口。实现这些接口就能调用合适的工具。

是啊,不过如果所有业务规则需要用到每个工具,那么只需把工具放在gateway接口中。

啊,我看你还是没明白。

明白什么?这已经很清楚了。

每个业务规则只为自己所需的数据访问工具定义一个接口。

等一下,你说什么?

这就是接口隔离原则(Interface Segregation Principle)。每个业务规则类只用到数据库的某些设施。因此,每个业务规则提供的接口只能访问相应的设施。

不过,这意味着需要很多接口,以及很多的小型实现类,它们又会调用其他的数据库类。

很好,你开始理解了。

不过这太乱了,浪费时间。为什么要这样做呢?

这样做能够条理分明,节省时间。

得了吧,为了代码,弄出来一大堆代码。

恰恰相反,通过重要的架构决策,可以延缓不相关的决策。

这是什么意思?

记得最开始,你说想做软件架构师不是吗?你想要作出所有真正重要的决策。

是啊,我是这样想的。

你想要决策的是数据库、webserver和框架相关的方面,对吗?

是啊,你说那些都不重要。只是不相关的内容。

没错。就是这样。软件架构师所作出的重要决策指的是,让你不对数据库、webserver和框架进行决策。

不过必须得先决定那些吧!

不用的。事实上,在开发周期中,这些都可以稍后再决定,在信息更充足的时候再决定。

如果架构师提前确定框架,却发现框架无法提供所需的性能,或者带来了无法忍受的约束,这就成了灾难。

只有架构师决定推迟决策,待信息足够时才作出决策;在架构师的决策下,不使用缓慢而过于耗费资源的IO设备和框架的团队,才能创建快速、轻量级的测试环境;只有其架构师关心真正重要的东西,延缓那些不重要的,这样的团队才是幸运的团队。

胡说,我完全不明白你的意思。

好吧,还是好好看一下本文,不然只能再等10年你才能明白了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSDN技术头条 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一个对话让你明白架构师是做什么的?
老鸟:这样很好,只是你没有列出哪些才是重要的决定。你刚才说的那些跟重要的决定没有什么关系。
良月柒
2019/03/20
2.3K0
一个对话让你明白架构师是做什么的?
架构师是怎样炼成的
软件架构师定义 软件工程师的职业发展方向: 软件架构师: 制定高级设计决策,并确定技术标准,包括编程标准,工具和平台的软件专家 软件架构: 系统的基本组织构成,这种组织主要体现在其组件,组
攻城狮Chova
2022/01/22
6720
架构师是怎样炼成的
《架构整洁之道》第 17 章 划分边界
软件架构设计是一门划分边界的艺术,其作用是将软件分割成各个组件,以达到约束边界两侧的依赖关系。
巴啦啦的积累
2023/06/02
3100
《架构整洁之道》第 17 章 划分边界
架构与架构师3
在《架构与架构师2》[1]中引用了1995年David Garlan和Dewayne Perry给出的定义:
码农戏码
2021/11/12
4290
架构与架构师3
架构与架构师
“架构”这个词给人的直观感受就充满了权力与神秘感,因此谈论架构总让人有一种正在进行责任重大的决策或者深度技术分析的感觉。毕竟,进阶到软件架构这一层次是我们走技术路线的人的终极目标
码农戏码
2021/03/23
5840
资深架构师十年总结:成为架构师,你必须具备这五点能力
作者 | Alan Tai 译者 | 冬雨 策划 | 闫园园 在过去的 20 年里,作为一名软件工程师和软件架构师,我与不同领域和不同学科的软件工程师聊过很多次。他们中有一些人是有着 8 到 10 年经验的高级工程师,有许多人还在职业生涯早期,有着 3 到 5 年的经验。其中一些人是我的同事。有些人是求职者。聊到最后,他们几乎都会问到同样一个问题: “我想成为一名解决方案架构师。了解更多架构相关内容的资源有哪些?“——很多软件工程师都会问的一个问题。 他们问错了问题。如果你读下去,就会知道为什么我
深度学习与Python
2023/03/29
5990
资深架构师十年总结:成为架构师,你必须具备这五点能力
《架构整洁之道》重点整理,快收藏!
高层架构&底层设计细节 "架构"这个词往往使用于“高层级”的讨论中。这类讨论一般都把“底层”的实现细节排除在外。 而“设计”一词,往往用来指代具体的系统代码组织结构和实现细节。 但是,从一个真正的系统架构师的日常工作来看,这样的区分是根本不成立的。 底层设计细节和高层架构信息是不可分割的。 只考虑高层架构,而不考虑设计细节会导致架构师脱离一线,导致架构师永远不了解具体开发代码时会遇到什么问题。 而只考虑设计细节而不考虑架构会导致视野的局限性,没有全局观,设计出来的系统可能边界不清楚,组件划分不明确,系统最
博文视点Broadview
2023/04/04
3610
《架构整洁之道》重点整理,快收藏!
成为java架构师需要具备那些技能?
大家好,又见面了,我是你们的朋友全栈君。架构师定义 百度百科,系统架构师是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。 架构师工作职能 软件架构师在整个软件开发过程中都起着重要的作用,并随着开发进程的推进而其职责或关注点不断地变化,在需求阶段,软件架构师主要负责理解和管理非功能性系统需求,比如软件的可维护性、性能、复用性、可靠性、有效性和可测试性等等,此外,架构师还要经常审查客户及市场人员所提出的需求,确认开发团队所提出的设计;在需求越来越明确后,架构师的关注点开始转移到组织开发团队成员和开发过程定义上;在软件设计阶段,架构师负责对整个软件体系结构、关键构件、接口和开发政策的设计;在编码阶段,架构师则成为详细设计者和代码编写者的顾问,并且经常性地要举行一些技术研讨会、技术培训班等;随着软件开始测试、集成和交付,集成和测试支持将成为软件架构师的工作重点;在软件维护开始时,软件架构师就开始为下一版本的产品是否应该增加新的功能模块进行决策。 成为java架构师所需要具备那些技能? 所谓架构师,思考的是全局的东西,是如何组织你的系统,以达到业务要求,性能要求,具备可扩展性(scalability),可拓展性(extendability),前后兼容性等。可能涉及到的东西包括了从硬件到软件的方方面面,实在是一言难尽。 既然java架构师,首先你要是一个高级java攻狮城,熟练使用各种框架,并知道它们实现的原理。jvm虚拟机原理、调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,连接池,线程池…:;java反射技术,写框架必备的技术,但是有严重的性能问题,替代方案java字节码技术;nio,没什么好说的,值得注意的是”直接内存”的特点,使用场景;java多线程同步异步;java各种集合对象的实现原理,了解这些可以让你在解决问题时选择合适的数据结构,高效的解决问题,比如hashmap的实现原理,好多五年以上经验的人都弄不清楚,还有为什扩容时有性能问题?不弄清楚这些原理,就写不出高效的代码,还会认为自己做的很对;总之一句话越基础的东西越重要,很多人认为自己会用它们写代码了,其实仅仅是知道如何调用api而已,离会用还差的远。 熟练使用各种数据结构和算法,数组、哈希、链表、排序树…,一句话要么是时间换空间要么是空间换时间,这里展开可以说一大堆,需要有一定的应用经验,用于解决各种性能或业务上的问题。 熟练使用linux操作系统,必备,没什么好说的。 熟悉tcp协议,创建连接三次握手和断开连接四次握手的整个过程,不了解的话,无法对高并发网络应用做优化;熟悉http协议,尤其是http头,我发现好多工作五年以上的都弄不清session和cookie的生命周期以及它们之间的关联。 系统集群、负载均衡、反向代理、动静分离,网站静态化。 分布式存储系统nfs,fastdfs,tfs,Hadoop了解他们的优缺点,适用场景。 分布式缓存技术memcached,redis,提高系统性能必备,一句话,把硬盘上的内容放到内存里来提速,顺便提个算法一致性hash。 工具nginx必备技能超级好用,高性能,基本不会挂掉的服务器,功能多多,解决各种问题。 数据库的设计能力,mysql必备,最基础的数据库工具,免费好用,对它基本的参数优化,慢查询日志分析,主从复制的配置,至少要成为半个mysqldba。其他nosql数据库如mongodb。 还有队列中间件。如消息推送,可以先把消息写入数据库,推送放队列服务器上,由推送服务器去队列获取处理,这样就可以将消息放数据库和队列里后直接给用户反馈,推送过程则由推送服务器和队列服务器完成,好处异步处理、缓解服务器压力,解藕系统。 想成为架构师不是懂了一大堆技术就可以了,这些是解决问题的基础、是工具,不懂这些怎么去提解决方案呢?这是成为架构师的必要条件。 架构师还要针对业务特点、系统的性能要求提出能解决问题成本最低的设计方案才合格,人家一个几百人用户的系统,访问量不大,数据量小,你给人家上集群、上分布式存储、上高端服务器,为了架构而架构,这是最扯淡的,架构师的作用就是第一满足业务需求,第二最低的硬件网络成本和技术维护成本。 架构师还要根据业务发展阶段,提前预见发展到下一个阶段系统架构的解决方案,并且设计当前架构时将架构的升级扩展考虑进去,做到易于升级;否则等系统瓶颈来了,出问题了再去出方案,或现有架构无法扩展直接扔掉重做,或扩展麻烦问题一大堆,这会对企业造成损失。
全栈程序员站长
2022/09/08
3840
架构整洁之道 15~22章读书笔记
软件架构师自身需要是程序员,并且必须一直坚持做一线程序员,绝对不要听从那些说应该让软件架构师从代码中解放出来以专心解决高阶问题的伪建议。
跑马溜溜的球
2021/06/22
4050
架构整洁之道 15~22章读书笔记
.NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记
Software architecture = {Elements, Forms, Rationale/Constraints}
郑子铭
2021/01/13
3610
.NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记
.NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记
Software architecture = {Elements, Forms, Rationale/Constraints}
郑子铭
2020/10/11
7490
.NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记
业务架构师、系统架构师、软件架构师:职责、技能要求及对比分析
业务架构师、系统架构师和软件架构师在企业技术层面扮演着不同角色,各自有其独特的职责和技能要求。了解和明确这三者的不同,有助于组织有效地分配资源和角色,促进企业的技术和业务目标的实现。
运维开发王义杰
2023/08/10
4.6K0
业务架构师、系统架构师、软件架构师:职责、技能要求及对比分析
业务架构师、系统架构师、软件架构师:八卦三者的混淆与现象
相比于系统和软件的架构师,业务架构师更倾向于站在更高的战略层面,涉及商业分析、战略规划等。许多技术人员可能并未完全理解业务架构师的工作内容和重要性。
运维开发王义杰
2023/08/10
5290
业务架构师、系统架构师、软件架构师:八卦三者的混淆与现象
你离架构师还有多远?
  软件架构师在整个软件开发过程中都起着重要的作用,并随着开发进程的推进而其职责或关注点不断地变化,总结下面几点。   在需求阶段,软件架构师主要负责理解和管理非功能性系统需求,比如软件的可维护性、性能、复用性、可靠性、有效性和可测试性等等,此外,架构师还要经常审查客户及市场人员所提出的需求,确认开发团队所提出的设计;   在需求越来越明确后,架构师的关注点开始转移到组织开发团队成员和开发过程定义上;   在软件设计阶段,架构师负责对整个软件体系结构、关键构件、接口和开发政策的设计;   在编码阶段,架
欢醉
2018/04/19
8960
你离架构师还有多远?
关于开发转岗架构师的一点体会
1、已经是某一个业务领域的专家,在该领域有从设计、开发到上线,有完整的经历,业务领域被周围同事认可;
呱牛笔记
2023/05/02
1820
关于开发转岗架构师的一点体会
架构师的必备素质和成长途径
2016年11月18-20日SDCC 2016中国软件开发者大会,易宝支付CTO陈斌给我们带来了“架构师的成长之路”的演讲。主要谈及了架构师的必备素质和成长途径及给准架构师的建议。 它山之石可以攻玉,
智能算法
2018/04/03
1.2K0
架构师的必备素质和成长途径
硬核干货:一位菜鸟码农的架构师“封神”之路!
不久前,高级架构师 Justin Miller 在 GitHub 上创建项目,介绍自己关于如何成为更好的软件架构师的想法。该项目发布一天即获得 1.4K star,现在已有近 5K star 量。
江南一点雨
2020/02/19
4310
「企业架构」企业架构师,解决方案架构师和软件架构师有何不同
在体系结构开发中使用实际操作的方法来在项目生命周期中提供技术领导。通常,他们是根据他们所掌握的技术来命名的,例如,Python架构师。他们负责软件开发中的设计模式、标准和策略。软件架构师倾向于回答这样的问题:“我们重构现有代码的开发标准是什么?“并确定开发方法。它们还可以定义集成标准。他就是我们很多人所说的架构师。负责特定解决方案/项目的最高设计级别和范围的人员。如果有其他类型的架构师,也可以在标题中使用Application,并且您希望清楚地看到此人主要担心的是某个特定的应用程序。
架构师研究会
2020/07/20
8970
「企业架构」企业架构师,解决方案架构师和软件架构师有何不同
硬核干货:一位码农的架构师封神之路!
几年前有人问我:「你是怎么成为一名软件架构师的?」我们就此探讨了必备技能、经验,以及储备相关知识所需的时间和精力。除此之外,我也回顾了自己走过的路、使用或尝试过的技术,以及我从那些五花八门的工作中学到的东西。
用户6543014
2020/02/21
3490
软件架构的本质
在不同的人眼里“架构”一词的意思大相径庭,互联网上对架构的定义也多如牛毛。过去几年里我问过上百人同一个问题,在他们看来“架构”意味着什么。得到的答案概括如下(排名不分先后):
一个会写诗的程序员
2022/07/01
8020
软件架构的本质
推荐阅读
相关推荐
一个对话让你明白架构师是做什么的?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档