你好,哈布爾。 我們自發地舉辦了第一次內部黑客馬拉松。 我決定與大家分享我在兩週內準備的痛苦和結論,以及最終的項目。
對於那些對營銷感興趣的人來說無聊的部分
我將從一個小故事開始。
四月初。 第一屆 MskDotNet 社區黑客馬拉松正在我們的辦公室舉行。 塔圖因之戰此時在我們銀河系如火如荼地進行著。 週六。 20 隊。 披薩. 一切都很真誠(
當我在 Slack 中分享我的快樂時,我的腦海中浮現出一個想法:“我們需要舉辦我們自己的黑客馬拉松。” 我正在寫信給我們的薩莎服務站。 安靜。
早晨。 我在辦公室喝咖啡。 我看到薩沙從後面走來。 “麗莎,這太棒了! 21 月 XNUMX 日是一個重要的日子。 我們開始做吧! ” 臥槽!? 很快? A? 什麼? 我需要在四月中旬飛往瑟克特夫卡爾實習。 見鬼去吧! 讓我們。
還剩 2 週。 我從來都不是黑客馬拉鬆的唯一組織者。 讓它成為內部的。 我讀過有關這個主題的文章。 艱難的。 這需要幾個月的時間。 需要幾個人。 你需要考慮商品、獎品、條件、時間表、興趣,了解目標、預算。 或者甚至可以弄清楚生命的意義。 我肯定趕不上時間了。 當你在閱讀和準備的時候,一周已經過去了。 是時候忘記這些文章並開始做點什麼了。
查看我們在 1 週內舉辦內部黑客馬拉鬆的清單
- 計畫:你平靜地坐下來,寫下黑客馬拉松需要做的事情的清單。 30分鐘.
- 任務:參與者提出並選擇他們想要在 Google 表格中創建的項目。 後台任務,2小時.
- 時間表:在膝蓋上寫下簡短的時間細目,其中考慮了 3 次休息和最後一次。 20分鐘.
- 命令:在Slack/mail/等IT頻道中,從服務站發布有關黑客馬拉鬆的消息和時間表,並為黑客馬拉松創建單獨的頻道。 其中,每個人都被分成小組,那些猶豫不決的人會在黑客馬拉鬆的前 5 分鐘內這樣做。 後台任務,2小時.
- 包子:您與兩個開發人員一起提出商品,將其交給設計師進行渲染,然後準備好接收。 後台任務,3天.
- 黑客松:你來到辦公室,一開始就協調好每個人,處理你的事情,閱讀Reddit,重要的是宣布每一次有關新鮮披薩的休息,拍攝日落照片,宣布決賽,一起投票並選擇獲勝者。 1天.
- 星號下:當然,你總是想著一切都進展順利。 當然,並不是每個人都會看到您的消息,最好親自與某些人交談。 當然,如果有人幫助你,一切都會變得容易2倍(很棒的Alena幫助了我)。
關於黑客馬拉松日期不那麼無聊的部分
為什麼是 21 月 21 日? 這一天對我們來說意義重大。 就在一年前,即 8 月 12 日,聯邦廣告活動開始後的第一個週末,我們陷入了超負荷狀態。 第二天,週日,我們的團隊從早上 XNUMX 點開始工作。 然後我們在 Trello 中創建了一個週日黑客馬拉松板,並開始了一周的輪班工作,每天 XNUMX 小時。 情況非常危急,我們連吃飯的時間都沒有,就由其他隊的人餵我們。
您可以閱讀更詳細的故事:
今年,我們認為這一活動值得後人永遠銘記,並按照最佳傳統,組織了 Dodo 歷史上的第一次內部黑客馬拉松,持續了 10 個小時。
黑客馬拉松項目中最無聊的部分
免責聲明:所有描述都是由他們自己寫的,所以文本的作者不是我的。
奧列格學習(機器學習)
迪瑪·科赫涅夫、薩沙·安德羅諾夫 (@alexandronov)
他們想要建立一個神經網絡,可以在沒有任何知識的情況下確定照片中的披薩是什麼類型。 結果,我們製作了一個非常簡單的玩具 - 它可以識別 10 個披薩,我們盡可能在一天(約 10 小時)內大致弄清楚一切是如何工作的。
特別是,我們意識到該行業已經達到了一個水平,普通開發人員可以使用現成的庫、閱讀文檔並訓練他的神經網絡,而無需深入了解該主題。 而且它能夠很好地解決實際問題。
使用的工具:
圖像AI — 一個方便簡單的庫,用於處理機器學習和計算機視覺。- 我們嘗試了兩種模型——ResNet50、Yolo。
- 當然,代碼是用 Python 編寫的。
我們有 11000 張照片,但其中幾乎 3/4 結果是垃圾,其餘的則有不同的、不合適的角度。 因此,我們採用了一個現成的模型(它只知道如何找到披薩),並在它的幫助下我們分離了垃圾。 接下來,照片的標題包含了披薩的名稱 - 所以我們將其分類到文件夾中,但結果發現這些名稱與實際不符,我們不得不用手清理它。 最後還剩下大約500-600張照片,顯然這是一個微不足道的數字,但儘管如此,這也足以將10個披薩分開。
為了訓練網格,我們在 NVIDIA Tesla K80 上使用了 Azure 中最便宜的虛擬機。 他們對其進行了 100 個 epoch 的訓練,但很明顯,由於數據集較小,網絡在 50 個 epoch 後就已經過度飽和。
事實上,整個問題在於缺乏好的數據。
我們可能對這些術語有點困惑,但我們必須考慮到我們根本沒有處理所有這些問題的經驗。
NOOBS GUI(用於訂購披薩的控制台)
米沙·庫馬切夫(
我們為極客們打造了一個控制台應用程序的原型,通過它,您可以通過終端或命令行訂購披薩,甚至將其集成到部署管道中,並在成功發布後將披薩送到辦公室。
這項工作分為幾個部分:我們弄清楚了移動應用程序的 API 是如何工作的,使用
我們這次黑客馬拉鬆的最大計劃是通過 CLI 向辦公室真正訂購披薩。 我們在測試台上運行了十幾次,但當我在生產中輸入命令時,我的手仍然在顫抖。
結果,我們終於做到了!
快遞快運
安東·布魯日梅列夫(作者)、瓦尼亞·茲韋列夫、格列布·列斯尼科夫(
我們提出了“快遞應用程序”的想法。
有關準備的背景。最初,我想知道應用程序中有哪些功能? 出現了以下功能列表:
- 應用程序使用代碼登錄送貨收銀機。
- 該應用程序立即顯示可用訂單和需要接受的訂單。
- 快遞員記下訂單並隨身攜帶。
- 他會看到預計時間以及他是否準時。
- 向客戶顯示快遞員已離開。
- 開始向客戶顯示地圖上的快遞點和預計時間。
- 快遞員可以通過應用程序通過聊天方式給客戶寫信。
- 客戶可以通過應用程序中的聊天方式給快遞員寫信。
- 到貨前五分鐘,客戶收到快遞到門的消息,做好準備。
- 快遞員在申請中註明他已到達並正在等待。
- 快遞員一鍵從應用程序中呼叫並報告(正在上升、已到達等)
- 客戶接受訂單並從應用程序或短信中輸入PIN碼以確認送貨(作為簽名),以便快遞員如果遲到則無法提前完成送貨。
- 訂單在系統中標記為已交付。
再加上一些替代方案:
- 快遞員可以將訂單標記為未送達並選擇原因。
- 如果遲到,快遞員可以通過短信一鍵開具電子憑證。 或者,如果未滿足交付期限,證書將自動到達。
當然,這個項目的承諾和必要性令人振奮。
第二天,我們與團隊共進午餐,討論了應用程序的最低功能。
因此,形成了以下在黑客馬拉松中必須完成的任務列表:
- 登錄送貨收銀機。
- 顯示當前位置。
- 將數據發送到外部 API(坐標、接收訂單、交付訂單)。
- 從外部API接收數據(當前快遞訂單)。
- 發送一個事件,表明您已接受訂單交付/已交付。
- 在網站的地圖上顯示快遞員的當前位置。
看起來,主要工作在於創建後端、應用程序本身(經過討論,我們選擇了 ReactNative 來開發應用程序,或者更確切地說是它的框架 -
我決定嘗試立即為項目本身創建一個工作存儲庫。 晚上12點我發現ReactNative中後台的地理定位效果不好,如果不寫原生代碼,我有點沮喪。 然後當我意識到我正在閱讀的不是expo.io框架的文檔,而是ReactNative的文檔時,我放手了。 結果,整個晚上我已經了解瞭如何獲取 expo.io 中的當前位置並繪製單獨的屏幕(用於登錄、訂單顯示等)。
早上在黑客馬拉鬆上,他們引誘格萊布加入他們超級有前途的項目。 他們很快就制定了需要做什麼的計劃。
當我們按照項目模板嘗試不通過 HTTP 而是通過 GRPC 進行通信時,我們犯了一個錯誤,因為沒有人知道如何為 JavaScript 構建 GRPC 客戶端。 最終,在花了大約一個半小時的時間後,我們放棄了這個想法。 正因為如此,後端的人開始將完成的服務器從 GRPC 重新製作為 WebApi。 半小時後,我們終於能夠在應用程序和後端之間建立通信,你瞧。 但與此同時,Gleb 幾乎完成了對 k8s 的部署以及對 master 的提交的自動部署。 🙂
我們選擇 MySQL 作為存儲,以避免至少在數據庫方面承擔風險(我們考慮過 CosmosDb)。
概括如下:
- 實現將快遞員的當前坐標從應用程序保存到數據庫。
- 我們安裝了 RabbitMQ 並訂閱了快遞員取貨的消息,以便立即在應用程序中顯示快遞員的訂單。
- 快遞員按下應用程序中的按鈕後,我們開始將訂單交付時間保存到數據庫中。 我們沒有時間添加將事件發送回訂單已交付的 rebbit。
- 我在網站的當前訂單頁面上製作了一個地圖,其中顯示了快遞員的當前位置。 但此功能仍有一點未完成,因為無法在環境中配置 CORS 以從我們的新服務接收坐標。
M87
羅馬·布金、戈莎·波萊沃伊 (
我們想要實現一個 OpenID Connect 提供程序,因為目前我們使用我們自己設計的身份驗證協議,這會帶來許多困難:自定義客戶端庫、外部合作夥伴的不便工作、可能的安全問題(畢竟,參考實現中的OAuth2.0和OpenID Connect可以認為是安全的,但我不確定我們的解決方案)。
我們製作了一項單獨的服務,模擬存儲個人數據的服務,以便創建一個小型的與國家無關的身份驗證提供商模型,該模型將使用單獨的個人數據服務(這將在未來使一項服務與可以使用任何國家的帳戶註冊登錄,同時遵守GDPR和其他聯邦法律)。 我們和提供商一樣完成了這部分,並成功地將它們相互鏈接起來。 接下來,需要創建一個由提供商發布的令牌保護的 API,支持通過提供商進行自省,並在請求滿足授權策略時返回受保護的數據(我們檢查用戶是否根據 Bearer 方案進行了身份驗證) ,他的token包含一定範圍+y用戶本身有允許調用的權限)。 這部分也完成了。 最後一個組件是 JavaScript 客戶端,它將獲得一個令牌,借助該令牌可以調用受保護的 API。 我們沒有時間做這部分。 也就是說,整個功能部分已經準備好了,但是前端部分還沒有準備好來演示整個系統的功能。
E-E-E(玩具)
迪瑪·阿豐琴科、薩莎·科諾瓦洛夫
我們在 yunka 上製作了一個迷你玩具,靈活的雙手將香腸扔到披薩上。 如果你把香腸放錯了,屏幕上會出現一條悲傷的“拒絕”消息,如果所有香腸都放正確了,就會出現一個關於披薩的隨機事實。
我們想用投擲西紅柿來製作第二個關卡,但我們沒有時間。
簡短的延續:誰贏了?
在黑客馬拉松之前,我們與這些人進行了交談,我問他們如果獲勝希望獲得什麼獎勵。 事實證明,最有價值的獎品是“通往食物的道路”。
因此,預計我們很快就會推出一款用手將胡椒粉放在披薩上的遊戲。
細心的讀者可能已經註意到,“E-E-E(玩具)”隊獲勝。 恭喜你們!
只有註冊用戶才能參與調查。
您最喜歡哪個項目?
-
奧列格學習(機器學習)
-
NOOBS 的 GUI
-
快遞快運
-
M87
-
東-東-東
5 位用戶投票。 3 名用戶棄權。
來源: www.habr.com