软件设计与软件架构

341
请问有人可以解释一下“软件设计”和“软件架构”的区别吗?
更具体地说,如果您要求别人呈现“设计”,您希望他们呈现什么?同样适用于“架构”。
我目前的理解是:
- 设计:针对系统的某个特定模块/部分的UML图/流程图/简单线框图(用于UI)。 - 架构:组件图(显示系统的不同模块如何相互通信以及与其他系统的通信),使用哪种语言,模式...?
请纠正我如果我错了。我已参考维基百科上关于软件设计软件架构的文章,但我不确定我是否正确理解了它们。

以下的问题有帮助吗? ;) - Patrick Karcher
请记住,某种程度上,这种区别(确实存在)常常是虚伪的。没有一个建筑师能够在没有良好的设计和施工理解的情况下做得很好,也没有一个设计师能够在没有合理的建筑理解的情况下做得很好。 - Hot Licks
我曾经看到有人将架构描述为“适合目的的设计”。这听起来有点陈词滥调,但其中包含了一些真理,因为好的架构必须最终以目的为中心而不是以实现为中心。 - Hot Licks
41个回答

326

没错,系统的架构就像是它的“骨架”。它是系统的最高抽象层。它包括哪些数据存储、模块之间如何交互以及哪些恢复系统已经到位。就像设计模式一样,有一些架构模式:MVC,三层分层设计等。

软件设计涉及到设计单个模块/组件。模块X具有哪些职责和功能?类Y呢?它能做什么,不能做什么?可以使用哪些设计模式?

简而言之,软件架构更多地关注整个系统的设计,而软件设计则强调在模块/组件/类级别上的设计。


116
建筑学通常处理的是“做什么”和“在哪里做”,但从不涉及“如何做”。我认为这是它与设计的基本区别,设计完成了建筑学不涉及(也不应该涉及)的“如何做”的部分。 - Asaf R
2
嗨@AsafR!这让我想到架构作为分析,因为分析处理的是“做什么”,而设计则处理“如何做”。你觉得呢? - Chriss
2
现在人们都自己设计、实现、维护后端服务器(可能是基于云的),以及前端设计(Web 或移动端)。我认为他们被称为全栈开发者。对吗? - Maziyar
1
架构是系统的概要,结构和整体蓝图。设计只是制定计划的活动。您可以设计架构,设计模块,甚至设计方法。 - Evan Hu
2
这是因为MVC是一种架构设计。MVC本身并不陈述任何细节。 "View"可以是网站、winforms、控制台应用程序等。模型几乎可以是任何东西,它并不说明它来自哪里(数据库层或其他)。 - Razzie
显示剩余7条评论

80
在一些软件开发生命周期的描述中,它们可以互换使用,但共识是它们是不同的。它们同时具有以下特点:(1)不同的阶段,(2)不同的责任领域和(3)不同的决策层次。
  • 架构是更大的视角:选择框架、语言、范围、目标和高级方法论(Rational瀑布流敏捷等)。
  • 设计是更小的视角:计划代码如何组织;系统不同部分之间的合同将如何看起来;项目方法论和目标的持续实施。规范是在此阶段编写的。
这两个阶段由于不同的原因会似乎混合在一起。
  1. 较小的项目通常没有足够的范围将计划分成这两个阶段。
  2. 一个项目可能是更大项目的一部分,因此这两个阶段的某些部分已经决定。(已经存在数据库、约定、标准、协议、框架、可重用代码等)
  3. 关于SDLC的新思考方法(参见敏捷方法),在一定程度上重新排列了这种传统方法。设计(架构在较小程度上)在整个SDLC过程中有意发生。通常有更多的迭代,整个过程反复进行。
  4. 软件开发本来就很复杂,很难计划,但客户/经理/销售人员通常通过在中途改变目标和要求使其更加困难。设计甚至架构决策必须在项目后期做出,无论是否计划。

即使阶段或责任领域混合在一起并且遍布各处,了解正在发生的决策层面总是好的。(我们可以永远继续下去。我试图让它成为一个摘要。)我会以这样的话结束:即使似乎您的项目没有正式的架构或设计阶段/ AOR /文档,它正在发生,无论是否有人有意识地这样做。如果没有人决定进行架构,则会发生默认的架构,可能很差。设计也是如此。如果没有代表它们的正式阶段,则这些概念几乎比任何其他时候都更重要。


好的回答。我喜欢强调一个看似是另一个部分的方式。第四点提出了一个有趣的问题:当一个特定问题领域中没有架构存在时,设计是否仍然有效?经验表明是的,但从理论上讲,我认为一个保持适当范围内的设计(即针对特定组件)应该是同样有效的,无论最终如何使用它。 - Tom W

55

架构是战略性的,而设计是战术性的。

架构包括框架、工具、编程范式、基于组件的软件工程标准和高级原则等内容。

而设计是与局部限制相关的活动,例如设计模式、编程习惯和重构。


如果“设计”的定义中减少对“设计”和“架构”的提及,我会投赞成票... - Peter Hansen
1
同意..也许它包括: 架构包括框架、工具、编程范例、基于组件的软件工程标准、高级原则等。 而设计是一种关注本地约束条件的活动,例如设计模式、编程惯用语和重构。 - Chris Kannon

38

我在寻找架构和设计之间简单的区别时发现了这篇文章;

你认为这种看待它们的方式怎么样:

  • 架构是我们正在构建的“什么”;
  • 设计是我们正在构建的“如何”。

4
我们正在建造的是客户的要求。我们如何建造取决于架构和设计。所以,不,这完全是错的。 - Marek
1
@Marek 我不明白哪里有问题。架构是要建造什么,客户想要什么,它应该大致看起来像什么,由哪些组件组成等等。设计则是这些东西如何实际制作的过程:组件、算法等的实际实现。 - RecursiveExceptionException

21
  1. 架构是指计算机或基于计算机的系统的概念结构和逻辑组织。

    设计是指在制作之前,展示系统或物体外观和功能或工作原理的计划或图纸。

  2. 如果您正在“设计”一个组件,您正在定义其内部行为。如果您正在“架构”同一组件,则正在定义其在更大系统中的行为。

所有架构都是设计,但并非所有设计都是架构。

What 部分是设计,How 是具体实现, WhatHow 的交集则是架构。

用于区分架构和设计的图示:

Design vs Architecture

还有一些设计决策,这些决策不具备架构重要性,即不属于设计的架构分支。例如,某些组件的内部设计决策,如算法选择、数据结构选择等。

任何不能在其组件边界之外看到的设计决策都是组件的内部设计,并且是非架构性的。只要它们的设计不违反系统级架构施加的架构约束,系统架构师就会将这些设计决策留给模块设计人员或实现团队自行决定。

以下链接提供了一个很好的类比:good analogy


我不喜欢这个答案。架构是最高层次的抽象,因此你不应该去烦恼“如何”完成它。我确实同意设计和架构在某种程度上是相互关联的 - 设计是创建系统架构的一部分活动,但我不会说“什么和如何”就是架构,因为这非常令人困惑... - Martin Čuka

15

我认为你说得对,用我的话来说:

架构 是将系统要求分配给系统元素的过程。以下是关于架构的四个声明:

  1. 它可以引入非功能性要求,如语言或模式。
  2. 它定义了组件、接口、时间等之间的交互方式。
  3. 它不应引入新的功能,
  4. 它将系统预期执行的(设计的)功能分配给元素。

当系统的复杂性被分解时,架构是必要的工程步骤

例如:想想你的房子,你不需要一个建筑师来设计你的厨房(只涉及一个元素),但整个建筑需要一些相互作用的定义,如门和屋顶。

设计 是对(拟议中的)功能实现的信息表示。它旨在引起反馈并与利益相关者讨论。这可能是一个好的实践,但不是必要的工程步骤

在安装厨房之前看到厨房设计确实很好,但对于烹饪需求来说并不是必要的。

如果我考虑一下,可以说:

  • 架构是为公众/工程师提供更详细的抽象级别。
  • 设计旨在为公众提供较少详细的抽象级别。

+1 架构是将系统要求分配给系统元素的过程。在最终列表中使用“a”字,会被扣除一分。我认为你(正确)最初的定义是抽象的反义词。 - Chris Walton
不确定第1点和第3点。任何东西都不应该引入比满足利益相关者要求所需的功能更多的功能。约束更多是一种方法论问题。其他几点很有帮助。厨房类比并不是一个好的类比;你不需要一个建筑师,但厨房设计是一个相当专业化的领域,其中使用了一些模块化组件进行设计。不能同意设计不是必要的工程步骤。不确定最后两点的含义。 - Mike G
实现在哪里呢?实现不就是设计吗? - jwilleke

14

我的提醒:

  • 我们可以在不向他人询问的情况下更改设计
  • 如果我们更改架构,需要将其通知给某些人(团队、客户、利益相关者等)

6
我认为我们应该使用以下规则来确定何时谈论设计与架构:如果您创建的软件图像的元素可以一对一地映射到编程语言的语法结构,则是设计,如果不能,则是架构。
例如,如果您正在查看类图或序列图,则可以使用类语法结构将类及其关系映射到面向对象编程语言。这显然是设计。此外,这可能会带来一个问题,即此讨论与您将用于实现软件系统的编程语言有关。如果您使用Java,则适用上述示例,因为Java是一种面向对象编程语言。如果您提出显示包及其依赖项的图表,则也是设计。您可以将元素(在此情况下是包)映射到Java语法结构。
现在,假设您的Java应用程序分为模块,并且每个模块都是一组包(表示为jar文件部署单元),并且您提供了一个包含模块及其依赖项的图表,则该图表是架构。在Java中没有一种方法(至少在Java 7之前没有)将模块(一组包)映射到语法结构。您还可以注意到,此图表表示软件模型的抽象级别更高的步骤。任何比包图更粗粒度的图表都表示在Java编程语言中开发时的架构视图。另一方面,如果您正在开发Modula-2,则模块图表示设计。
(摘自http://www.copypasteisforword.com/notes/software-architecture-vs-software-design

我非常喜欢它。很好的贡献。我不确定它是否如此明确,但在这样的问题上,这是你能得到的最明确的答案了。我想给你点赞,但我今天已经用完了所有的投票次数:(。 - Mike G

5
个人而言,我喜欢这个比喻:“设计师关注的是用户按下按钮时发生了什么,而架构师关注的是当一万个用户同时按下按钮时会发生什么。” ——Mark Cade和Humphrey Sheil所著的《Java EE SCEA学习指南》。

即使我已经阅读了那本书超过两次,但在阅读了以上所有评论之后,这个定义对我来说仍然不合理。这是为什么:设计师部分听起来不错,因为您会关注每一个细节,以确保按钮正在按照其应该执行的方式执行。但是架构师部分根本不涉及模块交互或整体情况,而是关于性能等等的事情,您认为我从那个定义中误解了什么吗? - Rene Enriquez

5
我同意很多解释;本质上我们认识到了软件系统的建筑设计和详细设计之间的区别。
虽然设计师的目标是在开发过程中尽可能地精确和具体化规格说明,但架构师的主要目标是指定系统的结构和全局行为,仅提供足够的详细设计开始所需内容。
一个优秀的架构师会避免过度说明 - 架构不应过度说明,而只能够处理成本最高的方面 (架构) 决策,并有效地提供一个框架 ("共性"),其中可以进行详细设计,即在本地功能方面进行变化。
实际上,架构过程或生命周期就是遵循这个主题 - 充分抽象,以概述 (架构) 重要的业务需求的结构,并在设计阶段留下更多细节,用于更具体的交付。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接