寒假作业2/2


作业基本信息

这个作业属于哪个课程 2021春软件工程实践
这个作业要求在哪里 作业要求
这个作业的目标 阅读《构建之法》提出问题
作业正文 正文
其他参考文献 构建之法

阅读构建之法

问题1

1.我不同意这个观点(作者观点:给每个团队一定的分数,即“团队贡献分”,让每个团队决定如何分配这 些分数,每个人的分数必须不同。这样,团队成员就能体验真实的公司如何做绩 效评估和团队管理,如何衡量“我在团队中的地位”、“我在别人心目中的分量”。每 个人的付出和结果能更好地结合起来。辛苦工作的人可以得高分,决定打酱油、 不在乎分数的人可以少花时间,得一个低分 我的观点:我并不觉得这是个好方法,因为如果更现实的考虑人际关系,做很多的人并不会与做很少的人拉开很大差距,如果自由的让他们团队记录,最后俩者不会有特别大的差距,不会做或者不想做的可能还会做的更少,这在高中有一次小组作业就能看出来,而且得分是掌握在大众小组手中,肯定会有人做了非常多,但涉及各自利益,团队给他的并不会很多分数,我觉得必须得找另一个与团队无关的人员,每个人做哪一点就记录下里最后把每一点列出来,私下问每个人的想法,这样大家都会比较公正,不会受别人影响)

问题2

2.看了这段文字(阿基米德·牛顿等人,现在的我们无论从哪个方面都没有这些名人一般有着极高的修养和无与伦比的智慧,只是极个别的人才拥有这样的学识,才能这样灵光一现,并抓住机会。而作为学生的我们该如何挖掘自己的创新思维,我相信,只要经过训练联系,会比平常人更加敏锐地察觉到创新点,从而走在别人前面。)有这个问题(小型企业程序员,本身在程序设计中,就会比大型企业差很多,而在创新方面更没有什么特别之处。那么该如何促进中小型企业整体的创新度?)。我查了资料,有这些说法(创新过程中依然存在着诸多制约因素.这其中既有企业自身原因,也有外部环境问题,如不加以解决,企业创新效果不可能较大提升.而如何做到更好的促进我国中小企业技术的创新,这需要我们从多个方面进行不断的研究和改革.)根据我的实践经历,我得到这些经验(我认为有创新方面的人才都往大型企业追求更高得发展空间,中小型企业青黄不接)。但是我还是不太懂,我的困惑是(国家如果不大力发展中小型企业,这种创新培养只会加大中小型和大型企业的差距,大型企业拥有的人才量级对比中小型企业差距实在太大了)

问题3

3.我看了这段文字(有实际用处的同时又是完美的软件,在世界上是不存在的。没有实际用处的完美软件也几乎没有,有人会说“Hello World!”是的程序似乎可以称为“完美”,但是根据前文对“软件”的定义,我们不知道这个程序能不能算作一个软件。那市面上有那么多不完美的产品,软件团队为什么还要把这些不完美的软件发布出来呢?为什么不能等到它们完美之后再发布?软件工程的一个重要任务,就是要决定一个软件在什么时候能够“足够好”,可以发布)针对作者提的问题,我有这个想法(为什么不能等软件完美再发布,还是没看懂)我查阅网上的资料(网上说没有一个软件是完美的,资料少得可怜)那针对我自己的是实践经历(就比如说游戏界的很多游戏开服即暴死,就是因为这款游戏还不完美)那我还有这样的困惑(如果说等完美再发布,我相信用户群体会更加喜欢这款软件,比如2077没能成为一款爆火的游戏就是因为他有很多bug)

问题4

4.我看了这段文字(我有一个故事,假设团队里来了两位年轻人,嗯,就叫“萝卜”和“白菜”。萝卜做事很快,是“萝卜快了不洗泥”类型;白菜是“慢工出细活”类型。分配了任务后,萝卜很快就说做好了!白菜还在吭哧吭哧地跟项目经理和测试人员讨论。领
导很高兴,让萝卜去做更多的事。开发阶段结束了,萝卜比白菜多做了不少功能。稳定阶段开始了。大家发现萝卜负责的功能出了很多问题,白菜的模块倒是比较稳定。然而萝卜在团队中的曝光率很高,很多问题都在等着他解决,从统计数据上看,他也修复了不少小强。白菜搞定了自己负责的模块,开始帮助其他 人,由于不熟悉其他人的模块,白菜修复的缺陷不多。由于萝卜的设计有缺陷, 导致模块非常复杂,萝卜也成了唯一了解其模块的开发人员。项目最后阶段,几 乎都是萝卜工作得最晚,把最后几个缺陷给修复了。领导们说:有问题,找萝卜!项目结束了,开始了绩效考核,领导A认为白菜绩效不错,模块按时完成, 没有大多问题,然后还能帮助其他成员;领导B认为萝卜是超级明星:第一个完 成模块,修复的缺陷最多,而且掌握了最复杂的模块,离开他不行,工作得也很 晚,有突出贡献。至于白菜,领导B没感觉他做了啥,仅仅是按要求完成任务 了。萝卜白菜,各有所爱。那萝卜和白菜谁该得到奖励,谁该得到批评呢?假如 领导B的评价方式占了上风,萝卜得到奖励,白菜离开了团队,你觉得下一个版本会出现什么情况? )我觉得我有这样的困惑(你觉得下一个版本会出现什么情况?)查了网上的资料,他是这么说的(大牛:我估计萝卜会成为“构建大师”,每天忙得不可开交。然而项目进展不一定 会像以前那样顺利…… 二柱:有人会怀念白菜。 大牛:你的意思是团队的领导者文化决定了团队的风格。但是当前该怎么办呢? 阿超:所以我们要让“萝卜快了不洗泥”的人慢下来,这样能减少他们的危害。大牛:授予他们“萝卜大师”的称号? 阿超:恐怕不行,我们要胡萝卜和大棒并用。我们的大棒就是“小强地狱”(Bug Hell)。)这是这本书的回答,但是我自己的实践经历哈,会觉得(分析得有点道理,萝卜和白菜如果谁走了都是团队巨大损失,就这俩个骨干为都代表了一大部分人)但我觉得(不应该让领导来决定谁去谁走而应该让团队的成员来决定,这样子是不是更好点,团队成员会对萝卜和白菜进行各方面的接触,得的意见一定更有利于团队)

问题5

我看到这段文字(大家可以从各种各样的健身馆中看到这样的关系。在这种关系中,是谁想提高自 己的水平?是那些学员,这些学员的想法得足够强烈,他/她才会花钱去参加这样的健身活动。在健身活动中,谁要做各种运动,谁要流汗呢?是学员。谁在这个 活动中对别人进行批评指导?是教练。那为什么教练可以这样做?因为教练有下面的资源。 1. 教练是很有经验的身体力行者,并有足够的理论知识。 2. 教练有一套训练计划和各种练习方法,教练(场馆)有仪器、工具、设备,不是每一个人都打算在家里放一套各种重量的哑铃和杠铃。3. 教练可以随时指出学员的进步和不足,给予具体指导。 4. 教练能召集到一群有相似基础的队友,这对有些类型的锻炼是很重要的。教练和学员的关系一旦确定,就很好办了。每一个来学习的学生,都是想学好软 件工程这门技术才来的。各人的先天条件不同,目标也未必相同。有些同学想成 为世界一流的程序员,那老师就会以世界一流的标准来要求和评价学生。 谁要在这门课中写代码,做实验,找需求,修Bug?是学生,不是老师。 谁要看各种与软件工程相关的书籍、博客,并定期汇报?是学生。 谁给各个学生设计练习,回答疑问?老师和助教。如果学生的努力低于既定目标的要求,谁会批评这个学生?老师和助教。有些学生说:老师,你讲得特别,我很想提高,但是我太忙了,没时间写程序, 我就是来听听……这种情况放在健身学员的类比中会是这样:教练,你讲得特别好,我特别想减肥健美。但我太忙了,没时间练,所以我办了卡,放在钱包里面,有时候拿出来看看…… )哇 太行家了,直接类目,但我想说(首先每个来学习的人也不一定都是想学好软件工程这门课,那些同学在大一大二的学习后,心灰意冷,就不觉得能学到什么,觉得自己课后延申更重要,一些忙于实习的同学甚至觉得大学停留在表面,但对大部分人还是抱着期望的,由于我之前也有健身过,我自身的经历让我还是发现俩者的差别,健身教练对你的指导性和贴身性是老师远远比不上的,而且到后面我对健身教练就产生了极为不满的情绪,所以我觉得一味参考健身教练会适得起反其实,并不是特别的好)

冷笑话和故事

著名计算机科学家Donald Knuth(高德纳)(学计算机的肯定知道这个人)写的排版软件TeX版本号可以算是个趣事,从TeX第三版开始,之后的升级是在小数点后加入一个新数位,使之越来越接近Pi的值。TeX目前的版本是3.1415926。于2008年3月更新。这个程序很稳定,高德纳许诺要是谁发现一个bug,就奖励他一些钱(1美分开始,每年翻倍),一般真的发现bug的人,会把支票裱起来。这个故事是我知乎找来的,我个人就觉得高德哪许诺这个方式很棒,而且刚开头每个人需要的钱都比较少,找的bug越来越多,而且随着年越来越久,就越难找到剩下的bug,相对应的酬劳也越高,更能激发人们找bug的心,这种良性的方法如果被当今游戏厂商采用可能前期会被割韭菜,但是对游戏的长久发展我觉得是很有利的,特别有些一玩就都是bug。

GIthub项目地址

项目地址

PSP表格

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

解题思路描述

看到这个项目很快就想起了大一年就做过类似的题目,不过那时可能没用文件的读取输入和输出,字符数的话就觉得一个一个读取过去就好了,行数就通过换行符来处理,并通过对尾行和空白行的特殊处理,然后单词的话就能转化成小写吧,而且特别注意首字母开头即大写的情况,不过大一的时候用的是数组来做,在经过这俩年的学习,领悟到了map更适合用来做这道题,并通过排序函数即可使文章在按出现次数排行的前提下也通过字典序排序。

代码规范链接

代码规范

计算模块接口的设计与实现过程

1.主要类/接口

{

private:
	FILE * f;
	const char *input_file;
	const char *output_file;
public:
	WordCount(FILE *a, const char *b, const char*c)
	{
		f = a;
		input_file = b;
		output_file = c;
	}
	~WordCount() {};
	int wordnum();
	int charcount();
	int linecount();
	void start();
};

2.统计字符函数

	int allchar = 0;
	char ch;
	ch = fgetc(fp);
	while (ch != EOF)//一个一个字符的读取 
	{
		allchar++;
		ch = fgetc(fp);
	}
	fclose(fp);
	return allchar;
}

字符要一个一个读取
3.统计行函数


	int line = 0;
	char ch;
	ch = fgetc(fp);
	while (ch != EOF)
	{
		if (line == 0 && ch != ' '&&ch != '\n')//对第一行进行定义 由于第一行没有换行符
			line++;
		else if (ch == '\n')
		{
			line++;
			ch = fgetc(fp);
			if (ch == EOF)//怕只有一个换行符就结束了
				line--;

		}
		else
		{
			ch = fgetc(fp);
		}
	}


通过读取换行符来统计行数,然后对结尾进行处理
4.统计单词函数

stream ss(strFile);

	if (stringmap.empty())
		getstring(ss);
	vector < pair < int, string > > v;
	for (unordered_map<string, int>::iterator it = stringmap.begin(); it != stringmap.end(); ++it)
		v.push_back(make_pair(it->second, it->first));//内将字序压入容器内



这一部分用来统计单词数 也是将单词放入strfile里面,然后一步一步的统计,去除符号位和大小写字母变化差异
5.统计单词频率前十位并输出

if (stringmap.empty())
		getstring(ss);
	vector < pair < int, string > > z;
	for (unordered_map<string, int>::iterator it = stringmap.begin(); it != stringmap.end(); ++it)
		z.push_back(make_pair(it->second, it->first));
	sort(z.begin(), z.end(), cmp);
	

对于输入和输出流是选择最基础的argv函数最后定向输出到存入的文件里
独到之处:我觉得自己比较满意的地方就是用map装单词最后回归到栈里把,这样确实简化了蛮多东西的,连排序函数都蛮省的

性能改进

1.测试俩万单词


	if (!fileOut)
	{
		std::cout << "error !";
	}
	else
	{for(int i=0;i<=20000;i++)
		fileOut << "first ";
	
	}
	return 0;

测试截图
2.测试十万单词

	std::ofstream fileOut("input.txt", std::ios::out);

	if (!fileOut)
	{
		std::cout << "error !";
	}
	else
	{for(int i=0;i<=100000;i++)
		fileOut << "first ";
	
	}

测试截图
3.测试百万单词

std::ofstream fileOut("input.txt", std::ios::out);

	if (!fileOut)
	{
		std::cout << "error !";
	}
	else
	{for(int i=0;i<=1000000;i++)
		fileOut << "first ";
	 
	}

测试截图
发现性能效果还是不咋地 不过由于C++的局限性 我也查不到比map还好用的方法,所以着重就放在正确性测试了

单元测试

测试字符


	TEST_CLASS(UnitTest1)
	{
	public:

		TEST_METHOD(TestMethod1)
		{
			std::ofstream fileOut("input.txt", std::ios::out);

			if (!fileOut)
			{
				std::cout << "error !";
			}
			else
			{
				for (int i = 0; i <= 20000; i++)
					fileOut << "first ";

			}
			return 0;
			int num = CharCount("input.txt");
		cout<< "characters:" << ' ' << A.CharCount() << endl;
		}

代码覆盖率截图
代码覆盖率

测试单词数


	TEST_CLASS(UnitTest1)
	{
	public:

		TEST_METHOD(TestMethod1)
		{
			std::ofstream fileOut("input.txt", std::ios::out);

			if (!fileOut)
			{
				std::cout << "error !";
			}
			else
			{
				for (int i = 0; i <= 20000; i++)
					fileOut << "words ";

			}
			return 0;
			int num = CharCount("input.txt");
		cout<< "characters:" << ' ' << A.WordNum) << endl;
		}


代码覆盖率截图
代码覆盖率

就类似这样子的一下就不一一叙述 开始进行正确率测试
1.

windows2011 windows98

结果

characters: 21
words: 2
lines: 1
windows2011: 1
windows98: 1

2.1篇英语作文未加换行符

Transportation has been greatly changed in the past few years. In ancient days, people used to travel by horse or carriage. The journey was often tiring and tedious. Then people had buses, trains and ships, which could shorten the time of the long-distance trip. Now we have not only more private cars, but also planes and high-speed rails. All of these modern transports could offer us a quick and pleasant travel. Thus, more and more people enjoy traveling very much these days. In conclusion, modern transportation has completely changed our life. Thanks to modern transportation, our world is becoming smaller and smaller

结果

characters: 625
words: 70
lines: 1
modern: 3
more: 3
people: 3
transportation: 3
changed: 2
could: 2
days: 2
smaller: 2
these: 2
travel: 2

3.一篇英语作文加换行符且以换行结尾

Transportation has been greatly changed in the past few years. In ancient days, people used to 
travel by horse or carriage. The journey was often tiring and tedious. Then people had buses
, trains and ships, which could shorten the time of the long-distance trip. Now we have not only 
more private cars, but also planes and high-speed rails. All of these modern transports could 
offer us a quick and pleasant travel. Thus, more and more people enjoy traveling very much 
these days. In conclusion, modern transportation has completely changed our life. Thanks to 
modern transportation, our world is becoming smaller and smaller

结果

characters: 633
words: 70
lines: 8
modern: 3
more: 3
people: 3
transportation: 3
changed: 2
could: 2
days: 2
smaller: 2
these: 2
travel: 2

4.大写字母

AAaa aaAA Aaaa AAAA aaaa

结果
···
characters: 26
words: 5
lines: 2
aaaa: 5
···
5.数字和字母

AAaa1 aaAA2 Aaaa3 AAAA4 aaaa5

结果

characters: 31
words: 5
lines: 2
aaaa1: 1
aaaa2: 1
aaaa3: 1
aaaa4: 1
aaaa5: 1

6.小于四个字符的单词

 d du dui duia

结果

characters: 14
words: 1
lines: 1
duia: 1

7.参考同学的测试

hello,hello,hello,hello,i21
iiii1,iiii2,iiii3,iiii4,
iiii1,iiii1.iiii1
iiii5 iiii5 iiii5 iiii5 iiii5
iiii6
iiii7

iiii8
iiii9 iiii10 iiii11

结果

characters: 140
words: 22
lines: 9
iiii5: 5
hello: 4
iiii1: 4
iiii10: 1
iiii11: 1
iiii2: 1
iiii3: 1
iiii4: 1
iiii6: 1
iiii7: 1

异常处理

异常处理基本只有Io输入输出流处理,比如参数输入超栈,打不开文件,还有输入参数不符合,还有创建文件失败

心路历程和收获

心路历程: 一开始的时候就想哇这作业这么多,什么鬼要求我都没见过,就开始怀疑自己是不是有这个能力能搞清楚弄明白要怎么做,GitHub不是大佬用的吗,和我这种弱鸡有啥关系,然后就是疯狂的查资料,被各种要求搞到爆炸,就感觉有点逼上梁山的感觉,前几天心里也很爆炸,花这么多时间却啥都没搞定,不过后面随着新知识的学习,情况明显好转,就勉勉强强成功做完
收获:更深刻学会了map结构的使用,复习了输入输出的知识,学会了单元测试这个事情,然后对GitHub这个平台也有了更深的认识,复习了C++很多语言的使用,对markdown语法也进行了一次复习!

posted @ 2021-02-27 17:55  冷夜梦  阅读(145)  评论(1编辑  收藏  举报