2017華為編程大賽總結

来源:https://www.cnblogs.com/jilodream/archive/2018/01/27/8362135.html
-Advertisement-
Play Games

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


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

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;

謝謝你,我的隊友們;

也謝謝你,我的對手們。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 問題 當使用tab切換時,部分特殊場景需要獲取當前元素的類名或者id。 2.解決思路,tab切換是綁定函數,函數會傳遞過去當前對象,通過當前對象獲取對象屬性 vue部分代碼:本項目是在vue-cli下運行,因此vue的初始化函數略有差異。 ...
  • 到了年底,開發任務相對較少,閑來看了幾篇優秀的代碼優化文章,現在分享出來,記錄一下,以便以後再次重讀 1.反覆推敲代碼 2.寫優雅的代碼 3.寫模塊化的代碼 4.寫可讀的代碼 5.寫簡單的代碼 6.寫直觀的代碼 7.寫無懈可擊的代碼 8.正確處理錯誤 總結: 世界上有兩種“沒有bug”的代碼。一種是 ...
  • win10系統配置虛擬主機1.用記事本或Sublime Text打開httpd.confctrl + f 搜索httpd-vhosts.conf 將#Include conf/extra/httpd-vhosts.conf的#號去掉保存 2.打開extra/httpd-vhosts.conf添加如下 ...
  • Relatives Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15566 Accepted: 7900 Description Given n, a positive integer, how many positive i ...
  • 一.路由配置系統 1.1 基本認識 a. URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL與要為該URL調用的視圖函數之間的映射表 b. URLconf 在請求的URL 上查找,將它當做一個普通的Python 字元串。不包括GET和POST參數以及功能變數名稱。 例如,htt ...
  • 一.介紹 在HTML的基礎上加上模板語言(包括:會被替換掉的變數和標簽) 二.模板語法之變數( {{ }} ) 2.1 基本用法 views: template: 2.2 過濾器 語法: 三.模板語法之標簽( {% %} ) 3.1 標簽操作 3.2 模板繼承 模版繼承可以讓您創建一個基本的“骨架” ...
  • 1.開啟apache模塊 在apache配置文件 #LoadModule rewrite_module modules/mod_rewrite.so 前面的#去掉 然後添加 我的E:/Apache/Apache24/htdocs/ 為網站目錄 到apache配置文件,隨便放,為了好找我放在最下麵 < ...
  • 迭代器 迭代器是一種更抽象的概念。 迭代是訪問數據的一種方式。迭代器是一個可以記住遍歷位置的對象,迭代器對象從集合的第一個元素開始訪問,直到所有的元素訪問完後結束。迭代器只能往前去訪問下一個元素,不能後退。 迭代器就是可迭代對象調用iter()方法,返回了一個迭代器 那麼什麼是可迭代對象呢? 像字元 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...