软件工程第一次作业
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/SE2020 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167 |
这个作业的目标 | 制作一个程序统计和分析 GitHub 的用户行为数据 |
学号 | 031802208 |
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
Estimate | 估计这个任务需要多少时间 | 30 | 20 |
Development | 开发 | ||
Analysis | 需求分析 (包括学习新技术) | 120 | 240 |
Design Spec | 生成设计文档 | 20 | 20 |
Design Review | 设计复审 | 30 | 30 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 30 |
Design | 具体设计 | 40 | 30 |
Coding | 具体编码 | 180 | 360 |
Code Review | 代码复审 | 30 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 180 | 300 |
Reporting | 报告 | ||
Test Report | 测试报告 | 20 | 30 |
Size Measurement | 计算工作量 | 30 | 30 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 180 | 200 |
合计 | 1060 | 1350 |
一、数据来源:
GH Archive
二、题目要求:
本题目会关注以下的信息类型:
1、PushEvent
2、IssueCommentEvent
3、IssuesEvent
4、PullRequestEvent
需要统计以下内容:
1、个人的4种事件的数量
2、每一个项目的4种事件的数量
3、每一个人在每一个项目中4种事件的数量
三、编码要求:
·C++、Java、Python三选一
·有一定的代码规范
·使用git版本控制
四、评测环境:
GitHub Actions
五、格式要求:
- 执行文件为
GHAnalysis
,拓展名依所选语言而定,注意 Linux 操作系统文件系统区分大小写。 - 初始化
- C++:
GHAnalysis <--init|-i> <path to data>
- Java:
java -Dfile.encoding=UTF-8 -jar GHAnalysis.jar <--init|-i> <path to data>
- Python:
python3 GHAnalysis.py <--init|-i> <path to data>
- C++:
- 查某用户的某事件数量运行格式:
- C++:
GHAnalysis <-u|--user> user <-e|--event> <PushEvent|IssueCommentEvent|IssuesEvent|PullRequestEvent>
- Java:
java -Dfile.encoding=UTF-8 -jar GHAnalysis.jar <-u|--user> user <-e|--event> <PushEvent|IssueCommentEvent|IssuesEvent|PullRequestEvent>
- Python:
python3 GHAnalysis.py <-u|--user> user <-e|--event> <PushEvent|IssueCommentEvent|IssuesEvent|PullRequestEvent>
- C++:
- 查询某项目的某事件数量运行格式:
- C++:
GHAnalysis user/repo <-r|--repo> user/repo <-e|--event> <push|IssueCommentEvent|IssuesEvent|PullRequestEvent>
- Java:
java -Dfile.encoding=UTF-8 -jar GHAnalysis.jar <-r|--repo> user/repo <-e|--event> <PushEvent|IssueCommentEvent|IssuesEvent|PullRequestEvent>
- Python:
python3 GHAnalysis.py <-r|--repo> user/repo <-e|--event> <PushEvent|IssueCommentEvent|IssuesEvent|PullRequestEvent>
- C++:
- 查询某用户在某项目的某事件数量运行格式:
- C++:
GHAnalysis <-u|--user> user <-r|--repo> user/repo <-e|--event> <PushEvent|IssueCommentEvent|IssuesEvent|PullRequestEvent>
- Java:
java -Dfile.encoding=UTF-8 -jar GHAnalysis.jar <-u|--user> user <-r|--repo> user/repo <-e|--event> <PushEvent|IssueCommentEvent|IssuesEvent|PullRequestEvent>
- Python:
python3 GHAnalysis.py <-u|--user> user <-r|--repo> user/repo <-e|--event> <PushEvent|IssueCommentEvent|IssuesEvent|PullRequestEvent>
- C++:
- 输出格式为单独的数字。
六、运行格式:
- 会先运行一次初始化指令,然后在运行其他指令。
- 多个参数顺序不一定一致。
<path to data>
是一个文件夹。
七、数据范围:
- 数据文本小于 10GB。
八、学习步骤:
(一)学习git的使用(包括git的基础指令、如何将自己代码上传到repository)
1、首先去官方网站下载git:
官方网址:https://git-scm.com/
2、默认安装到自己电脑上(略)
3、在自己电脑目录下创建版本库、github关联到自己的仓库:
练习git的基本代码的使用:
SSH keys的创建:
关联成功后,可以在github对应的仓库内看到提交(一个测试文件):
4、补充git的原理:
5、参考链接:
Git的基本使用+基础命令:https://www.cnblogs.com/imyalost/p/8762522.html
Git如何关联到GitHub:https://www.cnblogs.com/imyalost/p/8777684.html
(二)代码实现:
1、问题分解:
初看本题,感觉一头雾水,看题目要求是解析json文件,然后对数据进行处理,统计4种类型文件的信息。阅读示例代码,且考虑到python自带json模块,所以决定还是用python来解题。
主要步骤:1.指令的解析2.Json文件的解析3.数据处理
2、关键代码:
__init()
#对文件读取,统计并生成结果文件,完成初始化。
def __init(self, dict_address: str): self.__4Events4PerP = {} self.__4Events4PerR = {} self.__4Events4PerPPerR = {} for root, dic, files in os.walk(dict_address): for f in files: if f[-5:] == '.json': json_list = [] json_path = f x = open(dict_address+'\\'+json_path, 'r', encoding='utf-8').read() str_list = [_x for _x in x.split('\n') if len(_x) > 0] for i, _str in enumerate(str_list): try: json_list.append(json.loads(_str)) except: pass records = self.__listOfNestedDict2ListOfDict(json_list) for i in records: if not self.__4Events4PerP.get(i['actor__login'], 0): self.__4Events4PerP.update({i['actor__login']: {}}) self.__4Events4PerPPerR.update({i['actor__login']: {}}) self.__4Events4PerP[i['actor__login']][i['type'] ] = self.__4Events4PerP[i['actor__login']].get(i['type'], 0)+1 if not self.__4Events4PerR.get(i['repo__name'], 0): self.__4Events4PerR.update({i['repo__name']: {}}) self.__4Events4PerR[i['repo__name']][i['type'] ] = self.__4Events4PerR[i['repo__name']].get(i['type'], 0)+1 if not self.__4Events4PerPPerR[i['actor__login']].get(i['repo__name'], 0): self.__4Events4PerPPerR[i['actor__login']].update({i['repo__name']: {}}) self.__4Events4PerPPerR[i['actor__login']][i['repo__name']][i['type'] ] = self.__4Events4PerPPerR[i['actor__login']][i['repo__name']].get(i['type'], 0)+1 with open('1.json', 'w', encoding='utf-8') as f: json.dump(self.__4Events4PerP,f) with open('2.json', 'w', encoding='utf-8') as f: json.dump(self.__4Events4PerR,f) with open('3.json', 'w', encoding='utf-8') as f: json.dump(self.__4Events4PerPPerR,f)
(三)性能测试:
通过pycharm里的profile生成,截图如下:
九、代码规范链接:
https://github.com/helttt/first-repository/blob/master/text.md
十、个人总结:
受限于自身python代码的水平,我只能靠吃“百家饭”,一口一口地研究示例代码,一点一点研究每一句代码的含义,依葫芦画瓢地修改,最终才顺利编译运行。这个过程非常艰难,但我想这是每一个同学学习的必经之路,只是有的人能提前吃苦,而我是接到任务以后被动地学习——自以为格外痛苦罢了。客观的说,由于自己完全没有接触过python语言,所以这次任务在python学习上花费了太多的时间(尽管这门语言真的很方便易学)因此我个人的反思是,在这次的作业之后,会专门花费一段时间系统地学习python代码,而不是查一点用一点。再切实地应用到我的课程作业当中,经验告诉我,这样边学边做印象会很深(我的SDN和Linux也需要用到python)
然后这一阶段很不熟悉的码代码经历,也让我明白,要充分重视我遇到的任何一个“问题”——再小的问题也要刨根问底。举个例子,我前面“git的使用”花了一整天,面对一个命令行的错误束手无策,最后只能推翻了重来。结果再重来的时候,发现是自己在参考csdn的博客时,漏输入了夹在文字中的一句命令——尽管那个地方很不明显——但就因为学习、看文字的不仔细,导致我浪费了一整天的时间排查一个非常简单的错误。
总结以上两点,简而言之就是,花时间去精深python的使用,知行合一多多操练;另一方面就是,杜绝细节犯错,认真仔细,重视每一次写代码和debug的经历。