Hai, Habr. Kami secara spontan memegang hackathon internal pertama. Saya memutuskan untuk berbagi dengan Anda tentang rasa sakit dan kesimpulan saya tentang mempersiapkannya dalam 2 minggu, serta proyek-proyek yang ternyata.

Bagian yang membosankan bagi mereka yang tertarik dalam pemasaran
Saya akan mulai dengan sedikit cerita.
Awal April. Komunitas MskDotNet hackathon pertama diadakan di kantor kami. Pertarungan untuk Tatooine sedang berlangsung, di galaksi kita kali ini. Sabtu 20 tim. Pizza Semuanya sangat tulus (
bukti ). R2-D2 tiup menjulang di sekitar aula. Tim menulis algoritma yang paling benar untuk melewati perlombaan paling berbahaya di peta. Kami menggeser peluncuran balapan pertama. Kue dan kopi disimpan. Panitia dan saya berharap pada hari Sabtu, banyak yang akan pergi setelah makan malam. Tapi tidak. 12 jam coding di belakang. Final. Sesuatu jatuh, sesuatu tidak dimulai. Tapi semua orang senang. Tim kami menang. Kami sangat senang dua kali lipat.
Saya berbagi kegembiraan saya di Slack dan ide muncul di kepala saya: "Kita perlu membuat hackathon kita sendiri." Saya menulis ke stasiun layanan kami Sasha. Kesunyian.
Pagi Saya minum kopi di kantor. Kulihat Sasha datang dari belakang. "Lisa, bagus sekali! Kami memiliki tanggal penting pada 21 April. Ayo lakukan! " WTF!? Sangat cepat Hah? Apa? Saya perlu terbang ke Syktyvkar untuk magang pada pertengahan April. Ya, dan persetan dengan dia! Ayo
Tetap 2 minggu. Saya tidak pernah menjadi penyelenggara tunggal hackathon. Biarkan internal. Saya membaca artikel tentang topik ini. Timah Butuh beberapa bulan. Perlu beberapa orang. Perlu untuk memikirkan merch, hadiah, kondisi, jadwal, minat, memahami tujuan, anggaran. Atau bahkan mungkin mencari tahu arti hidup. Saya pasti tidak akan punya waktu. Dan saat Anda membaca dan bersiap, satu minggu telah berlalu. Sudah waktunya untuk menilai artikel dan mulai melakukan sesuatu.
Tangkap daftar periksa hackathon internal 1 minggu kami- Rencanakan : duduklah dengan tenang dan tulis daftar apa yang perlu dilakukan untuk hackathon. 30 menit
- Tujuan : peserta sendiri mengusulkan dan memilih proyek yang ingin mereka buat di Google Sheets. Tugas latar belakang, 2 jam .
- Jadwal : pada lutut Anda menulis rincian singkat dengan memperhitungkan 3 istirahat dan final. 20 menit
- Tim : Anda mempublikasikan pesan tentang hackathon dengan jadwal dari stasiun layanan di saluran IT di Slack / mail / etc dan membuat saluran terpisah untuk hackathon. Di dalamnya, semua orang dibagi menjadi beberapa tim, dan ragu-ragu melakukannya dalam 5 menit pertama hackathon. Tugas latar belakang, 2 jam .
- Plus : Anda datang dengan merch dengan dua pengembang, Anda memberi perancang render, Anda bersiap-siap. Tugas latar belakang, 3 hari .
- Hackathon : Anda datang ke kantor, mengoordinasikan semuanya di awal, menjalankan bisnis Anda, membaca Reddit, menginformasikan setiap istirahat tentang pizza segar, mengambil gambar matahari terbenam, mengumumkan final, memilih bersama, dan memilih pemenang. 1 hari
- Di bawah tanda bintang : tentu saja, Anda terus-menerus berpikir bahwa semuanya berjalan dengan baik. Tentu saja, tidak semua orang akan melihat pesan Anda dan lebih baik berbicara dengan beberapa orang secara pribadi. Tentu saja, jika seseorang membantu Anda, semuanya akan menjadi 2 kali lebih mudah (Alena yang luar biasa membantu saya).
Bagian yang kurang membosankan tentang tanggal hackathon
Kenapa 21 April? Hari ini penting bagi kita. Tepat setahun yang lalu, pada 21 April, kami jatuh di bawah beban selama akhir pekan pertama setelah dimulainya Kampanye Periklanan Federal. Keesokan harinya, Minggu, tim kami mulai bekerja dari jam 8 pagi. Kemudian kami membuat papan sundayhackathon di Trello dan mulai bekerja seminggu 12 jam sehari. Situasinya sangat kritis sehingga kami tidak punya waktu untuk makan dan kami diberi makan oleh orang-orang dari tim lain.

Anda dapat membaca kisah yang lebih rinci di
halaman Fedor Ovchinnikov (CEO kami). Sejak itu, kami telah banyak berubah, tetapi sekarang kami pasti tidak akan melupakan tanggalnya.
Tahun ini, kami memutuskan bahwa acara ini harus diabadikan untuk mengenang anak cucu, dan dalam tradisi terbaik kami menyelenggarakan hackathon internal pertama dalam sejarah Dodo, yang berlangsung 10 jam.
Bagian paling membosankan tentang proyek hackathon
Penafian: semua deskripsi ditulis oleh orang-orang itu sendiri, jadi kepengarangan dari teks itu bukan milik saya.Oleg Lörning (mobil lörning)
Dima Kochnev, Sasha Andronov (@alexandronov)Mereka ingin membuat jaringan saraf yang akan menentukan jenis pizza di foto tanpa sepengetahuan mereka. Akibatnya, mereka membuat yang sangat sederhana dan mainan - itu mengenali 10 pizza, menemukan cara kerja semuanya, berapa banyak yang mungkin dalam satu hari (~ 10 jam).

Secara khusus, kami menyadari bahwa industri telah mencapai titik di mana pengembang biasa dapat mengambil perpustakaan yang sudah jadi, membaca dokumentasi, dan melatih jaringan sarafnya tanpa pengetahuan mendalam tentang subjek tersebut. Dan itu akan bekerja cukup baik untuk menyelesaikan masalah nyata.
Alat yang digunakan:
- imageai adalah perpustakaan yang nyaman dan sederhana untuk bekerja dengan pembelajaran mesin dan visi komputer.
- Dua model telah mencoba - ResNet50, Yolo.
- Kode itu ditulis, tentu saja, dengan python.
Kami memiliki 11.000 foto, tetapi hampir 3/4 diantaranya ternyata adalah sampah, dan sisanya menunjukkan sudut yang berbeda dan tidak pantas. Hasilnya, kami mengambil model yang sudah jadi (yang hanya tahu cara menemukan pizza) dan dengan bantuannya kami memisahkan sebagian besar sampah. Lebih jauh, dalam nama foto itu adalah nama pizza - itulah cara kami memasukkannya ke dalam folder, tetapi ternyata nama-nama itu tidak sesuai dengan kenyataan dan kami harus membersihkannya dengan tangan kami. Akibatnya, sekitar 500-600 foto tetap, jelas bahwa ini adalah jumlah yang tidak signifikan, tetapi bagaimanapun, ini ternyata cukup untuk memisahkan 10 pizza dari satu sama lain.
Untuk melatih grid, mereka mengambil mesin virtual termurah di Azure pada NVIDIA Tesla K80. Itu dilatih dalam 100 era, tetapi jelas bahwa jaringan itu jenuh setelah 50 era, karena fakta bahwa ada dataset kecil.
Sebenarnya - seluruh masalahnya adalah kurangnya data yang baik.

Kita mungkin telah sedikit campur aduk dalam hal ini, tetapi kita harus ingat bahwa kita umumnya tidak memiliki pengalaman dalam bekerja dengan semua masalah ini.
GUI untuk NOOBS (konsol untuk memesan pizza)
Misha Kumachev ( Ceridan ), Zhenya Bikkinin, Zhenya VasilievKami telah mengumpulkan aplikasi konsol prototipe untuk Geeks, berkat itu Anda dapat memesan pizza melalui terminal atau baris perintah, atau bahkan mengintegrasikannya ke dalam pipa penyebaran dan, dengan rilis yang sukses, mengirimkan pizza ke kantor.

Pekerjaan itu dibagi menjadi beberapa bagian: kami memilah-
milah bagaimana API kami untuk aplikasi seluler diatur, menyusun CLI kami sendiri menggunakan
oclif, dan mengatur publikasi paket yang kami kumpulkan. Tugas terakhir dikaitkan dengan beberapa menit yang tidak menyenangkan menjelang akhir hackathon. Semuanya bekerja untuk kami secara lokal dan bahkan versi lama dari paket yang dipaketkan bekerja, tetapi yang baru (di mana lebih banyak fitur keren dan emotikon ditambahkan) menolak untuk berfungsi. Kami menghabiskan 40 menit untuk mencari tahu apa yang salah, tetapi pada akhirnya semuanya bekerja secara ajaib).
Program hackathon maksimum kami adalah pesanan pizza nyata ke kantor melalui CLI kami. Kami mengendarai semuanya belasan kali di bangku tes, tetapi tangan saya masih bergetar ketika saya mencetak gol tim di prod.

Akibatnya - kami masih melakukannya!

Kurir pergi
Anton Bruzhmelyov (penulis), Vanya Zverev, Gleb Lesnikov ( entropi ), Andrey SarafanovKami mengambil ide "Aplikasi untuk kurir."
Latar belakang tentang persiapan.Awalnya, saya tahu, tapi fitur apa yang bisa ada di aplikasi? Sesuatu seperti ini muncul:
- Aplikasi masuk ke konter checkout dengan kode.
- Aplikasi segera menampilkan pesanan yang tersedia, yang harus Anda ambil pesanan.
- Kurir mencatat pesanan dan melakukan perjalanan.
- Dia ditunjukkan perkiraan waktunya dan dia punya waktu atau tidak.
- Klien menunjukkan bahwa kurir telah pergi.
- Klien mulai menunjukkan titik kurir pada peta dan perkiraan waktu.
- Kurir dapat menulis kepada klien dalam obrolan dari aplikasi.
- Klien dapat menulis kurir untuk mengobrol dari aplikasi.
- Lima menit sebelum kedatangan, klien menerima pesan bahwa kurirnya sudah dekat, bersiap-siaplah.
- Catatan kurir di aplikasi yang dia tarik dan sedang menunggu.
- Kurir menelepon dari aplikasi dengan satu klik dan melaporkan bahwa (ia naik, berjalan, dll.)
- Klien menerima pesanan dan memasukkan kode PIN dari aplikasi atau SMS untuk mengonfirmasi pengiriman. (Sebagai tanda tangan) Sehingga kurir tidak dapat menyelesaikan pengiriman di muka jika dia terlambat.
- Urutan ditandai sebagai dikirimkan dalam sistem.
Ditambah beberapa skenario alternatif:
- Kurir dapat menandai pesanan tidak terkirim dan memilih alasan.
- Kurir, jika Anda terlambat, Anda dapat mengeluarkan sertifikat elektronik satu tombol melalui SMS. Atau sertifikat datang secara otomatis jika waktu pengiriman tidak dihormati.
Rasa janji dan kebutuhan untuk proyek ini tentu dibebankan.
Hari berikutnya, kami pergi bersama tim untuk makan siang dan membahas seperti apa fungsi minimal dari aplikasi tersebut.
Sebagai hasilnya, daftar berikut tentang apa yang harus dilakukan pada hackathon dibentuk:
- Login ke meja kas pengiriman.
- Tampilkan posisi saat ini.
- Kirim data ke api eksternal (koordinat, ambil pesanan, kirim pesanan).
- Dapatkan data dari api eksternal (pesanan kurir saat ini).
- Kirim acara yang saya ambil pesanan pengiriman / dikirim.
- Tampilkan posisi kurir saat ini di peta di situs.
Pekerjaan utama, seperti yang saya lihat, adalah membuat backend, aplikasi itu sendiri (setelah diskusi, kami memilih ReactNative untuk mengembangkan aplikasi, atau lebih tepatnya,
mengikatnya secara
over-expo.io , yang memungkinkan Anda untuk tidak menulis kode asli sama sekali). Dalam hal backend, pada awalnya ada harapan untuk Vanya Zverev, sebagai yang berpengalaman dalam bekerja dengan templat layanan dan k8 (pekerjaan seperti apa yang ia lakukan pada dirinya sendiri). ReactNative membawa saya dan Andrei Sarafanov.
Saya memutuskan untuk mencoba segera membuat repositori yang berfungsi untuk proyek itu sendiri. Pada 12 malam, saya menemukan fakta bahwa geolokasi di latar belakang tidak berfungsi dengan baik di ReactNative, jika Anda tidak menulis kode asli, itu sedikit frustrasi. Kemudian dirilis ketika saya menyadari bahwa saya sedang membaca dokumentasi bukan dari kerangka expo.io, tetapi dari ReactNative. Akibatnya, pada malam hari sudah jelas bagi saya bagaimana mendapatkan posisi saat ini di expo.io dan menggambar layar terpisah (untuk login, tampilan pesanan, dll.).

Di pagi hari di hackathon, Gleb tertarik dengan proyeknya yang sangat menjanjikan. Mereka dengan cepat menyusun rencana tentang apa yang perlu dilakukan.

Mereka membuat kesalahan ketika, sesuai dengan templat proyek, mereka mencoba membuat komunikasi bukan melalui HTTP, tetapi melalui GRPC, karena tidak ada yang tahu cara membangun klien GRPC untuk JavaScript. Akibatnya, setelah menghabiskan sekitar satu setengah jam untuk hal ini, mereka meninggalkan ide ini. Karena itu, orang-orang dan di belakang mulai mengulangi server selesai dari GRPC ke WebApi. Setelah setengah jam, akhirnya, kami dapat mengkonfigurasi komunikasi aplikasi dengan backend, lihat dan lihat. Tetapi pada saat yang sama, Gleb hampir menyelesaikan penyebaran di k8s dan ditambah auto-deed dengan melakukan komitmen pada master. :)
Sebagai repositori, kami memilih MySQL agar tidak mengambil risiko bahkan basis (ada pemikiran tentang CosmosDb).

Singkatnya:
- Diimplementasikan menyimpan koordinat kurir saat ini dari aplikasi ke database.
- Mereka mengacaukan RabbitMQ dan berlangganan pesan tentang kurir yang mengambil pesanan untuk segera menampilkan pesanan dari kurir dalam aplikasi.
- Kami mulai menghemat waktu untuk pengiriman pesanan ke database kami, setelah kurir mengklik tombol di aplikasi. Kami tidak punya waktu untuk menambahkan pengiriman acara kembali ke rebbit yang menunjukkan bahwa pesanan telah dikirimkan.
- Saya melakukan tampilan peta pada halaman saat ini di situs dengan posisi kurir saat ini. Tetapi fungsi ini tetap sedikit belum selesai, karena lingkungan tidak dapat mengonfigurasi CORS untuk mendapatkan koordinat dari layanan baru kami.
M87
Roma Bukin, Gosha Polevoy ( georgepolevoy ), Artyom TrofimushkinKami ingin mengimplementasikan penyedia OpenID Connect, karena saat ini kami menggunakan protokol otentikasi desain kami sendiri, dan ini menciptakan sejumlah kesulitan: pustaka klien khusus, pekerjaan yang tidak nyaman dari mitra eksternal, dan kemungkinan masalah keamanan (setelah semua, OAuth2.0 dan OpenID Connect dalam implementasi referensi dapat dianggap aman, tetapi untuk solusi kami - Saya tidak yakin).

Kami membuat layanan terpisah yang meniru layanan penyimpanan data pribadi untuk membuat model kecil dari penyedia otentikasi Country-Agnostik yang akan pergi ke layanan terpisah untuk data pribadi (ini akan memungkinkan di masa depan untuk memiliki satu layanan yang dapat digunakan untuk masuk dengan akun Anda. catatan di negara mana pun, dan pada saat yang sama mematuhi GDPR dan Hukum Federal lainnya). Kami melakukan bagian ini, seperti penyedia, dan berhasil menghubungkan mereka satu sama lain. Selanjutnya, kami perlu membuat API yang akan dilindungi oleh token yang dikeluarkan oleh penyedia, mendukung introspeksi mereka melalui penyedia, dan mengirim data yang dilindungi jika permintaan akan memenuhi kebijakan otorisasi (kami memverifikasi bahwa pengguna diautentikasi menggunakan skema Bearer, tokennya mengandung ruang lingkup tertentu + pengguna sendiri memiliki izin yang memungkinkan panggilan dibuat). Bagian ini juga telah selesai. Komponen terakhir adalah klien JavaScript yang akan mengeluarkan token, yang dengannya ia akan memanggil API aman. Kami tidak berhasil membuat bagian ini. Artinya, seluruh bagian fungsional siap, tetapi bagian ujung depan tidak siap untuk menunjukkan operabilitas seluruh sistem.
Uh (igruha)
Dima Afonchenko, Sasha KonovalovKami membuat mainan mini pada si kecil di mana pegangan lincah meletakkan sosis pada pizza. Jika Anda salah melemparkan sosis, pesan sedih "Ditolak" muncul di layar, dan jika seluruh sosis dilemparkan dengan benar, fakta acak tentang pizza muncul.

Mereka ingin membuat level kedua dengan sebaran tomat, tetapi tidak punya waktu.

Kelanjutan singkat: siapa yang menang?
Sebelum hackathon, kami berbicara dengan mereka dan saya bertanya hadiah apa yang ingin mereka terima jika mereka menang. Ternyata jalan menuju makanan akan menjadi hadiah paling berharga.

Karena itu, segera harapkan dari kami pengumuman permainan dengan pegangan topping pepperoni pada pizza.
Seperti yang bisa diperhatikan oleh pembaca yang penuh perhatian, tim "E-E-E (igruha)" menang. Selamat guys!