寒假作业2/2
这个作业属于哪个课程 | 2021春软件工程实践|W班(福州大学) |
---|---|
这个作业要求在哪里 | 寒假作业2/2 |
这个作业的目标 | 阅读构建之法并提问,完成词频统计个人作业 |
参考文献 | CSDN,博客园 |
Part1:阅读《构建之法》并提问
提问
1.第一章中对软件开发者提出了要开发出足够好的软件,那么对于足够好的软件的定义到底是什么,是没有bug,还是满足用户需求,还是经过足够长时间的测试,亦或是三者同时满足?
比如说,一个简单的小软件,需要足够长的时间测试吗?或者说,一个功能优越的软件但无法很好满足用户需求的软件(如响应时间慢),算是好的软件吗(12306订票网站)
2.第五章中提到团队的模式,那在团队开发中如何才能找到正确的团队模式才能调动所有团员的积极性来主动一起完成团队项目?如何妥善的分配任务给各个队员?如何减少队员的摸鱼现象?
目前遇到的大部分团队项目其实都是一两个“大佬”承担了大部分的工作量,剩下的就“摸鱼”,导致时间拖长。又有一种情况是队员之间差距较大,对于“大佬”很简单的问题对于部分队员需要过长的时间来解决,降低了团队的效率。这种情况应该怎么去解决?
3.第十六章中,提到成功的企业往往难以创新,成功的企业为什么会停下创新的脚步?
历史已经告诉我们,失去了创新的脚步就会必然被时代淘汰,如同当年如日中天的柯达胶卷,仗着老式相机庞大的市场而固步自封,殊不知无需胶卷的数码相机即将占据所有市场,最终柯达破产。而如今我国的这些大企业,固步自封者更加少,大家都是在未涉猎的新领域上前进。如文中所说,股东需要更大的利益,如今所有的市场基本都是几家公司共同占据,如果能在一个新的技术上占据大部分市场,毫无疑问,利润会更加庞大,这也是符合公司的利益。
4.第八章中提到要分清估计和目标,如何正确估计自己的能力从而不设立过高的目标?
接到项目我会先初步的分析需求,但容易把需求分析的过于浅显,因此给自己定了很高的目标,然而在后续开发中才发现自己的能力难以处理这些需求,不得不降低目标,导致之前做的一些工作全部白费,浪费了大量时间。
5.第四章中提到,结对编程相当于是两个人同时处理一份代码,但人和人的想法毕竟是不同的,会不会产生对代码想法的冲突从而降低效率?
两个人一起完成代码的时候,如果一方更新了一部分功能,还需要自己去再阅读代码再进行下一步的开发,会不会打断自己已经有的思路,从而再去思考新的解决方案,因此浪费了时间。
附加题
史上第一位程序员是名贵族小姐
话说这位贵族小姐,她来头不小。是19世纪英国著名诗人拜伦的女儿,她是一名数学家,也是世界上第一位程序员。她的名字是Ada Lovelace。
阿达一生做出的成就不少。她设计了巴贝奇分析机上解伯努利方程的一个程序,证明了计算机狂人巴贝奇的分析其可以用于许多问题的求解。后来她在1843年发表的论文里提到了一个叫循环和子程序的概念,并且她相信以后创作复杂音乐、制图和科学研究是可以通过机器来创作的,这在当时是大胆的预见,但在今天都逐渐成为了现实。
于是在1981年,为了纪念这位程序员,这种语言被正式命名为ADA(阿达)语言,艾达·洛夫雷斯也被公认为“世界上第一位软件工程师”。
https://blog.csdn.net/XVJINHUA954/article/details/110266902
Part2:WordCount编程
GitHub
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 20 |
• Estimate | • 估计这个任务需要多少时间 | 10 | 20 |
Development | 开发 | 360 | 460 |
• Analysis | • 需求分析 (包括学习新技术) | 20 | 30 |
• Design Spec | • 生成设计文档 | 10 | 10 |
• Design Review | • 设计复审 | 10 | 10 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
• Design | • 具体设计 | 20 | 30 |
• Coding | • 具体编码 | 240 | 300 |
• Code Review | • 代码复审 | 20 | 20 |
• Test | • 测试(自我测试,修改代码,提交修改) | 30 | 50 |
Reporting | 报告 | 60 | 70 |
• Test Repor | • 测试报告 | 30 | 40 |
• Size Measurement | • 计算工作量 | 10 | 10 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 20 | 20 |
合计 | 430 | 550 |
解题思路描述
程序流程:
1.读取文件,把文件每个字符拼接成一个string
2.统计文件的字符数
3.统计文件的单词数
4.统计文件的有效行数
5.排序单词
6.把统计和排序的结果输出到output.txt中
代码规范
设计与实现过程
设计WordCount为主函数入口,WordsProcess类为工具类。
通过将输入输出的文档名传入WordsProcess类的实例对象,并将需要的数值保留在类的私有对象中,在输出文件时调用。
WordsProcess类共有六个处理的方法和一个封装起来调用其他处理方法的方法deal,
六个处理方法分别为读取文件、统计字符数、统计有效行、统计单词数、单词排序和输出文件。
输入输出使用字节流
读取完文件后返回一个长字符串供其他方法使用
int ch;
BufferedReader br = new BufferedReader(new FileReader(inputName));
StringBuilder builder = new StringBuilder();
while((ch = br.read()) != -1){
if (ch < 128)builder.append((char)ch);
}
br.close();
return builder.toString();
先分割出行和字母开头的字符串,再通过正则表达式的匹配来判断是否是单词/有效行
String regex = "\\s*";
String[] content = string.split("\n");
int total = content.length;
for (String line : content) {
if (line.matches(regex))total --;
}
在分割单词后,把单词已经出现的频率放入map中,方便接下来的排序
String[] content = string.split("[^a-zA-Z0-9]");
for (String element:content) {
temp = element.toLowerCase();
if(temp.matches("[a-zA-Z]{4}[a-zA-Z0-9]*")){
map.merge(temp, 1, Integer::sum);
numberWord ++;
}
}
性能改进
- 原来每个方法都要读取一次文件,现在直接只读取一次文件组成字符串,并将字符串传入方法,减少了消耗在多次读取文件的时间。
- 原本使用LineNumberReader来读取文件判断空行,后来使用bufferreader来读取文件并判断,提高读取速率。
单元测试
以这个字符串测试四个功能
String str1 = "asuj62 4w\t\n\n哈";
读取文件
String str = "asuj62\t\n 4we哈";
String str1 = "asuj62\t\n 4we";
String result;
StringBuilder builder = new StringBuilder();
for(i = 0;i < loop;i++){
writer.write(str);
builder.append(str1);
}
writer.close();
result = wp.readFile();
Assert.assertEquals(builder.toString(),result);
统计字符数(自动略去非ascii码)
for(i = 0;i < loop;i++){
writer.write(str);
}
writer.close();
result = wp.readFile();
wp.countChar(result);
Assert.assertEquals(12*loop,wp.getNumberChar());
统计行数(自动略去空行)
for(i = 0;i < loop;i++)writer.write(str);
writer.close();
result = wp.readFile();
wp.countLine(result);
Assert.assertEquals(loop,wp.getNumberLine());
统计单词数
for(i = 0;i < loop;i++){
writer.write(str);
}
writer.close();
result = wp.readFile();
wp.countWord(result);
Assert.assertEquals(loop,wp.getNumberWord());
执行结果
用这段文本来测试排序功能
aaaa bbbb
ccc哈
ddd
aaaa1
aabb1
aaaa1
结果如下
characters: 35
words: 5
lines: 6
aaaa1: 2
aaaa: 1
aabb1: 1
bbbb: 1
展示多次结果
String str1 = "asuj62 4w\t\n\n";
字符串循环10万次花费的时间:379ms
字符串循环100万次花费的时间:3097ms
覆盖率
异常处理
在WordsProcess类遇到IO异常时会直接抛出,由主函数catch后输出File Error!
当运行时没有两个参数会输出there are not 2 parameters
心路历程
1.本次作业让我了解了白盒测试,也学会了如何在git上提交代码。现在发现原来有这么方便的测试方式,比起以前的测试如果出现问题需要反复的debug才能找出问题所在,现在可以精确到方法了。
2.学会了正则表达式的使用,正则表达式在许多方面确实有很好的用处,这次的判断空行和单词比之前的string对比不仅减少耗时,而且代码也更为简洁。