Chatworkサマーインターン2021に参加してきた

8月16日から9月3日までの3週間、Chatwork社のインターンに参加してきました。面倒くさがって超遅筆になりましたがレポート書きます。

lp.chatwork.com

参加の経緯

僕は今まで、実際に仕事をしてみないことには得られるものも少ないだろうということで実務に参加するタイプのインターンに絞って参加してきており、BEENOSで Nuxt.js を使ったwebアプリを書いてみたり、freeeで既存サービスのPWA化をしてみたり、日本経済新聞社で新規サービスのAndroid版を立ち上げたりしてきました。実務系のインターンはそれはそれで楽しいし好きなのですが、今夏はオンライン参加で実務的なことをするのも辛そうだということで、インターン用コンテンツのあるインターンを選ぶことにしました。

そのようなことを考えながら毎年お世話になっている「魔法のスプレッドシート」を眺めたところ、文字通り365日バイトで使っているChatworkがピッタリのインターンを募集していたので応募候補に入れました。

調べてみるとChatwork社には最近だいくしー(@daiksy)さんが入社してエンジニアのチーム力を高める取り組みが活発になっていたりDDD本のレビュアーでもあるかとじゅん(@j5ik2o)さんがテックリードを務めていたりと、技術的にもかなり楽しそうな会社なことが分かり、応募することにしました。

2021年のChatworkサマーインターンにはフロントエンドコース(React)とバックエンドコース(Scala)があり、どちらに応募するか迷ったのですが、Scalaは1文字も書いたことが無いな、ということでフロントコースを選択しました。

応募から参加まで

選抜は面接が2回で、コード試験等はありませんでした。エントリーシートもエンジニアとしては標準的なもので、特に困ったことはありませんでした。

面接では応募動機やChatwork社を知った経緯といった一般的なものから技術的な話まで色々なことを聞かれました。1回目の面接は人事の方と面談でしたが、2回目はエンジニア採用の人事の方と人事ではないエンジニアの方の2名で、エンジニアリング的にも少々突っ込んだ話をしました。僕がスクラムあたりのエンジニアのチーム論が好きだという話をしたところかなり話が広がりました。面接の後半で面接官に「実は僕は認定スクラムマスターなんですが」と明かされ、ヤベー変なこと言ってないかと変な汗をかいたのを覚えています。

7月12日には無事に参加確定のメールが届きました。しばらくしてから参考図書が2冊届いたので(1冊は物理本、1冊はPDF)参加までにざっくり目を通しました。

www.books.or.jp

booth.pm

時間を取れなかったので隅々までは読めなかったのですが、特に読まなくても参加自体に問題はありませんでした。ただちゃんと読んでから参加すれば「なるほどな~~~」となる機会は増えただろうな、とは思います。

インターン開始よりかなり前に連絡用のChatworkのグループチャットに招待され、好きな天ぷらを紹介したりしました。ちなみにしそ好きは2人でした。

Screenshot 2021-09-11 at 16-56-40 Chatwork - [新卒] サマーインターンシップ 2021 事前・事後連絡用.png

前半戦:講義パート

3週間のインターンのうち最初の1週間は講義パートとして、インプットに当てられていました。最初に書いた通り僕は今まで実務系のインターンにばかり参加してきたので、インターンで講義があるというのは初体験でとても新鮮でした。Chatwork社の宣伝が多いのかと思いきや、会社についての説明は最初の1-2時間程度のみで、残りは新入社員向けのような技術講義でした。講義パート前半の基礎的な内容は知っていることが多く正直少々退屈に感じることもありましたが、後半はそのようなこともなく楽しく聞くことができました。

前半の基礎講義は「ブラウザにURLを入力してからページが描画されるまでをざっくりと追ってみよう!」とか「セキュリティの基礎の基礎」とか、そういった内容でした。学部生時代のネットワーク系の講義の良い復習になりました。

後半になると「TypeScriptの型でゴリゴリに遊んでみよう」とか「スクラムってなんだよ」とか「丸一日かとじゅんさんがDDDについて語ります」とか、かなり楽しいコンテンツが揃っており、一切飽きずに参加できました。特にかとじゅんさんのDDD講義は密度が高く、これだけで参加した価値があったなという気持ちになりました。

講義と聞くと面倒くさいなと身構えてしまいそうですが、現役エンジニア社員による大プレゼン大会を1週間聞き放題だと思えば面白さが伝わるんじゃないかと思います。

後半戦:チーム開発パート

3週間のインターンのうち後半の2週間はチーム開発パートとして、チームでスクラムを組んでチャットアプリを開発するパートに当てられていました。

このパートは事前に用意されたコードベースをチームで改造(追記?改良?)して新機能を付加するというパートです。Scalaで書かれたバックエンドのコードやReactで書かれたフロントエンドのコード、プロダクトバックログの一部、ストーリーが提供され、それに沿ってチームで開発を進めていきます。

チームは学生参加者4名とメンター(新卒社員と内定者)3名、社員1名で構成されており、開発で手を動かすのは学生とメンターの7名です。主体は学生で、困ったときにはメンターが相談に乗ってくれたり、(恐れ多くも)学生の指示に従ってコードを書いてくれたりする形でした。社員はプロダクトオーナーの役割で、基本的には沈黙して我々を眺めており、必要に応じてチームが呼び出して相談をするスタイルでした。といっても社員の立ち回りはチームによって違いそうで、他のチームではもう少し登場回数が多そうな印象でした。

コードベースはインターンのために相当練られて作られており、バックエンドもフロントエンドも「Chatwork社員が考えた最強のDDD」みたいなコードになっていました。講義で説明されたコマンドクエリ責務分離(CQRS)もコードとして実装されており、なるほどアレはこういうことかという気持ちになれました。

チームとして何を開発するか、どういう手順で開発するかといったことは学生メンバーにほぼ丸投げされており、月曜日に1日をかけて開かれるスプリントプランニングでその週に開発する内容やスプリントゴールを話し合います。毎日の開発はデイリースクラム(朝会)から始まりデイリーレトロスペクティブ(反省会)で終わります。僕たちのチームはレトロスペクティブをKPTでかなり徹底的に行い、毎日チームの何かしらが改善されていくのが実感できてとても楽しかったです。週の最後にはスプリントレビューとして、Chatwork社のCTOや各部門マネージャの前で一週間の成果を報告しました。CTOはもちろんのこと、デザイナーやプロダクトマネージャ、開発マネージャなど様々な方から様々な視点でレビューを貰えたのでとても良い刺激になりました。

開発パートを通して、やはりチーム開発は楽しいなという感想を持ちました。個人開発では自分の考えの範囲でしか開発が進みませんが、チーム開発ではチームメンバーで共有した広い考えに基づいて開発が進みます。チームメンバーの考えを良い具合に束ね、チームとしての出力を大きくするためにも、やはりチームマネジメントというのは意味があるなと思いました。

技術的には、今まで何となく知識としては持っている程度だったDDDを実際に実践できたところは学びが大きかったと思っています。ソフトウェアのモデリングではついつい実装に話が落ちてしまいがち(DB的にどうするかとか、JavaScriptのオブジェクト的にどうとか)ですが、そこをぐっと堪えて真のモデルを見抜くことが大事だし難しいなと思いました。

会社について

ヘラヘラモードと真面目モードの緩急が素晴らしくてメチャクチャ良い会社だなという印象でした。社員間の仲がとても良くしょっちゅう冗談を言い合っているのに、それでいて全然馴れ合いではないというのがすごいなと思いました。インターン途中のCTO面談で「これって自然発生した文化なんですか、それとも意識してるんですか」と聞いたところ「当然意識して作っている。真に社員が考える組織ってなんだろうと思ったらこれが最適解かと思った」といった旨の答えが返ってきて、はえ~~~~となりました。

また、バックエンドはともかくとして、フロントエンド開発でもただ最新技術を追い回すのではなくきちんと丁寧に「ソフトウェア」をやっているという印象があり、その点も大変に好印象でした。他社のインターンを見ても、フロントエンドでDDDといった設計を全面に出しているところは少ないのではないかと思います。

最後に

インターン用に用意されたインターンなんてなぁ、と最初は思っていましたが、良い意味で期待を裏切られたインターンでした。3週間と少々長めでヘビーなインターンですが、来年以降インターンを探す皆さんにはぜひオススメしたインターンです。

インターンを企画・運営してくださったChatwork社のみなさん、大変ありがとうございました!

おまけ

インターンに参加した給料で自宅デスクトップPCのメモリが倍増し、OpenCommで快適にオンライン会議に参加できるようになりました。インターン万歳!