软工实践寒假作业(2/2)

这个作业属于哪个课程 2021春软件工程实践|S班 (福州大学)
这个作业要求在哪里 软工实践寒假作业(2/2)
这个作业的目标 1.阅读构建之法,继续提出自己的疑问
2.学习使用git和github进行代码管理
3.编写WordCount程序
其他参考文献 《构建之法》、CSDN正则表达式教学、CSDN文件读写教学

目录

1.阅读《构建之法》并提问

Q1:工程师在不清楚模块对于全局的作用时,容易对局部模块花费大量时间,这种问题被称为“过早优化”,但是我们对于程序的测试与调优应该从项目开始就有所准备,所以在进行程序优化时,我们应该遵循怎样的准则从而避免我们陷入“过早优化”的陷阱?

问题来源:本书第三章提到“过早优化时一切罪恶的根源”,一个复杂的软件似乎很多模块都可以变得更好,但我们很容易花费大量时间对某一个模块进行无法奏效的优化。

我的思考:“过早优化”造成的问题是浪费了大量时间在未来可能并不重要的优化上,所以我想可以从两个方面入手解决这个问题,第一个是从时间的管理上,完善的规划自己对于前期程序优化与测试所需要的时间不做超出时间规划的无用功。第二个是从对程序的理解上,将优化的时间后移,先对程序有一个全面而深刻的认识,清楚了解各个模块对于程序全局的重要性,合理分配自己的优化与测试时间。

Q2:一部分人写代码时充满激情,也有一部分为了工作而勉强了事,那造成这种差异的所谓“激情”是如何产生,它来自于项目的商业价值还是个人的理想实现又或者是什么,第二类人又该如何激发自己的激情呢?

问题来源: 本书第七章谈论到一个项目商业价值如果经不起考验,没有明确的前景,是会消磨工程师的激情的。

我的思考:书中说到激情能被激发也会消失,就拿我自己举例,在写代码时如果进展顺利,那我会感到心情愉悦,并且愿意花更多的时间去完成我的代码,而当遇到瓶颈时总是迟迟不愿意动手去解决,转而去做其他事情转换心情。如果写代码的激情可以由我们自己掌握,那我们应该把它寄托在什么之上,有没有很好解决方案。

Q3:今天碰到的问题来自于昨天的风险,一个项目存在着许多的风险,其中来着环境的风险有法规、市场竞争环境、经济情况、技术大趋势等等。那么我们程序工程师在项目确定的时候考虑风险是参考当下的环境,还是凭借个人的眼光以及周遭信息更多地参考所预测的未来的环境呢?

问题来源: 本书第九章提到了,风险是影响项目进程的一大因素,其中许多可以通过人为避免,但是来自环境的风险是不那么好预知的。

我的思考: 环境的风险的始终存在,我认为应该更多地参考我们预测中产品完成时的未来的环境,哪怕因为这样所制定的计划有许多本不必要的限制,但对我们的项目而言是更加稳重的选择。

Q4:用户体验的好坏与产品的成功息息相关,我想可以理解为用户体验至上,但是有些时候我们不得不牺牲一部分用户体验以换取性能、安全性等等,这种时候我们怎么进行取舍呢?

问题来源: 本书第十二章关于用户体验和质量的讨论,牺牲一部分性能换来好的产品体验,与追求最高性能放弃用户体验的两方始终存在,但是用户的选择却不一定和我们想像的一样。

我的思考: 软件为了利益而放弃一部分用户体验的先例数不胜数,就比如广告的投放,大量的广告势必会劝退相当一部分的用户,但在自己拥有强大的竞争优势时,这样可能造成的用户流失就显得不那么重要,所以我们是不是可以经过权衡合理地牺牲一部分用户体验换取其他利益。

Q5:假设我们砍掉了一个无法实现预期的设计需求,我们为这个功能所花费的成本可以称之为“沉没成本”,那我们能不能从这个已经花费出去的“沉没成本”上吸取到什么教训。

问题来源:本书第十五章提到了,当砍掉一个功能后,为以前花费了成本的任务却没有回报,继续投入成本是不合理的。

我的思考: 造成沉没成本的原因可能有对团队技术力的预估失误,又或者环境因素所产生的风险,我们能吸取到的教训应该是做出更加细致精确的成本预估。

2.WordCount编程

关于github地址

我的github呢称 我的github地址
ChenSK12 https://github.com/ChenSk12

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 80 50
• Estimate • 估计这个任务需要多少时间 80 50
Development 开发 1320 1740
• Analysis • 需求分析 (包括学习新技术) 120 120
• Design Spec • 生成设计文档 30 60
• Design Review • 设计复审 30 40
• Coding Standard • 代码规范 (为目前的开发制定合适的规范) 30 30
• Design • 具体设计 60 90
• Coding • 具体编码 720 840
• Code Review • 代码复审 30 60
• Test • 测试(自我测试,修改代码,提交修改) 300 500
Reporting 报告 115 135
• Test Repor • 测试报告 40 50
• Size Measurement • 计算工作量 15 25
• Postmortem & Process Improvement Plan • 事后总结, 并提出过程改进计划 60 60
合计 1515 1925

解题思路描述

题目要求是计算字符数、单词数、非空行数、词频前十单词。于是我使用BufferedReader读取文本,BufferedWriter写入文本。利用正则表达式区分筛选单词,计算非空行。我的学习步骤

  • 1.学习了git以及github的使用指南
  • 2.学习了正则表达式的使用教程
  • 3.复习java文件读写流教程

代码规范制定链接

(代码规范)

设计与实现过程

共设计了5个类,分别可以实现读取文本后计算字符数、非空行、单词数、词频前十单词,多线程执行函数
1.计算字符数
利用BufferReader类的read()方法,验证读取到的字符属于规定字符后,将字符统计变量加一。

2.计算行数
利用BufferReader类的readline()方法读取一个字符串,再通过字符串方法isBlank()(JDK8不适用)判断是否是空字符串。

3.计算单词数
利用BufferReader类的readline()方法读取一个字符串,再通过利用 split("[^0-9a-zA-Z]") 将单词分隔出来。

String[] splitStr = str.split("[^0-9a-zA-Z]");

4.计算词频前十单词
先利用正则表达式 "[a-z]{4}.*" 将匹配的单词存储入HashMap,再利用List将HashMap转化为可排序的字典。从而对字典进行排序

public static boolean isThatWord(String content){
        String pattern = "[a-z]{4}.*";
        boolean isMatch = Pattern.matches(pattern,content);
        return isMatch;
    }

5.多线程任务类

性能改进

在主函数增加多线程处理,利用线程池的newCachedThreadPool()方法,开四个线程分别执行每个函数。


160w字符运行效率

1600w字符运行效率

1.6e字符运行效率

单元测试

  • 随机生成字符串,含有所有有可能出现的字符,测试字符数,以及行数正确性
  • 部分典型测试数据测试
    1.相同出现次数时字典序靠前的先输出


    2.不是单词的短词


    3.多个空白字符的换行


    4.大写字母转换为小写字母


    5.各种分隔符的情况(共10个file,同时含有大小写)

异常处理说明

1.命令行输入的参数找不到文件时捕获异常


2.命令行参数仅输入一个或者没有输入

心路历程与收获

1.本次作业先学习了git和github的使用,这对于我们以后的代码管理和结对编程时的分工合作有着巨大的帮助,也让我有了使用GitHub建立自己的代码库的想法。
2.对于本次作业的程序开发,我一开始并不是觉得有很大的难度,于是在收集部分资料后就马上开始了程序的编写。但是在开始开发之前,我没有对性能水平做出一个预期要求,对于功能的实现没有考虑它对与整体耗时的影响,这导致了在某些类中需要耗费大量的时间。这次开发经验告诉我,软件项目开发的前期准备是多么重要,在代码实现之前,我们就应该对每个功能以及预期的性能做出一定的要求,每个类之间的联系,功能怎么完善,是否留有足够的优化空间。否则就容易出现后期难以修改,性能无法提高的瓶颈。
3.单元测试是本次作业的第三大收获,好的单元测试可以帮助我们发现很多问题,改进代码性能。写好单元测试与写好代码本身一样重要,在这方面,还有很多东西要学。
4.在提交之前,我观摩了很多优秀同学的博文,从他们的博文中我发现了自己很多的问题,这让我想到,人总是趋向于舒适的,如果一直待在自己的世界那么我们总会渐渐懈怠,只有不断与优秀的人进行交流与探讨,我们才能正视自己的不足奋起直追。

posted @ 2021-03-02 19:39  spiritcsk  阅读(92)  评论(3编辑  收藏  举报