[软工顶级理解组] Beta阶段项目展示
团队成员
郭骏(https://www.cnblogs.com/sharinka0715/)
普通程序员预备一枚。喜欢编程,想要做软件。担任过计组助教,进行过一段时间的网页后端开发。自己没事也喜欢鼓捣一些无聊的小脚本、小程序。
希望在软件工程这门课上能够做出自己未曾实现过的级别的软件,相信团队的力量。
目前掌握技术:C/C++, Java, Python控制台编程,C# Winform开发,Django后端开发,(一定程度上的)Linux服务器维护
职位:PM
李嘉铖(https://www.cnblogs.com/bakahentai/)
什么都会一点但是什么都不精通,非ddl玩家,喜欢提前把任务做完。
希望在软件工程的项目上可以通过担任测试的岗位,学习其他人的代码风格和编程思想,提高自己的编程能力、设计测试用例的能力、执行自动化测试的能力,提高项目软件的质量。
目前掌握技术:C/C++, Java, Swift, Ruby和基础Rails框架, Python控制台编程
职位:后端开发
单彦博(https://www.cnblogs.com/shanyanbo/)
精通C语言,能熟练使用java,python,c++等语言,作为组长组织过无线网络系统项目的编写和集成,对团队工作有一定经验。本学期是我第二次参加团队项目,希望能有更多收获。
目前掌握技术:C, C++, Java, Python, Ruby on Rails.
职位:前端开发
胡彬彬(https://www.cnblogs.com/ilwf/)
能够熟练使用C,C++,python,java等语言,曾做过数据库课设,对于MySQL有一定的了解,自己也比较喜欢计算机图形学相关知识。在这次想进行前后端开发。
目前掌握技术:C,C++,Java,Python,MySQL
职位:后端
张艺璇(https://www.cnblogs.com/zhyixuan/)
个人属于ddl玩家,不过希望且愿意接受push。上学期安卓课上做过一点客户端开发。在这次软工中希望和大家一起做意思的项目,学习团队合作的经验。在这次团队项目中想做前端或者测试的工作。
目前掌握技术:C/C++, Java, python,安卓客户端开发
职位:前端开发
杜博玮(https://www.cnblogs.com/cuogeihong/)
C/C++,Java,Python均有所涉及,会用其中一部分内容。写代码时经常上网查函数定义。
我希望在这次软件工程的项目中担任前端或者后端的开发。有了PM和测试人员的存在,在团队中进行开发工作可以使我得到更多的收获。
目前掌握技术:C/C++,Java,Python,MySQL
职位:爬虫开发
孙旭东(https://www.cnblogs.com/ring-of-sun/)
来自高工大三计算机专业的老笨比,会使用python,C++,Java等编程语言,具有爱运动和死肥宅的双重属性,喜欢社交,为人友善,希望能在软件工程这门课上学到新知识,交到新朋友。
职位:前端开发
软件介绍
项目简介
这里是航胥,一款更懂你的教务助手。
我们团队做的是一款集课表查询、空教室查询、成绩查询、课程评价、校历查询、课程中心DDL查询等教务服务为一体的北航教务助手APP。
预期典型用户
北航普通学生
用户信息 用户情况 姓名 吉良吉影 用户身份 北航一位普普通通的学生党 用户动机 希望能有一个美观、迅速且无需手动导入的软件来查询课表、空教室、成绩等信息 用户困难 教务系统需要电脑操作,且界面透露出过时的气息,手机端的北航小程序运行速度慢 典型场景 通过手机查询自己的课表等信息 经常忘记DDL的冒失同学
用户信息 用户情况 姓名 广濑康一 用户身份 对日期和DDL不敏感的同学 用户动机 希望能有一款产品时刻查看、提醒自己作业DDL,且无需手动导入 用户困难 课程中心没有手机相关的适配,且电脑端访问课程中心比较麻烦 典型场景 通过手机端直接收到了作业DDL的截止信息,立马投入工作 对定制化有要求的同学
用户信息 用户情况 姓名 岸边露伴 用户身份 对软件的自定义有一定偏好的同学 用户动机 希望教务软件能够按照自己的需求进行一定的定制 用户困难 课程中心没有手机相关的适配,且电脑端访问课程中心比较麻烦 典型场景 上课周将主界面设置为课表,考试周结束后将主界面自定义为成绩 想评价课程的同学
用户信息 用户情况 姓名 东方仗助 用户身份 很想了解课程评价,以及参与评价的同学 用户动机 希望能有一个有学校开设课程信息的软件,供大家分享不同课程的口碑 用户困难 目前市面上没有这种东西,只能靠大家在微信群口口相传 典型场景 通过航胥来查询课程评价
功能描述
模块 | 功能介绍 |
---|---|
登录绑定 | 使用北航的统一认证账户登录,即可在APP上看到数据。当然密码错误是看不到的。 |
课表查询 | 自动从教务网站获取课表并展示 |
课程评价 | 对北航开设的课程进行打分、评论、给老师点赞,且可以对评价进行点赞 |
DDL查询 | 自动从课程中心网站获取所有课程的“作业”信息并展示 |
DDL通知 | 我们会在DDL截止前24小时向您的手机发送推送通知,提醒您完成DDL |
校历查询 | 查询学校校历,并与课程中心DDL结合,显示待办事项 |
用户反馈 | 在软件内设置页面获取用户意见和建议 |
成绩查询 | 自动从教务网站获取学生成绩并查询,同时计算GPA和加权平均分 |
主页设置 | 用户可以自定义主页需要展示的内容 |
版本更新 | 当软件有更新时,会自动提醒到用户 |
预期目标用户数
- 发布一周内注册用户数:400人
- 发布一周内主动查询次数:4000次
下面是实际使用人数统计。因为我们的推广方式是朋友圈等社交网络,所以在Alpha阶段,组员社交圈内的用户数量已经趋于饱和。Beta阶段使用朋友圈和大班群推广无济于事。
为了进一步扩宽用户,我们组员尽力发给了所有认识的外系的同学,包括但不限于1系、2系、3系、4系、17系、21系、高等理工学院、高研院等。最终,我们的用户数定格在此表。
时间 | 注册人数 | 课表访问次数 | 成绩访问次数 | DDL访问次数 | 空教室访问次数 | 登录次数 | 校历 |
---|---|---|---|---|---|---|---|
发布前 | 210 | 0 | 0 | 0 | 0 | 0 | 0 |
6/3 | 262 | 2799 | 333 | 180 | 16 | 94 | 292 |
6/4 | 285 | 3809 | 475 | 259 | 18 | 129 | 353 |
6/5 | 301 | 4549 | 652 | 330 | 19 | 158 | 413 |
6/6 | 347 | 5787 | 987 | 415 | 26 | 313 | 492 |
6/7 | 355 | 6338 | 1080 | 467 | 26 | 324 | 532 |
6/8 | 377 | 7174 | 1204 | 548 | 30 | 355 | 588 |
6/9 | 379 | 7547 | 1259 | 578 | 31 | 359 | 605 |
用户反馈
在Beta阶段,我们设置了用户反馈页面,用户可以直接在个人中心—用户反馈页面将对软件的意见反馈到服务器后台。如果是BUG方面的反馈,我们会及时进行修复。其他方面的反馈如图所示:
团队管理
分工协作
我们团队没有将开发和测试人员分开,而是让每部分的开发人员兼任测试,这是考虑到我们需要开发的板块本身就较多,且功能之间沟通性强,可以由不同的开发部分之间进行互相测试。
团队分工如下:
人员 | 岗位 | 职责 |
---|---|---|
孙旭东、单彦博、张艺璇 | 前端 | 进行Android软件界面开发 |
胡彬彬、李嘉铖 | 后端 | 进行服务器交互逻辑代码编写 |
杜博玮 | 爬虫 | 负责从教务获取学生数据存到数据库 |
郭骏 | PM | 监督工作、写博客 |
在近一个月的开发测试过程中,我们这套团队制度的优点和不足都有所体现,也让我们吸取了不少的经验教训。
- 优点:开发效率高,部门之间通过接口交流,耦合度低,测试出bug时能够很快定位到bug所在。
- 缺点:由于缺乏专门的测试人员,只是在每个功能上线前进行本地测试,难以产出很详尽的测试数据。不过在Beta阶段项目框架完成,开发技术趋于熟练之后,Alpha阶段在测试阶段爆出大量BUG的现象不复存在。这代表着我们团队的磨合更上了一层楼。
项目管理
Repository
将前端和后端的仓库分开,分别维护不同语言的代码,以不同的标准进行开发。
Pull Request & Code Review
所有代码签入使用PR进行,而所有PR需要经过负责人的Review。这样可以有效避免提交冲突,且代码复审会减少设计阶段出现的bug数量。
Issue
我们项目的所有任务放在Issue中,每个Issue都绑定着对应的开发人员,且有PR的Issue都会和PR绑定。Issue的性质和工作量标签可以帮助我们更好的进行项目的时间管理,在计算贡献分时也有更加具体的数据。
Code Style
前端遵循Dart语言的一般代码规范。由于Android Studio没有合适的适配Dart语言的Checkstyle配置文件,所以我们主要靠AS自带的Reformat功能对缩进换行等进行限制,而变量名、程序结构等其他风格由组员自行维护。
后端和爬虫使用Python,我们使用pylint和pylint-django第三方包对代码进行静态检查,并配置了适合于我们项目的.pylintrc配置文件。目前提交到主分支中的每一个commit都要求通过代码风格检查。
GitHub Action
后端和爬虫的代码中设置了GitHub的Action,每次commit或merge时自动触发。Action会检查代码风格,并运行Django单元测试。如果有一项不通过,则PR不会允许通过,需要重复修改。
Documentation
除了在仓库的主目录下编写合适长度的README.md文件,我们项目的所有文档维护在GitHub Wiki中。Wiki文档中包括编译运行指导、接口规格说明、错误处理说明、更新日志等详细信息。
取舍平衡
我们想做的事情有很多,在Beta阶段我们依然无法一一完成。我们在纠结中,选出了以下几个功能作为优先开发项:
用户呼声较高的内容
校历查询、意见栏、iOS版(因为苹果开发者账号688一年被劝退)
效率问题
爬虫彻底重构——从selenium换成requests包,内存占用大大降低,并且登录速度大大提升。所使用的爬虫服务器数目由4个降低到2个。
“杀手功能”
课程评价——我们项目规划时的核心,也是和DDLKiller项目组试图区分开的功能
不得不放弃的功能
考期考表查询,因为一直到发布阶段才出数据,所以在这之前爬虫没法做,我们也无法实现。
博雅课程功能,因为本学期博雅叫停,无法测试,所以我们没有实现相关功能。
代码管理
程序测试
Alpha阶段单元测试:测试用例47个,测试覆盖率78%。
Beta阶段单元测试:测试用例94个,测试覆盖率88%。
使用django-coverage工具测试覆盖率,我们录制了单元测试的视频以供播放。
前端没有进行单元测试,因为Flutter框架不同于原生Android,没有合适的覆盖率插件来帮助我们进行测试。且前端本身逻辑较为简单,常规的用户使用已经足够测出许多错误。所以前端的测试通过在测试阶段有限分发我们的apk安装包来进行。
代码规范
Alpha阶段,我们没有对代码规范提出过多的要求。Beta阶段,我们吸取了之前的教训,有了一定的进步。
前端遵循Dart语言的一般代码规范。由于Android Studio没有合适的适配Dart语言的Checkstyle配置文件,所以我们主要靠AS自带的Reformat功能对缩进换行等进行限制,而变量名、程序结构等其他风格由组员自行维护。
后端和爬虫使用Python,我们使用pylint和pylint-django第三方包对代码进行静态检查,并配置了适合于我们项目的.pylintrc配置文件。代码风格检查在GitHub平台上使用Action功能进行了自动化部署,每个commit都需要通过代码风格检查。
为了改进我们Alpha阶段堪称混乱的代码风格,我们在Beta阶段伊始引入pylint时,将一条条报错suppress的过程,工程量几近重构。但是最后做出来的成果是值得的,如今的代码非常整齐清爽,格式整齐。
文档撰写
在之前已经提过。除了在仓库的主目录下编写合适长度的README.md文件,我们项目的所有文档维护在GitHub Wiki中。Wiki文档中包括编译运行指导、接口规格说明、错误处理说明、更新日志等详细信息。
继续开发指导性
如果有下一届同学接手我们的项目,并且具备相关框架的基础知识,是能够很容易上手我们的项目的。原因如下:
- 我们使用的是现成的框架,启动方式是现有框架的常见启动方式。
- 我们的文档中有对新手较为友好的编译指导说明,可以帮助用户上手我们的项目。
- 我们的文档中有详细的功能和结构说明,代码中也有足够的注释来指导新人上手。
- 抛弃selenium后,我们的依赖安装过程几乎不存在难点,只需要用pip安装requirements.txt即可上手。
用户沟通
需求分析
从立项开始调研到的需求“做一款像同袍一样的软件就好”,我们在Alpha阶段靠着方便的DDL查询功能,吸引到了200位用户,也展现出了我们能和同袍、北航小程序等不一样,我们有我们的优势。我们更快捷、功能更多样、迭代开发更及时、界面更丑。
但Alpha阶段收到的用户反馈较少,依然没有什么新功能,所以我们只能沿着我们先前规划的道路走。通过之前提到过的一番取舍之后,我们最终产出了现在的项目。
数据分析
我们对从用户收集到的数据,画出了用户数量随时间变化的折线图。
可以看到,因为我们在发布的一周中每天都在推广,所以我们的数据增长较为平稳。但总的来说,没有达到我们的预期400人。其主要原因有:
- 没有像预期一样开发出iOS版本,导致没有争取到占比不小的iOS用户。
- 考期阶段,大家对课表查询、课程评价等的需求大大降低,而可能有高需求的内容(比如考表查询等)我们并没能实现。
软件发布
发布文档:(博客发布公告)
https://www.cnblogs.com/se2020djlj/p/13034817.html
发布位置:大班群,朋友圈,委托进行“口口相传”。
用户反馈截屏:
最终燃尽图:
(后端最后一个是PM的贡献分统计)
我们认为,燃尽图较为真实的反映了我们项目的状态,项目如同燃尽图一样平稳推进。因为燃尽图绑定了issue,而issue绑定了PR,所以燃尽图上的每一个节点,都是我们的代码。
前端的曲线相较于预测实线偏上,原因是当时前端存在部分技术难题,加上大家计网实验比较忙,卡了比较久的时间,在之后催更一波进度之后渐渐好转。
团队贡献
我们的评分思路遵循以下原则:
- 不同开发部门之间的代码行数、PR数目等不能直接比较。
- 综合考虑Bug数开发issue数目。
- 不对开发完成的时间做出奖励。
下面是Beta阶段个人代码提交量。代码行数使用git log输出,等于增加行数减去删除行数。只计算5月12日之后的commit。
姓名 | 贡献分 | 量化贡献 |
---|---|---|
孙旭东 | 53 | 代码行数1411,Pull Request 12个 |
张艺璇 | 51 | 代码行数1926,Pull Request 8个 |
单彦博 | 48 | 代码行数818,Pull Request 22个 |
李嘉铖 | 52 | 代码行数823,Pull Request 30个 |
胡彬彬 | 47 | 代码行数611,Pull Request 11个 |
杜博玮 | 50 | 代码行数813,Commit 46个 |
郭骏 | 49 | PM,会议记录14篇,博客作业9篇 |
功能展示
在答辩时使用模拟器演示。
我们Beta阶段的特色功能——校历和课程评价,是我们着重需要介绍的部分。
总结
所学到的
- 团队的力量是伟大的,众人拾柴火焰高,可以做到许多难以想象的事情。
- 庞大的任务可以分解为多个小任务,逐个击破。
- 软件质量、运行速度、开发时间很难做到三者兼优,取舍和得失也是敏捷开发的魅力。
- 给北航学子一个DDL,真的可以创造奇迹。
- 无脑撸代码不是唯一,代码规范、项目管理、合理规划、充分调研都是软工不可或缺的部分,磨刀不误砍柴工。
课程建议
- 做推广、发布是一个不小的门槛,用户群体越广阔的项目反倒更对推广无所适从。如果没有用户量的要求,课程内是否会有更多的组选择开发更有意思的项目呢?
- 如果课程组认可,我们的软件是否可以交由下一届继续开发?