こんにちは、9/23担当のoribeです。
もう夏休みの終わりが目前ですね。
あと1、2週間くらいある気持ちでいたのでとても辛いです。
この記事は、9/19、20の2日間にわたってサイバーエージェントで開催された「CA Tech Challenge 学生版ヒダッカソン -API編-」の参加記です。
ヒダッカソンとは
「ヒダッカソン」は年に1度行われる、サイバーエージェントのゲーム事業部(SGE)に所属するエンジニア達が技術を競い合う社内イベントです。
今回のAPI編では、与えられた仕様書をもとに2日でサービスを模したWebアプリケーションのAPIを実装してスコアを競います。仕様書をもとに採点が行われ、スピードと正確さを意識しながら高いスコアを目指して実装してください。
メンターとなるエンジニア社員のバックアップのなか、学生同士で点数を競い合っていただきます。
出典:「CA Tech Challenge 学生版ヒダッカソン -API編-」
当日は25個のAPIの仕様書が渡され、それに沿って実装して稼いだスコアを競っていく形式でした。
1人につき1つのサーバーが用意され、そこに対してベンチマークを行い1つのAPIのリクエストが通るごとに100点計上されていきます。
基本的には2500満点になりますが、25個のAPIが全て実装されてからはそのパフォーマンスに応じて応用点がつき、それ以上の点数を得ることができました。
また、一人ひとりにGitHubのリポジトリが用意されており、マスターブランチにプッシュした上でリモート環境でシェルスクリプトを実行するだけで最新のマスターブランチのプルからデプロイまで行えるようになっていました。
ローカルでの開発用にDockerfile、docker-compose.ymlが用意されており、Dockerを起動するだけで実装したMySQLとクライアントサイドが立ち上がり、開発しているサーバーサイドのビルドまで行えるようになっていました。
使用言語は事前のアンケート結果を踏まえてGo、PHP、Python、Rubyから選ぶことができ、Dockerfileもそれぞれの言語に応じて用意されていました。
参加動機
今年の5月にtraPで開催された「WEBエンジニアになろう講習会」(参加記)に参加して以来、サーバーサイドの開発をしてきました。
あれから4ヶ月でどの程度の力を身に着けることができたかを測るにあたって、競技形式で行われるヒダッカソンは最適だと感じ参加しました。
当日
1日目
午前中はサイバーエージェントについての企業紹介と、ヒダッカソンについての説明が行われ、実際の開発自体は午後からでした。
開始してすぐにリモート環境でデプロイを行いベンチマークが通ることを確認。何も実装していないので当然のようにスコアは0点になります。
ローカル環境での開発を開始。言語はGoを使用しました。
†全完†を目指していたので、特に何も考えずAPI仕様書の上から順に実装していくことにしました。
1つめのログイン機能の実装の実装を終えてローカル環境でテストしてみようとしたところ、なせかビルドが通らない。
原因はローカル環境用のDockerfileを日頃の開発環境に合わせて書き換えたところ、もともと用意されていたgo.modのモジュールパスと整合性が取れなくなってしまったことでした。
この問題を特定・解決するのに30分以上かかってしまいました。つらい。
とりあえずビルドできるようになったものをデプロイしてベンチマークを回してみたところ、スコアは0点のまま。
「ログイン機能の実装は他のAPIのテストをする上での大前提」みたいなことを事前に言われていたので、ただログイン機能だけを実装してもその分のスコアは入らないのかな、と気楽に考えて(完全に思い違いでしたが)次に進むことにしました。
そういことでログアウト機能の実装を飛ばして、3つめのAPIを実装することにしました。
このAPIはトップページを描画するための情報をごりっと取ってくるためのもので、やること自体は単純なのですが作業量がかなりあるものでした。
後から考えると、個人的には25個のAPIのうち3番目くらいに大変なものでしたね。
このAPIは後回しにして実装を進めた人が多かったみたいです。それが妥当だなと思いました。はい。
途中で細かいミスをはさんだりして1時間半くらいかかったものの、無事実装を終えベンチマークを回したところまたまた0点。
流石におかしいな、と気づきベンチマークのログを見た所全てのAPIへのリクエスト結果が502。
上述のAPIで502を返すものは実装していませんし、未実装のAPIに関しては501を返すようにしていたので想定外の現象です。
メンターさんに付き合ってもらって調べていったところ、原因は変数名を間違っていたために環境変数が読み込めておらず、その結果データベースへの接続という最初の処理に失敗してアプリケーション自体が死んでいたとのこと。
……これの特定にも30分以上かかりました。
結局スコアが0点のまま開発時間が終了しました。
1日目夜、2日目朝
0点での1日目終了という事実が悲しすぎたので、家でがっつり進捗をすることにしました。
ベンチマークは行えなくなっていましたが、開発を進めること自体は許可されていたので、1日目夜に3時間半、朝に2時間ほど作業をして7個のAPIを実装しました。
この時点で流石に全完することを諦め、重いAPI2つは飛ばすことにしました。
それ以外は懲りずにまた上から順に実装しているのですが……。
2日目
午前中は社員の方によるLTと、メンターさんによるAPIのおすすめ実装順序の開示が行われました。
当然のごとく私の実装順序とは全然違うので、一切気にせず進めることにしました。
ベンチマークを回せるようになる正規の開発開始時刻までにもいくらか開発を進められる時間があったので、その時間も有効活用しました。
開発開始時刻になってからベンチマークを回し、細かいミスの対応をして1300点。
途中、リクエストへのバリデーションを丁寧にやりすぎたせいで他の人は問題なく通過させていたベンチマークのミスリクエストを弾いてしまう、というトラブルはあったものの(ベンチマークの修正対応をしてもらえました)、比較的順調に実装が進み、15:30には2300点まで到達しました。
開発終了時刻は17:00だったので、残り1時間半で重いAPI2つの実装は無理だなと諦め、1つに絞って実装を進めました。
ギリギリ間に合うか間に合わないか、という状況から結局間に合わずに開発終了時刻に。
ベンチマークが締め切られて10分後に完成しました。悲しい。
結果
最終スコアは2300点で4位でした。
3位の方は2400点、1位2位の方は25個のAPI全てを実装し終えて応用点で競っているという状態でした。
感想
楽しかったけれど、とても悔しかったです。
1日目の諸々のトラブルさえなければ、もしくは持ち帰りの時にもって進めていればより上の順位に入れていたかもしれない、と考えてしまい落ち込んだりしました。
ですが、当初の参加目的であった「自分の現在の実力を把握する」という点は達成できました。
自分の実装力にも自信を持つことができたので、参加してよかったと思います。
メンターさんから「問題にぶつかった時に原因を切り分けるのが上手だった」という講評をいただけたのがとても嬉しかったです。
加えて「もう少し落ち着いてデバックできるとよかったですね」という講評もありました。大変おっしゃる通りです……。
また機会があれば今度は1位を取ります。
メンターを務めてくださったサイバーエージェントの社員の方々、ありがとうございました!
景品としてトートバックをいただきました。