跨考计算机专业一年来浅学了几门相关专业技术,而一直没有对软件工程这个专业有一个宏观的认识和中心思想。学习了孟宁老师的高级软件工程后,颇有感悟,若有所得。
受益于老师轻松诙谐、亲和年轻的授课方式,学习过程轻松惬意。下面这些知识点和思想尤其让我对开发效率,人工效率和计算资源有了新的认识和看法:
编写高质量代码的基本方法
1.
通过控制结构简化代码
(if else/while/switch)
2.
通过数据结构简化代码
3.
一定要有错误处理
4.
注意性能优先的代价
5.
拒绝修修补补要不断重构代码
模块化
基本原理
模块化(
Modularity
)是在软件系统设计时保持系统内各部分相对独立,以便每一个部分可以被独
立地进行设计和开发。这个做法背后的基本原理是关注点的分离
(SoC, Separation of Concerns)
分解成易解决的小问题
,
降低思考负担。
每个模块只有一个功能,易于开发,并且
bug
会集中在少数几个模块内,容易定位软件缺陷,也更
加容易维护。
KISS
原则
一行代码只做一件事
一个块代码只做一件事
一个函数只做一件事
一个软件模块只做一件事
使用本地化外部接口,本质上是一种设计模式,代理模式
,
即客户端通过代理间接地访问该对
象,从而限制、增强或修改该对象的一些特性。能够有效降低模块与外部的耦合度。
先写伪代码的代码结构
软件质量的三个角度
1.
产品的角度,也就是软件产品本身内在的质量特点;
2.
用户的角度,也就是软件产品从外部来看是不是对用户有帮助,是不是有良好的用户体验;
3.
商业的角度,也就是商业环境下软件产品的商业价值,比如投资回报或开发软件产品的其他驱
动因素。
需求的类型
1.
功能需求:根据所需的活动描述所需的行为
2.
质量需求或非功能需求:描述软件必须具备的一些质量特性
3.
设计约束
(
设计约束
):
设计决策,例如选择平台或接口组件
4.
过程约束
(
过程约束
):
对可用于构建系统的技术或资源的限制
需求分析的两种方法
1.
原型化方法
原型化方法可以很好地整理出用户接口方式(
UI
,
User Interface
),比如界面布局和交互操作
过程。
2.
建模的方法
建模的方法可以快速给出有关事件发生顺序或活动同步约束的问题,能够在逻辑上形成模型来
整顿繁杂的需求细节。
统一过程
核心要义
统一过程(
UP
,
Unified Process
)的核心要义是
用例驱动
(
Use case driven
)、
以架构为中心
(
Architecture centric
)、
增量且迭代
(
Incremental and Iterative
)的过程。用例驱动就是我们前
文中用例建模得到的用例作为驱动软件开发的目标;以架构为中心的架构是后续软件设计的结果,
就是保持软件架构相对稳定,减小软件架构层面的重构造成的混乱;增量且迭代体现在下图中。
敏捷统一过程的四个关键步骤
第一,确定需求;
第二,通过用例的方式来满足这些需求;
第三,分配这些用例到各增量阶段;
第四,具体完成各增量阶段所计划的任务。
显然,第一到第三步主要是计划阶段的工作,第四步是接下来要进一步详述的增量阶段的工作。
在每一次增量阶段的迭代过程中,都要进行从需求分析到软件设计实现的过程,具体敏捷统一过程
软件具有复杂性和易变性
,
从而难以达成概念的完整性与一致性。
(
需求的达成永远赶不上需求的变
化
)
设计模式
设计模式的本质是面向对象设计原则的实际运用总结出的经验模型。目的是包容变化
,
即通过使用设
计模式和多态等特殊机制
,
将变化的部分和不变的部分进行适当隔离。
(
高内聚
,
低耦合
)
正确使用设计模式具有以下优点
:
可以提高程序员的思维能力、编程能力和设计能力。
使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开
发周期。
使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。
没有银弹的含义
“
在
10
年内无法找到解决软件危机的杀手锏(银弹)。
软件中的根本困难,即软件概念结构
(conceptual structure)
的复杂性,无法达成软件概念的完整性
和一致性
,
自然无法从根本上解决软件危机带来的困境。
软件的生命周期
分析、设计、实现、交付和维护五个阶段
1.
分析阶段的任务是需求分析和定义
,
分析阶段一般会在深入理解业务的情况下,形成业务概念原
型
2.
设计阶段分为软件架构设计和软件详细设计,前者一般和分析阶段联系紧密,一般合称为
“
分析
与设计
”
;后者一般和实现阶段联系紧密,一般合称为
“
设计与实现
”
。
3.
实现阶段分为编码和测试,其中测试又涉及到单元测试、集成测试、系统测试等。
4.
交付阶段主要是部署、交付测试和用户培训等。
5.
维护阶段一般是软件生命周期中持续时间最长的一个阶段,而且在维护阶段很可能会形成单独
的项目,从而经历分析、设计、实现、交付几个阶段,最终又合并进维护阶段。
V模型
V模型也是在瀑布模型基础上发展出来的,我们发现单元测试、集成测试和系统测试是为了在不同层面验证设 计,而交付测试则是确认需求是否得到满足。 也就是瀑布模型中前后两端的过程活动具有内在的紧密联 系,如果将模块化设计的思想拿到软件开发过程活动的组织中来, 可以发现通过将瀑布模型前后两端 的过程活动结合起来,可以提高过程活动的内聚度,从而改善软件开发效率。 这就是V模型。
V模型是开始一个特定过程活动和评估该特定过程的过程活动成对出现,从而便于软件开发过程的
组织和管理。
敏捷方法的敏捷宣言
个体和互动 高于 流程和工具
工作的软件 高于 详尽的文档
客户合作 高于 合同谈判
响应变化 高于 遵循计划
参考资料 代码中的软件工程
软件工程: 《代码中的软件工程》一书的配套ppt和源代码
在之前的学习中,我很少关注软件工程的具体应用,也因此遇到了很多的问题,经过认真的学习《高级软件工程》这门课程,感觉收获到了很多软件工程相关的知识,从中我学习到了问题解决方法论、软件生命周期、软件开发过程、图形化描述方法训练、工作量评估和项目管理、项目管理工具和软件测试技术方面的知识。
孟宁老师还推荐了人件/人月神话/第五项修炼这些经典书籍。在拜读了人件和人月神话之后,对软件工程有了更深入的了解,而且和之后孟宁老师的课堂讲授相互印证,十分感谢老师的推荐。
希望对于高级软件工程的学习不止于课堂和考试,后续能从这些书中学到更多。
高软总结 gc 186