软工实践寒假作业(2/2)
这个作业属于哪个课程 | 2021春软件工程实践|S班 (福州大学) |
---|---|
这个作业要求在哪里 | 软工实践寒假作业(2/2) |
这个作业的目标 | 学到新知识,掌握新技能,培养新经验 |
作业正文 | https://www.cnblogs.com/weirdo123/p/14425747.html |
其他参考文献 | 《构建之法》、《码出高效_阿里巴巴Java开发手册》 |
阅读《构建之法》并提问
问题一:
p9(第一章)中提到“软件工程师是看不到自己的源代码是如何在用户的机器上被执行的。商用软件出现了错误,工程师可以看到程序在出错的一瞬间留下的一些痕迹,但是几乎无法完整重现程序到底出现了什么问题。”,我有所疑问,在难以看出是什么错误的基础上,如果这个bug还难以复现,那么工程师该如何处理这个bug呢?根据我之前反馈bug时向一些工程师了解知道:根据bug的优先级,在上线之前对该bug进行处理,特别严重的bug,要召集项目组的成员,进行讨论分析并尽可能的复现bug。但是这仅仅只是如何找出bug,那么该如何有效的修复这些“不可见性”的bug呢?
问题二:
p27(第二章)写道:单元测试应该覆盖所有代码路径。所以我认为单元测试的代码覆盖率要尽可能的高,越高越好,这样就不可避免的要有很多单元测试要去完成。那么问题就来了,如果开发软件,是把这么多测试全做完,还是挑一些重要的测试来进行呢?如果只挑一些测试进行,又怕软件会存在未知的缺陷,如果全部测试都做的话那需要庞大的人力物力。我个人是觉得把全部测试都做完比较好,但是有没有其他方法既不用做所有的测试,又能防止缺陷?
问题三:
p47(第三章)中提到开发人员在团队中的流程,其中第六步即最后一步:“在解决方案发布出去之后,对结果负责。”,关于这个问题,我想提问:这个对结果负责是只对不好的结果负责吗?如何负责?负全责吗?这个问题目前在网上并没有明确的解答,对此我全然不知,想了解一下,希望老师们解惑。
问题四:
p58(第三章)中提到工程师有职业成长级别,对此我上网查找资料得知:软件工程师是一个认证考试,具体地说是从事软件职业的人员的一种职业能力的认证,通过它说明具备了工程师的资格。只有这一门认证考试,而且以后的职称级别评定是根据工作经验,个人能力以及工作结果来评的。关于这个行业我感到十分奇怪,难道没有任何数据资料或者书面材料来证明软件工程师的级别吗?还是比如说这个高级职称只在一个公司内有用,换了公司别人也只能从你简历中了解到你以前工作大概是什么情况,但是真实性有待考究,因为没有任何证明?
问题五:
p79(第四章)中说代码复审的正确定义是看代码是否在代码规范的框架内正确地解决了问题。查阅资料后我发现网上对于这个代码复审并没有一个很明确的定义。因此疑问:如果此时有人提出了一个新功能,那么这个新功能是否算在代码复审的过程中?我个人的第一判断是:算在代码复审的过程中。但是新功能无关代码规范,也不是为了正确解决问题,只是为了增加新功能,这与代码复审的定义矛盾。所以是我的判断错了还是定义不够准确?由于我个人理解能力有限,希望得到老师的解答。
问题六:
p122(第六章)敏捷流程的第四步提到了增量的软件发布,这引起了我对于生活中软件发布的联想:如果在实际的软件更新或者发布公告已经出来,但是由于各种可能的原因导致软件在截止日期没办法发布,如果DDL发布可能只是半成品,那么软件公司有两种选择:发公告说明情况并延后发布;按时发布但告诉用户缺少一些预告的功能,只能在下下个版本一起实现。如此诚信和口碑该如何选择?我个人倾向于按时发布,但是这两种选择貌似都没有什么优点,都是弊端,那么请问老师该如何选择?又或者既然两种方法都吃力不讨好,干脆选择其他途径来减少用户的不满?
问题七:
p160(第八章)只列举了一些利益相关者,并指出软件开发不可能一次满足所有利益相关者的要求,我的理解是对于利益相关者的需求是有优先级的,如果是那么是根据需求来确定优先级还是根据利益相关者来确定优先级?
问题八:
p196(第九章)有人问:如果PM也来开发,那么项目进展不是更快?答:如果这个这个舵手也开始划船,可能小船的速度会快一点,但是小船的方向、稳定性会出现问题。我的个人理解是:PM也兼做开发,那么会有利于项目进展,就好比舵手一边指挥一边划船。查阅资料也了解到不少PM也是兼做架构师、开发等等。不知道老师觉得这样是利是弊,亦或是有利有弊?
问题九:
p259(第十二章)提出了两点考虑:关于目标用户的考虑和用户第一次使用软件的考虑。由此我想到,比如一个用户正在使用我们的软件,旁边有人正在观察他使用软件,那么这个软件的各个界面,动画等等都有可能吸引这个旁观者成为我们的用户,虽然我们这个软件主要不是为他们设计的,那么这上面提到的可能的种种因素属于影响用户体验的因素吗?如果属于,我们需要将其放于什么位置,极其不重要的位置吗?(因为软件的主要群体不是他们,他们也还没有成为我们的用户,但是他们可能会因此成为我们的用户甚至还能吸引其他人成为我们的用户,毕竟没有人会嫌自己的用户多),该问题我无法获知实际结果,希望能得到老师的解答。
问题十:
p343(第十五章)讲述了如何开一个Postmortem会议(事后诸葛亮会议),这个会议显然对于参与者、已经发布的代码及以后做的项目都有好处,那么为什么不在代码没有发布之前开展这个会议,假想代码已经发布了,然后在代码发布之前解决一些问题,这样难道不是更好吗,关于一些发布后可能会出现的一些问题,我们可以先寻找一部分用户进行测试并加以解决,这难道不是两全其美吗?望解惑。
WordCount编程
Github项目地址
Github链接:https://github.com/Weirdo341
Github项目链接:https://github.com/Weirdo341/PersonalProject-Java
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 50 | 60 |
• Estimate | • 估计这个任务需要多少时间 | 50 | 60 |
Development | 开发 | 1220 | 1190 |
• Analysis | • 需求分析 (包括学习新技术) | 90 | 120 |
• Design Spec | • 生成设计文档 | 120 | 90 |
• Design Review | • 设计复审 | 30 | 30 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 20 | 10 |
• Design | • 具体设计 | 240 | 180 |
• Coding | • 具体编码 | 420 | 500 |
• Code Review | • 代码复审 | 60 | 60 |
• Test | • 测试(自我测试,修改代码,提交修改) | 240 | 200 |
Reporting | 报告 | 120 | 90 |
• Test Repor | • 测试报告 | 60 | 60 |
• Size Measurement | • 计算工作量 | 30 | 10 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 30 | 20 |
合计 | 1390 | 1340 |
解题思路描述
大致知道了题目的几个要求,首先是先要实现几个功能,一个功能是文件读写,然后分别是统计字符数,统计单词总数,统计有效行数,统计最多的10个单词及其词频。对于这个题目来说读取字符数和行数是基本操作,题目的难点在于按照给定规则进行单词计算,以及在单词数量大时如何保证良好的性能。
根据这几个功能部分所涉及的java知识,可以结合课本内容进行编写,至于重难点问题和空间复杂度的优化,也可上网搜索以及与同学讨论。
代码规范制定链接
代码规范:https://github.com/Weirdo341/PersonalProject-Java/blob/main/221801330/codestyle.md
设计与实现过程
程序主要分为两个类,WordCount类负责文件输入输出流,Lib类为对文件数据的处理。 下面是一些模块的代码:
单词数的统计
static int WordSum(String s) {
int wordSum = 0;
String word = "";
for (int i = 0; i < s.length(); i++) {
if (Character.isDigit(s.charAt(i)) || Character.isUpperCase(s.charAt(i))
|| Character.isLowerCase(s.charAt(i))) {
word += s.charAt(i);
}
else {
if (WordJudge(word)) {
wordSum++;
}
word = "";
}
}
if (WordJudge(word)) {
wordSum++;
}
return wordSum;
}
字符数的统计
static int CharSum(File f) {
int charSum = 0;
try {
byte[] bytes = new byte[1024];
int num;
FileInputStream input = new FileInputStream(f);
while ((num = input.read(bytes, 0, bytes.length)) != - 1) {
charSum += num;
}
lib.SetCharSum(charSum);
input.close();
}
catch (FileNotFoundException e) {
System.err.println("发生异常" + e);
e.printStackTrace();
}
catch (IOException e) {
System.err.println("发生异常" + e);
e.printStackTrace();
}
finally {
return charSum;
}
}
单词判断
static boolean WordJudge(String s) {
if (s.length() < 4) {
return false;
}
else if (! Character.isDigit(s.charAt(0))) {
return false;
}
else {
return true;
}
}
参照课本的带缓存的读取器
try {
BufferedReader br = new BufferedReader(new FileReader(f1));
String s = "";
for (s = br.readLine();s != null;s = br.readLine()) {
lib.SetWordSum(WordSum(s));
lib.SetLineSum();
lib.SetWordFrequency(GetWordFrequency(s));
}
br.close();
return;
}
catch (FileNotFoundException e) {
System.err.println("发生异常" + e);
e.printStackTrace();
}
catch (IOException e) {
System.err.println("发生异常" + e);
e.printStackTrace();
}
心路历程与收获
通过这两次作业,我正视到了自己拖延的坏毛病,不仅要学习新知识,还要重拾旧知识,后面一周还要上课及做作业,因此搞的时间安排优点紧张。再说说这次作业,让我重新复习了java的课本相关知识,代码中不少地方也有用到,但是由于过久没有接触java了,写出一个完整的程序还是有点困难,在参考了网上他人的方法后,也能适当写出相应功能了。在写代码过程中虽屡屡碰壁,但是在和同学的讨论中及查找书籍和资料的过程中还是解决了一部分问题,由此可见互帮互助的重要性。这次作业让我收获良多,也认识到了自己的不足,后面会更加努力,更好地完成作业、完善自己。