软件构造的多维度视图
按阶段划分:构造时/运行时视图
按动态性划分:时刻/阶段视图
按构造对象的层次划分:代码/构件视图
软件构造的阶段划分、各阶段的构造活动
内部/外部的质量指标
外部质量因素影响用户,内部质量因素影响软件本身和它的开发者。外部质量取决于内部质量。
外部:
External 1 正确性:最重要的质量指标
External 2健壮性:针对异常情况的处理
External 3可扩展性:规模越大,扩展起来越不容易。为什么要扩展:应对变化
External4可复用性:一次开发,多次使用。发现共性
External5兼容性:不同的软件系统之间相互可容易的集成
External 6 高效性:性能毫无意义,除非有足够的正确性。对性能的关注要与其他质量属性进行折中。过度的优化导致软件不再适应变化和复用。
External7可移植性:软件可方便的在不同的技术环境之间移植。硬件、操作系统。
External 8易用性:容易学、安装、操作、监控。给用户提供详细的指南。
External 9 功能性: 每增加一小点功能,都确保其他质量属性不受到损失
External 10: 及时性
可验证性,完整性,可修复性,经济性……
内部:源代码相关因素,例如代码行数、圈复杂度等。与架构相关的因素,如耦合、内聚等。可读性 易懂 清晰度 尺寸。
质量之间的权衡特性。
质量属性之间的权衡。正直 使用方便 。经济 功能。 效率 可移植性。 效率 可重用性。 经济 可重用性。 及时性 可扩展性。
软件建设的五个关键质量目标 :
优雅美观的代码->易于理解 注释
为/重用而设计->开发成本低 可复用性
低复杂度->随时可以更改,易于扩展 可维护性
健壮性和正确性->避免错误,不易出错 健壮性
性能与效率->高效运行 易用编写、运行
软件构造过程与配置管理
传统的软件过程模型
两种基本类型:线性过程(软件不易更改,用户需求一定要明确),迭代过程(每个阶段都可给反馈,适用需求不确定)
现有型号:瀑布模型,增量模型,V字模型,原型模型,螺旋模型
选择合适的过程模型的依据:
1.用户参与程度有多大?--适应变化的能力
2.开发效率/管理复杂度
3.开发出的软件的质量
瀑布模型: •线性推进 •阶段划分清楚 •整体推进 •无迭代 •管理简单 •无法适应需求 增加/变化(传统线性模型,要求需求稳定)
增量模型: •线性推进 •增量式(多个瀑布的串行) •无迭代 •比较容易适应需求的增加(1.每个模块可运行2.接口简单清晰,后面增量不能影响已有的)
V-model 代表一个开发过程,可以被认为是瀑布模型的扩展。不是以线性方式向下移动,而是在编码阶段之后向上弯曲工艺步骤,以形成典型的 V 形。展示开发生命周期的每个阶段与其相关的测试阶段之间的关系。横轴和纵轴分别代表时间或项目完整性(从左到右)和抽象级别(最粗粒度的抽象)。每个阶段都进行一个测试。
原型模型:在原型上持续不断的迭代,发现用户变化的需求。迭代:开发出来之后由用户试用/评审,发现问题反馈给 开发者,开发者修改原有的实现,继续交给用户评审。 循环往复这个过程,直到用户满意为止。 时间代价高,但开发质量也高。提供给客户可评价的模型,可被抛弃。搞清楚客户需求再开发,系统结构可能不好,因为未进行深层分析。
螺旋模型:非常复杂的过程: •多轮迭代基本遵循瀑布 模式 •每轮迭代有明确的目标 ,遵循“原型”过程, 进行严格的风险分析, 方可进入下一轮迭代。长周期,风险不确定的大程序。
敏捷开发:通过快速迭代和小规模 的持续改进,以快速适应变化。
Agile = 增量 + 迭代 每次迭代处理一个小规模增量。需求不稳定,快速、短周期迭代,低风险、常改变、更新。对一些高质量、高风险,需用传统,需详细文档(军队火箭)
软件配置管理SCM与版本控制系统VCS
软件配置管理:追踪和控制软件的变化。
软件配置项:软件中发生变化的基本单元(例如:文件)
基线:软件持续变化过程中的“稳定时刻”(例如:对外发布的版本)
CMDB:配置管理数据库 存储软件的各配置项随时间发生变化的信息 +基线
版本:为软件的任一特定时刻(Moment)的形态指 派一个唯一的编号,作为“身份标识”
古老的版本控制方法:通过复制文件并修改文件名
Local VCS(局部式)本地版本控制系统: 仓库存储于开发者本地机器 无法共享和协作
Centralized VCS(集中式)集中式版本控制系统:仓库存储于独立的服务器, 支持多开发者之间的协作
Distributed VCS(分布式)分布式版本控制系 统:仓库存储于独 立的服务器+每个开 发者的本地机器 缺点:难以同步,耗费空间 git分布式
Git as an example of SCM tool
Git 存储库包含三个部分:本地的CMDB,工作目录:本地文件系统,暂存区:隔离工作目录和Git仓库
每个文件属于以下三种状态之一:已修改,已暂存,已提交
提交:对象图中的节点
每个commit指向一个父亲。多个 commit指向同一个父亲:分支。一个commit 指向两个父亲:合并。A branch is just a name that points to a commit.HEAD points to the current commit.
考:一个commit对象有几个父对象?0/1/2 一个父对象可有多个子对象
git与传统区别:传统VCS存储 版本之间的变 化(行),易于得到版本的变化,但很难创建分支。Git存储发生变化的文件(而非代码行),不变化的文件不重复存储。易于创建任意多个分支。
文件未发生变化,则后 续多个版本始终指向同一个文件。文件发生变化了,存储 两份不同的文件,两个版本指向不同的文件。
在 Git 中创建和合并分支:
General process of software construction
(1) Programming(2) Modeling languages 建模语言(3) Configuration languages 配置语言
Review and static analysis/checking 代码评审
Dynamic code analysis / profiling动态分析:要执行程序并观察现 象、收集数据、分析不足。
Debugging and Testing
What is testing 测试:发现程序是否有错误;What is Debugging 调试:定位错误、发现错误根源
Refactoring 重构:在不改变功能的前提下优化代码
狭义的软件构建过程(Build) 粗略理解build:build-time à run-time 借助于工具,将软件构造各阶段的活动“自动化” (编译、打包、静态分析、测试、生成文档、部署、…) 尽可能脱离“手工作业”,提高构造效率