欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

2017华为编程大赛总结

程序员文章站 2022-03-29 11:33:48
华为研发部门,每年都会在部门内部举办一届编程大赛。旨在让开发人员在工作之余,通过游戏编程的切磋,提高技术和协作能力。在入职华为的第四个年头,我终于如愿拿到了部门编程大赛的冠军。之前的每一年也都会参加,其中两次抱大腿拿到了亚军,一次因为太忙弃权了。这一届终于带队拿到了冠军,了却了一桩心事。在此,对之前 ......

      华为研发部门,每年都会在部门内部举办一届编程大赛。旨在让开发人员在工作之余,通过游戏编程的切磋,提高技术和协作能力在入职华为的第四个年头,我终于如愿拿到了部门编程大赛的冠军。之前的每一年也都会参加,其中两次抱大腿拿到了亚军,一次因为太忙弃权了。这一届终于带队拿到了冠军,了却了一桩心事。在此,对之前的参赛经验和感悟总结一下,做一个纪念。至于下一届?应该不会再参加了。

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;

谢谢你,我的队友们;

也谢谢你,我的对手们。