软工实践寒假作业(2/2)
相关问题 | 具体内容 |
---|---|
这个作业属于哪个课程 | <2021春软件工程实践S班> |
这个作业要求在哪里 | <软工实践寒假作业> |
这个作业的目标 | <学习了解git,学会简单测试操作,对软件工程有更好的了解> |
其他参考文献 | <Java正则表达式> <廖老师的git教程> <github fork 与pull request> |
任务一
问题一
在软件工程概论中有提到职业道德,举了一个是否可以写一个“刷课机”的程序帮助某些用户选择自己想要的课程。其实这种类型的程序在市面上有很多,比如离我们比较近的抢票软件,会根据用户的会员程度依次提高抢票成功几率,帮助某些用户抢到心仪的车票,几乎每一个抢票软件都会有这样的功能,那么这个程序合法吗?符合道德规范吗?或许每个人有不一样的见解,我对于此问题在知乎上搜到了如下解答:“在我看来并不算是违法的,换个思路看问题,如果我把抢票看成是是一个服务,然后替换,在看这个句子就会变成有些人花更多的钱享受服务,这对那些没钱的人来说是违法的吗 不能这么理解 ”,在这个博主看来,这个软件唯一的问题就是因为经济的不平衡导致售票的明显偏向。另外,我也了解到,中国铁路目前对于第三方抢票软件态度并不友好,12306正在一步步完善自身功能同时一步步封锁第三方软件。那么这些第三方抢票软件在市面上的使用是否能说明这种独占程序符合道德标准?事实上道德标准也是一个不稳定的标准,来自于每一个人的主观。那么怎么才能判断软件的可开发性是否符合当前道德?是多数服从少数下的标准吗?
问题二
在两人合作中,笔者觉得可以以影响和反馈的方式来影响同伴,似乎是在平等方式下的合作。那么我觉得,既然是合作,总归是两个不同思想的碰撞,是不是没有绝对平等。先说影响,在各种方式下,本质上来讲就是思想引导,一方用或软或硬的方式将对方的思维引导至自己想要达到的位置,此时合作似乎就不太平等;其次反馈,越深层次的反馈越偏激,合作就逐渐变成一人主导,那么何谈平等?另外,虽说是1:1,但还是要有一个人可以掌握决定权,要不然两人自说自话,互不谦让,何谈友好合作,也不会有行之有效的方案实现。
问题三
第九章项目经理有一个微软的故事,讲述了不被用户要求但被开发出来的打印预览功能。那么,如果有一个正在进行的项目,PM已经归纳了用户需求,工程师发现在编程过程中某个未被要求功能未来可能会被需要,那么应该把这个功能做出来吗?PM的需求分析在后期执行过程中可以被编程者改变吗?
问题四
在讲义8稳定阶段中,有一个九条创建的bug,其中问题并不完整,似乎只是一个偶发性事件,下面又给了一个完整且可以有效解决问题的方案。虽然这样是会节省时间,但是这是专业测试人员可以做到的完整描述。bug不可能完全消失,所以如果后期软件上市后会有类似的小bug,用户的反馈极有可能是像九条一样,简单明了,或许再次打开不会有同样的bug,但那个bug确实存在,此时收到这条反馈的开发人员该怎么办呢?是等着有多次相同问题提升准确率后进行统一修改还是自己测试即使找不到那个确切的小bug?
问题五
在讲义8软件的血型中,提到软件要重构还是重写。现实中确实会有这样的事情--临近发行,发现软件的某个功能或者构建有更好的解决方法,甚至是软件可以有新的功能,那么此时是在原有基础上修改还是重新再构建一个软件?或许公司上层希望的是尽快按照既定方案发行,但工程师是否有必要在发行之前将软件尽善尽美,去增添不加也无伤大雅,加了就锦上添花的项目呢?重点是,如果真的要重构和重写,又能保证确实比之前要好吗?要以什么样的角度去看待这种问题才是我们真正需要的呢?
问题六
创新使得软件工程一步步地发展,那么创新的时机该怎么掌握呢?就像16.7提到的问题:在你创业时,有人又有了更cool的想法,你该怎么办?是继续你的工作,还是破釜沉舟重头再来?继续是否一定会成功,重头再来又会不会成功?又会不会有又一次的重头再来的机遇?人生就是选择题,人要承担自己做完选择之后的后果,那怎么选择才会不会更后悔?
冷知识 电脑病毒的设计初衷并非是造成损害
史上第一款电脑病毒,竟然是由防御技术专家Fred Cohen亲手设计出来的。他创造电脑病毒的目的仅仅是为了证明程序对电脑感染的可行性,从未希望借此对电脑造成任何危害。但这款程序却能够对电脑进行感染,并且能通过软盘等移动介质在不同计算机之间进行传播,因而命名为病毒。后来,他又创造出一种主动式电脑病毒,主要目的是帮助电脑用户找到未受感染可执行文件。<来自这>
任务二
代码地址
<在这>
PSP表格
Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|
计划 | 10 | 15 |
估计这个任务需要多少时间 | 40 | 60 |
开发 | 20 | 40 |
需求分析 (包括学习新技术) | 60 | 80 |
生成设计文档 | 30 | 20 |
设计复审 | 20 | 40 |
代码规范 (为目前的开发制定合适的规范) | 5 | 8 |
具体设计 | 10 | 10 |
具体编码 | 20 | 50 |
代码复审 | 30 | 30 |
测试(自我测试,修改代码,提交修改 | 60 | 90 |
报告 | 90 | 120 |
测试报告 | 30 | 50 |
计算工作量 | 20 | 30 |
事后总结, 并提出过程改进计划 | 10 | 10 |
合计 | 455 | 653 |
代码规范制定
①缩进:行宽Maximum line width为120
②变量命名:采用函数首字母,例如:StringBuffer sb;采用对应英文,例如:字符characters
③函数命名:自定义函数采用驼峰式命名
④大括号使用:除类、try、catch外的语句,大括号必换行;左大括号后换行,右大括号前换行,左右大括号对齐
⑤运算符:运算符左右必加空格
⑥注释:单行注释距离代码两个空格
⑦每行最多字符数:未明确规定
⑧函数最大行数:未明确规定
⑨空行规则:非必要不空行
解题思路
拿到作业时的一瞬间是懵的,看到关于代码以及各种要求几乎有些头大,所幸仔细看过后抓住了重点。本次作业要求实现一个计数命令行程序,统计文本的字符数、单词总数、有效行数、单词出现次数。由基本需求可知,首先需要文本阅读,所以就有Java的IO流知识,其次是字符统计,考虑以字符(read())还是以文本行(readline())读取,第一想法是用字符读取,但显然效率很低,于是打算用文本行读取,此时又有新的问题:怎么规定需要满足的条件?搜索后发现正则表达式以及Java的java.util.regex包,可以用pattern和Matcher实现条件查询;到单词次数统计且排序时第一时间想到暴力排序,但是如何将次数统计与排序结合到一起又成了难题,搜索得到,可以用哈希表进行键值对存储和排序,至此,大概框架已经了解,于是要开始了。。。
计算模块接口设计与实现部分
总体概括
程序主要有一个类WordCount,由主函数和两个功能函数构成,主函数包括对文本读写、文本行数统计以及对单词出现频次统计以及排序,函数countCharacters统计字符个数,函数countWords统计出现单词数
主函数
①文件读取:有InputStreamReader()、BufferedReader()、StringBuffer(),readLine()按行读取;
②行数统计
③单词出现频率统计
由于以行读取只统计每行第一个单词,所以改为字符读取,并与此同时将单词小写化
④哈希排序
⑤文件写入:
用append()函数添加,FileWriter(),BufferedWriter(),write()实现写入
countCharater函数
采用正则表达式作为条件查询,Matcher.find()作为查找
countWords函数
同样采用正则表达式,将条件改为"[a-z]{4}[0-9a-z]*"即可
性能改进
①原先用正则表达式,按行读取作为单词频率的判断标准发现有所遗漏,于是单独开出以字符读取,逐字符判断可更好达到目的;
②打算用冒泡排序,但花费时间过长,于是用哈希表
单元测试
测试countWords(),countCharacters()函数
countWords()函数有以下数据:纯字母,字母加数字,字母加数字加符号,长英文;
countCharacters()函数有以下数据:纯字母,纯数字,纯符号,字母加数字或加符号;
测试结果
覆盖率
只是测试了其中两个功能函数,所以覆盖率很低,由此可见优化覆盖率要将函数按功能分别实现,既可增减函数复用性又可提高测试覆盖率
总结
在看到作业时觉得很难完成,但细看之下发现代码编写是可以有思路的。从IO流到正则表达式再到哈希表让我意识到自己储备知识的匮乏。主要是github知识让人无所适从,在看完教程后还是有些不理解,出现了很多问题,询问过同学,也搜索过各种错误,一个个解决后才基本完成。此次作业让我学会了提问题的方法,了解了GitHub的基本知识,又复习了Java的IO编程,同时理解了团队合作的重要性,Q&A也是解决疑惑的一大方法。