2017华为编程大赛总结
华为研发部门,每年都会在部门内部举办一届编程大赛。旨在让开发人员在工作之余,通过游戏编程的切磋,提高技术和协作能力。在入职华为的第四个年头,我终于如愿拿到了部门编程大赛的冠军。之前的每一年也都会参加,其中两次抱大腿拿到了亚军,一次因为太忙弃权了。这一届终于带队拿到了冠军,了却了一桩心事。在此,对之前的参赛经验和感悟总结一下,做一个纪念。至于下一届?应该不会再参加了。
1、比赛报名阶段
首先说说自己的感受,由于报名时是要确认队友的。而这里的队友不要求技术多精湛,但是一定要有责任心,也就是把这个比赛当回事。你忙的时候,他能帮你分担事情。你不忙的时候,大家可以一起讨论比赛算法和思路,互相勉励。有时候即使忙到很晚,但是作为一个团队,大家都没什么怨言。所以个人认为挑选队友是最最重要的事情。根据这几年的比赛经验来看,一个队伍要想拿到好成绩,真的不是一个高手带着一堆酱油就可以完成的。
2、参赛事宜
一般组织者会把比赛队伍的队长拉到一个群里。群里往往会第一时间发出框架bug,赛程变更,比赛规则安排等等事宜。所以在群里的队长一定要第一时间把群里获取到的消息,通知给组内的成员。先不说队友能做什么,至少做起事情来可以胸中有成竹。很多人只管问下自己想要知道的事情,对于其他人交流的话题往往不太关心,这是个很大的失误。。(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )比如比赛开发进度有人快,有人慢,往往可以通过群里的交流信息得到一些思路或者是提前知道比赛bug信息等。所以就算是在群里打酱油的人,也请把酱油打满。这或许就是所谓的情报工作吧。
3、代码编程
其实代码的算法并不是需要使用多么高效多么复杂的算法。但是一定要对整个的算法过程,在心中有一个思路。知道第一步做什么,第二步算什么,第三步解决什么,后续还需要做什么。比赛给的信息有什么,什么东西我们不能直接拿到,需要自己进行数据的生成。(如比赛地图的信息)。很多人往往在这一步就畏难而止步,其实大可不必。只要你写下第一行代码,后续的代码就可以渐渐的隐现出来,你需要做的就是一层层的拂去尘埃,看到潜意识中的算法思路。
4、算法思路的补齐
这个阶段主要是核心算法已经大概完成。但是细节处理起来往往不尽如人意。大部分时间,参赛选手的基本算法其实都差不多,真正分出排名高低的原因就是这一步。而这一步又是最考验人耐心的阶段。需要队员主要是反复的测试model,也就是比赛官方提供的默认AI,不断的进行比赛,翻出查看录像解决问题。如:
(1)为什么会死,死之前有没有出现重大失误。如果有的话迅速找出问题原因并且修复。如果没有重大失误是不是最初的基本算法思路就是有问题的。该怎么避免这种问题。重写还是优化。
(2)为什么会死的这么早,虽然说已经进入死胡同了,能不能用贪心思路多坚持一下,或许再坚持一下,往前边走就是柳暗花明了呢?千万不要这么早就放弃。
(3)为什么没有死,但是却输了比赛。是不是对分数的获取不够敏感。如何调整权重,如何能使优势最大化,甚至动态的调整策略权重。这些都对实战有重大的影响。当时我们在小组赛的时候输了一场。赛后反思原因,其中的一个重要原因是在下半场分数领先的情况下(而且是必胜的情况下)没有考虑上半场的分数落后了多少,从而出现了,明明可以赢,却输了的结果。
其它的思路还有很多,比如如何使代码跑的更快一点,虚拟机能否再优化下,内存会不会溢出,jvm会不会挂,如果抛出异常怎么办,如果处理异常时又有异常怎么办。如果自己的“棋子”两败俱伤,如何止损,达到伤害最小化,利益最大化。如果必死,如何玉石俱焚,使对手的伤害最大化。(oh my god 越想越多,想想自己当初的思路也是够疯狂的)总之这一步是整个比赛阶段拉开排名的重要环节。也就是查漏补缺阶段。
5、关于参赛事宜
自己的感觉是队伍内部最好有多次参加比赛经验的队友。往往某些忽略的比赛细节,以及赛前需要注意的事情,都可能最终会影响到比赛的走势。还有编程大赛中可能会有一些灰度的事情,这些该如何应对。所以不要完全忽略掉代码以外的事情。
6、比赛情况安排
在这届比赛中,我被项目组安排为其他小组的比赛裁判。所以一边在主持比赛,一边还要观察自己队伍的比赛情况(时间、地点、赛况等)。这里其实也是有重大失误的。虽然我赛前已经安排了队友去跟着观看比赛,以免有任何环境脚本等意外事故,但是比赛当时事情太多,完全无暇顾及。而我又是队长,队友完全不知道比赛的实际情况,导致很晚了,队友才给我打电话咨询比赛情况。幸好当时我们队伍所在组的裁判因为工作上的事情,开始比赛较晚,影响并不大,但是无论怎么样,这个错误很严重。关于这件事请看下文。
7、比赛临场工作
我们队伍所在的小组是H组,但是H组的环境有问题,应该是使用jre较老,导致虚拟机始终拉不起我们编的jar包。当时我已经主持完其他小组的比赛,急匆匆的赶来。我一方面让队友排查脚本问题,一方面跟H组的裁判解释,因为根据比赛规程,如果比赛时初选类似问题,只可以修改启动脚本,不可以再修复代码包括编包。最终在我们的要求下换了一台电脑,我们提交的jar包终于可以正常运行了。当时真的是十万火急,如果不是对赛制的了解,再加上之前的比赛经验,很可能直接就弃权了。因为当时的比赛已经只剩下和我们队伍相关的比赛了。其他队伍都在等比赛结果,而H组的裁判又在死命的催,这种时候来自外界的声音往往比平常会更大。
8、注意心态
在小组循环赛中,我们队伍的程序是最后运行起来的。而H组是公认的死亡之组,观看其他队伍的比赛,感觉他们的算法很完善,而我们的程序却死活不能启动。在和队友陆续尝试各种方法未果,猜测可能是环境问题,要求换电脑,最终看到程序正常启动时,真的是欲哭无泪。在和裁判的解释过程中,双发也发生了矛盾,我反复解释我们的要求是满足赛制规则的。这一点赛后我觉得非常重要,正是因为站在满足比赛规则的基础上,你的所作所为才能被称之为合理。。(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )弃权和冠军真的是一念之差,如果当时就放弃比赛了,觉得是生成的jar的问题,觉得是代码的问题,如果当时没派人跟队冷静的分析原因,可能结果完全不一样。
另外一个让人啼笑皆非的事情是,程序正常启动后,我们第一场比赛就输了。就是我在前文算法思路补齐阶段所说的问题。当时没有想到是分数计算的原因,只觉得自己的程序指令出现了“死循环”了。操作的“棋子”在绕一个很大的圈,一圈圈的走。当时心想这还比个毛线啊。还好后续的比赛地图不会再出现一些“特殊”的地形,导致我们的算法在临界点的判断上可能互相影响,综合起来造成一些很奇怪的现象。最终在16强中,我们队伍与H组的第一再次相遇,凭借对手算法一次重大失误(也有人说是算法超时)最终赢得了比赛,剑指总冠军。
比赛所能想到的事情就是这些了,谢谢你,2017;
谢谢你,我的队友们;
也谢谢你,我的对手们。