Q&A:【腾讯文档】第二次寒假作业
为了不遗漏作业内容,这里有一份checklist方便同学们快速检阅。应该注意的是,checklist虽然有顺序,你在完成时可以并列进行;例如,可以在重新阅读《构建之法》之间穿插git的学习。
前一次作业要求不够详细,部分同学阅读《构建之法》提出的问题过于浅显,没有对提出的问题进行深入思考,因此在本次作业中额外添加了重新阅读《构建之法》并提问这一任务,并布置了更详细的要求。
一、快速看完整部教材(教材开学会发,可以先看邹欣老师的博客园讲义),列出你仍然不懂的5到10个问题,发布在你的个人博客上。如何提出有价值的问题? 请看这个文章,以及在互联网时代如何提问题。 还有这些要点:
我看了这一段文字(引用文字),有这个问题(提出问题)。我查了资料,有这些说法(引用说法),根据我的实践,我得到这些经验(描述自己的经验)。 但是我还是不太懂,我的困惑是(说明困惑)。
【或者】我反对作者的观点(提出作者的观点,自己的观点,以及理由)。
大学生应该能写出自己的思考, 而不是摘抄书本内容。
提示: 编程经验不多的同学,建议看16章“创新”,提出自己的问题。
大家知道了软件和软件工程的起源,请问软件工程发展的过程中有什么你觉得有趣的冷知识和故事?
冷知识和故事的例子:
在 Dijkstra 决定成为一个程序员后,他尽快完成了学业,因为以他的话说,他在大学里不再受欢迎了:物理学家们觉得他是逃兵,而数学家们也看不起他和他做的事,因为在当时的数学文化里,你的课题必须和 ∞ 有关才会受尊重。那个时候程序设计没有成为一个职业,没有人能说出这个行业的基础知识体系是什么,而这些都会被 Dijkstra 改变。1957 年,他结婚的时候在申请的职业一栏写上了「程序员」,结果被政府拒绝,因为当时荷兰没有这个职业。
http://www.techug.com/post/edsger-wybe-dijkstra.html
在本次课程结束后回顾,你对你提出的问题是否有了新的理解?在实践的过程当中,你用到了哪些知识?(本次作业不要求回答,等课程后期会有一次关于提问回顾的作业)
提问30分
附加题5分
在大数据环境下,搜索引擎,电商系统,服务平台,社交软件等,都会根据用户的输入来判断最近搜索最多的词语,从而分析当前热点,优化自己的服务。首先当然是统计出哪些词语被搜索的频率最高啦,请设计一个程序,能够满足一些词频统计的需求。
为了保证你的代码能够帮助更多的人,并且能得到有效的管理和开源共享,请先学习git以及github的使用:
代码有进展即签入Github。签入记录不合理的项目会被助教抽查询问项目细节。对代码签入的具体要求如下:根据需求划分功能后,每做完一个功能,编译成功后,应至少commit一次。具体的功能划分,请自行定义,并在撰写博客时体现出来,遵循自己对需求的功能划分来提交代码即可。
为了其他同仁可以轻松的阅读你的代码,请制定属于你的代码规范,要求不能偏离主流代码规范:
请参照《码出高效_阿里巴巴Java开发手册》/《腾讯c++代码规范》/《Python PEP8》,从以下几个角度制定你的编程规范,并撰写成markdown文件,添加到git仓库里。请牢记你制定的编码规范,并在此次作业中严格执行。
https://github.com/SsnAgo/PersonalProject-C.git
https://github.com/SsnAgo/PersonalProject-Java.git
.gitignore
忽略,如编译器生成的项目文件、输出文件、class、jar包、exe等,确保不会提交到github上,参考 [附录3]。实现一个命令行程序,不妨称之为WordCount。
假设有一个软件每隔一小段时间会记录一次用户的搜索记录,记录为英文。
输入文件和输出文件以命令行参数传入。例如我们在命令行窗口(cmd)中输入:
//C语言类
WordCount.exe input.txt output.txt
//Java语言
java WordCount input.txt output.txt
则会统计input.txt中的以下几个指标
统计文件的字符数(对应输出第一行):
统计文件的单词总数(对应输出第二行),单词:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写。
统计文件的有效行数(对应输出第三行):任何包含非空白字符的行,都需要统计。
统计文件中各单词的出现次数(对应输出接下来10行),最终只输出频率最高的10个。
例如,windows95,windows98和windows2000同时出现时,则先输出windows2000
然后将统计结果输出到output.txt,输出的格式如下;其中word1
和word2
对应具体的单词,number
为统计出的个数;换行使用'\n',编码统一使用UTF-8。
characters: number
words: number
lines: number
word1: number
word2: number
...
如果现在我们要把这个功能放到不同的环境中去(例如,命令行,Windows图形界面程序,网页程序,手机App),就会碰到困难:代码散落在各个函数中,很难剥离出来作为一个独立的模块运行以满足不同的需求。
这些代码的种类不同,混杂在一起对于后期的维护扩展很不友好,所以它们的组织结构就需要精心的整理和优化。
我们希望把基本功能里的:
这三个功能独立出来,成为一个独立的模块(class library, DLL, 或其它),这样的话,命令行和GUI的程序都能使用同一份代码。为了方便起见,我们称之为计算核心"Core模块",这个模块至少可以在几个地方使用:
把计算核心在单元测试框架中做过完备的测试后,我们就可以在算法层级保证了这个模块的正确性。
但我们知道软件并非只有计算核心,实际的软件是交付给最终用户的软件,除了计算核心外,还需要有一定的界面和必要的辅助功能。
这个Core模块和使用它的其他模块之间则要通过一定的API来交流。
API应该怎么设计呢?
为了方便起见,我们可以从下面的最简单的接口开始(仅举例,你的代码里可能没有这个函数):
int countChar(File *file)
这个函数表示输出一个文件指针,返回这个文件的字符数。
假设我们用Core封装了这个接口,那么我们的测试程序可以是这样:
File *in = fopen("input.txt","r");
int count = 100;
Assert(countChar(in) == count);
当然,这样的测试程序并不充分,希望大家测试时不要像这样偷懒。
请根据自己以往积累的测试经验,在编码完成之后,提交产品之前,设计测试用例,并编写单元测试,对自己的项目进行测试。首先,至少应采用白盒测试用例设计方法来设计测试用例,其他测试方法不限。其次,要设计至少10个测试用例,确保你的程序能够正确处理各种情况。最后,结合测试评估的要求,对自己的测试设计进行评价,这些测试用例能满足该程序测试的要求吗?
另一个重要的措施是要把单元测试自动化,这样每个人都能很容易地运行它,并且可以使单元测试每天都运行。每个人都可以随时在自己的机器上运行。团队一般是在每日构建中运行单元测试的,这样每个单元测试的错误就能及时被发现并得到修改。
助教在测试时,将运行自动测试程序编译源文件并运行,进行批量测试,因此请保证项目的组织目录符合要求.
对于使用Java语言的项目有以下要求:
xxxxxxxxx (文件夹名字为学号)
|- src
|- WordCount.java(主程序,可以从命令行接收参数;确保文件名一致、区分大小写)
|- Lib.java(包含其它自定义函数,可以有多个,对名字不做要求)
|- README.md
描述你的项目,包括如何运行、功能简介、作业链接、博客链接等
|- codestyle.md
描述你之前定的代码风格
对于使用C++ 语言的项目有以下要求:
xxxxxxxxx (文件夹名字为学号)
|- src
|- Main.cpp(主程序,可以从命令行接收参数;确保文件名一致、区分大小写)
|- Lib.cpp(包含其它自定义函数,可以有多个,对名字不做要求)
|- Lib.h(包含其它自定义函数,可以有多个,对名字不做要求)
|- README.md
描述你的项目,包括如何运行、功能简介、作业链接、博客链接等
|- codestyle.md
描述你之前定的代码风格
本次自动测试会加入各种各样出错情况的测试,要求开发者程序不能崩溃,并且能够尽可能精确报错。你可以有“容错性”的出错设计,但必须输出必要的提示或说明。
本次作业涉及文件路径、文件读写等的问题,请自行查阅资料学习。文件路径既可以使用绝对路径,也可以使用相对路径。
在执行程序时,通过读入命令行指定的测试文件路径,在程序中给文件路径赋值。总之请确保你的程序可以在助教的电脑上运行,例如请不要在程序中使用你自己电脑上的绝对路径通过硬编码的方式给文件路径变量赋值。
由于任务二占70分,实际评分规则有100分,最终记分按70%折算。
PSP是卡耐基梅隆大学(CMU)的专家们针对软件工程师所提出的一套模型:Personal Software Process (PSP, 个人开发流程,或称个体软件过程)。
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
• Estimate | • 估计这个任务需要多少时间 | ||
Development | 开发 | ||
• Analysis | • 需求分析 (包括学习新技术) | ||
• Design Spec | • 生成设计文档 | ||
• Design Review | • 设计复审 | ||
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | ||
• Design | • 具体设计 | ||
• Coding | • 具体编码 | ||
• Code Review | • 代码复审 | ||
• Test | • 测试(自我测试,修改代码,提交修改) | ||
Reporting | 报告 | ||
• Test Repor | • 测试报告 | ||
• Size Measurement | • 计算工作量 | ||
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | ||
合计 |
一个功能完备的程序不是一蹴而就的。通过将词频统计的需求划分为4个部分,可将一个大任务划分为可操作的小任务,同时最好按照任务难度或紧急程度指定各个任务的完成次序。因此,在动手开发之前,要先估计将在程序各模块开发所需耗费的时间,以及完成整个项目所需的时间,将这个[估计值]记录下来,写成PSP 的形式。
PSP的目的是:记录工程师如何实现需求的效率,和我们使用项目管理工具(例如微软的Project Professional,或者禅道等)进行项目进度规划类似。
有关PSP的更多内容,请自行阅读邹欣老师的博客工程师的能力评估和发展
git是版本控制系统,而github提供托管git仓库的服务。或许你可以先在各大视频网站找一些git&github介绍,对此有一个总体上的了解,再深入进行学习。
务必包含以下大标题:(标题含义近似即可,你可以个性化自己的标题)
这个作业属于哪个课程 | <班级的链接> |
---|---|
这个作业要求在哪里 | <作业要求的链接> |
这个作业的目标 | <写上具体方面> |
作业正文 | .... |
其他参考文献 | ... |
markdown代码
|这个作业属于哪个课程|<班级的链接>|
|-- |-- |
|这个作业要求在哪里|<作业要求的链接>|
|这个作业的目标|<写上具体方面>|
|作业正文|.... |
|其他参考文献|... |
(忘记提交作业和补交扣分一致)
若有对题意不清或者有不理解的地方,可在该博客下方留言,或者在微信群中直接提问。
学号 | 成员名 | 提交作业标题 | 提交日期 | 分数 |
---|
提交: 1 人,未提交: 94 人
未提交名单: 051805124 221801124张思萍 刘睿珏 盫曌 火言火又 221801128 小皮碎大石⚡️ _QAQ_wmz 李子李子李 SearlShieh FTDKF 木子来井 行露 柠檬blessing 无祂 ChenMy。 GONGHAIXU 倒拔垂杨柳 DumbassL 黄贸之 221801239_林龙星 LLLLeBron WiLLyy 羊肉串i FZU_TKQ CLH029 岩王帝君 抹布拉布 多喝热水呀 aaagx 淡水蓝鲸 潘紫盈 Savona 穗積 lauhiukwan 水上灯 大萌神 YukioLee Kosmos1 hanmajack 郭晗宇 J-Letoo Guodd 王大鱼Yu LINX666 FZU-CQ Elsa1226 Phara 霍格沃茨荣誉学生 至沁 221801326_王炜嘉 SuZ1 VROOM coldsu Huro~ kepachirenguai 鲸落12138 hhhhxx EdmunddzzZ 冷夜梦 Poisson7 小球同学bbu zlllfy 从零开始的代码生活 murasameEM 大不列颠恰饭王 Aurora315 不到65kg不改名 MyYe AAAdmin Tarsss 白石Re NOSAE 要记得吃饭啊 _honghh 可爱的小美酱 wwsse BigClever 221801301邵涵洋 Recii 十年饮冰-难凉热血 陈修庆 Linzkk 6586744 Arturia_Xenon Scott233 turning-ch 都不吃大白菜 S灬J SakuChyan Fino- YangZhenXuan 童栀·不告而别 221801210