こんにちは!クックパッド編集室メディア開発グループ長の @yoshioriです。
このまえ夏の技術職インターンシップの前半の開発講義・課題部分が終わったのでさっそく公開しちゃいます!
ちなみにこのインターンの対象者はプログラミングはわかるし自分で(授業とかではなく)コード書いている人なので超初心者向けでは無く、少なくともひとつ以上の言語でプログラミングが出来る人向けです。
一日目
TDD + git 編(@yoshiori)
講義初日なのでまずは簡単に肩慣らし & 開発の基礎の部分として TDD と git で始めました。 git については軽く説明し TDD は基本のテストファーストで進めて行きました。 ちゃんと何かをするたびにテストを実行し、メッセージを見れば次にすることが分かるというのを体験してもらい、GREEN が良くて RED が悪いのではなく、GREEN を想定しているのに RED になったり RED を想定しているのに GREEN に成るのが良くないというのを学んで貰いました。 翌日以降は静的型付言語 + IDE での開発になるのでテストによって typo とかも拾えるというのを自分で経験してほしく自分で写してもらいながら進めていきました。
Rails 編(@yoshiori)
Rails の講義では引き続きテストファーストで進めました。 フレームワークの使い方を覚えてもあまり意味が無いと思い、REST 的な部分を重点的に説明しました。具体的には基本となる「resource 操作は Path と method でユニークになる」というのを実感してもらうために telnet で実際に http をしゃべるところから始めました。 テストファーストで進めると Rails はエラーメッセージが親切なのでホントにテストに導かれながら開発するような感覚になれるのを実感してもらいました。 また JSON を返す API 部分も作り、なんとか heroku へのデプロイまで含めて行いました( 作ったアプリは翌日以降のクライアント開発で使うため)。
二日目
Android アプリ 編 (@101kaz + @tomorrowkey)
Androidの講義では前日に作ったRailsアプリケーションのAPIを使うクライアントアプリを作りました。 Androidアプリが起動してから終了するまでの流れや、レイアウトの作成、イベントドリブンなプログラムの書き方、サーバとの通信方法など、Androidアプリを作る上で最低限必要な知識を説明しました。 講義の流れとしては、基本的な画面だけ講義で一緒に作り、残された画面は各々が思う使いやすいアプリを考えながら開発してもらいました。 みなさんとても優秀だったので、少しのアドバイスで各々が思うユニークなアプリを作ることができました。
資料: https://github.com/cookpad/cookpad-internship-2015-summer/blob/master/android.md
三日目
iOS アプリ 編 (@slightair)
iOS アプリの講義では簡単なアプリの実装を進めながら iOS アプリ開発の基本を学んでもらいました。 Rails の講義で作成した Web アプリの API を実行し、同様の機能を持つ iOS アプリを開発しました。 開発に使ったプログラミング言語は Swift 1.2 です。
簡単なアプリとはいえ、画面要素の配置や画像の表示、APIリクエストの送信など、一般的な iOS アプリ開発に必要な知識にひと通り触れています。 iOSアプリの開発ではコードを書くだけでなく Xcode 上の操作が必要になってくるので、プロジェクターに画面を映して操作を見せながら講義を進めていきました。 AutoLayout の設定でつまづいてしまう人がたくさん出てしまいましたが、講義の終わりには全員が目的のiOSアプリの形へ仕上げることができました。
資料: https://github.com/cookpad/cookpad-internship-2015-summer/blob/master/ios.md
四日目
サービス開発編 (@ryo_katsuma)
サービス開発の講義では、クックパッドでのサービス開発に対する考え方と、その実践方法についてのエッセンスを学んでもらいました。
「サービス開発のおいて正解は誰にも分からないから、学びのある失敗を繰り返し、その中から成功に辿り着く」リーン・スタートアップに基づいた考え方や、ユーザーインタビューの仕方や効率的なMVPの作り方、検証数値の説明などを説明しました。
演習課題では実際にサービス企画を行ってもらいました。 本来はユーザーインタビューによる課題発見、MVPによる検証、その結果を元にした新たな仮説を立てるところまでサイクルをひと通り回したかったのですが、今回は時間の関係上そこまでは実現できませんでした。このあたりの調整は次回の課題になりますね。
機械学習・自然言語処理編 (@mrkn+原島+@chezou)
機械学習・自然言語処理の講義では、機械学習の入門的な話と自然言語処理の概要をクックパッドの事例と共に学んでもらいました。
機械学習の講義では、機械学習とはなにかという話から、教師あり学習、教師なし学習、そして評価と過学習の話など基礎的なところを解説しました。
自然言語処理の講義では、形態素解析や構文解析などの基礎解析から検索エンジンや自動翻訳などのアプリケーションまで一通り解説しました。実習では、形態素解析器を使って、レシピのタイトルを解析・マイニングしてもらいました。
演習課題としてクックパッドとWikipediaのデータから作ったword2vecのモデルを比較して、レシピサイト特有の類義語などの言語現象を探求してもらいました。
www.slideshare.net五日目
プログラミングパラダイム編(青木峰郎)
「プログラミングパラダイム」についてとかふわっとしすぎだろ! ていうかプログラミングパラダイムを語りたいなら 最低でも各パラダイム1言語は知らないとお話にならないし、 言語処理系くらい普通に書けてあたりまえだろ!
ということで、この講義では言語処理系を作ってもらいました。 1日という短期間である程度本気の処理系をさわれるように、 JavaScriptのコンパイラ(未完成)とVMをこちらで用意し、 コードジェネレーターだけを書いてもらう方式です。 ソース言語は多くの人が知っている言語のほうがよいのでJavaScript。 ターゲットは機械語ほどつらくないバイトコードVMとしました。
言語処理系をさわったことがないというインターン生は意外と多く、 VMスタックのpush・popが合わなくてVMに怒られたり、 謎の最適化に悩まされたりと、想定通りのつらいめにあってくれました。 人生一度くらいは全力でスタックと戦う経験をするのも悪くないのではないでしょうか。
- コード(バイナリはMac OS X Yosemite用です)
- 補足資料
今回こういったガッツリ講義などをするインターンシップは初の試みでした。 色々反省点もありますが、また来年も出来ればいいなと思っています。