设计(design)、架构(architechure)、框架 (framework)之间是个什么关系?请描述一下?

设计,架构,框架之间是什么关系?-LMLPHP

每个人都在进行设计

在探讨题目问题之前,我们从设计开始聊聊。

其实我们每个人都在做设计,无论我们是在哪个行业,哪个层次,哪个职位。

  • 画家作画时会画草图做设计
  • 作家写作时会列提纲做设计
  • 程序员编码时会写伪代码做设计
  • 清洁工扫地时会在脑海里设计扫地的执行路径

设计有大有小

对于软件系统领域来说:

  • 在方法层次,我们可以设计方法名、变量名、语句块使得方法变得易懂、简洁、高效;
  • 在类的层次,我们可以设计其方法、成员变量、静态变量、继承关系及可见性级别等,使得一个类能更好地抽象与封装,方便其他人使用;
  • 在包的层次我们可以设计规划各个模块代码的位置,方便我们能快速找到对应的代码;
  • 在服务层次我们可以设计服务的粒度,暴露的功能,交流的协议,以方便服务间持续的交互;
  • 在系统层次我们可以通过设计系统暴露的功能、协作的形式以完成系统层次的协作;
  • 再往上依然存在需要设计的层级,如多个软件系统间协作完成的一个大的软件系统,但每个公司对此叫法可能不一样;
  • 软件系统再往上也有层级,但其可能就是人类自身的系统了。

这里各个层次的设计都有一个朴素的设计理念,那就是 提供抽象接口以此与外围交互、封装具体变化以此在内部独立演进。这个是我们完成某项复杂任务而组织的大型工程里的一个基础理念。

刚刚讲的是软件系统领域的设计,但其可扩展到各个领域,如人的系统、建筑的系统、小说的系统等等。

设计,架构,框架之间是什么关系?-LMLPHP

进行高层设计的人不一定精通底层的设计

当然,进行高层设计的人能融汇贯通其相关底层子系统的知识当然最好,但是大多数情况下,我们做不到,因为我们现在组织的系统的层级太多太深了。

举个例子,我们设计的业务代码在编译后能借助操作系统的能力协调CPU、内存及IO一起完成业务代码的执行,但是设计业务代码的人,不一定能知道CPU的流水线是怎么运作的、内存屏障是如何协调多个核心与内存的、数据具体是怎么传输到其他机器的。

再举个例子,某个大型公司CEO可能不懂编码,但其手下有不同类型的大将,包括懂技术的人才,因此CEO只要组织设计一个团体能覆盖其知识盲点,就能管理好整个公司,包括整个公司的各类软件系统。

从上面我们可以看到在做高层设计与做底层设计的人的能力是无法直接比较的,因为他们的能力栈可能完全不一样,无法简单地进行比较。

但通常的套路下,做高层设计的都是从底层设计的人才中转岗(叫提拔、晋升不一定合适,有时候底层设计的人才更为稀缺)而来的,因为只有你的设计能力在影响不那么大的层次经过验证后,才放心让你到更高层次进行设计。

架构与设计的关系

实际上架构是一种设计。

架构设计规定了主要组件间一些较大层次的约束与规范,一些较小层次的设计在这些约束与规范下进行的话,能最大限度地满足某些方面的特性,如可阅读性、可靠性、可扩展性、安全性等等。

举个例子,我们在设计一个屋子的时候,房间、厅、厨房等可以想象为架构,我们在进行软装的时候,是不能改变原有的设计的,不然随便敲墙容易造成安全隐患。但我们能控制软装的,形成风格各异的房间。

当然,设计层次的大小是相对的。在刚刚例子里一个屋子里的房间布局是架构。但往上看,在一个街区的架构设计里,一个屋子的内部房间布局仅仅只是一个较小层次的设计,其不会影响整个街区的规划。

因此,架构这一个词,应该存在于各个层次。就像我们在写代码时,运用各种设计模式,如责任链等,规定编写代码所使用的方式,以开闭原则保证代码稳定性及可阅读性时,我们就已经是这段可扩展的代码的架构师了。

架构与框架的关系

框架是架构的一种实现。

例如MVC这种架构设计(架构是每个层次都存在的),分离了不同类型代码的关注点,使得代码更为清晰及更易维护。

而各类MVC框架则实现了这种架构,只要我们基于这个框架扩展实现我们的代码,那么我们就能写出符合MVC架构规范的代码。

同时,在这里我们需要额外理清楚的一件事情是框架(framework)与库(library)的区别。我觉得以下这幅图很好地说明了这个区别。

设计,架构,框架之间是什么关系?-LMLPHP

总结

  • 为了完成某件事情,无论我们身处哪个职位,都需要进行设计;
  • 一个设计可以包含多个其他人负责的子设计,你的设计也可能是其他人设计的一部分;
  • 要完成一个复杂的任务,按层级拆分设计是一个常用的方法;
  • 为了底层设计实现的可控,达到我们预期的某些效果,我们要对设计进行规范与限制,这称为架构,这也是一种设计;
  • 就像设计有很多层次一样,架构也有很多的层次;
  • 框架是架构的具体实现,利用框架,并在框架/架构的约束下进行扩展/编码能加速我们代码的实现

最后

本文是基于目前个人理解而成,若文章有谬误,望不吝 批评斧正 ;若本文对大家有所帮助,望不吝 推荐

相关阅读

你知道如何画好一幅架构图么?

作者个人公众号

多年金融码农,现为某信用卡中心架构师,EasyTransaction作者,欢迎关注
设计,架构,框架之间是什么关系?-LMLPHP

ref:

01-02 17:50