総合職で入社した新卒がクックパッドでエンジニアになるまで

はじめに

こんにちは、技術部の土谷です。

現在、私は2015年4月に総合職の新卒社員として入社したのですが、自ら希望してエンジニアに転向するために6ヶ月間の技術教育(トレーニング)を受けています。

この記事では、私が受けているトレーニングの内容に関してご紹介したいと思います。

なぜやっているのか

トレーニングのゴールは「クックパッドで一人前のエンジニアとして働ける技術力を身につける」ことです。

クックパッドでは、ディレクターや営業職であってもサービスに関わるスタッフは全て最低限の技術的な知識を持っているべきと考えられています。 そのため総合職の新入社員研修にも、クックパッドで働く上で最低限の技術的な知識を持つために技術研修が組み込まれています。

ただ、私自身、総合職で内定をもらったものの、「自分でものづくりがしたい」「それも、手を動かして納得のいくものをつくりたい」という思いを持っていて、その葛藤を人事に相談し、新入社員研修を受けながらエンジニアと面談する機会を設けてもらいました。 いろいろ相談した結果、やはり自分でものが作れるようになりたいと思い、トレーニングに挑戦することにしました。

なにをやっているのか

さて、実際に行われている研修の内容は、基本的には大きく

  • 開発実習
  • 書籍学習

の2種類があります。それぞれ具体的にどういうことに取り組んできたかご紹介します。

書籍学習(&コードリーディング)

書籍学習では、以下の技術書を読んで理解した内容を、トレーニング担当のエンジニアに説明します。

基本的に私がメインで説明しますが、理解の曖昧そうな箇所は事前に質問したり、説明の途中で質問します。

書籍学習をする目的は3つあると考えています。 1つ目は、「エンジニアが標準的に知っていることを学ぶ」ということ。そもそも私は知識や経験が圧倒的に足りないので、「標準的なWebアプリケーションに必要となる知識」を書籍学習を通じて体系的に学ぶ必要があったのです。

2つ目は、「技術の学び方を学ぶ」ということです。技術書を読む時、どこに注目すべきか、何を考えながら読むべきか。 初めて見るメソッドや単語であったら、その都度公式ドキュメントで調べてその挙動を理解するようにしました。

3つ目は、「人にきちんと説明できるようになる」ことです。まだまだできていない部分ではありますが、自分の理解したことを相手に伝えることで、理解が曖昧そうな点や、説明が漏れている箇所を突っ込んでもらいます。 読んだだけで終わらず、内容をレジュメにまとめて自分の言葉でエンジニアに説明することで、理解したと思っていた内容が実は間違っていた、とわかることが徐々に理解度の向上につながっています。

書籍学習の技術書のうちいくつかは高度な内容を扱っていたり、中級者を想定して書かれている本もあるので、そこは用意してもらった参考書籍を自分で読んで足りない部分を補います。 以下、自分が追加で読んだ書籍や文献です(一部は研修が始まる前に読み進めていたものもあります)。

コンピュータ科学: なぜプログラムは動くのか

Ruby:

Rails:

DB: SQL ゼロからはじめるデータベース操作

JavaScript: JavaScript本格入門

今は書籍学習が一段落したので、RubyやRails関連のオープンソースソフトウェアから中〜大規模のライブラリやgemのソースコードを読んで、実装内容を説明するということをしています。

開発実習

書籍学習と並行して、手を動かしてコードを書いています。

Rubyでアルゴリズム演習

最初は、UNIXコマンドと同等の機能を持つプログラムとアルゴリズムを実装することが課題でした。実装時はまずテストを書いて、それからテストを満たすようにプロダクトコードを実装するテスト駆動開発で行いました。

コマンド

  • wc, head, tail, expand

アルゴリズム

  • ヒープソート、二分探索木、ハノイの塔

RailsでWebアプリケーション開発

Rubyで上記のものを実装した後は、RailsでWebアプリケーションを開発しました。 最初の課題はタスク管理アプリでした。タスクが登録できて、タグを付けられる、というシンプルなものです。以前に読んでいたRails Tutorialは1対多のモデル構造だったので、多対多のモデルで実装しました。

次の課題は独自の認証機構をもった画像投稿SNSです。認証や画像投稿を扱うための便利なgemはありますが、今回はそれらは使わずに自分で実装してみました。

Webアプリケーション開発では、「標準的なWebアプリケーション開発のフローを学ぶ」ことと、「見積もりをたててスケジュールを修正できるようになる」という目的がありました。 前者に関しては、「プルリクエストを出してコードレビューをしてもらい、修正したものをマージする」という実際の業務で開発する際のフローと近い形で開発をすることができ、最後にはデプロイできるように設定しました。 コミットの粒度、コミットメッセージの書き方と細かい部分まで見ていただきました。

実務研修

現在はこの段階です。事業部に入り、実際の案件を担当させてもらっています。

いまの研修スタイルに関して

簡単な紹介にはなってしまいましたが、以上が私がこの4ヶ月クックパッドでやってきたことです。最後に、私が受けた(今も受けている)研修の内容や進め方に関して、特に良かったと思う点を述べたいと思います。

初期の段階で基礎的な分野を学べた

今まで、Rubyの本やRailsの本は読むことはあっても、入門コンピュータ科学のような本は読んだことがありませんでした。 概念的な説明が多く、コードもほとんど出てこなくて、書かれている内容に関して、自分の中でどういうこと(もの)かイメージしづらい分野でしたが、初期の段階で一通り基礎を学んでおくことで、結果的に後で役に立つケースが何度もでてきました。

例えば、実習で開発していたアプリを本番環境にデプロイする際に、変更したはずの修正が反映されていないことがわかった時。 「きちんとアプリのファイルが配置されているのになぜ?」と疑問に持ち、「もしかして昔のプロセスが生きてて、それで反映されてないのではないか」と当たりをつけて、プロセスを調べ、サーバを再起動したら、修正が反映することができました。自分の学んだことから構築して、ぱっと指摘された時もだいたい自分で解決できるようになりました。

周りのエンジニアに質問しながら、自分で短時間で問題を見つけて、解決することができた経験は、以前の自分より前進することができてる成功体験を得ることができました。

網羅的に知識の索引がわかる

一度、コンピュータとは?というところから初めて、言語処理系、DB、フロントエンド、のことを網羅的に学んだので、わからないことがあったり詰まった時、「ここに載ってるのではないか?」と当たりをつけたり、「あ、たしかこれ一回学んだ内容だから、あそこ見ればきっとわかる」という状態を少しずつ持つことができました。

一度本や文献で読んでいるので、2回目以降は同じ所を読んでも、一度目よりも理解も深まります。

一方、仮にいきなりRailsで動くアプリを書いていっていたとすると、動くものを作れるから楽しいと思いますが、なんとなく動くものが作れたので、わかった気になってしまうかもしれないのと、新しいことやわからないことにぶち当たった際に調べて理解するのにかかるコストが大きそうだなと思います。 これはどちらが正しいというものでは無いと思いますし、本人にとっての向き不向きによって当然左右されます。

私の場合、先述したように新卒社員の3ヶ月の研修中に何度かエンジニアと面談(技術書を読んだり、チュートリアルに取り組み、その内容を説明するというもの)をしました。 何回かエンジニアと面談を重ねていく中で、「コードは少し書くことはできるが、業務の中で新しい問題に直面した時にも応用できるための基礎力が必要だ」ということを言われました。それもあって、最初に社内のエンジニアが(独学もしくは大学など)どこかで学んだことがある基礎的な内容も含めたカリキュラムを組んでもらいました。

まとめ

今回は、私がチャレンジしているトレーニングの内容をご紹介しました。

まだトレーニング半ばではありますが、これからエンジニアリングを学ぼうと考えていたり、同じような境遇の方に少しでも役に立てれば幸いです。

/* */ @import "/css/theme/report/report.css"; /* */ /* */ body{ background-image: url('http://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527163350.png'); background-repeat: repeat-x; background-color:transparent; background-attachment: scroll; background-position: left top;} /* */ body{ border-top: 3px solid orange; color: #3c3c3c; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; line-height: 1.8; font-size: 16px; } a { text-decoration: underline; color: #693e1c; } a:hover { color: #80400e; text-decoration: underline; } .entry-title a{ color: rgb(176, 108, 28); cursor: auto; display: inline; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; font-size: 30px; font-weight: bold; height: auto; line-height: 40.5px; text-decoration: underline solid rgb(176, 108, 28); width: auto; line-height: 1.35; } .date a { color: #9b8b6c; font-size: 14px; text-decoration: none; font-weight: normal; } .urllist-title-link { font-size: 14px; } /* Recent Entries */ .recent-entries a{ color: #693e1c; } .recent-entries a:visited { color: #4d2200; text-decoration: none; } .hatena-module-recent-entries li { padding-bottom: 8px; border-bottom-width: 0px; } /*Widget*/ .hatena-module-body li { list-style-type: circle; } .hatena-module-body a{ text-decoration: none; } .hatena-module-body a:hover{ text-decoration: underline; } /* Widget name */ .hatena-module-title, .hatena-module-title a{ color: #b06c1c; margin-top: 20px; margin-bottom: 7px; } /* work frame*/ #container { width: 970px; text-align: center; margin: 0 auto; background: transparent; padding: 0 30px; } #wrapper { float: left; overflow: hidden; width: 660px; } #box2 { width: 240px; float: right; font-size: 14px; word-wrap: break-word; } /*#blog-title-inner{*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-position: left 0px;*/ /*}*/ /*.header-image-only #blog-title-inner {*/ /*background-repeat: no-repeat;*/ /*position: relative;*/ /*height: 200px;*/ /*display: none;*/ /*}*/ /*#blog-title {*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-image: url('http://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527172848.png');*/ /*background-repeat: no-repeat;*/ /*background-position: left 0px;*/ /*}*/