软件工程实践2019第五次作业——结对编程的编程实现
deadline 1: 2019.10.19 23:00
补交deadline 2: 2019.10.22 23:00
零、写在前面的话
上次的结对作业中,大家做出了不同风格的原型设计,有一些是Web风格的,不少是移动终端风格的;采用的原型工具有墨刀、Axure等;有一些组还通过思维导图来细化功能逻辑;你们通过实践的方式,体会了从几段用户视角的文字描述,到初见软件原型的过程,掌握了原型模型开发的能力,学会了原型开发工具。这些,都将为你们下一个阶段的组队开始系统化的软件开发打下基础。在这些作业中,也看到一些不足:一些组抓的用户“痛点”不够准确和到位,很多组的原型就是一个简化或直男版的微信雏形原型,虽然这是一个社交软件,但和微信或QQ的区别是什么? 同时,这又是一个轻度使用的软件,做成独立的APP或web,是否会存在用户或活跃度不足的问题。采用什么样形式的原型,既要考虑到满足用户的需求,又要考虑到后期的推广和软件长远的生命力。所谓的“杀手”功能,就是要考虑到现实的痛点,又要比别人活得更“旺盛”。另外,大家对于结对的形式,也有了新的体会。两个人共同完成一份作业,互动交流,激荡创新。
一、编码要求
-
两人中一位同学在Github仓库中新建以“第一个学号&第二个学号”为名的项目;另一位同学fork该项目,有进展时pull request。单元测试不必上传。签入记录不合理的项目会被助教抽查询问项目细节。
github管理团队编码有这些参考:
GitHub 从单机到联机:玩转 Pull Request
如何使用github中的pull request功能? -
在开始实现程序之前,在PSP表格[附录1]记录下你估计在程序开发各个步骤上耗费的时间,在你实现程序之后,在PSP表格记录下你在程序的各个模块上实际花费的时间。
-
使用html+css+javascript实现,可以使用bootstrap这样的框架;请使用下载的框架文件,并使用相对路径引入到项目中;
-
你们需要合理组织你自己的目录结构(html, css, javascrip, 图片素材等,以及第三方框架),在博客中提供一份目录说明和使用说明,以供其他测试人员参照;
-
同时将这份目录说明和使用说明用markdown添加到项目的README文档,方便其他同学了解和使用你的项目,参考这里;
-
在测试时请用谷歌浏览器运行,以防效果不一致;请确保其他同学在下载你的所有文件后,用谷歌浏览器运行html文件就能展现预期结果。
-
重要:使用单元测试[附录3]对项目进行测试;并写出至少10个测试用例确保你的程序能够正确处理各种情况。
二、博客撰写要求
请参照博客评分规则部分。按点答题,保证完成所有方面,也能取得较高分数。
三、开启第二次结对编程
上上次是编程作业,上一次是美术作业,这次自然就是延续“学术家族树”的编程作业了:
需要在网页页面上呈现树形结构形式的师门树,树的节点,鼠标点击后是可以缩放的。同时,支持呈现多棵树并存、两棵关联树共存等形式。此外,尽情添加你喜欢的特点。
输入:
学术家族树以文本形式输入,web页面需要提供一个文本框;考虑学术家族树的文本格式是这样的:
导师:张三
2016级博士生:天一、王二、吴五
2015级硕士生:李四、王五、许六
2016级硕士生:刘一、李二、李三
2017级本科生:刘六、琪七、司四
其中,"导师:","级博士生:","级硕士生:","级本科生:"和"、"当做关键词处理;若有多组输入,中间空一行。
输出:
文本的呈现方式没有强制要求,可以自定义为普通格式或XML格式;树的节点,鼠标点击后是可以缩放的。同时,支持呈现多棵树并存、两棵关联树共存等形式。
四、作业提交须知
按时交:deline1之前,得实际分数100%
迟交:在deadline1后、deadline2前(写了作业没有在博客园提交)补交,扣实际分数 * 10%;一人作业迟交两人扣实际分数 * 10%;(没写作业补交)算0分。
缺交:在deline2后不在开放提交,该同学本次作业为负分,同时另一个成员扣实际分数 * 10%,请督促对方及时提交。
未完成作业必做项:本次作业为零分。
请确保在deadline1之前填写了结对表格,后续评分会使用到。没有在deadline1之前填写表格的,算总成绩*50%
微信班级群如果发布相关通知也是作业要求一部分,请及时查看群通知;
五、测试须知
1.本次作业不采用自动测试,而采用助教评分+各组互评的形式,各占50%。
2.各组请先在群内填写结对表,并在完成作业之后在表中填写Github项目地址。
3.互评方式参考了K班的互评方式,具体如下:
- 每组的成果需要接受另外3个小组的评分,评分小组为本组编号加x,x+1和x+2,超过总的组数就取mod。x在作业结束后公布
- 每个小组要为自己评分的小组,针对成果的各个方面给出评分理由;被评分小组有异议的,评分小组要给出解释;评分表请在结束后在群内查看。
4.参照被测评小组提供的目录结构说明,用谷歌浏览器运行,以防效果不一致;请每组同学确保其他同学在下载你们的所有文件后,用谷歌浏览器运行html文件就能展现预期结果。
5.请参考程序评分规则,确保你们的网页能处理那些问题。
六、评分规则
博客评分规则
1.在文章开头给出结对同学的博客链接、本作业博客的链接、你们队创建的仓库的Github项目地址;在群内填写结对表,并在完成作业之后在表中填写Github项目地址【1'】
2.给出具体分工【1'】
3.给出PSP表格【1'】
4.解题思路描述与设计实现说明【20'】
- 代码组织与内部实现设计(类图)【5'】
- 说明算法的关键与关键实现部分流程图【10'】
- 贴出你认为重要的/有价值的代码片段,并解释【5'】
5.附加特点设计与展示【10'】
- 设计的创意独到之处,这个设计的意义【3'】
- 实现思路【3'】
- 贴出你认为重要的/有价值的代码片段,并解释【2'】
- 实现成果展示【2'】
6.在博客中给出目录说明和使用说明【4'】
- 说明你的目录是如何组织的【2'】
- 测试人员如何运行你的网页【2'】
7.单元测试【10'】
- 说明你们选用的测试工具,是如何学习单元测试的,能出一份你自己的简易教程吗?【4'】
- 展示出项目部分单元测试代码,并说明测试的函数【3'】
- 说明构造测试数据的思路,你是如何考虑各种情况的?你如何考虑将来测试人员的***难?【3'】
- ps:上一次编程作业是比较欠缺的部分,请同学们认真完成此次单元测试,请看附录部分说明。
8.贴出Github的代码签入记录【1'】
- 请合理记录commit信息
9.遇到的代码模块异常或结对困难及解决方法【4'】
- 问题描述
- 做过哪些尝试
- 是否解决
- 有何收获
10.评价你的队友【2'】
- 值得学习的地方
- 需要改进的地方
程序评分规则
本次测试需要关注以下几个方面:
1.正确性【15'】
- 输出呈现的形式符合文本要求吗?
- 各种输入情形的处理:多棵树并存、两棵关联树共存等形式等等。
- 对于各种情况都有考虑并且正确展示的,可给满分
2.美观性【15'】
- 字符显示有无乱码?
- 结点展开流畅度怎样,点击可以展开吗?界面设计、树的设计、结点设计怎样?
- 主观性评分。不加修饰,但是树的行为正确的取最低分5分,在此基础上越漂亮分越高
3.方便【6'】
- 有没有README.md?里面的内容直观易懂吗?
- 网页操作方便吗?要想获取输出,查看树的某个节点,操作麻烦吗?
4.附加特点【10'】
- 你和你的队员有没有做其他人性化、方便的设计,效果怎么样呢?可以尽情思考,添加你认为好的特点。
七、附录
1.PSP表格
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 | 事后总结, 并提出过程改进计划 | ||
合计 |
一个功能完备的程序不是一蹴而就的。可将一个大任务划分为可操作的小任务,同时最好按照任务难度或紧急程度指定各个任务的完成次序。因此,在动手开发之前,要先估计将在程序各模块开发所需耗费的时间,以及完成整个项目所需的时间,将这个[估计值]记录下来,写成PSP 的形式。
PSP的目的是:记录工程师如何实现需求的效率,和我们使用项目管理工具(例如微软的Project Professional,或者禅道等)进行项目进度规划类似。
有关PSP的更多内容,请自行阅读邹欣老师的博客:工程师的能力评估和发展
2.Github
请阅读邹欣老师的博客:源代码管理,了解源代码管理的10个实践问题。
本次作业要求使用Github进行源代码管理,代码有进展即签入Github。签入记录不合理的项目会被助教抽查询问项目细节。
对代码签入的具体要求如下:根据需求划分功能后,每做完一个功能,编译成功后,应至少commit一次。具体的功能划分,请自行定义,并在撰写博客时体现出来,遵循自己对需求的功能划分来提交代码即可。
对Commit不是很熟悉的话,请阅读阮一峰的博客:Commit message 和 Change log 编写指南,了解更多细节。
3.单元测试
请根据自己以往积累的测试经验,在编码完成之后,提交产品之前,设计测试用例,并编写单元测试,对自己的项目进行测试。
首先,至少应采用白盒测试用例设计方法来设计测试用例,其他测试方法不限。其次,要设计至少10个测试用例,确保你的程序能够正确处理各种情况。最后,结合测试评估的要求,对自己的测试设计进行评价,这些测试用例能满足该程序测试的要求吗?
另一个重要的措施是要把单元测试自动化,这样每个人都能很容易地运行它,并且可以使单元测试每天都运行。每个人都可以随时在自己的机器上运行。团队一般是在每日构建中运行单元测试的,这样每个单元测试的错误就能及时被发现并得到修改。
推荐阅读邹欣老师的博客:关于单元测试和回归测试
重点
这是一个对于自学能力/信息搜集能力要求比较大的部分。
针对javascript的单元测试,这里有一些教程以供参考,如果你有更好的,可以在群内分享:
廖雪峰的javascript
测试框架 Mocha 实例教程
有哪些测试工具可以使用?这里有一些参考,如果你有更好的建议,可以分享出来:
10个可靠的JavaScript测试工具