软工实践寒假作业(2/2)
这个作业属于哪个课程 | 2021春软件工程实践|W班 (福州大学) |
---|---|
这个作业要求在哪里 | 软工实践寒假作业(2/2) |
这个作业的目标 | 学习PSP,阅读《构建之法》 完成WordCount编程 |
其他参考文献 | CSDN、博客园、简书、 .gitignore配置语法、关于单元测试和回归测试 |
阅读《构建之法》
问题一:如果能力差距大,结对编程效率会高吗?
书中提到的结对编程过程中,双方需要互相磨合和学习,即采用“驾驶/领航”模式。考虑到想要使得结对编程的效率需要投入一定的时间成本。若二人所长不同,编程能力不同,单纯采取交替执行“驾驶/领航”的工作方式是否影响效率。
问题二:如何记录PSP?
第二章中提到,PSP依赖于数据。但是数据需要自己记录和考察,因此不准确性因素有很多。以本次实践来说,在准备工作期间无法预估到底需要多少时间。在执行的过程中,对于时间的计算也没有特别注意,而且特地关注时间反而降低了工作效率。那么关于PSP的记录到底如何进行操作。
问题三:如何平衡“同理心”与不同客户需求
书中提到“我们都用过各种电视/DVD播放器的遥控器,功能很强,按钮很多吧?你有没有注意到老人家使用遥控器时的困难?我们常说做产品要从用户的角度考虑问题,这需要有“同理心”。”,但由于一个项目的受众很多,有很多不同的需求。以我个人对微信的使用感受来说,对于经常推送的广告不胜其烦,甚至想要取消该弹窗,但我的家人,特别的年长的人却“沉溺其中”。由此看来,虽需“同理心”
但用户的感受不一,最后的设计到底该如何决定。
问题四:关于工程师的能力评估
书中提到了通过数据的形式评估衡量工程师的能力,但我认为编程思路、学习能力、合作能力等能力确实无法用数据进行评估的,虽然数据可以足够客观,但单纯的采用数据的形式是否太过片面,或者说如何界定衡量的标准与尺度?考虑到一些无法考量的实力,怎么设计公平的标准呢?
问题五:关于BUG的问题
第一章提到“软件的行为和用户的期望值不一样,就叫BUG。是否是BUG,取决于用户、开发者的不同角度。”,在我寒假玩的一款游戏中,地图常出现BUG,但这些BUG常常大幅度提高了我玩游戏的效率与体验,但突然有一天BUG被逐一修复,玩家们也都怨声载道。那么面临已经出现的BUG,用户的评价褒贬不一,程序员到底是修复还是不修复呢?
冷知识
在程序中bug一词用于技术错误。这一术语最初由爱迪生在1878年提出的,但当时并没有流行起来。在这的几年之后,美国上将Grace Hopper在她的日志本中,写下了她在Mark II电脑上发现的一项bug。不过实际上,她说的真的是“虫子”问题,因为一只蛾子被困在电脑的继电器中,导致电脑的操作无法正常运行。如图片所见,她写道“这是我在电脑上发现的第一个bug”。
WordCount编程
Github项目地址:点击这里
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 60 |
• Estimate | • 估计这个任务需要多少时间 | 60 | 300 |
Development | 开发 | 660 | 775 |
• Analysis | • 需求分析 (包括学习新技术) | 120 | 120 |
• Design Spec | • 生成设计文档 | 60 | 30 |
• Design Review | • 设计复审 | 30 | 45 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 30 | 60 |
• Design | • 具体设计 | 60 | 60 |
• Coding | • 具体编码 | 180 | 240 |
• Code Review | • 代码复审 | 60 | 120 |
• Test | • 测试(自我测试,修改代码,提交修改) | 120 | 100 |
Reporting | 报告 | 150 | 105 |
• Test Report | • 测试报告 | 60 | 40 |
• Size Measurement | • 计算工作量 | 30 | 5 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 60 | 60 |
合计 | 870 | 940 |
解题思路
利用BufferedReader,从字符输入流中读取文本,然后对文件进行处理,先统一将所有的字母都转换为小写再进行统计。
利用split切割单词,再利用for循环找出以字母开头的单词,作为key放入map。
统计单词的词频利用map,把单词当做key的时候先进行存放,最后输出top10的时候在进行判断。
统计总的字符数,直接调用BufferedReader中的readline()方法,对每一行的字符数进行累加,最后加上行数就是文本中总的字符数。
代码规范制定 :点击这里
设计与实现过程
1.处理文本大小写
do {
if(i!=-1) {
tempStream.write(i);
}
i = myBufferedReader.read();
if(i >= 65 && i <= 90) {
i += 32;
}
}
while(i != -1);
2. 进行单词的处理
public static int CountWordNum(String line, List<String> lists) {
int wordcount = 0;
String[] wordsArr1 = line.split("[^a-zA-Z0-9]"); //切割筛选单词
for (String newword : wordsArr1) {
if(newword.length() != 0) {
if((newword.length() >= 4) && (Character.isLetter(newword.charAt(0))
&& Character.isLetter(newword.charAt(1)) && Character.isLetter(newword.charAt(2))
&& Character.isLetter(newword.charAt(3)))) {
wordcount++;
lists.add(newword);
}
}
}
return wordcount;
}
3.词频统计并存入输出文本
for (String li : lists) { //单词出现个数统计
if(wordsCount.get(li) != null) {
wordsCount.put(li,wordsCount.get(li) + 1);
}
else {
wordsCount.put(li,1);
}
}
Print p = new Print(args[1]);
p.SortMap(wordsCount,wordline,wordcount,characterscount+wordline); //排序并输出
单元测试
public void testCharacter() {
int result = Lib.CountEachLineCharacter(s);
assertTrue(result == length);
}
public void testWordNum() {
int result = Lib.CountWordNum(s,list);
assertTrue(result == num);
}
异常处理说明
1.命令行参数错误
catch(ArrayIndexOutOfBoundsException ee) {
System.out.println("Error");
}
2.输入文件不存在
catch(FileSystemAlreadyExistsException f) {
System.out.println("Not find this file");
}
3.其他错误
catch(Exception e) {
System.out.println(e);
}
心路历程与收获
1.复习了java相关知识
2.学会了git和GitHub的应用
3.学会了单元测试相关知识
4.学会了编写异常处理代码
5.对PSP应用有部分了解