読者です 読者をやめる 読者になる 読者になる

クックパッド サマーインターンシップ2016の資料を公開します

技術部開発基盤グループの @moro です。

クックパッドでは、昨年に引き続き今年も、夏の技術職インターンシップを実施しました。 クックパッドのインターンシップは前後半に分けた構成になっていました。まず前半はWebサービス開発に必要な技術の中から6つの分野に関する講義や実習を行いました。さらに後半は、前半の座学に合格した方を対象に、メンターとなる社員と一緒に実際の開発現場に入り、具体的な問題解決に取り組んでもらいました。

f:id:moro:20160810112403j:plain

その中で、前半の講義に使った資料を公開します。


1日目 Git (@moro)

昨年に引き続き、講義初日はGit, TDD, Railsを1営業日で一巡りするという、忙しい構成でした。

Git編では、すでにGitを使っているエンジニアも多いだろうと想定して各コマンドの紹介などは最小限に済ませました。代わりに、Gitの内部構造を説明し「コミットを覚えておけばなんとかなる」感覚を掴んでもらうことを主眼に置きました。Gitあるあるである「rebase していたらわけわかんないことになった」に陥ったときにも落ち着いて復帰できるようになったと思います。

資料: https://speakerdeck.com/moro/about-git-at-cookpad-summer-intern-2016-day1

1日目 TDD (@moro)

引き続き、TDDの講義を行いました。 「時刻」を表すバリューオブジェクトを、ユニットテストに導かれながらボトムアップで実装していくというコースです。 こちらも、テスティングフレームワークRSpecの使い方や気の利いたAPIの説明などはインターネット情報にお任せしたうえで、「なぜTDDするのか」「何を考えてテストに駆動させるか」という 気持ち を伝えたい構成でした。

資料: https://speakerdeck.com/moro/about-tdd-at-cookpad-summer-intern-2016-day1

1日目 Rails (@moro)

ボリュームたっぷり1日目のラストは、Ruby on Railsを使ったWebアプリケーションの講義でした。 こちらも「特定バージョンのRailsの使い方」のみならず、Webアプリケーションフレームワークを使った開発の一般論や、HTTPやREST、RDBMS、End-to-Endなテストを書くトップダウンTDDといった内容も理解してもらえるような構成を心がけました。 ひたすらボリュームが多い講義でしたが、参加者はみなさん頑張ってついてきてくれました。すごい。

資料: https://speakerdeck.com/moro/about-rails-at-cookpad-summer-intern-2016-day1

2日目 Android (@101kaz & @kmats_)

Androidの講義では前日に作ったRailsアプリケーションのAPIを題材として、クライアントアプリを作りました。 Androidアプリのライフサイクルの話や、レイアウトの作成、サーバとの通信方法、DBを使った永続化など、Androidアプリを作る上で最低限必要な知識を説明しました。 今年は非同期処理にRxJava、レイアウトにDataBindingライブラリを利用するなどより実践的な内容になっています。 たった一日しかない中で、FragmentやRxJavaやDataBindingなどを使いこなし、実際の現場とほとんど変わらないスタイルでのAnroid開発はかなり難しいものがあったと思いますが、みなさんとても優秀だったので、想像を上回るスピードで課題をこなしていました。

資料: https://github.com/cookpad/cookpad-internship-2016-summer/blob/master/android/README.md

3日目 iOS (@slightair)

iOSの講義では、簡単なアプリの実装を進めながらiOSアプリ開発の基本を学んでもらいました。 架空のネット通販サービスで商品を注文するためのiOSアプリを題材に、講義形式の解説と自分のペースで実装を進める演習を用意しました。

午前中いっぱいとお昼ごはん後の1時間くらいで、画面の実装やAPIリクエストの送信など、iOSアプリ開発に必要な知識をひと通り説明しました。 1日しか時間がないのもあり、結構駆け足で説明してしまった所もあってすぐに演習課題に取りかかれるのか少し心配していました。 そんな心配をよそに、皆さんとても優秀で黙々と課題に取り組んでアプリの実装を進めていくことができていました。すばらしい。

ちょうど台風が関東に近づいていた日でもあり、はやめに切り上げる事になってしまったのは残念でしたね。 この日の感想を読むと「時間があるときに残りの課題もやりたい」と書いてくれた人が多かったので、それなりに楽しんでもらえたのかなと思ってます。ぜひ取り組んでみてください。

資料: https://github.com/cookpad/cookpad-internship-2016-summer/blob/master/ios/README.md

4日目 サービス開発 (@ryo_katsuma & @transit_kix)

「唯一コードを1行も書かない日」のサービス開発の講義では、前後半2パートの構成でした。

前半では、昨年に引き続きクックパッドでのサービス開発に対する考え方を講義形式で学んでもらい、 後半ではグループワークとして1人の社員の課題を解決するプロトタイプ作りとユーザーインタビューを行ってもらいました。

サービス開発において正解は誰も分からないものです。 そのためにもクックパッドでは、仮説を検証できるものを早く形にして、ユーザーの反応を見て「学びのある失敗」をしながら正解を探るアプローチを取っています。

今回も、たった1人の社員を満足させるためのプロトタイプであっても「これは私は使わない」「むしろこういうものが欲しい」など、全く想定していなかったフィードバックを参加者全員もらう流れになりました。

なかなか大変なグループワークだったと思いますが、学生のみなさんには「思い込みでつくるサービスがいかに意味がないか」「ユーザーのフィードバックがいかに大事か」など、普段ではなかなか体験できないであろうことを実感してもらえたかと思います。

資料: https://speakerdeck.com/katsuma/service-development-at-cookpad-2016-summer-internship

5日目 自然言語処理&機械学習 (原島純)

5日目は自然言語処理と機械学習の基礎を学んでもらいました。自然言語処理の講義では基礎解析からアプリケーションまで、その仕組みを大まかにお話ししました。また、それらがクックパッドでどのように使われているかもお話ししました。実習ではクックパッドのデータを使って、形態素解析器に触れてもらいました。

機械学習の講義では基礎知識から深層学習までをおおまかに学んでもらいました。こちらの実習でもクックパッドのデータを使って、機械学習のモデルを作ってもらいました。機械学習を初めて学ぶという方が多かったのですが、皆さん、素晴らしい成果を見せてくれて、大変驚きました。

資料: https://speakerdeck.com/junharashima/internship2016

6日目 プログラミングパラダイム (青木峰郎)

最終日の6日目は昨年に引き続き、プログラミングパラダイム……のはずが、それとはまったく関係なくJavaScriptコンパイラーを書くという課題をやってもらいました。

この課題のテーマはずばり、「すぐには役に立たないことをやる」。これまで言語処理系を実装したこともなかったエンジニアが、インターンに参加してくれたからと言って、すぐその日からプログラミングパラダイムについて一家言持って語れるなどということは正直ありえません。であればせめて3年後に語れるようになるための礎としてこの日を使ってもらうのがよいだろう、というのがこの講義の趣旨です。

さて、実際に講義をやってみて、去年も今年も多かった間違いが1つありました。それは、「プログラムを実行するコードを出力しなければいけないのにその場でプログラムを実行してしまう(インタープリターを作ってしまう)」という間違いです。この点はある意味コンパイラーの肝とも言える特徴なので、ここに悩んでもらえるのは講義をやった甲斐があるというものです。存分に悩んでいただければ幸いです。

なお、今年の反省として、流れを改善したことにより全体的に進捗がよくなってしまいました。来年は進捗をより絶望的にするために、もっと難易度を上げようと考えています。ネイティブコード出力とかがいいですかね?

資料: https://speakerdeck.com/aamine/cookpad-2016-summer-intern-programming-paradigm


今年もかなりのボリュームの講義でしたが、参加した皆さんは一生懸命取り組んでくれていました。 来年も、よりパワーアップして実施する予定です! お楽しみに!

(2016-09-06T19:07にスライド展開しました)

/* */ @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;*/ /*}*/