3月22号的时候我们这边工创的省赛结束了,省排前三都是我们学校的队伍,我们排第二,因为我们学校只有一个名额,没能进国赛,可惜没能去国赛现场看看,要止步于此。
意外发生全过程
其实如果我们最后一次能够正常跑完的话,至少是有9600的,我们省第一名才9400,是完全有机会拿下省一进国赛的。
这次的失败虽然是不可抗拒的因素引起的,但是我们的处理还有之前的策略也不能说没有问题,其实这个事情如果处理得好还是可以解决的。
不可抗拒的因素就是在17点20多分的时候,我们测到一半校园网断了,当时我们是差不多16点50的时候开始测的,测这一次的时候我们也觉得这个应该是最后一次测了,测完不够时间测下一次了。
开始测试的时候,因为知道这很有可能就是最后一次测了,所以队长也是非常紧张,激动的心颤抖的手,当时第一名才9000分,我们保守估计至少都有9600。所以队长也很激动,我们也是一边乐一边跟队长说不要紧张,一样的代码之前测能过现在也能过的,记住这句话,最后要考。我们都在跟队长说这把稳了,队长还在看着摇摇晃晃的小车在那里一边激动一边紧张,我当时也是乌鸦嘴说了句,万一到时候测到最后一个案例校园网炸了,他们还开玩笑说如果这样的话我们可以直接从这里跳下去了。
其实这个也不能完全说是乌鸦嘴,因为校赛的时候最后一次全程是我测的,当时就出现过在最后5分钟的时候服务器炸了,也是因为这个我们校赛也没拿到第一,但是这次看时间应该也不会到最后5分钟,之前最后5分钟炸可能是提交的人太多了,但是这次应该不会拖到这么后面,所以我也只是开开玩笑,没想到这次真的是校园网断了。
测案例其实是个很无聊的事情,就是每个案例结束下个案例开始前运行一下程序,我测的时候都是直接挂着脚本自动测试的,也像我们之前说的,一样的代码又不会跑出不一样的结果,所以我测的时候连录像都懒得看,都是调试的时候看过好多次的东西。或许是最后一次测试,队长非常有仪式感的在手动测试,并且每个案例都点开看录像,跟着小车在那里摇晃。
一开始我也跟着一起在那里兴奋,后面还是觉得挺无聊的,就坐旁边玩手机,一边刷知乎一边切QQ看群里有没有人说话,然后切着切着QQ就开始转圈了,然后跳了个未连接,然后我随口一句,草校园网断了,说完我一抬头看见他们3个都在看我,我问他们怎么了,他们说他们那里也断了,我过去看,他们说那个启动测试中已经卡了好久了,应该是校园网炸了。
虽然没有到最后一个案例才炸,但是现在炸的话剩下的时间可能也不够我们跑完全程了,我们也没有犹豫马上停止了那个测试然后跟组委会说了校园网断了我们换流量重新测,然后他们跟组委会说了可能时间不够,组委会说可以开四倍速测。
这个东西我们之前也开来试过几次,感觉没有什么明显变化,所以一直没有开过四倍速,这次因为突然发生了这个事情,大家都很急,尤其是队长,毕竟他是队长,这个比赛对他来说好像非常重要,所以他承受的压力可能也比我这种其他院拉来的普通队员要大,所以在最后测的时候,不管有没有用他都开了四倍速,可能也只是想图个心理安慰。
虽然很急,但是这种情况下其实我也什么事都做不了,我就是个过来写代码的,我能做的事情在最后一次开始测试之后就已经没有了,所以在一切回到正轨之后,大家的情绪稳定下来之后,我又回去旁边用流量刷手机了,还有时不时看一眼省排名,看有没有新的最高分出现。
中间有人提议,时间不够的话把那些不能通过的案例直接删了不测了,然后他们又开始一边翻着第一次测的报告把没通过的案例一一念一遍,问有没有人改过,没有就叫队长删了,节省时间,队长就在每个案例开始之后点个四倍速然后就去删案例,之后队长好像也没有一直盯着录像看,如果他当时有看录像,或许就能及时发现问题,损失就不会这么大,但是话也不能这么说,毕竟谁都没想到还会再出事。
过了18点了,我们跟考场老师说了情况,在结束之后10分钟内没有跑完还可以继续测,只要能及时上传成绩。等零几分跑完的时候我们一看评分人都傻了,8700多分,然后再一翻评分,1、2、5这种之前没出过问题的案例直接失败了,还有有几个案例出现了没有见过的扣分(那几个扣分是我修的,只有第一次测的时候扣过分,后面都没有问题的),还有后面500分的39题也炸了,后面39看回放确实炸了,但是我们再测没有问题,直到我们怀疑是四倍速的问题,开了四倍速测,确实炸了。
后来我们联系组委会说明了情况,组委会说这个是因为我们用了时间相关的函数,我才想起来是那个PID的问题。其实这个平台应该是锁帧率的,都是计算完一帧才下一帧的,而且有些案例能够明显看出时间流逝和现实不一样,这个PID就不应该用系统时间间隔的,应该直接用固定时间的帧就行了的。
后面我们虽然嘴上都说着要申诉,但是我们应该都知道这个申诉是不可能通过的,而且申诉是对评分有疑问拿报告去申诉的,不是对运行有疑问拿代码去申诉的。如果组委会真的会拿我们的代码去运行一遍重新给我们评分,那只能说是不幸中的万幸了。
可以避免的情况
其实我们的策略或者说合作是有问题的,因为之前都是各自为战,而且改动几乎没有,就我和队长两个人使用平台。然后这次线下赛,题目改动较多,不是我和队长两个人能够解决的,这种情况理应在第一次跑完全程的时候记录每题的问题,然后安排每个人的分工,但是我们即没有记录问题也没有事后看回放分工,导致我们大部分时间是闲着的,然后我和队长两个人同时盯41题。
其次,我们应该在修好41题之后跑一次全程先拿一个较高的分的,我们在修好41和一些其他案例之后也差不多9000分了,如果这时候测了一次我们应该会较长时间保持第一。
还有就是我们之前的问题,现在想想所谓的玄学问题其实就是PID引入的随机性。为什么有些代码改了刹车距离,在我的电脑上能跑换个人又不能跑,为什么会出现每次测试都有概率玄学压线。我是里面代码能力最强的,我看见等待帧和获取下一帧还有测试的时间流逝居然一直没想到这个平台是以固定帧率运行的,是逻辑帧不是物理帧,我应该早点把那个PID的获取系统时间的方法改掉,或者跟他们说不要用PID。
还有就是急了,开了四倍速这个不知道有没有副作用的东西,不过这个确实大家都不知道,也不为过吧。
还有就是因为我们没有意识到那个PID的问题,所以认为一样的代码跑出来的结果都一样。队长也是在后面急了,在一直翻案例列表也没看录像,如果看的时候发现了哪怕一个案例炸了,发现了四倍速有问题,后面及时把四倍速停下,只要保住了39题的分,我们还是能进国赛的。
最后
其实我一直都对那个代码不满意,我也是第一次见到这种屎山,我看见它的第一眼就想重构了,虽然我写的代码也谈不上非常优雅,但是我觉得还是比这个东西好点。但是没有办法,受到时间和精力的限制,而且主要是,这是团队赛,而且我只是一个他们找来的外援,我不可能对这个代码进行大改,并且要求他们按照我的想法来写,所以只能保持原样,然后我再继续堆屎。
之前我也跟他们提过几次,他们也说如果进了国赛就让我重构代码,一方面是准备的时间多了,另一方面可能他们也没有想过能拿什么奖,就是去一日游拿个国三,到时候代码什么的无所谓了。
不过可惜还是没进国赛,我连怎么重构都想好了,而且我心里实在是放不下,不是因为这个意外没进国赛,我在意的是这个代码,我想知道我能写出多优雅的代码去参加比赛,而且调试的时候看着小车跑也挺好玩的。不过多亏了这次机会,我接触到了这个比赛,并且获得了一份代码和经验。
立下flag,明年我要拿着重构的代码再次参加比赛,下一次我要一个人参加。