華為研發部門,每年都會在部門內部舉辦一屆編程大賽。旨在讓開發人員在工作之餘,通過游戲編程的切磋,提高技術和協作能力。在入職華為的第四個年頭,我終於如願拿到了部門編程大賽的冠軍。之前的每一年也都會參加,其中兩次抱大腿拿到了亞軍,一次因為太忙棄權了。這一屆終於帶隊拿到了冠軍,了卻了一樁心事。在此,對之前 ...
華為研發部門,每年都會在部門內部舉辦一屆編程大賽。旨在讓開發人員在工作之餘,通過游戲編程的切磋,提高技術和協作能力。在入職華為的第四個年頭,我終於如願拿到了部門編程大賽的冠軍。之前的每一年也都會參加,其中兩次抱大腿拿到了亞軍,一次因為太忙棄權了。這一屆終於帶隊拿到了冠軍,了卻了一樁心事。在此,對之前的參賽經驗和感悟總結一下,做一個紀念。至於下一屆?應該不會再參加了。
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;
謝謝你,我的隊友們;
也謝謝你,我的對手們。