首先,文章对于程序、用户需求、工程等等概念用了阿超给儿子编写的一个出题程序来分别解释了个中的含义,尤其是程序和工程的区别,程序大概就是用很多语言或工具编写的一个简单能实现目标要求的一行行代码,而工程就是在这个程序的基础上不断满足用户的需求、修复程序的bug、提供后续维护等服务。
需求分析:梳理需求,逐步展开后续工作,如设计(软件架构)、实现(写数据结构和算法),测试,发布软件
软件=程序+软件工程(软件企业=软件+商业模式)
软将工程的核心部分:构建管理、源代码管理、软件设计、软件测试、项目管理(广义上还有用户体验、用户界面设计等
然后对于软件开发的不同阶段有一个详细而有趣的举例
1.玩具阶段
通过“设计/制造纸飞机”的例子说明所有的事物都或多或少都体现了某些基本理论
2.业余爱好阶段
讲述了梦想和爱好对于人类社会能有多大的贡献(爱好者的尝试:气球+沙滩椅升空)
3.探索阶段
持续探索实践对于实现梦想的重要性,以及先行者伟大的钻研精神(莱特兄弟飞行)
4.成熟的产业阶段
在先人的基础上不断完善,成为一个产业(飞机制造业)
接着阐述了软件工程的定义
其中比较令人深思的部分就是软件开发过程中的五点难题
1.复杂性(Complexity)
“软件的各个模块之间有各种显性或隐性的依赖关系,随着系统的成长和模块的增多,这些关系的数量往往以几何级数的速度增长,而理解运用这些复杂性的人并没有太大的变化“,这样意味着虽然现在的软件看起来功能越来越强大,使用也非常便捷,但实际上这种强大是建立在更多的人手和更长的开发时间上的,所以如何解决人力问题是今后快速开发大型复杂问题的重中之重。
2.不可见性(Invisibility)
“软件以机器码的形式高速运行,还可能在几个CPU核上同时运行,工程师是‘看‘’不到自己的源代码如何具体地在用户的机器上被执行的”,就是程序总会以自己无法预知的方式执行,当程序出错时,几乎无法完整重现程序到底出了什么问题,这对于bug的修复实在是有点无力。
3.易变性(Changeability)
“正确地修改软件是一件很困难的事情”,这点在我们亲自编程的过程中已经有了深刻地了解。。。
4.服从性(Conformity)
“软件不能独立存在,它总要运行在硬件上面,它要服从系统中其他组成部分的要求,它还要服从用户的要求、行业系统的要求”,意味着如果想要广为发布一个程序,除了程序本身的正确性,还要考虑很多外在因素才能保证程序的良好运行。
5.非连续性(Discontinuity)
“有时输入上很小的变化,会引起输出上极大的变化”,这需要从设计上着手考虑如何让用户更好地熟悉一个程序的操作,不能让用户对自己操作的结果摸不着头脑。
构建之法读后感----第1章 绪论