记第六届中国软件杯决赛




经过7月份的初赛,我们成功晋级了中国软件杯的决赛。9月4号,我们启程前往南京参加决赛。

关于比赛:大学生软件设计大赛官方网站—中国软件杯全国大学生软件设计大赛组委会主办
我们的赛题:安全可靠赛题2:分布式爬虫系统 – 六届赛题 – 大学生软件设计大赛官方网站—中国软件杯全国大学生软件设计大赛组委会主办

第一天 签到

9月4号,正好是学校开学第一天,我们一大早出发前往南京。第一周的课就先翘为敬了。

我们的车次是刚上线运行不久的复兴号,有车载WiFi,看了下IP应该是移动的4G,速度很良心。而且小桌板比和谐号更大,简直是为了车上赶代码量身定制的(误。

我们的题目是A10分布式爬虫系统。路上全程在做之前还没有完成的功能,还有写作品简介,参赛心得等等。

中午过后到了南京信息职业技术学院,我们住宿的学校。跟着志愿者去签到,办入住等等。

我们住的宿舍,条件算不上很好,不过也说得过去。主办方很良心,在宿舍里给我们准备了脸盆,热水瓶,衣架等生活用品。

主办方发的原谅色的参赛衣服。要求比赛期间必须要穿,但是这个颜色实在太丑了些。

南信院的食堂,伙食还不错。

突然撸猫。学校里有超多猫和狗,而且都不怕人。

晚上回到宿舍,部署了一下开发环境,然后开始继续赶代码。临近比赛的时候已经不想再动爬虫的架构了,做了一些像是数据可视化之类的展示性功能。我们用京东上面爬下来的1w多条数据做了商品分类图,还有各个手机品牌的评价和销量的散点图。图上最大的那个圆是小米= =

忙活到了晚上快两点,把代码、文档和一堆文件打包刻盘,然后睡觉。

第二天 设备调试、开幕式

第二天起了个大早,出发去位于南京国际博览中心的场地。我们住宿的学校和比赛场地分别在南京的西南角和东北角,单程大概一个半小时左右,真是头大。

到了我们的比赛场地 —— 南京国际博览中心5号馆。上午的安排是设备调试,但是因为场地上的电和网络直到将近11点才可用,整个现场一团糟。虽然我们受影响不算很大,但是有的队伍是涉及到网络的赛题,没有网络几乎没办法运行,还有的队伍用的是台式机,电时不时断一下就太要命了。

因为过于闲得无聊,我开始把我们的爬虫对新浪博客做适配。我们的爬虫是自己编写的框架,但是之前只对京东做了适配。因为比赛同时要求可以爬取电商和博客,就顺便把新浪博客也适配了,反正工作量也不大(FLAG)。

我新开了个experimental分支,开始做新浪博客的适配。结果一发不可收拾。我做了新浪博客的适配之后,发现需要新增一个Redis队列,但是原来的Redis配置都是写死在一个Python模块里的,所以需要把Redis的模块抽象成一个类;然后我发现原来的多线程的架构对于爬取新浪博客来说简直慢得不可思议,所以改成了单线程加多个celery worker的模式;再测试的时候,我发现新建任务时,任务只能分发到一个worker上,所以我需要使用celery的广播机制将任务发送到所有worker…一次改动牵出了一大堆的问题,直到在前往南航的车上我还一直在改,而且在评审前一天还在大改架构,多少显得有些作死。

下午是大赛开幕式,规格不小,来了一堆省部级的领导,还有倪光南院士。内容基本是各种领导致辞,还有南航学生演出的尬歌尬舞尬剧。

开幕式之后回到宿舍,继续处理上午没有处理完的问题。因为我也没有太大把握能够解决问题,我们商定如果到晚上11点半仍然不能解决,就停止开发,并回滚到一个能够运行的tag,然后开始测试和演练。

不过运气还不错,问题很快就解决了,比想象中顺利很多。celery广播任务的问题我通过将broker从Redis替换为RabbitMQ解决了,但是由此引发了使用revoke命令无法停止任务执行的问题,我通过在revoke函数的参数中添加signal='SIGKILL'解决(默认为SIGTERM)。

之后把剩下的工作收了个尾,简单计划了一下演示的内容,然后演练了几遍,睡觉。

第三天 第一轮评审

到了比赛场地之后,因为昨天的网络和电力问题,我们有了额外的一个半小时调试时间。
然而
因为赛场提供的WiFi网络实在太慢(在赛场提供的网络下,我们的爬虫爬取一个页面的时间大概是我们测试时的5-10倍),大家都纷纷用4G开WiFi热点,结果导致2.4G频段拥挤不堪,甚至移动的4G网络都几乎无法使用,比赛群里一篇哀嚎。在尝试几次之后,我们用联通4G手机开了个5GHz的热点,才终于得到了还算满意的网速。

上图是2.4GHz的车祸现场,拥挤到几乎没法使用。心疼做智能家居题目的队伍。

我们几乎是最先开始评审的。我们演示了单进程爬取京东,然后大致讲述了一下设计思路。之后了启动10个进程,演示分布式爬取京东和新浪博客。同时演示正文抽取的三种算法。最后展示了京东和新浪博客的抓取历史记录查询,及京东爬取到的数据的可视化。

演示期间评委似乎不太关心架构设计和技术细节,也不关心在赛题中着重强调的性能,调度算法等,而更多关注成品的功能如何。评审过程中几乎只有一个女老师在和我们互动,其他评委一直在边上默默地听。评委向我们提问了大概两个问题,一个是关于我们的作品中使用了哪些开源项目或工具,另一个是关于docker相关技术。

演示结束过后,其中一个女老师又折回来查我们的文档。翻了翻过后告诉我们文档还是有些问题。这确实是我的锅,因为我把设计和实现混杂了,在设计里面写了很多实现细节。而且自从初赛作品提交过后,我们的文档就没有更新过。

评审完过后,去围观了一下别的队伍

这个队伍的题目是商业大数据的WiFi探针,桌上是一个树莓派集群。

然后去隔壁的软博会转了转

人工智障机器人。我问他明天南京的天气怎么样,他回复我说明天见哦…

摩拜单车的展台。展示了摩拜的历代智能锁和几辆技术验证车。

第二天的答辩需要做ppt,而且因为我们的文档仍然是初赛时候写的文档,所以需要大改。由于晚上才能知道能否晋级,我们决定等知道结果之后再开始做ppt,到了宿舍开始摸鱼,然后不知不觉就睡着了。凌晨一点的时候被志愿者的电话叫醒得知晋级。我们到签到点去抽了签,回来开始整理文档,做ppt和演练,一直忙活到4点。

第四天 答辩

今天是最后一轮答辩,将会从中决出第二批二等奖和特等、一等奖。

我们抽到的是19号,基本上要排到下午了。上午一边赶讲稿,一边听其他组的答辩。答辩的模式是6分钟演讲+4分钟提问。6分钟的演讲时间实在很紧,能讲完的队伍是少数。在我们之前只有一组爬虫,队伍名字叫迷。这一组把自己的作品放到了github上,博客上也写了非常细致(你简直想象不到有多细致)的开发日志和文档。

我们的演讲分为项目背景、架构设计、技术难点、核心优势和总结几个部分,排练时将时间控制在5分半左右。但是答辩并不顺利,6分钟的时间实在太紧,而且我讲架构设计部分的时候卡了几次壳,耽误了一些时间,以至于最后一页ppt没有讲完。

评委提问的第一个问题是关于爬虫的判重和反反爬机制。判重的问题很好回答,只需要利用Redis的集合功能,将每一个网址计算hash之后添加进集合即可。关于反反爬问题,我回答的是在请求中使用随机UA以及通过分布式的多个IP来避免被爬取目标封禁。这个回答显然不够好,因为随机UA并不能为反反爬带来很好的效果,而且受条件所限,我们也没法实现真正的分布式部署。比较合适的方案是代理池,但是优质的代理资源并不好收集。第二个是关于持续部署的问题,但是由于音响问题,我们在台上完全听不清楚评委的提问,场面一度很尴尬。

第五天 投融资对接会

今天的内容是上午半天的融投资对接会。参加对接会的创业团队用自己的赛题作为基础,向台下的投资人演示自己的创业项目。因为实在太累,一上午基本都趴在桌子上度过了,团队的演示只听了一小部分,不过用比赛的题目来创业,总觉得有点迷。

趁着空闲时候去软博会的其他场馆还有招聘会去转了转。

迷之电竞比赛

教育机器人

智能农业大棚

华为展台上循环播放的华为DevCloud的宣传片

复盘

最终我们获得了二等奖,以及最佳表现奖。

这次比赛,获得的成绩超出我的预期。在初赛期间,两位队友一个在实习,另一个在军训,我一个人在提交作品截止期限之前花了一周时间写出了初版代码,代码里全都是坑;决赛之前我一直在做软工小学期的项目和一个外包项目,几乎没有时间来优化作品,以至于直到决赛评审的前一天晚上我还在大改架构。

在初赛时设计爬虫架构的时候,我一直在是否使用如scrapy的爬虫框架上摇摆不定。根据比赛题目来看,评审所注重的是爬虫的调度,判重等(实际上并不是)。如果使用框架,这些事情都由框架来完成了,那么这个作品就没有什么意义了;其次,由于需要整合图形界面,多进程,Redis队列等,如果使用框架则可能会给整合带来麻烦。最终出于以上两个原因,我决定不使用框架。

在最终的决赛答辩中,所有的成果都仅通过6分钟的演示来展现。这确实有一些难度,决赛答辩中的大多数队伍都因为花了较大篇幅来讲并不是那么重要的技术细节,以至于时间完全不够用。如何在短时间内把工作成果的核心展示给评委,同样也是能力的体现。在路演中将自己的项目展示给投资人,或是把自己的产品推销给客户也是同理。不过,软件杯毕竟还是个以技术为核心的比赛,如果仅靠PPT来展示确实有失严谨,难免会出现用嘴写代码的现象。

组委会老师和志愿者们都很用心,管好近500人的衣食住行还有赛事本身确实不容易。但是比赛当中确实存在一些问题。最严重的是评审当天现场的网络状况实在堪忧。因为主办方提供的网络太慢,所以大家纷纷用手机开热点,结果导致2.4G频段拥挤到几乎无法使用,直接影响到了很多队伍的评审。一个软件比赛,评审现场的网络不可用,听起来就很魔幻。

其次,评审没有一个公开的,统一的标准,评委的主观性太强。很多评委的评审标准和侧重都互不相同,甚至有些评委的角度很刁钻。一个队伍几乎不可能满足所有评委的口味,如果有个公开的标准可以参照则会好很多。最终答辩的评委由高校和企业两部分组成,但是企业评委只能提问,不能打分。但是整个比赛的题目从硬件到软件到算法,跨越范围很广,不可能有哪个老师的知识面如此宽广。因此我很费解为什么不让企业评委加入打分,毕竟企业评委对自己出的题目最清楚。至于群里和知乎上很多人诟病的公平性问题,我认为没有什么讨论的意义,因为没有实质的证据,永远也讨论不出结果。

总而言之,还是一次很有意义的经历,学到了很多在学校中学不到的东西。




Posted

in

by

Comments

发表回复/Leave a Reply

您的电子邮箱地址不会被公开。/Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.