软件工程第一次作业

这个作业属于哪个课程https://edu.cnblogs.com/campus/fzu/SE2020
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167
这个作业的目标 制作一个程序统计和分析 GitHub 的用户行为数据
学号 031802208

 

PSP2.1Personal 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++: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++: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++: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>
  • 输出格式为单独的数字。

六、运行格式:

  • 会先运行一次初始化指令,然后在运行其他指令。
  • 多个参数顺序不一定一致。
  • <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的经历。

posted @ 2020-09-16 22:47  helttt  阅读(248)  评论(2编辑  收藏  举报