Treasure2018の記録
はじめに
VOYAGE GROUPの夏のインターンTreasure2018に参加して来ました。Treasureを通して自分には経験をアウトプットすることがもっと必要だと思ったので、まずはインターンでの経験を書き残すため、1年以上前から更新が止まっているこのブログを復活させてみようと思います。インターンの内容自体は、他の人が結構書いているので、個人的な部分をピンポイントで書きます。
参加動機
はじめに、自分は地方の大学で情報系を専攻している修士1年の学生です。博士課程に進む予定はなく就職するつもりです。ただし、仕事でもプログラミングによるものづくりやコンピュータ・サイエンスに関わりたいという思いはあるものの、その就職先として、大きく分けてもメーカーやSIer、Web等と進む方向を決めきれずにいました。特にWeb業界を進路の選択肢として本気で意識しだしたのはここ半年程度です。それまでは、メーカーやSIerがメインで、Webについては具体的なイメージが湧いてませんでした。また、業務内容や企業文化など、新卒として自分が働くときどのようなものが相性がいいのかがイメージできていなかったため、夏のインターンシップでは、大手のSIerとベンチャーっぽいWeb系の企業のある意味正反対(のように見える)の組織を自分の目で見て、その経験を進路を考えるための材料にしようという狙いがありました。もちろん、インターンでスキルを上げたいという思いもありましたが、モチベーションとしてはこちらのほうが大きかったように思います。
Web系のインターン先としてVOYAGE GROUPのTreasureに応募した理由は大きく3つです。
1つ目は、技術力的な成長です。これまである程度プログラミング経験があり、動くものを作ることはできます。ただ、いつまでたっても「とりあえず動く」というレベルを脱することができていないような気がしていました。今考えると何を学ぶべきかわからないという状態だったのかもしれません。この一年くらいは技術的な成長の実感を感じることも少なく、そのような停滞を突破するきっかけを探していました。過去の参加者の話などから、Treasureならばそのきっかけになるのではないかと思っていました。
2つ目は、インターンに一緒に参加する同世代の優秀な学生の人たちと話して、彼らの考えを聞きたいと思っていたからです。これは地方に住んでいる学生にありがちなことだと思いますが、プログラムを書いている同世代の人間が周りにおらず、技術的な話題や将来について真剣に話す機会が極端に少ないです。都心の企業でお金を受け取ってコードを書いている学生たちは自分にとっては、雲の上のような存在で、実際のところ彼らがどんなんことを考えているのかは、想像するしかありませんでした。
最後の理由は、VOYAGE GROUPの中の人達と話してみたかったということです。会社が配信しているポットキャスト「ajitofm」を以前から聞いていおり、「この人たちと話してみたい」という憧れのような気持ちと、なんとなく「この人たちなら自分の質問にも真剣に答えてくれそう」という思いがありました。
講義内容
インターン期間の最初の3分の2は座学中心の講義で、残りがチーム開発です。
Treasure参加前の自分の経験としては、競プロやiOS、Unity、 組込みなどが中心で、Web開発の経験は簡単なAPIサーバ(mainファイル1つのみで完結)程度だったので、講義で学ぶ内容はどれも新鮮で学びの多いものでした。具体的には、Golang、TDD、フロント(React)、APIの設計、セキュリティ、データベース(モデリング)、チーム開発手法(アジャイル)、アイデアの出し方、等です。どの講義も非常に濃い内容でまだ消化しきれていないくらいなのですが、現状で特に印象にの残っているものを2つ挙げます。(強調しておきたいのは、他の講義で学んだことが少ないという意味でないということです。どの講義も学んだことが多すぎて、それらをまとまった文章を書く自信がないので、ほんの一部書きやすい印象的なエピソードを抽出しています。)
まず、フロントエンドの講義。自分はWebのフロントエンドどころか、jQueryも触ったことがありませんでした。「HTMLとCSS、JSは読めなくはない」くらいの事前知識でした。そんな状態だったので、講義を受け終わったあとは10数年くらい未来にタイムスリップしたような感覚でした。フロントエンドには興味があまりなかったのですが、フロント側のstateの管理などが案外面白そうで興味が湧いてきたのと同時に、やはり見た目が変わるインパクトが楽しく勉強してみたくなりました。
次に、API設計の講義について。ここで得た知識は、後半のチーム開発で最も生かされた内容かもしれません。過去に自分がPHPやGoで作った簡単なAPIは、エンドポイントのURIは操作自体の名称を使用して、ほぼ全てGETメソッドでやっていました。具体的には「GET /api/addUser」、「GET /api/deleteUser」などです。本当にひどいですね。このへんが、まさに先に述べた「とりあえず動く」状態というのが最もよく現れている部分です。講義で学んだような、リソースを中心にそれに対する操作ベースで考えるAPI設計は、多くのAPIが必要な後半の開発でも非常に見通しが良くなり、開発しやすかったです。
すべての講義を通して、講師やTAの方のサポートが圧倒的で、こちらが驚くくらい丁寧に質問に答えてもらえました。そのおかげで、自分の知識が薄い部分についても、ついて行けなくなるようなことはなく、理解しながら講義を聞くことができました。
チーム開発
自分たちが作るサービスを考えるパートは、途中まではわりと順調に進み、初日の夕方には作るサービスが一つ決まりました。アイデアが一旦決まってみんなで食事に行ったあと、どうしても先程までの自分たちのアイデアが既存サービスと同じに見えてしまい、それを正直にチームメンバーに言いました。ほとんど決まったものに対していまさらちゃぶ台を返すようなことをやるのかどうかはかなり悩みましたが、ここで言わないと途中で作る意味を見失ってしまいそうな気がしたので伝えました。その後、予定の時間をかなり延長してアイデアを再考しました。結局、アイデアの中心的な部分が大きく変わることはなかったのですが、この議論を通して納得感を持って開発をスタートすることができました。
開発パートでは、最初期でフロントエンド担当のメンバーが見た目のモックを作ってくれました。完成イメージが明確になることで、作るモチベーションが上がったのと同時に、実装のイメージも具体的になって設計もすぐに考え始めることができました。過去のチーム開発でデザインができる人がいた経験はほとんどなかったので、このような開発初期段階でのスピード感は初体験でした。
また反省点としては、APIの変更を曖昧にしたまま進めることがあったことです。最初の大まかな設計が決まった段階で、APIの仕様を決めてwikiにまとめてからフロントエンドとバックエンドに別れて開発をスタートしました。開発の途中で、実装面の問題からAPIの仕様が微妙に変更になることが多々ありました。その場合、口頭で伝えて実装してしまってからwikiを修正するよなことが多かったです。このような流れでやっていると、wikiにかかれていることと実際に動いている実装が異なっている場面が多くなり、そのズレが蓄積してコードが機能しなくなり修正に余計な時間を取られることが何度かありました。おそらく、多少時間を使っても、全員の共通意識としてのwikiをしっかり修正してから実装するという手順を守る方が、全体としての開発スピードは落ちなかったような気がします。
個人的にはとてもいいチームメンバーに恵まれました。前半の期間で話したことがある人もない人もいましたが、どちらもチーム開発での関わりの中で、技術的な部分ではもちろん、人間的に尊敬したいと思える部分が数多く発見できました。真似できる部分は真似して、自分の行動方針に取り入れて行きたいと思います。
終わりに
3週間のインターンは本当にあっという間でした。毎日の密度が非常に濃く、新しく学んだことを必死に理解しようとしていたら終わっていました。内容が本当に盛りだくさんだったので、消化しきれていないことも多いです。正直、「圧倒的成長」できているのかはわからないですし、実際そのようになれるかは、この消化不良感に目を背けずに自分で学びを進める必要があると思います。これまでの自分だと、この圧倒的成長した「感覚」の満足感で止まりがちだった気がしますが、Treasureの期間で一緒だったみんなの技術へ取り組む姿勢を見ていると、とても満足できなくなりました。
成長の実感があまりないと書きましたが、いまの時点でひとつだけ成長を実感していることがあります。Treasure直前に、軽く「Real World HTTP」という本に目を通していました。正直そのときは、目から入る情報がそのまま頭を抜けていく感じでした。しかしTreasure終了後に同じ本の目次を見てみると、景色が変わっていました。各項目がインターン中に解決しきれなかった疑問に答えてくれているような内容に感じられ、読むときの吸収率が桁違いになっていました。同様にTreasureでの経験をきかっけに吸収しやすくなっていることがまだまだありそうなので、そのあたりを突破口に進んで行きたいです。