现代软件工程 第二章 【个人技术】 练习与讨论
1 基本作业: 从Hello World开始
要求每个读者(或者学生)开始管理自己的源代码:
- 每个人都有一个VSTS的客户端,系统管理员给每一个人都创建了TFS项目,每个学员都是各自项目的管理员。
- 每个同学去申请一个GitHub [i]的项目,或者 www.coding.net 项目,存放源程序和其他文档。
下面的练习可以用来锻炼学生的编程基本功。
(1)全部用命令行工具和notepad编辑器,不用Visual Studio 等集成编辑环境,每人手工创建并编译一个C的命令行程序:“Hello World”。
(2)练习数值计算。找出一个整数数组中子数组之和的最大值,例如:数组[1, -2, 3, 5, -1],返回8(因为符合要求的子数组是 [3, 5]);数组[1, -2, 3, -8, 5, 1],返回6(因为符合要求的子数组是 [5, 1]); 数组[1, -2, 3,-2, 5, 1],返回7(因为符合要求的子数组是 [3, -2, 5, 1])。
(3)写一个命令行程序, 找出一本英文长篇小说中最常出现的字母数大于 4 的单词的前十名, 和最常出现的两个相邻单词的短语前十名。 并用效能分析工具来分析程序中最费时的函数是什么, 如何改进? 请看《构建之法》 中效能分析部分。
(4)使用工具Visual Studio,创建一个C++或C# Windows程序,在主窗口中显示“Hello World”,用户可以用鼠标拖动“Hello World”在主窗口中移动。
(5)很多同学自己会写不少程序,但是往往看不懂别人写的程序,这也需要练习。不借助电脑的帮助,回答下面的问题(如代码清单2-8所示)。
问题1:这个程序要找的是符合什么条件的数?
问题2:这样的数存在么?符合这一条件的最小的数是什么?
问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间精确到分钟(电脑:单核CPU 4.0G Hz,内存和硬盘等资源充足)。
问题4:在多核电脑上如何提高这一程序的运行效率?
2 软件工程和程序设计大作业的调查
请同学们做一个调查,到相关的软件学院或计算机学院采访学长或学弟学妹,调查一下程序设计大作业的完成情况:程序花多少时间完成?程序量是多少(多少行代码)?开发过程中使用了源代码管理等工具么? 完全独立完成的同学有多少个?程序解决实际问题么?在一些学校里,全班50 个同学,交上来的作业只有 4 到 5 种版本。这说明了什么?
3 效能分析的讨论
果冻:噫吁唏,危乎高哉!我以前一直害怕做效能分析,看来是否会用效能分析工具来提高程序质量是一个优秀程序员的标志之一。我在今天之前都是盲人骑瞎马。
小飞:改成盲人摸象更恰当。我听说,如果一个程序员从来没有用过效能分析工具,那他就不是一个程序员,只是一个编程爱好者罢了。
我的WC 程序事实上是最快的。但是在今天的程序评比之前,我想更进一步,就再优化了一下,估计能把速度提高2%。没想到出了一个小错误,导致报告的结果(行数、词数、字数)仅仅差了1。由于程序不正确,因此不能参加速度评比。我才是最需要大喊“噫吁唏”的人。
阿超:这有两个教训:
(1)先保证正确性,再提高效能。一个“仅仅差了1”的错误可能会导致缓冲区溢出(Buffer Overflow[i])的严重漏洞。
(2)如果效能的提高效果在5%以下,用户不会注意到程序效能的区别。所以要考虑那些微小的提高是否值得。
另外,WordFreq算法的时间复杂度是多少?能否再优化?请写实际程序加以验证。
荔荔:怎么才能快捷地得到有适量重复文字的文件,来帮助我们进行测试和效能分析?
小飞:我是这样做的,在电脑的根目录下,运行“dir /s > c:\temp\test.txt”命令。
阿超:好主意,大家还有没有别的办法?