由于这周是端午节,我们放假了,就没有上课。
这周的阅读内容:
第1章 概论
理论和知识点
计算机科学的领域
软件的特性
软件工程
软件工程与 计算机科学的关系
练习与讨论
练习不断通过简单的程序来实现一系列要求和改进
从切身体会出发,讨论软件的特性,软件和 软件工程对社会的影响
结合所在的学校的特点和自身经历,讨论 软件工程与 计算机科学的区别
1.1 软件 = 程序 + 软件工程(1)
几乎所有的程序员都知道“程序= 数据结构+算法”1 这句名言,但是在实际的学习和工作中,也有不少人产生了疑问。例如:
1. 我写了 二叉树的遍历算法实现,在这里, 二叉树是 数据结构,遍历的实现细节是算法。 C 程序就是结果。但是这个程序有什么实际用处呢?在Java 和其他一些语言中,似乎没有指针,那我可以不必了解 二叉树么?
2. 我成了一名职业程序员,但是我发现所有的算法别人都已经实现了,我只要调用就可以。似乎我们公司的软件与 数据结构、算法的关系都不大。那我当初辛辛苦苦学习的 数据结构和算法有用么?如何区分一个好的程序员和不好的程序员呢?
3. 我上班后,发现以前同事写的程序真是垃圾,根本看不懂,无法维护。我要推翻 重写!后来一个老员工笑嘻嘻地告诉我,我们现在看到的程序,就是去年的新员工愤怒地推翻 重写之后的结果,大家反映还没有以前的版本好用呢。
那么软件行业赖以生存的“软件”,程序员用来安身立命的“程序”是什么?举一个生活中的例子。移山公司程序员阿超的宝贝儿子上了小学二年级,老师让家长每天出30 道加减法题目给小学生做。阿超想写一个小程序来做这件事。这可以用很多语言或者工具来实现:
- Excel、C/ C++、 C#、VB、 Unix Shell、Emacs、Powershell/VBScript、 JavaScript、Perl、 Python……
请大家估计写好这个程序需要的时间。
我想,程序员用自己最擅长的工具,一袋烟的工夫就搞定了。
阿超一下打印出好多份不同的题目,让孩子做了。老师看了作业之后,对阿超赞许有加。别的老师闻讯也想要类似的程序,让二年级到四年级都能用,并附带提出一些小小的要求,例如:
题目避免重复
可定制数量和打印方式
可以控制下列参数
是否有乘除法
是否有括号
数值范围
加减有无负数
除法有无余数
是否支持分数(真分数、假分数 ……)
是否支持小数(精确到多少位)
打印中每行的间隔
阿超的儿子兴高采烈地回家来给老爸汇报,并说“老师明天就想要!”阿超有些挠头,原来就是随手写了个程序,现在怎么来了一些用户,还带来了不少 需求?
现在大家估计做好这个软件需要多长时间。
阿超熬夜做出了这个软件的一个初始版本,交给了老师。过了几天老师说,教导主任看了很满意,提议把这个程序放到学校的网站上,再多一点点要求,支持二元一次方程,能开根号,并且让老师和家长可以通过网站定制各种类型的四则运算作业, 还可以生成期中、期末考试的试卷。当然,希望网站永远是可以用的,至少早上五点到晚上十二点要能访问。
阿超叹了一口气— 这是多复杂的一个工程啊,如果有一天晚上网站打不开了,我是不是还要修理服务器?
这里我们看到客户们对阿超的 需求从一个简单的程序,扩展到一个满足各种功能的应用软件,再扩展到一个能保证维修的 软件服务!现在请大家估计做好这个 软件服务需要多长时间。
上面的例子展现了 软件工程的一些概念:
程序,在这里指的是 源程序,就是一行行的代码。仔细看过去,它们的确是建立在 数据结构上的一些算法。程序还要对数据进行操作,这些数据有些是静态的(例如软件的图标、提示信息),有些是动态的(例如程序生成的随机数字、程序通过网络下载的数据、用户的文字或语音输入等)。但是光有代码和静态数据还是不行,要把它们编译成机器能懂的可执行代码,而编译不仅仅是cc 和link 命令,一个复杂的软件不但要有合理的 软件架构(Software Architecture)、 软件设计与实现(Software Design, Implementation and Debug),还要有各种文件和数据来描述各个程序文件之间的 依赖关系、 编译参数、 链接参数,等等。这些都是 软件构建的过程。
软件 团队的成员每天都在修改各种源代码,怎么保证软件在修改过程中能不断提高质量,至少要维持以前的质量,不至于崩溃?有些时候,我们要为某个 需求写一些特殊功能,不久后又要把这些功能再合并回主要版本。有些程序要配置不同的界面,运行在中文、英文或其他语言的 操作系统上;有些程序还有32 位版本、64 位版本等。这是 源代码管理(Source Code Control)的问题— 有时候也叫 配置管理(Software Configuration Management)。我们还有一系列的工具和程序来保证程序的正确性,这些工具流程和程序本身应该更正确,才能保证别的软件的质量。这就是 质量保障(Quality Assurance),具体的验证过程叫做软件测试(Testing)。
一个软件或者服务要有人买,就得找到顾客,顾客有各种 需求,有些靠谱,有些不靠谱;有些容易做到,有些难以做到。软件 团队要从 需求分析(RequirementAnalysis)开始,把合适的 需求梳理出来,然后逐步展开后续工作,如设计( 软件架构)、实现(写 数据结构和算法)、测试,到最后发布软件。
软件 团队的人员也会流动,新的成员要尽快读懂已有的程序,了解程序的设计,这叫 程序理解(Program Comprehension)。软件在运行过程中还会出这样那样的问题,也许我们要时不时给软件打一个补丁,或者维护众多的服务器,团队的新老成员要一起工作, 修复各种各样的问题,这叫 软件维护(SoftwareMaintenance),或者 服务运营(Service Operation)。这一系列过程就是 软件的生命周期(Software Life Cycle,SLC),有人得负责软件项目的管理(ProjectManagement)。
一个好的软件,即使功能和同类软件区别不大,但是会让人感觉到非常好用。这就是软件的 用户体验(User Experience)特别好。 用户体验和 数据结构、算法没有直接的关系,但是很多非常成功的软件就赢在这个方面。
一个软件 团队或企业总要养活自己,市面上有很多种赚钱的方式:
有的交钱买断
有的“先试用再交钱”,有些软件也提供试用版、免费版和正式版
有的不但免费,连源代码都奉送,但是要求获得源代码的开发人员遵守某种协定
有的送硬件,但是软件要收钱
有的送软件,但是硬件要收钱
也有“免费用,但是要看我提供的广告”
还有“免费用,程序也不是我写的,如果有问题,给我钱,我就来提供咨询……”