1. 程式人生 > >2017華為編程大賽總結

2017華為編程大賽總結

代碼 最好 最小 滿足 指令 計算 jvm 矛盾 臨界點

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

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;

謝謝你,我的隊友們;

也謝謝你,我的對手們。

2017華為編程大賽總結