窓を作っては壊していた人のブログ

提督の窓や成績の窓を作ってました.今では適当に好き勝手に開発をしてます.

Cookpad Tech Internship - Summer 2016 - に参加してきた(前半)

参加の経緯

就活が来年に迫ったM1の夏,多くの経験と圧倒的成長がしたいなぁと考えサポーターズさんのエンジニア面談会に5月ぐらいから参加していました. そこで今回お世話になったクックパッド株式会社さんと出会うきっかけがあり,そこで 技術はあくまでも課題解決の手段,料理で問題を解決したいなど, 技術に対するスタンスや,また料理に対するアツい想いを語っていただきました. またインターンについて内容を聞いてみると技術一筋の内容だけではなく,人にサービスを提案するその流れも味わえるとあったため,一味違った体験が出来るなと感じ, 食べることが大好きだったこともあり今回のクックパッドサマーインターンシップへの参加を決意しました.

Cookpad Tech Internship - Summer 2016 - とは

recruit.cookpad.com 説明にもあるように前半7日間でサーバーサイド,クライアント,サービスの提案,機械学習,そしてすぐには役に立たないことを学び, 後半に進むと実際の現場に配属され実務を行う非常に刺激的なインターンシップです.

選考フローとか

こんな課題を行いました,提出したソースなどはお見せできません.

GitHub - cookpad/engineer-portfolio: クックパッド 2016 インターンの応募方法と、その時に利用するファイル一式です。

言語不問でよかった...Markdownはちょこちょこ書いていたのですが,YAMLについては全く書いたことがなかった&読んだことがなかったのでまずは仕様調べからという感じになってしまいました.

インターンを終えて考えてみると,インターンの講義の流れだったり,また選考の課題もインターンでの講義や業務に使う技術や考え方の基礎になっているんだなぁと感じています.

インターンシップの内容と所感

さてここからは実際にインターンシップで経験した課題などについて触れます. 上記の通り前半の7日間では講義形式で与えられた課題について取り組み,理解を深めていくことを主とします.初日のオリエンテーションで環境構築を行い講習に集中できるようにします.前半講義の内容を列挙すると以下のとおり.

  1. TDD / Git / Rails
  2. Android
  3. iOS
  4. サービス開発
  5. 機械学習 & 自然言語処理
  6. プログラミングパラダイム

資料などは後日

クックパッド開発者ブログ

にアップされるかと思います.参加者のレベルは全体的に高いですが,一度もサーバーサイドだったりクライアントサイドに触れたことがない人間でもわかりやすいものとなっていたので,目を通しておくといい勉強になると思います. 私もスライドがアップされたら再度復習をしてみようかなと思います.

追記2016/09/06
アップされました

techlife.cookpad.com

TDD / Git / Rails

初日からいきなり重い課題だったなぁという記憶があります.

Gitの講義では使い方というよりもGitの内側について学びました.GitBookでいうと Git - Gitオブジェクト あたりの話. コマンドを叩いて使ってはいましたが,背景にあるツリー構造だったり,ファイルというかblobごとのハッシュ,それを持ってるtreeなどこのシステムを構成する要素を一つ一つ考えたことは初めてで非常に面白い内容でした.

TDDではRspecといったフレームワークを使用し,テスト駆動開発について学びます.今回は時計のオブジェクトを作成し,それに対して様々な仕様を付け加えてテスト駆動開発を行う流れを学びました.テスト自体は片手で数える程度しか行っていなかったため,この場合どういったテストケースを用意すれば仕様を満たしていると担保できるレベルになるのか見当をつけるのが非常に難しかったです. しかしテストを書くことによって本当にこのオブジェクトやメソッドがどういう振る舞いをすることが望まれているのかを整理しやすくこれからも少しずつ勉強していきたいと思える内容でした.

初日最後はRailsです.一番最初に後悔したことがあり,Railsやるって書いてあるんだからRuby書けるようになっておけばよかった,ということです. 講義中にループや条件判定とかの構文調べるのはさすがにまずかった. ウェブアプリケーションの作成経験がほとんどなかったこともあり,短時間で新しい概念が頭に流れ込んできてパンク寸前だったことを覚えています.ブラウザからのアクセスを想定しているとHTMLも書く必要があるのですが,今回はhamlを使用しました. どちらを使ってもタグを書く必要があるのですが,このタグもわからなかったあたりちょっとしたホームページを書く練習を行った方がいいなと思いました. さて,作ったウェブアプリケーションの内容ですが,簡易的なECサイトです. DBに登録されている商品の情報と画像を表示し,ユーザがオーダー出来るようにするものでした. ここで作ったウェブアプリケーションをベースとして今後のAndroid/iOSの講義を行いました.

Android

Railsの講義で作成したAPIを利用するAndroidアプリケーションを作成しました. 私は今までに

SmartCampus | 電気情報物理工学科 オープンキャンパスネット

こんな感じのプロジェクトに参加していたことがあり,ある程度Androidアプリケーションは書けそうだなあと油断していたのですが,太刀打ちできませんでした. 自分一人でAndroidアプリケーションを開発したのはもう何年前か覚えていないレベルだったので見るもの全てが新しかったです. 開発ではReactive Extensions(いわゆるRx,みんなが大好きC#だとLinqとかでごにょごにょするっぽいやつ?)だったりAndroid Data Bindingを取り入れたり生のSQLを扱わないORMと自分が触れたことのない技術だったので,非常にお得感があった講義だったことを覚えています. あとテンプレートを使用しないでNavigation Drawerを作ったり... ですがこの経験は今後の開発にすごく活かせるだろうなと感じて非常にやりがいのあるものでした.

iOS

えっと,めちゃくちゃAutoLayout難しくないですか?と終始感じながら行ったiOSアプリケーション開発です. 画面の遷移をGUIで線を伸ばして作っていくのは非常に新鮮でそこは面白かったのですが,キーボードから手を離すのは億劫と感じてしまうレベルに手を動かすのが嫌いな人間にとっては非常に難しい開発でした. じゃあコードでLayoutから遷移まで書くかと言われたら多分そうとう苦行なんだと思います.iOS App Developerの方たちはすごいなぁと感じました. コードの部分では初めてSwiftを触ったのですが,独特だけど慣れると非常に書きやすい言語だなと感じました.あとはもうちょいXcodeよしなにやってくれよとも思いましたが. パッケージ管理もサードパーティのものが非常に優秀で, 慣れたら 開発しやすい環境なんだと思います.

サービス開発

今までの3日間と一風変わってコードを書かない講義です. ある意味ですごく頭フル回転させた講義であると思います. cookpadのサービスは多くのユーザーに向けたものであるため,どのようなサービスに価値があるのか,喜ばれるのかというものを実際にインタビューなどを通して自分たちでサービスを提案するという内容でした. 与えられた価値仮説シートやユーザシートを使用し,その人に向けた最適なサービスを提案します. MVP(Minimum Viable Product)を試すためにプロトタイプ作成サービスを使用し付箋などで切り貼りして作った画面をユーザの方に実際に見てもらったり触ってもらったりしてフィードバックを貰うとともに,実際に自分たちが提案したサービスは対象としたユーザに刺さっているのかをインタビューを通して確認していきます. ある一人を喜ばせるにしてもここまで大変なのかと身にしみて感じられました. このインターン前半部の中でも非常に印象が強い講義となりました.

機械学習 & 自然言語処理

機械学習自然言語についてざっくりと講義形式で原理を学んだ後実際にcookpadのレシピデータを利用し分類器の作成を行いました. 講義でパターン認識論について学んでいたため内容がすっと入ってきて面白かったのですが,実際に手を動かす開発部にさしかかった時は大変でした. 膨大なデータを整形したりフィルタリングしたり仮説を立ててコードを書くのは非常に難しく,整形と学習時間で発表会に間に合わないんじゃないかとヒヤヒヤしたのを覚えています. 後になって考えてみると,前日にMVPと言っているのだから少量のデータで一度回してみていい具合に分類できているのかを試すことから始めるべきだと思いました. スクリプトが間違っていたら本当に時間の無駄になってしまいますからね...

ちょっとした宣伝?で,この講義で自分がバリバリ使っていたのですが,

jupyter.org

これデータの可視化だったり,スクリプトに対するメモだったり,思考の過程が残しやすのでオススメしておきます.

プログラミングパラダイム

はい,難易度鬼,鬼.プログラミングパラダイムってなんだっけ.

しょっぱなから今やってる技術は4年で使えなくなるだかそんな感じのめちゃくちゃ刺さるワードが出てくる非常に刺激的な講義です. 構文解析の結果を利用して各ノードを機械語に落とし込むというマジで何言ってんだっていう恐ろしい内容でした. もうちょっと詳しく書くと,JavaScriptコンパイラを作りました.

github.com

ここの未実装の機能をがっつり実装していくというものです. ここでもRubyが書けず苦しい思いをしたのを覚えています. ちょっとした分岐などは書けたのですが,計算量の最適化あたりになったら完全に脳が停止しました. ()とか結合順序とかを考えたりし始めたらもう,無理ですね. 本当にコンパイラ作ってる界隈の方は凄いと思いました. 本当にいっぱいいっぱいだったのでほとんど頭に残ってません,けど開発手順などは頭に残ってるのでたまにリポジトリを覗いて苦しい思いをしようと思います.

前半まとめ

選考課題もあったこともあり,非常に優秀なインターン生に囲まれ毎日毎講義,そして普通の交流も刺激的なものでした. 機械学習の講義はPythonを使っていのですがいきなりRubyPythonのコードを吐き出すような変態技術を出してくる人がいたり...

これどうやるのかなぁとか調べてる間に次の課題に取り組んでいたり発展課題をガリガリ進めている人がたくさんいたので非常に焦ったこともありました. ですがわからない時はわからないままにしないでわからない部分をまとめ講師の方々に積極的に聞けたのはよかったなと思っています. 実際このインターンでわからないところは一気に解消して技術を盗んで行こうと思っていましたし.

今回書きませんでしたがお昼ご飯は社員の方が作ってくださったお昼ご飯をご馳走になりました.よく写真とかで見るcookpadのあのキッチンで作られたものです. 非常においしく彩りも華やかで自分の自炊力を上げてああなりたいなぁと毎日感じた食事でした.画像はブログ書いている時にセルフ飯テロになって辛いのでご勘弁願いたいです.

追記:2016/09/03
写真で振り返るインターンシップを行っている方が...

Cookpad Tech Internship ~ Summer 2016 ~ に参加しました! - pockestrap

さてこのインターン前半では多くの講師の方に講義を行っていただきました. 様々な分野のインターン生の面倒を見て,そのみんなにわかりやすい内容で伝えること,また資料を作るのは非常に大変だったと思います. そのおかげで私たちは非常に有意義な講義を受けることができました,本当にありがとうございました. また講師の方だけではなく,インターン生の食事だったり滞在する場所の手配,また遅くまで残って復習に付き合ってくださるなど様々なことに対して多くの社員の方にお世話になりました.本当にありがとございました.

さて,タイトルに前半と書いていることからもおわかりかと思いますが,無事に後半に進むことができました(この記事を書いている日はもう後半も終わってます). 後半では実際に開発現場に配属され経験を積んでいきます.頑張れ私

つづく

後半書きました Cookpad Tech Internship - Summer 2016 - に参加してきた(後半) - 窓を作っては壊していた人のブログ