相信大多软件工程师在谈及软件架构(software architecture)时立刻会联想到数据结构(data structure),这是正常的反应。但是,有些工程师却误以为软件架构就完全是关于数据结构,这就不对了。之所以将软件架构与数据结构在本文中并提讨论,是为了让我们对之有更清晰的认识。读者后面会明白,这种清晰的认识对于我们的工作是有益的。
数据结构在Wikipedia上的定义是:为了有效使用数据而在计算机中存储和组织数据的特定方法。这一定义说明了为什么我们又称之为算法。同样是在Wikipedia上,我们能找到对于软件架构的定义:一个系统所需结构的集合,包括软件元素(element)、元素间的关系和属性。定义中的“元素”是一个很宽泛的称呼,即可以指软件组件(component),也可以指一个独立的子设备。
单从定义来看,软件架构与数据结构具有不同的抽象层次,前者更放眼于功能,后者更着力于效率。为了读者能更好地理解这种层次之别,让我们以软件开发流程中的两个关键步骤为例加以说明。软件开发的设计阶段存在概要设计和详细设计两大步骤,概要设计应重点阐述软件架构,而详细设计应着力于解释数据结构。我们都知道,在开发过程中概要设计先于详细设计,因而可以推测出软件架构处于更高的抽象层次。我看到过不少软件概要设计文档一上来就讲数据结构,这是文档的作者对于软件架构与数据结构没有加以明晰的缘故。
做软件设计首当其冲的不是数据结构设计,而是架构设计,这一点无论怎样规模的软件都正确。架构设计强调的是设计概念(我有时也称之为模型),即软件“长什么样”。对于实现同样功能的软件模块,在有概念和没有概念时所设计出来的数据结构会很不一样。即使采用的算法相同,但命名很有可能不同,且有概念的命名更具可读性。因此,“先架构后结构”的方法,有助于写出更具可维护性的代码。现实中,之所以存在大量难以维护的代码,正是因为设计者省去了概念塑造这一步骤。
另一点需要指出的是,软件架构设计与数据结构设计对工程师的能力要求并不完全相同。软件架构设计需要更多的是概念能力,即将细节进行一定的抽象和概括的能力。数据结构设计所需的能力却是对于计算机体系结构、编程语言和各种算法的掌握。
分清软件架构与数据结构的意义在于:
1) 方便沟通。不至于他人在说软件架构时,我们却只想着数据结构。
2) 明白架构设计的重要性。架构设计用于引导数据结构设计,数据结构设计是用来表达架构的。
3) 理解架构设计与数据结构设计所需的能力之别,而不至于认为“数据结构是软件的一切”。

明晰软件架构与数据结构相关推荐

  1. 车路协同 智能路侧决策系统边缘计算系统功能技术要求

    1 范围 车路协同 智能路侧决策系统边缘计算系统功能技术要求. 本文件旨在规定车路协同 智能路侧决策系统中路侧计算系统的功能要点.软件架构.数据结构和性能参数等.该系统可以统一接入各类型感知设备,以标 ...

  2. 绝对好文:嵌入式系统的软件架构设计!

    要学嵌入式,关注@我要学嵌入式,嵌入式猛男的加油站. 1. 前言 嵌入式是软件设计领域的一个分支,它自身的诸多特点决定了系统架构师的选择,同时它的一些问题又具有相当的通用性,可以推广到其他的领域. 提 ...

  3. 嵌入式系统软件架构设计

    嵌入式系统软件架构设计 目录 1. 前言 4 2. 决定架构的因素和架构的影响 4 2.1. 常见的误解 5 2.1.1. 小型的系统不需要架构 5 2.1.2. 敏捷开发不需要架构 7 3. 嵌入式 ...

  4. 软件架构自学笔记——非功能特性

    软件架构的非功能特征 1.可修改性 大型的工业和商业软件系统的寿命周期通常都是很长的,有时候会长达20年甚至更长.很多这类应用程序在开发结束后都不是固定不变的,而在其整个生命周期内不断演化.原来的需求 ...

  5. 不可不知的软件架构模式

    什么是系统架构(Architecture) 设计不仅仅指的是外观和感觉,它还包括运作方式.-- 史蒂夫·乔布斯 系统架构(System Architecture),软件架构(Soft Architec ...

  6. 从算法+数据结构到MVC

    2019独角兽企业重金招聘Python工程师标准>>> -------------------- Pascal之父--Nicklaus Wirth,提出了著名公式:"算法+ ...

  7. 软件架构设计-五视图方法论

    1.每个人都可以做成为架构设计师 不懂软件的和刚入行的人们一听到架构设计,都认为是非常的高大上课题,是一个遥不可及的领域,一般人是不能做的.听起来云里雾里的,第一印象除了来自微软,阿里这些NB的公司里 ...

  8. FD.io/VPP — VPP 的软件架构

    目录 文章目录 目录 VPP 的分层架构 VPP INFRA(基础设施层) VLIB(矢量处理库层) VNET(网络协议栈层) Plugins(插件 APP 层) VPP 的软件架构 VPP TLDK ...

  9. malloc 结构体_算法与数据结构——结构体变量

    首先,要学习数据结构,一般要先了解结构体变量的使用,那么该如何定义结构体变量呢?随我一起回忆一下吧.(不一样的音乐,不一样的体验)(1)直接定义结构体变量.struct {int a;        ...

最新文章

  1. Python 之 Pandas (三)选择数据
  2. TortoiseSVN每个菜单项都表示什么意思
  3. 通过经度纬度得到距离
  4. SAP 电商云 Spartacus UI 产品明细页面路由路径的自定义配置
  5. PHP引用全局作用域中可用的全部变量是,php全局变量之学习笔记
  6. Windows Phone本地数据库(SQLCE):3、[table]attribute(翻译) (转)
  7. java移动接口发短信_Java面试零碎知识点
  8. Google X 新项目,用计算机视觉养鱼?
  9. 自动化(YUM/编译)安装PHP(5.3/5.5/7.0/7.1)脚本
  10. java搜寻范围在哪设定_查找值在Java中的范围
  11. jQuery中的join方法
  12. Spring Cloud Alibaba之服务治理Nacos
  13. wps2016向程序发送命令_word文档打开,提示“向程序发送命令时出现问题”的原因...
  14. 硬件信息查看PHP,如何查看电脑硬件信息|查看电脑硬件信息软件 查看电脑CPU/显卡/内存条/主板型号等配置...
  15. Obsolete特性
  16. 内构函数java_图灵学院笔记-java虚拟机底层原理
  17. 华山论剑 | 弓叶、陶朗等四家企业再生PET分选技术圆桌会议
  18. 在.NET中使用正则表达式对太平洋产品参数进行分析!
  19. 06512oracle数据库,记一次ORA-06512、ORA-29283
  20. Unwriter:BCH和BTC之争可以参考法国大革命

热门文章

  1. linux用8m内存读取1g日志,检查 Linux 中内存使用状况的 8 条命令
  2. string s.substr()的用法
  3. Linux利用子命令m,Linux mdir命令
  4. go gorm指定别名_GORM入门指南
  5. 笔记-信息系统安全管理-信息系统安全技术体系
  6. 笔记-项目采购管理-复习要点
  7. Ionic+Angular+Express实现前后端交互使用HttpClient发送get请求数据并加载显示(附代码下载)
  8. Eclipse安装从dao层直接到mapper层的插件
  9. Jenkins怎么安装、使用Jenkins构建、部署spring boot项目
  10. TOC之关键链项目管理遇到软件工程7原则