本章重点:
- 计算机科学的领域
- 软件工程与计算机科学的关系
- 软件的特性
- 软件工程的定义与组成部分
1 软件 = 程序 + 软件工程
程序 = 数据结构 + 算法
一个复杂的软件不但要有合理的软件架构(Software Architecture)、软件设计与实现(Software Design,Implementation and Debug),还要有各种文件和数据来描述各个程序文件之间的依赖关系、编译参数、链接参数,等等。这些都是软件构建的过程。
1.1 软件的生命周期(Software Life Cycle,SLC)
- 源代码管理(Source Code Control):也叫***配置管理(Software Configuration Management)***,指对于不同版本源代码的管理和控制;
- 质量保障(Quality Assurance,QA):用一系列工具、流程和文档来保证程序的正确性,这些工具(也是软件)、流程应该达到很高的质量,才能保证开发出来的软件的质量;
- 软件测试(Test):指具体的验证过程;
- 需求分析(Requirement Analysis):对于来自客户等的需求进行分析,把合适的需求梳理出来,然后逐步展开后续工作;
- 程序理解(Program Comprehension):指软件团队人员读懂已有程序、了解程序设计的过程;
- 软件维护(Software Maintenance):也叫***服务运行(Service Operation)***,指软件运行过程中出现问题后,软件团队成员对其进行修复(如打补丁)的过程;
以上就是软件完整的生命周期,再这一周期中,需要有人负责软件项目的管理(Project Management)。
1.2 一个成功软件的要点
- 用户体验(User Experience):软件的好用与否;
- 国际化和本地化(Globalization & Localization):对于来自不同语言、不同地区的用户对界面和功能不同需求的处理;
- 商业模式:需要由***职业道德规范***来约束IT人的行为;
结论:
- 软件 = 程序 + 软件工程
- 软件企业 = 软件 + 商业模式
1.3 软件开发的不同阶段
- 玩具阶段:写程序联系数据结构/算法,用心的语言尝试一下“Hello World”;
- 业余爱好阶段:用JavaScript、ASP.NET、Ruby写写网站;
- 探索阶段:钻研新技术,应用新技术在软件行业创新;
- 成熟的产业阶段:银行软件系统,互联网搜索行业,电子商务系统、Windows操作系统。
2 软件工程是什么
- 软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程;
- 软件工程包括下列领域:软件需求分析、软件设计、软件构建、软件测试和软件维护;
- 软件工程和下列的学科相关:计算机科学、计算机工程、管理学、数学、项目管理学、质量管理、软件人体工学、系统工程、工业设计和用户体验设计。
2.1 软件的特殊性
软件的分类:
- 系统软件:操作系统、设备驱动程序、工具软件等;
- 应用软件:用户使用它们来完成工作,从管理核电厂到写文章,或者是通信、游戏、浏览网页、播放视频等;
- 恶意软件:软件病毒等。
软件开发过程的难题:
- 复杂性(Complexity):软件可以说是人类创造的最复杂的系统类型,文件繁多、模块之间关系复杂;
- 不可见性(Invisibility):软件工程师能直接看见源代码,但源代码不是软件本身,工程师是无法看到自己的源代码是如何具体地在机器上被执行的;
- 易变性(Changeability):软件看上去很容易修改,修改软件比修改硬件容易多了。而正确地修改软件是一件很困难的事情;
- 服从性(Conformity):软件不能独立存在,它总是要运行在硬件上面,它要服从系统中其它组成部分的要求、用户的要求和行业系统的要求(例如银行利率的变化);
- 非连续性(Discontinuity):连续性系统中增加输入,就能看到相应输出的增加,而软件中则往往很难看到这种情况。
2.2 软件工程与计算机科学的关系
1)计算机科学与软件工程的不同侧重点:
计算机科学 | 软件工程 |
---|---|
发现和研究长期的、客观的真理 | 短期的实际结果(具体的软件会过时) |
理想化的 | 对各种因素的折衷 |
确定性,完美,通用性 | 对不确定性和风险的管理,足够好,具体的应用 |
各个学科独立深入研究,做出成果 | 关注和应用各个相关学科的知识,解决问题 |
理论的统一 | 百花齐放的实践方法 |
强调原创性 | 最好的、成熟的实践方法 |
形式化,追求简明的公式 | 在实践中建立起来的灵感和直觉 |
正确性 | 可靠性 |
2)“工程”与“科学”的其它区别体现:
- 哲学家的宗旨:我思,故我在
- 科学家的宗旨:我发现,故我在
- 工程师的宗旨:我构建,故我在
3)不同项目的特点:
- Build To Learn:目的是做进一步的试验,试图发现客观规律或探求某方法的优劣。这些项目经常是科研论文的基础工作;
- Build To Show:为了突出地展现某个技术的作用,开发一些以演示为目的的软件,这些项目很吸引眼球,经常获得新闻报道,但是功能未必全面或实用;
- Build To Serve:为了服务一定范围的目标用户而构建的工具等,如SDK;
- Build To Win:以在市场上赢得用户为目标而构建的软件。
2.3 软件工程的知识领域
根据IEEE在2014年发布的SWEBOK V3.0(Software Engineering Body of Knowledge),提到了软件工程中以下15个知识领域(Knowledge Area,KA):
知识领域 | 理论基础 |
---|---|
生命周期 | 软件需求、软件设计、软件构建、软件测试、软件维护 |
专门领域 | 软件配置管理、软件工程管理、软件工程过程、软件工程模型和方法、软件质量 |
理论基础 | 计算基础、数学基础、工程基础 |
2.4 软件工程的目标 – 创造“足够好”的软件
- 用户满意度:用户体验好;
- 可靠性:软件不会出现崩溃、导致死机等问题;
- 软件流程的质量:开发流程规范,团队成员互相协作高效进行;
- 可维护性:代码可读性高,有足够的、详细的文档等。
本书(《构建之法-现代软件工程》)的目标是,让读者通过理论学习和具体项目的练习,做到下面三点:
- 研发出符合用户需求的软件;
- 通过一定的软件流程,在预计的时间内发布“足够好”的软件;
- 能证明所开发的软件是可以维护和继续发展的。
3 参考
[1]邹欣. 构建之法:现代软件工程(第三版)[M]. 人民邮电出版社.