Loading

寒假作业(2/2)

这个作业属于哪个课程 2021春软件工程|W班(福州大学)
这个作业要求在哪里 作业要求
这个作业的目标 阅读《构建之法》提出问题;git和GitHub的使用;WordCount编程
其他参考文献 《构建之法》,CSDN,博客园,百度

目录:

  1. 阅读《构建之法》并提问
    冷知识和故事
  2. WordCount编程
    2.1. Github项目地址
    2.2. PSP表格
    2.3. 解题思路描述
    2.4. 代码规范制定链接
    2.5. 设计与实现过程
    2.6. 性能改进
    2.7. 单元测试
    2.8. 异常处理说明
    2.9. 心路历程与收获

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

1.1 问题一:足够好的软件是把BUG都消灭掉,那么要达到什么样的标准才能被当作BUG全被消灭掉呢?

书中第一章说到“软件工程的目标——创造“足够好”的软件。什么是好的软件?一些同学认为,所谓好软件,就是软件没有缺陷(Bug),所谓软件工程,就是把软件中的Bug都消灭掉的过程。那市面上有这么多不完美的产品,软件团队为什么还要把这些不完美的软件发布出来呢?为什么不能等到它们完美之后再发布?软件工程的一个重要任务,就是要决定一个软件在什么时候能“足够好”,可以发布。”
不太明白如何让一个软件达到“足够好”的标准从而能够发布使用,我们都知道软件应该要在不断的模拟需求的测试之后才能发布使用,那么应该如何进行测试以及达到什么样的效果才算是“足够好”?
这个问题确实不知道如何解答,我认为每个公司都应该有属于自己的标准,各有不同,当设计的产品达到这个标准,才能被投入市场使用。

1.2 问题二:软件开发是一个连续修改的过程,那么会不会出现严重偏离的情况?

书中第七章说到“软件工程,唯一不变的是变化。所以干脆别幻想客户的需求会在第一时刻很明确,然后保持不会变。要注意,我们是预期变化,不是期望变化。除开外部原因,团队内部也在变化,我们对技术的掌握每天都在提高,原来认为不可能的事可能变得容易。我们对客观世界和软件系统的了解每天都在深化,原来觉得没问题的小细节忽然成了大问题。甚至原来一起打拼的同事忽然要离开……这些都要求我们团队保持敏捷的身段。”
软件开发过程是一个连续变化的过程,一切为了满足用户需求,那么会不会经历多次或者大幅度修改,导致偏离开发方向?这就需要在需求分析阶段多沟通多了解,先确定方向,再寻求长期的比较广度的发展,也需要团队保持敏捷的应对方式,但是对于需求变化的不可控性,该如何应对?对于需求变化的不可控性,我认为,应当与客户保持密切沟通,尽量保持大方向不改变。

1.3 问题三:最新型,有创新点的软件设计,一定就是最符合用户心目中的软件吗?

在第八章看到竞争性需求分析的框架,有这个问题:最新型,有创新点的软件设计,一定就是最符合用户心目中的软件吗?
书上说到“得到了需求之后,软件团队就要考虑用功能来实现这些需求。一个公司可能有多种软件产品和服务,它们各有不同的战略意义。一个软件或服务也由很多功能组成,它们有机地结合起来,才能解决用户的问题,产生效益。”我认为要更用心地去优化软件,后期准确的表达与介绍产品的核心价值,体现不同类型的功能,就也许可以取得好评。

1.4 问题四:对于提高产品的竞争力应该选择与众不同,还是迎合市场呢?

书中第十六章提到了影响产品竞争的各种因素。书中又提到了“不同的产业需要不同的组合拳,最好是一个完整的套路,对于最近几年比较火热的互联网产业来说,可以参考下面的建议。第一步,了解团队能力、产品方向和大环境的趋势;第二步,选择合适的细分市场。”
面对广大的市场,单纯的创新明显不够,还要与市场接轨,了解目标群众的喜欢习惯,从而来提高自己的影响力,但这样也就容易淹没在人群中。那么到底是应该选择与众不同,还是迎合市场呢?我认为在迎合市场的同时又有一定程度的创新,与同类型其他产品有吸引用户的地方,这样才能将产品竞争力最大化。

1.5 问题五:当新事物变得大众化,又该如何保持竞争力?

书中第十六章的魔方创新中。最开始果冻同学从其他地方带来魔方,这应该算是引进。而小飞同学复印了魔方口诀表来提高自己的竞争力,大牛通过改变规则来提高竞争力,但最后都是因为同学们对魔方的兴趣渐渐失去而失去了市场。那这么来看,当一个新事物出现的时候,要一直保持自己的市场,必须通过创新创意来提高自己的竞争力。当新事物变得大众时,又该如何去保持竞争力?难道只能默默被淘汰?
个人拙见,在变得大众化之后,应该重新调研,寻找当下热点以及客户的喜好趋势,在针对自身产品进行改造创新,从而获取用户的青睐。

冷知识和故事

Git的诞生
Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,成为最大的服务器系统软件。Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的。在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码。
到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。
安定团结的大好局面在2005年就被打破了,原因是开发Samba的Andrew试图**BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了,于是BitMover公司怒了,要收回Linux社区的免费使用权。
Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:
Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!

2.WordCount编程

2.1 GitHub项目地址

GitHub项目地址

2.2 PSP表格

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

2.3 解题思路描述

即刚开始拿到题目后,如何思考,如何找资料的过程
刚开始拿到题目后,大概思路:从文件中读取内容,然后经过四个基本功能,将结果写入result.txt中。
考虑使用C++来做。到网上重新学习C++关于文件的操作,用fstream来对文件读写,然后将四个功能分作四个函数实现。
统计字符数用get方法来读取字符。另外,学习如何匹配单词,学到了运用正则表达式实现单词匹配。那么又该如何存储单词呢?又学到了运用unordered_map。

2.4 代码规范制定链接

codestyle.md

2.5 设计与实现过程

分成三个文件,Lib.h放置头文件,Lib.cpp放置函数,Main.cpp为主程序。
CharCount用于统计字符数

int CharCount(const char* filename)//统计字符数
 {
int charNum = 0;
ifstream ifs(filename);
char c;

while ((c = ifs.get()) != EOF)
{
	if (c >= NULL && c <= '~')
		charNum++;
}
ifs.clear();
ifs.seekg(0);
return charNum;
}

LinesCount用于统计有效行数

int LinesCount(const char* filename)//统计行数
{
int i = 0;
bool isNull = 1;
int lines = 0;
fstream fs(filename, ios::in);
string s;
while (getline(fs, s))
{
	for (i = 0, isNull = 1; i < s.length(); i++)
	{
		if (s[i] != ' ' && s[i] != '\t')
		{
			isNull = 0;
			break;
		}
	}
	if (!isNull)
		lines++;
}
return lines;
}

WordsCount用于统计单词

int WordsCount(const char* filename)//统计单词数
{
regex word("[A-Za-z][A-Za-z][A-Za-z][A-Za-z]([\\w]+)");//单词的正则表达式
int wordNum = 0;
fstream fs;
fs.open(filename);
string str;
while (fs >> str)
{
	sregex_token_iterator end;
	for (sregex_token_iterator iter(str.begin(), str.end(), word), end; iter != end; iter++)
	{
		wordNum++;
	}
}
return wordNum;
}

前10个高频词

int SortWords(psi p1, psi p2)//排序
{
if (p1.second == p2.second)
{
	return p1.first < p2.first;//词频相等按字典序排列
}
else
	return p1.second > p2.second;
}


for (unordered_map<string, int>::iterator iter = WordsMap.begin(); iter != WordsMap.end(); iter++)/将map中的数队放入vector中
{
	WordsVec.push_back(pair<string, int>(iter->first, iter->second));
}
sort(WordsVec.begin(), WordsVec.end(), SortWords);//排序

2.6 性能分析

2.7 单元测试

基本功能测试:对于基本功能的正确实现

单元测试:分别测试能否识别中文字符、对于空文件的测试、测试全部都是错误单词的情况、测试全是分割符的情况、对于空白行的测试


2.8 异常处理说明

如果input.txt文件不存在,则会报错。

if (!TextFile)
{
	cout << "Erro!" << endl;
}

2.9 心路历程与收获

这次作业写了好几天,本以为作业较为简单,仔细琢磨却大有乾坤。
最开始便倒在了git和GitHub的使用,由于第一次接触,十分的陌生,完全不知道如何操作。后来,在网上寻找教程,一步步学习,总算是能够上手。
在代码方面选择C++,由于所学已久,在重新学习后才开始编码。
而单元测试、性能分析更是没有碰过,通过网上教程一步步学习。
第一次较为完整的做一个小项目,让我对软件工程有了进一步的了解,也提升了自己的实践能力,在今后,一定要理论与实践结合,才能更好地掌握技能。

posted @ 2021-03-05 11:19  Linzkk  阅读(102)  评论(4编辑  收藏  举报