インターン期間中にはなかなかBlogが書けないだろうなーと思ってはいましたが、予想以上に書けてないですね。。。
12日に最後の課題が出されて、今日はいままでの課題の再提出にあててよい時間でした。課題は全部で7つあって、全ての点数が6点(10点満点)を越えないとインターン後半に進む権利がもらえません*1。ちなみに僕は3/7しか一発で合格できていません。でも、必死に(いやもう必死に)再提出したので、6点は全部行きましたよ><。後半に進めるかは明日の朝に発表されます。
あとはいつもの通り思ったこととか適当に書いていきますよっと。
とにかく書くのが遅い
- こういうデータ構造ならうまくいくだろうな
- こういうパターンをあてはめることができるだろう
という感じでタンスの引き出しが少ない、という問題は前々から感じていましたが*2、「はまったときにはまっている時間が長い」というのが特に問題だなということに気づきました。問題の切り分けが下手くそで、「ここが問題になっているところだろう」と当たりを付けるのがうまくできていませんでした。今回のインターンでは
- Perl
- ORM
- Ridge
- JavaScript
- Ten.js
- アルゴリズム
- データ構造
- 環境の違い
- Perlのバージョンが5.8.9の環境ではtest通るのに5.8.8では通らない(まじで泣きそうになった)
などなど様々レイヤーなところではまる可能性があります(そしてはまる可能性があるところはことごとくはまったような気がします)。
- 小まめにテストを走らせる必要性
- バージョン管理システム(はてなではgit)などを使って動いているものを手元に持っておく
- 大規模な修正をするときにはブランチを切る
などなどはまったらすぐに比較、検討できる材料を持っておくようにしておくとちょっとはましになるのかなと思いました(もっと本質的なところがあると思いますが)。もし後半戦に進むことができたらペアでコーディングすることになると思うので、ペアになった人はどういう感じではまる時間を短かくするのか観察してみようと思います。
事前準備はしっかりしておけ
僕はWebのフレームワークやPerl自体に慣れていなかったので、インターンに行けることが決まってからはその辺を勉強していきました。
- Perlとテスト - yasuhisa's blog
- DBIモジュールを使ってデータベースを叩いて、Template Toolkitで整形する簡単なお仕事をやってみた - yasuhisa's blog
- はてなグループのキーワード機能の劣化版を実装してみた - yasuhisa's blog
DBIx::Mocoとかはcpanにあるので使っていくといいと思います。別に他のORMとかでもいいですが。事前に勉強していっても課題は簡単なものではないので、勉強していかなかったらと思うと…。Perl回りでいくとリファレンス、OOP、よく使うcpanのモジュール(のindexを頭の中に置いておく)くらいを押えていけばなんとか付いてはいけます。
JavaScriptについてはほぼ無勉強でいったのですが、むちゃくちゃ死にました。講義は分かりやすかったのですが、コードを書けるかというとまた別の問題で。firebugをインストールして、という感じのところから始まりました。金曜の課題だったので土日を使って作ってたんですが、このjsの課題を提出したのが課題の中で一番最後まで残りました。イベントドリブンな感じで書いていくというのがどういうことかよく分かってなかったし、コールバックってなにそれおいしいの?という感じでよく分からないコードができあがるので書き直しました。
というわけで来年インターンに参加される方はサイ本を買って勉強していくといいと思います。
講義の充実ぶりが半端ない
講師の方が時間をかけて準備してくださった講義は本当に素晴しいです。関心したのは、一つ一つの講義が独立したものではなく関連付けてあること。最初の一週目は
- PerlのOOP
- DBIx::Mocoを使ったORM
- Ridgeを使ったMVCフレームワーク
- Ten.jsを使ったUIの実装
となっていて、前日やその前に習ったことを活かしながら実装していきます。Mの部分がちゃんとできていなかったりすると、jsのときにエラーの原因がつかみにくくなるからテスト重要とか、そもそも実装しにくくなったり、ということを身を持って体験しましたw。
二週目はアルゴリズムを中心とした話(去年は分散での処理とかだったようだけど)で
- VB符号を用いた圧縮
- Trieのデータ構造を使ったAho-Corasick法によるキーワードマッチ
- 簡単な検索エンジンを作ってみる
という内容になっていました。「検索エンジンの辞書をTrieで持たせておけばAho-Corasick法で効率よく探せるし、エントリidも単調増加列にしちゃえば圧縮ができる!」というのが自分の中で一本の線になったときはなかなか感動しました。
余談ですが、自然言語処理の形態素解析とかの辞書引きとかでTrieを使ったアルゴリズムとかが出てきます。最初に勉強したときは「これは難しそうだからまだ実装できないかなー」と思っていましたが、まさか数ヶ月後に10時間くらいで作ることになろうとは予想もしてませんでした(そして一番はまってた)。
フィードバックがもらえる
自分一人でコードを書いているとBlogにでも書かないとなかなかフィードバックがないので書いているコードがいいか悪いかよく分からないですが、採点してもらえるだけでなく「この人のコードのここの部分の実装がよい」という感じでフィードバックしてもらえるので、
学習の高速道路
上に書いた最初の週のカリキュラムを見てもらうと分かりますが、一日一フレームワークという感じでとんでもないスピードで進んでいきます。高速道路を時速200キロくらいでつっぱしっている中で窓から顔出して風圧感じながら進んでいる感じです(どんな感じだ)。とにかく毎日課題が出て、それをその日のうちに片づけていかないと死にます。環境に関してはいうことないくらい整っていますが、それに乗るためには自分の準備が必要です。そういう意味でも事前準備重要。