《构建之法》 第一章学习笔记
一、从程序到软件
程序是每个学计算机的人都必须要编写的,但是编的出程序却不一定写的出软件,或者说虽然写的出软件但是这个软件很难让使用者满意,很难持久的维护应用下去。书中通过阿超的案例让我们看到了客户们对程序员的需求从一个简单的程序,是怎样扩展到一个满足各种功能的应用软件,再扩展到一个能保证维修的软件服务。
程序=数据结构+算法
- 程序,在这里指的是源程序,就是一行行的代码。仔细看过去,它们的确是建立在数据结构上的一些算法
- 程序还要对数据进行操作,这些数据有些是静态的(例如软件的图标、提示信息),有些是动态的(例如程序生成的随机数字、程序通过网络下载的数据、用户的文字或语音输入等)
软件=程序+软件工程
- 一个复杂的软件不但要有合理的软件架构(Software Architecture)、软件设计与实现(Software Design, Implementation and Debug),还要有各种文件和数据来描述各个程序文件之间的依赖关系、编译参数、链接参数,等等。这些都是软件构建的过程
- 有一系列的工具和程序来保证程序的正确性,这些工具流程和程序本身应该更正确,才能保证别的软件的质量。这就是质量保障(Quality Assurance),具体的验证过程叫做软件测试(Testing)
- 软件团队要从需求分析(Re-quirement Analysis)开始,把合适的需求梳理出来,然后逐步展开后续工作,如设计(软件架构)、实现(写数据结构和算法)、测试,到最后发布软件
- 软件在运行过程中还会出这样那样的问题,也许我们要时不时给软件打一个补丁,或者维护众多的服务器,团队的新老成员要一起工作,修复各种各样的问题,这叫软件维护(Software Maintenance),或者服务运营(Service Operation)
- 这一系列过程就是软件的生命周期(Software Life Cycle,SLC),有人得负责软件项目的管理(Project Management)
- 一个好的软件,即使功能和同类软件区别不大,但是会让人感觉到非常好用。这就是软件的用户体验(User Experience)。用户体验和数据结构、算法没有直接的关系,但是很多非常成功的软件就赢在这个方面
这就是由程序到软件的核心部分。
二、软件开发的不同阶段
目前我们应当处于第二阶段,正在向第三阶段努力着。
三、什么是软件工程?
软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程;人们在开发、运营、维护软件的过程中有很多技术、做法、习惯和思想体系。软件工程把这些相关的技术和过程统一到一个体系中,叫“软件开发流程”。软件开发流程的目的是为了提高软件开发、运营、维护的效率,并提高软件的质量、用户满意度、可靠性和软件的可维护性。
3.1 软件的特殊性
软件是可以运行在计算机及电子设备中的指令和数据的有序集合,软件有各种形式:
- 系统软件:操作系统、设备驱动程序、工具软件等
- 应用软件:用户使用它们来完成工作,从管理核电厂到写文章,或者是通信、游戏、浏览网页、播放视频等
- 恶意软件:软件病毒等软件
软件开发过程中的五点难题:
-
复杂性(Complexity)
软件可以说是人类创造的最复杂的系统类型,软件的各个模块之间有各种显性或隐性的依赖关系,随着系统的成长和模块的增多,这些关系的数量往往以几何级数的速度增长 -
不可见性(Invisibility)
工程师是“看”不到自己的源代码如何具体地在用户的机器上被执行的 -
易变性(Changeability)
人们自然地期待软件能在下面两种情况下“改变”: a) 让软件做新的事情;b) 让软件适应新的硬件 -
服从性(Conformity)
软件不能独立存在,它总是要运行在硬件上面,它要服从系统中其他组成部分的要求,它还要服从用户的要求、行业系统的要求 -
非连续性(Discontinuity)
输入上很小的变化,会引起输出上极大的变化
3.2 软件工程与计算机科学的关系
计算机科学 | 软件工程 |
---|---|
发现和研究长期的、客观的真理 | 短期的实际效果(具体的软件会过时) |
理想化 | 对各种因素的折衷 |
确定性、完美、通用性 | 对不确定性和风险的管理,足够好,具体的应用 |
各个学科独立深入研究,做出成果 | 关注和应用各个相关学科的知识,解决问题 |
理论的统一 | 百花齐放的实践方法 |
正确性 | 可靠性 |
3.3 软件工程的目标——创造“足够好”的软件
软件的Bug多少可以直接衡量一个软件的开发效率、用户满意度、可靠性和可维护性。最重要的是做到以下三点:
-
1.研发出符合用户需求的软件;
-
2.通过一定的软件流程,在预计时间内发布“足够好”的软件;
-
3.能证明所开发的软件是可以维护和继续发展的;
能做到这三点,就是初步的学会了软件工程,所以这也将是我初期努力的方向。