DeNAサマーインターン2020が最高によかった話

どうも@hirokihelloです!!

今回はDeNAのサマーインターン(8/29~8/30)に参加しましたので、参加してよかった点を残したいと思います。

来年度以降の貴重な夏にDeNAのインターンに参加するかを判断する材料になれば幸いです。

インターン概要

今年のサマーインターンは二日間に渡って、チーム対抗でプログラム(通称クソアプリ)の改善を競うハッカソン形式のインターン(ハッカソン参加したことないのでわかりませんが....)です。

参加人数は今年は総勢20名で、4人1チームの5チーム対抗でした。サーバーサイドはgolangで統一ですが、frontはandroid, ios, webの三つのチームがあります。自分はwebチームでの参加でした。 

課題概要

課題の概要は他ブログで簡潔にまとめられているので、引用させていただきます。

- コロナ禍の中、DeNAはチャットアプリを新規事業で立ち上げた
- このアプリは巣ごもり需要のなかで一定のユーザーを獲得したものの、突貫で作ったこともあり様々な問題が発生し、昨晩からメンテに入っている
もともとDeNAの別事業で働いてた4人のエンジニア(つまり参加者)は急遽この事業にアサインされ、メンテ作業に参加する
- 明日夜にオンラインで開催される大型フェスのコミュニケーションツールとして採用されることが決定しており、このままだと予想される負荷に耐えることができない
- 10000発言/秒、10万人同時接続に耐えられるように改修してほしい
- UI/UXも改善してほしい

引用
https://yt8492.hatenablog.com/entry/2020/09/23/142240

クソアプリの技術的な改善点ですが、印象に残るものでもこれくらいありました

サーバーサイド
- ページネーションがなく、数十万件のレコードが一気に返ってくる。
- 画像の保存がbase64

フロント
- ページネーションがない
- そもそもフロントレイヤーで動いていないページがある
- リアルタイム更新がされない。
- 同じ部屋に2回入れない。

インフラ
- appサーバーとDBが同じインスタンスにある。
- インスタンスが1台しかない
- DBの容量が数百GBある
- DBが正規化されていない

実際にやったこと

自分はインフラをメインで行いました。(フロントも雀の涙ほどやりました)

- DBのbackupをとる(mysql dump)
- appサーバーとDBサーバーを分け、接続確認
- appサーバーのスケールアウト
- スケールアウト後のappサーバーへのデプロイスクリプトの構築
- cloudfrontの導入(front, server)
- cacheをcloudfrontでquery parameterで設定できるように
- cors周りの設定
- apach benchで負荷試験の実施
- 負荷試験用のサーバーの用意
- s3からのredirect設定

画像1

汚くて申し訳ないですが発表資料の一部の構成図です。

独自ドメインはつけなかったですが、サーバーとフロントを同じクラウドフロントdistributionで配信し、path base routingを行い向け先をURLベースで変えるなどプロダクションと同じ構成に近づけようと試みました。

また既存のユーザーが前のURLを踏む可能性もあるので、s3へ新しいURLのリダイレクト処理なども行いました。

結果としてgetに関しては確実に100k/secを余裕で捌けることを負荷試験で確認できました。

他にもやりたいことはたくさんあったのですが、とにかく時間が足りませんでした。

総括

前置きが長くなりましたが、ここからは参加してよかったと感じた点を3点あげます。具体的には下記の3点となります。

1. 同じ世代のエンジニアと交流できる
2. よくわからんけどインフラこれでいいだろ!!に頼らない開発
3. エンジニアとして仕事でweb開発するときに大切なことを見つめられる

具体的に記述していきます。

同じ世代のエンジニアと交流できる

自分はあまりイベントなどに参加することが多くなく、優秀な同世代のエンジニアと開発できるというのはすごくワクワクするものでした。

チーム開発ということもあり、自分に足りないスキルを見つめ直すことができました。また情報交換もできてそういう意味でもすごくありがたかったです。

また同じ世代ではないですが、技術力の高いエンジニアがメンターとしてついてくれ、技術的な質問をするとすぐに沢山の資料をいただけたのも本当に貴重な体験でした。

よくわからんけどインフラこれでいいだろ!に頼らない開発

今回のインターンでは、10000発言/秒、10万人同時接続というのが一つの課題として設定されていました。

これをクリアするためには、まずボトルネックの検証が何よりも重要になります。アプリケーションロジック、DBのコネクションなど見るべきところはたくさんあります。ボトルネックが定まったら、それに対応した解決策を考えなければいけません。

普段の開発でAWSを使っていれば、インフラに関してはとりあえずボタンをぽちぽちすればスケールアウト、冗長化、サーバーのスペックアップが簡単に行え、ボトルネックへの対策としてそれなりに効果が見込めます。

しかしこのインターンではそれらに頼らず、限られたサーバーリソースでボトルネック対策をしなければいけませんでした。そのため普段は意識しないAWSの下でどんなものが動いているのか、サーバーだけで何ができるのかを真剣に勉強する絶好の機会となりました。

例えば今回自分は実装できませんでしたが、dbのスペックやコネクションがボトルネックなら、DBを別のサーバーにインストールしてクラスターを作成することが一つの解決策となります。普段これはRDSを使うことで簡単に行えますので、AWSを使っているだけでは自前でクラスターを用意することはできるようになりません。

今回のインターンはこうした自分は普段使っている技術がどのようなものの上に成り立っているのかについて考えさせられ、勉強を自然とするようになる素晴らしい機会でした。

エンジニアとして仕事でweb開発するときに大切なことを見つめられる

最後はこの点です。上記であげた二つの点は、例えばisuconなどでも達成できるのかなと思います。今回のインターンで本当に深く印象に残ったのは、上記にあげた技術力が要求されるような課題を提示した上で、何が本当の課題かどうかを見つめることが必要だった点です。

例えば、今チャットアプリの開発をしてるとして、メッセージ機能がうまく動いていません。またメッセージ機能はうまく動いても想定される負荷に明らかに耐えられません。

この状況でどちらを先に開発するべきでしょうか?

負荷対策をすることは、もちろんプロダクトにプラスになります。しかし結局動かなければ、どれだけユーザーが来ても誰も使えないので全て無駄です。なのでメッセージ機能を先に開発することが必要です。

この例では二つの比較ですので優先順位をつけるのが容易ですが、実際の開発では無限に課題があります。その中で全てのタスクを時間内に行うことは不可能です。何かしらをうまく諦める必要があります。

その時に重要になってくるのが方針です。何がこの開発で最重要なのか。求められていることは何なのか?を明確に決め、思い切ってそこから外れることを省くことが必要です。そしてその方針をぶらさずに保ち続けることも必要です。

そして今回のインターンではここが深く試されました。今回のインターンは時間が限られて大量の目に見える課題があるなか、ただ課題を全て解決しようとするだけでなく、それは本当に必要か?今やるべきことか?という視点を深く追求されたように感じます。

今回のインターンでは、そのような方針、実装したこと、決断に対してのフィードバックがメンターの方からもらえ、自分たちが何を考える必要があるんだっけ?ということを常に提示してもらえました。そして自分たちの決断、実装は課題の解決を考えると本当にそれで良いのか?について、何度もフィードバックを受けて真剣に考えさせられました。

このように限られた時間の中での決断する訓練、それに対してのフィードバックがもらえる今回のインターンは本当に貴重で素晴らしい機会だったと思います。

最後に

二日間でしたが、本当に楽しかったです。運営もスムーズに行われたことだけでなく、CTOの方含め本当に沢山の社員の方が参加しておりDeNAの本気を採用と育成への熱量を感じました。

本当に参加してよかったです。

参加者の皆さん、メンターの方、そして運営などに携わった社員の皆様、本当にありがとうございました。

他の方もブログにインターンの様子書かれていますので、興味を持たれた方は是非是非読んでみてください。

同じチームだったnakajimaさんの記事
https://note.com/hourglasshoro/n/n49cd0b3949ac

去年(2019年度)ですがめちゃくちゃ参考にさせていただいたp1assさんの記事
https://blog.p1ass.com/posts/dena-intern/


この記事が気に入ったらサポートをしてみませんか?