クックパッドのエンジニアサマーインターンに参加してきた話
Other
1. はじめに
8.16 ~ 8.27 の間、「Cookpad Summer Internship 2021」に参加していました。本記事はそのまとめです。2 週間という期間でしたが、サービス開発に関する体系的な講義,OJT や PBL による実践…etc と盛り沢山の内容で非常に充実した内容のインターンでした。
クックパッドの回し者というわけでは全くありませんが、開発力に自信がある人もそうでない人にもかなりオススメです。以下に参加までの経緯やインターンの内容について書いていきます。
2.なぜクックパッド?
ここでは数多ある IT 企業の中から「なぜクックパッドのサマーインターンに参加することになったのか」、参加までの経緯について説明していきます。
きっかけは今年の三月に参加した春インターン。5 日間で Next.js を使ったレシピページを作るというやつですね。
春インターンの後、人事の方から「サマーインターンの選考を受けてみませんか」というお誘いを受けました。しかし、誘っていただいた時点で、すでに開発の実務経験やスキルには自信があった僕は「俺、就業型受けるんで!」とサマーインターンシップの誘いを断り、就業型を受けることにします。
そして、いざ迎えた就業型のコーディング試験。アルゴリズムと DB 設計に関する問題が出題されましたが、競技プログラミング苦手が起因して、派手にやらかしてしまいます…(アルゴリズムの勉強マジでしないとまずいですね。今やっています。)
そして、7 月上旬、就業型インターンにあっさり落ちてしまったことを知らされました。
「ダメかぁ…」という失意の中、就業型に落ちたことを伝えるメールに、サマーインターンに関して、「募集は締め切っており、参加者も確定しておりますが、ご希望があれば特別に選考を行います」という内容が記載されていました。本来の締め切りが 5 月末で、このメールが届いたのが 7 月上旬なので、本当に特別枠という感じで選考してもらうことができました。クックパッドの人事の方、本当にありがとうございます。
そうして、選考を受けることにしたのですが、ここで「当初フロントエンドの就業型がしたいと思っていたやつがなぜサマーインターンの選考を受けることにしたの?」という点についてです。
選考を受けることにした理由はフルスタックな開発知識を体系的に学びたいと思ったためです。「なんで体系的に知りたいの?フロントだけでいいじゃん」と、言われてしまうかもしれませんが、個人的にソフトウェアエンジニアはフロント・サーバ・インフラ全ての領域で設計・実装はできる程度にフルスタックでないと厳しいと思っています。
理由としては
- プロダクトに貢献できる領域は広いに越したことはない。
- 色々できた方が仕事も個人開発も楽しい。
- 特定の領域を極めようと思ったら、その周辺領域の知識もないと厳しい.
という 3 点があるかなぁ、と思います。
3 点目についてですが、例えばフロントエンドを極めようと思ったら、単にブラウザ側の処理がわかるだけだと不十分で
- SSR や SSG,ISR といった概念を実装・理解するにはサーバ側の知識もないと厳しい。
- GraphQL API を実装するにはサーバサイドの実装経験がある程度ないと厳しい。
- SSR や SSG,ISR されているサイトのホスティング先の選定はインフラの知識がないと厳しい。
という風に、フロントエンドと呼称されている領域においても、フロントエンド以外の知識が求められる場面は多々あると思っています。(他の領域も然り)
だからこそ領域を絞らず、様々な技術領域に顔を出せるお節介なエンジニアがある種、僕の理想像なわけです。
そんなこんなで、「フロントエンド技術に関する知見をもっと深めたい」という就業型を受けた当初の目的とは、ズレますが、サマーインターンは僕にとって非常に魅力的な内容であると感じ、日程の都合も合ったので、選考を受けることにしました。
3.選考
選考は面接一回。聞かれたことは、
・作ったものに対する質問・ アルゴリズム系の問題が一問
という具合だったのですが、2 つ目のアルゴリズム系の問題で、再びやらかしてしまいました(キャーー)。
「ヤバい、せっかく誘っていただいたのに落ちたかも…」とかなり不安だったのですが、なんとか合格のメールをいただくことができ、参加が確定しました。
インターン前、Cookpad からノベルティが届きました。
エンジニアインターンのノベルティってどうしてどこも豪華なんでしょうか。こうして、僕は、インターン当日を迎えます。
4. インターン本番
4.1 現場エンジニアから開発講義を受ける
インターン前半はクックパッドのエンジニアから開発に関する講義を受けました。以下はインターンの LP からの引用です。
インターンシップ前半ではクックパッドが日々活用している Web(React・TypeScript・Ruby on Rails) 、モバイルアプリケーション、AWS といった開発技術や、ユーザーの課題解決のための考え方をギュッと圧縮して学習できる講義を実施します。
「ギュッと圧縮して」とありますが、実際、Web,モバイル,インフラとサービス開発に必要になるであろう全技術領域をこれでもか!というほどに詰め込んだ充実の講義内容でした。
各日の講義でやったことと感想はざっくり以下の通りです。
1 日目・Web フロント(Next.js/Typescript/GraphQL)
- @hokaccha さんの Web フロントエンド講義
- Next.js,Typescript,GraphQL で簡易版クックパッドマートの実装.
- localStorage に戸惑う。
2 日目
- iOS(Swift/Swift UI)
- @masaichi さんの iOS 講義
- Swift,SwiftUI で簡易版クックパッドマートの実装.
- 初 iOS だったので基本課題終えるのでやっとだった。Swift とは仲良くなれそう。
3 日目
- サーバサイド(ruby on rails/grpc/graphQL)
- @miyoshi さんのサーバサイド講義
- rails で GraphQL API サーバの実装をする。
- rails も初めてだったので基本課題終えるのでやっとだった。
- graphQL の内部ってこうなっているんだふーん、ってなった。
4 日目・インフラ講義(AWS/terraform)
- @mozamimy さんのインフラ講義
- terraform で構築したインフラに 3 日目に作ったアプリケーションをデプロイする。
- AWS や CloudFormation を雰囲気で触ったことがあったのでそんなに詰まらなかった。
- terraform はいいぞ。
5 日目・サービス開発講義
- サービス開発講義。
- 「ユーザーの課題発見」 ~ 「プロトタイプを作る」までのフローをレクチャーしてもらい、グループで実践した。
- ユーザーの課題を発見し、それをプロダクトデザインに落とし込むクックパッド独自のサービス開発のプロセスは本当に興味深く、今後実践していきたいと強く思った。
このように五日間とは思えないほど幅広い技術領域に触れることができました。入門レベルでも、様々な技術領域に触れておくことは重要だと思っているのでとても勉強になりました。
4.2 レシピ開発基盤部に配属され、A/B テストを実装する.
・配属部署インターン後半戦では OJT 組と PBL 組に分けられます。僕は「OJT がいいです!」という旨を人事の方に伝えていたのですが、無事希望が通り、レシピ開発基盤部というレシピサービスを開発する部署に配属されました。クックパッドのレシピサービスといえば、月間利用者数 5000 万人を超えるオバケサービス。そこまで大規模な to C サービスに触れる機会は普段無いため、ワクワクしながら、OJT に臨みました。
OJT 中に僕がやることになった領域は Web フロントエンドでした。クックパッドのフロントエンドといえば、以下の記事が以前話題になりましたよね。
記事にもあるとおり、現在、クックパッドは rails で作られたレシピサービスのレガシーフロントエンドを Next.js,Typescript,GraphQL というモダンな技術スタックに絶賛リプレース中です(目標の 70 ~ 80%くらいは完了しているらしい)。
そして、記事からの引用ですが、サービス全体のアーキテクチャは以下の通りです。
Next.js で構築されたフロントエンドが GraphQL API(BFF)を叩き、GraphQL は gRPC で裏側のマイクロサービスと通信を行う…という最近よく見かける 3 段構造のアーキテクチャがクックパッドレシピサービスでも採用されていました(メルカリ shops とかもこれでしたよね)。
やったこと
NDA 的な背景もあり、詳しくは書きませんが、レシピページの A/B テストの実装に取り組みました。
レシピページにある機能 x を追加するにあたって
- 機能 x のデザイン案 A
- 機能 x のデザイン案 B
- 機能 x なし
の 3 パターンを一定の割合でユーザーに振り分け、ログを収集することで「機能 x の効果はあるのか?」「機能 x の効果が高くなるデザインはどれなのか?」という 2 点を検証していきます。OJT 期間の 5 日間では、そのような A/B テストのフロントエンド実装に取り組みました。
ここで、実装に関してです。レシピサービスには数十程度の A/B テストを同時並行で実施することができる仕組みが既に実装済みであり、僕が参加した時は 20 以上の A/B テストが同時並行で走っていました。
そのため、A/B テスト用のログを送信するための関数やユーザーごとにデザインを切り替えるための hook 関数は cookpad-next(今回編集したリポジトリ)内に既に用意されており、実装自体はそれほど難しいものではなかったです
「どのようにしてデザインを切り替えるのか」「どのデザインがどのユーザーに届いているのかをどうやって識別するのか」という A/B テストの仕組みについては、「ずっと興味はあったが手が届かない領域」であったため今回実装を通して理解することができ、本当に勉強になりました。
4.3 CTO とのお話し.
懇親会や面談などで CTO の成田さんとも話す機会が何度かあったので、それについても少し触れておきます。もともと僕がクックパッドという会社に興味を持つきっかけは昨年あった技育祭での成田さんプレゼンを聞いたことだったので、今回お話しする機会を設けていただいたのは本当にありがたかったです。
話したことは
・技術的雑談・「サーバサイドをガッツリやりたいがなかなかその機会を得られず、悶々としている」といった個人的悩み・入社する会社を決めるにあたってドメインにこだわることの重要性・クックパッドのこれから
といった内容について話しました。「使っている技術は Web 系の企業だったらそんなに変わらないし、エンジニアとして意識高くやっていたらいずれフルスタックになるので、技術よりも関わるドメインについてもっと考えたほうが良い」という話は確かにその通りだと思いました。
また懇親会で成田さんが話していた「“Beyond the Boundaries” (境界を越える)」というクックパッドのエンジニアの行動指針についても非常に印象に残っています。「これは自分の役割ではない」「自分にはできない」と無意識のうちに引いてしまっている境界を認識し、それを超えていくことを習慣づけることが、エンジニア個人・組織の非連続的な成長につながるというものです。
特に最近の自分は「フロントエンド」や「個人・アルバイト・インターンでの開発」といった領域にとどまってしまい、それ以外の技術領域(サーバー、インフラ、OSS…)との間に境界を引いてしまっている気がしていたので、この言葉は非常に刺さった気がします。
4.4 最終成果発表
5 日間の OJT・PBL 期間を終え、いよいよ最終成果発表です。最終成果発表会では、5 日間離れ離れとなっていた OJT・PBL 組が一同に介し、成果を発表していきます。他の子が何をやっているかを全く知らなかったので、4 時間以上の長丁場でしたが食い入るように聞いていました。
OJT の子達は 5 日間という短い期間でしたが、全員「本番デプロイ・master へマージ」まで到達していました(すごい)。PBL 組は 5 日間かけて、与えられたふわっとしたお題に対し、課題設定 ~ アプリケーションの実装まで取り組んでいました。設定している課題やその解決方法が違えば、最終的なアウトプットも人それぞれで、素直に「みんなすごいな〜」と思いました。
もちろん、僕も聞くだけではなく、5日間かけて取り組んだ A/B テストの実装について発表を行います。
発表の後、メンターの@morishin さんから以下のようなフィードバックを受けました。
・実装が早い.・自分が関わるフロントエンド領域以外も Design Docs 等をよみ、サービスの全体像を把握しようとする姿勢がよかった.・自分の考えていることを Issue や Slack で積極的に共有してくれるの良い.・短い期間ながら、デプロイまで行けて Good.
みんなが聞く中でのフィードバックであったということもあるのかもしれませんが、ポジティブなものばかりで嬉しいですね〜。
余談ですが、@hokaccha さんが「発表がよくまとまっている」と Slack でつぶやいてくれたことも実は嬉しかったです。
5. 最後に
2 週間とは思えないほど内容が濃く、非常に充実したインターンでした。
この夏、未来の自分に出逢おう
というのがこのインターンのテーマである、ということをインターンが一通り終了後の懇親会で知りました(すみません笑)。
テーマに則るのであれば僕の場合は「境界をつくらず、新しいことにチャレンジすることが習慣になっているソフトウェアエンジニアになろう」そんな風に思えるようなインターンでした。
というわけで、2 週間という短い期間でしたが非常に楽しかったです!
クックパッドの皆さん、インターン参加者の皆さん、本当にありがとうございました!