距离华为无线第七届编码大赛结束已经快一个月了,尽管心中一直想着要好好总结一下,但之前由于其他一些原因一直没有总结,今天趁着要开这个总结会议的原因,理一理,只为下一次做的更好。
在华为无线第七届编码大赛之前一个月左右的样子,我同时也参加了华为成研所的编码比赛,结果就不提了。面对高手如云的华为,当初也只是抱着试试水的态度去体验了一把而已,得到那样的成绩也不意外,今天就不在这里多废话了……
在本次比赛中,深深的意识了以下几个方面的问题,现总结如下:
团队方面:
做为团队的领头,我是从以下几个方面去做的工作:
一、要对整个开发需求了如指掌,了解比赛的每一个细节。作为团队的领队,如果没有了解尽可能详细的需求,那么比赛的进度怎么安排,比赛的任务怎么分配,你将无从下手。
比赛时间为三天我的概要计划如下:
- 第一天详读任务书,明白开发需求,完成程序的消息解析发送,人物的简单控制。这一点我们当初在做的时候忽略了赛制中的规则,自己在那里想当然。在每次比赛中有两个子场比赛,每回合都有积分,官方的规则是两场分数之和谁最高,谁就赢了。结果我们的想当然理解是,只要我能够把对手全干掉我就赢了,结果不然。虽然这一点规则对我们整体的开发没多大影响,但从侧面就反应出一个问题:我们没有真正的熟悉需求。第一天的开发工作,协调工作我个人觉得都做的很好,大家轻松加愉快的都完成了,当然这一天晚上我们都没有熬夜了。
- 第二天完成基本策略的开发,发布基础版。第二天就是完成基本策略的开发,怎么去抢箱子,怎么去围杀对手。在第二天晚上经过几番优化我们的基础班发布出来了。心中十分欢喜。
- 第三天完成加强版的开发,发布加强版。由于在线对战平台的帮助,我们也在不断的用我们的程序去挑战其他参赛队,不断的完善我们的代码。在完善的过程中,代码的维护就显得比较费力,主要就体现在前期框架的设计上不够完美。
二、要熟悉每一个队员的能力。了解每一个队员的能力,最擅长的技能,这样才能够把每一个成员的能力发挥到最大,做到劲往一处使,将团队的能力发挥到极限。
鉴于我对我们团队的另外两个队友的了解,以及他们自己的选择,前期的任务分工主要就分为了三大部分:师兄负责整体的程序框架设计;发哥负责消息的解析,封装,发送;我就负责程序入口的控制处理。后期在策略方面都是大家一起讨论,一起协同分工完成。
三、规划整体的进度。在第一次的比赛中,这一点就没有做好,如果做不好这一点,就会导致整体的比赛进度漫无目的,没有一个开发周期的指定,大家就只能做到哪就在哪,想到哪就在哪,没有一个目标,容易在开发周期中丧失目标的明确性。指定好了开发周期和项目进度,尤其在像比赛这样周期短的开发任务中,做好这一点就显的更加尤为重要了。
四、对开发周期中发现的问题风险进行评估,把握开发进度。
本次比赛中,问题风险评估主要中有两个地方有问题:
- 风险的评估,由于队友个人私事的原因,加之个人承载的开发过多,导致后期承载的风险过大,一个人承载了过多的责任,在后期就会承载更大的风险。
- 问题评估就是在复赛的时候,针对初赛的版本,我们修改了代码,但是部分初赛的问题是修复了,但是又暴露出了很多以前初赛版本没有的问题,最后只有通过自己挑战自己的程序,选出最稳定的版本来作为复赛的参赛程序。可悲的是我们最后提交的还是初赛的版本来参加复赛,这也是我们最后失败的最大原因。
五、参赛的程序应该本着稳中求胜的思想。
从第一次的比赛中中我们总结了,程序不一定要有多好的策略,最基本的要做好程序的健壮性。做火车头游戏的时候就要保证永远不挂掉;做炸弹人就要保证逃生策略是无敌的。只有在这样的基础上,我们在谈其他的优化策略。在这点上也是我们这次成功的秘诀吧。
个人方面:
本次比赛中,我着实动手去写的代码不多。我主要负责了程序入口的研究,官方文档的详读和环境的准备。官方提供的资料当中只有C/C++的入口demo,我就只能通过去查看官方提供的一个cpp demo文件来编写java的入口程序设计。socket的创建于连接,socket消息的解析、帮助队友解析来自服务端的json消息等。除此之外就是配合着后期遇到的一些问题的解决开发一些小的功能模块。
1.代码框架设计,接口定义很重要
作为一个合格的程序员,编码不应该有什么问题(在我看来编码就是把我们人类的思维固化成计算机能够识别的有序代码而已)。编码只能从侧面体现出你对这个工具的一个熟练程度,而不是开发的重点工作。就好比我们在做游戏的时候,如何移动一个画面中的对象不是重点,重点应该放在怎么去移动(策略问题)。前期的分析与程序的架构设计,编写出可靠、高效、灵活、易扩展、可复用的程序才是重中之重。在初级程序员中(也包括我)往往喜欢用计算机能够理解的逻辑来买手和表达待解决的问题及具体的求解过程,这其实就是在用计算机理解的方式在思考,和面向过程的编程思想如出一辙,这样的做法本身没有错,但这样的思维却使的我们的程序只能满足眼下的需求,程序不容易维护,不容易扩展,更不容易复用,从而不能达到高质量代码的要求,也不能做好后期开发质量的保证。和我们的面向对象思想更是南辕北辙了。
这里就有人会反驳了,面对如此开发周期短的需求来说,时间不是很宝贵么?我只需要按照比赛规则开发完程序不就完事了么?在实际的比赛过程中大家往往只是注重怎么快速的去缩短开发周期,想留更多的时间去想策略,想通过损失一定的代码质量来换取策略上的思考时间。然而比赛不像平常的开发工作,开发完成以后,会有自动化的检测工具,会有同事的代码检视。比赛中没有这些东西,在时间上也不可能自己去设计这么一套东西来看护自己的代码质量,这也能从侧面反映出一个程序员的编程习惯。如果按照上面的开发完成以后,后期想做一些复杂的策略的时候,就显的难上加难。这一点在后期的策略开发过程中就显的很突出。
2.团队协作
在团队比赛中有一点我觉得很重要,虽然我时刻在告诫自己,但我也不知道自己到底做的好不好,这个只有和我一起并肩作战的兄弟才知道,那就是:团队协作的能力。团队赛不比个人赛。个人赛中一个人只要整好了那就是直接的胜利,而团队赛不然。在团队赛中,除了要做好自己,还要服从整体;既要把握模块的进度,也要注视总体的进展。针对同一个问题,不同的人有不同的想法,不同的思路,唯有做好队友之间的协调把控,才能将众想法中优秀的想法运用到我们的程序中。自己做完自己所承担的模块以后,不能一意孤行,需要从总体上一起去分析下一步怎么做,该怎么做,怎么做最好?领队统一协调,这样才能让整个比赛进度健康向前推进。
写在最后:
我们的队名:我不是路人甲(取这个队名有两个原因:第一最近有一部电影叫做《我是路人甲》;第二就是我们真的不想就只是路人甲)
参赛成员:师兄、发哥和我三人组
开发语言:JAVA
初赛时间:三天
比赛游戏原型:泡泡堂
本次比赛是我人生当中参加的第二次比较大型正规的比赛,是一次成功又失败的比赛。本次比赛总共有252个参赛队伍,最终我们能够拿到19名的成绩,按道理来说已经十分不错了,但是期间种种的原因导致我们心里都有一丝丝遗憾,未能将我们最大的能力发挥好。这一丝丝的遗憾都会成为我们下一次走的更远的铺路石,在哪里跌倒就在哪里站起来!
最后要感谢公司,感谢我们的客户方华为提供这样的平台来挑战自己,让我们在挫折中成长。最后也要感谢项目组以及客户方领导对我们的关心和支持,尤其是我们项目老大,为我们比赛付出了很多。非常感谢!
2015年09月22日 23:51:[email protected]