Chatworkのサマーインターン2023に参加しました （前編）

# はじめに

こんにちは！進捗ゼミです。普段は```Unity```についてのお堅い記事を投稿しています。
先日、Chatwork株式会社のサマーインターンに参加してきましたので、今回は体験記を書きました。

前編では、インターンの選定基準や心構え、インターンが始まるまでの話題が中心になっています。この記事を読む人はおそらくインターンを控えている就活生だと思うので、インターン選びで役立つような情報を中心に書いています。

もしもChatworkのインターンに参加すること自体は決めていてインターンの内容が気になる人は[後編](https://qiita.com/wolfmagnate/items/5eb285b29c30b7fecc48)を参照してください。


# インターン選び
## Chatworkのインターン内容をざっくり紹介

- 全部で10日です
- 最初の5日でSaaSとしてプロダクトを提供するために必要なことの講義を受けます
- 後半の5日で実際に```Rust```+```React```と即席の開発チームでプロダクトを作ります

## 私のインターンの選択の戦略
夏季のインターンは、魅力的なものが集中していて非常に迷いましたが、私はざっくりこんな感じで大別して参加するものを絞っていました。

![インターンの分類.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412657/4f6a30a0-5634-9136-61b0-c22f6b6688a2.png)


1. 就業型
実際の業務に組み込まれて本格的に労働を体験するタイプのインターン
ある程度の開発経験と技術力があり、企業の志望度が高いならば絶対に参加したほうが良い。
長期のものが多いので、真剣に選んで真剣に参加する必要がある。

2. ハッカソン型
チーム開発を行うインターン
ある程度のチーム開発経験と技術力と熱意があるなら参加したほうがいい。
性質上どうしても過酷な労働環境になりがちで、自分から動いていく力も問われるので、熱意が持てる企業or内容がいい。企業の技術についてはある程度学べるが、自分の開発に集中してしまうので実際の業務がどうなのか、みたいな観点は抜けがち。
貢献できるだけの技術力があれば**超楽しい（重要）**。

3. インプット型
技術研修に近い一般的な内容を扱うインターン
よく知らない技術領域でも参加しやすい。逆によく知っている領域だと退屈になるかも。短期インターンが多いので興味のある企業や内容ならばとりあえず参加したほうがいい。ただし、結局のところインターン期間だけで実用レベルまで学べないので、興味が持てるようになったらその後に技術書などで本格的に学ぶのが良い。

4. 技術型
その企業特有の技術について、専門的なお題を解きながら体験するインターン
興味がある技術領域についての内容であればアリ。２、３日でたくさん手を動かす内容が多いので専門的な話を聞けるいいチャンスと思って気軽に参加するのがいい。

## Chatworkのインターンの自分の中での位置づけ

![Chatworkの位置づけ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412657/1a9027cf-96ba-17e9-e89c-c8ef19e85ac3.png)


最初に見たときは、Chatworkのインターンはインプット+技術+ハッカソンという全部盛りに見えました。特に2023年からバックエンドとフロントエンドのコースが一体になりましたし、対面とオンラインの両方がありますし、多様な内容のインターンです。そのため、最初は自分の中でどのような位置づけをすればいいのか迷いました。

しかし、これは取っ散らかっているというよりも、Chatwork側で **プロダクト開発** という枠組みを大切にしていて、そのために必要なイベントを適宜やっていこうとした結果だと思います。プロダクト開発というのは、単に技術的にソフトウェアを開発するだけではなく、ユーザーに価値を届けて、企業に商品としての価値を提供するように開発するということです。

企業側からすれば、特定の技術要素であったりトピックについて伝えるインターンならば座学で教えられますし、学生の実力を見たい場合、テーマを与えてハッカソンを行い、その様子を観察するのが良いです。しかし、良い製品を作るための方法論としてプロダクト開発を教えるためには。まず座学をしたあとに、実際の業務に近い環境で実践知を学んでもらうという形式が適しているという判断を下したのだろうと考えました。

前半の講義でプロダクト開発において必要な要素をまとめ、後半の実践で実際の業務っぽいチームを組みながらインプットの定着を図る、ということで、学びを重視したインプット系のインターンという捉え方をして、応募を決めました。

## Chatworkのインターンを選んだ理由

### インプット系だけど実践知まで学べる

「ある程度の知識があることを前提に、実際に開発する能力を鍛える・発揮するインターン」、「あんまり知らないことを前提に教えてくれるインターン」はたくさんありますが、プロダクト開発という特定の領域について「**あんまり知らないことを前提に、実際に動かす能力まで学ぶことを保証してくれるインターン**」である、というのはかなり特筆すべき点だと思います。
インプット系のインターンは、基本的には学びの入口であり、本格的に知りたいなら技術書などを当たった方がいいということを書きましたが。しかし、プロダクト開発については多分に技術だけで割り切れないところがあり、実際にプロダクトを意識して手を動かすというのは非常に難しいです。なぜなら、書籍や普通のインターンで提供できるサンプルコードレベルでは、実際に動かすときの複雑さが表現しきれず、プロダクトという考え方を得られないからです。逆に就業型では複雑さと戦う経験はつめても、ある程度の技術力が無いと分からなさ過ぎて何もできなくなってしまいます。
そのため、インプット系としては長い2週間という実施期間をフル活用して学べるのが魅力的でした。

### ゲーム開発というWebとは全く違うバックグラウンドでWeb業界を目指していた

私は```Unity```エンジニアとして数年活動していたのでWeb開発の経験がなく、一通りまるごと学びたいというモチベーションがありました。
ChatworkのインターンはSaaSのプロダクト開発という内容で一貫していることから、ゲーム以外でも組み込み系や数値計算系など、プログラミングの心得はあってもWeb開発の経験は不足しているという人にはかなりおすすめです。普遍的な技術に関する理解があれば、どの講義内容もそれをプロダクトに応用する内容なので、全体像を分かりやすく俯瞰できるからです。実際、私は参加してかなりWeb系の雰囲気が分かりました。

### 文法を知っているだけの状態から実践的な知識へ進化させる機会が欲しかった

インプット系だと上で書きましたが、やはり後半は開発をすることもありハッカソンに近い雰囲気もありました。就業型やハッカソン型のインターンでボコボコにされるのが怖いと思ってる学生は多い気がします。私もWeb開発は経験が無かったので実践するタイプのインターンに応募するにはかなり勇気が必要でした。
しかし、Chatworkのインターンだと、後半の開発パートは前半の講義をどのように応用していくか、という点に主眼が置かれているので、就業型やハッカソンよりかは指針が立ちますし、敷居は低かったと思います。これからスキルアップしてハッカソンに参加していきたいんだという学生にはおすすめです。

参加した後の感想としては、ものすごく働きやすかったので、技術力不足とか経験不足で怯えずに参加したほうがいいと思います。

### チーム開発経験が数年あり、実際の会社でどのように取り組んでいるのかに興味があった
ChatworkはScrum@Scaleに取り組んでいたり、DDDに取り組んでいたり、先進的な言語である```Scala```を採用していたり、1つの大きな寿命の長いプロダクトと向き合って複雑さと戦い続けてきたことから、自分のチーム開発にも活かせる内容を期待しました。

インプット系は自分がよく知っている内容だとつまらなくなりがちと書きましたが、巨大ソフトウェア開発についてはステークホルダーのが多いと非常に複雑になるので、チーム開発経験があっても、流石にチーム開発が完璧に出来てしまってインターンがつまらなくなるほどの学生はほぼいないのではないでしょうか。

前提としてチーム開発の苦しみを知っていた方が身に染みると思うので、Chatworkのインターンに参加するうえでは、何らかの開発経験とそれにフィードバックを受けた経験があるとより得られるものが大きいと思います。逆に、特定の技術（```Rust```や```Scala```、```WebAPI```、DDDなど）の経験は不要だと思います。

## インターン内容と期待が違うかもしれないパターン

### チャットアプリの技術に興味がある場合
Chatworkという製品自体のアーキテクチャや```Scala```導入の現状みたいな話は積極的に推されていませんでした。
もちろん、聞いたら教えてくれると思いますが、あんまり会社紹介感および就活感が出てないというのは強く感じました。

 ~~なお、私は参加前にChatworkを使ったことはなく、なんならずっと**Slack**と言い間違えそうになってびくびくしていました。何回か社員さんに向かって堂々と言い間違えた気がしますが、幸い逆鱗に触れることはありませんでした。~~

### 特定技術に興味がある場合
Chatworkは```Scala```の採用がそこそこ有名で、お話したエンジニアの中には```Scala```が決め手で入社したという方もいらっしゃいました。
実際、```Rust```やDDD、型システムなど色々な技術についてかなり突っ込んだところまで教えてもらえましたし、実際その理論が使われているようなコードベースを扱ったのですが、それはそれとしてこのインターンの中心はそれらを活用したプロダクト開発であり、特定技術の適用範囲を知るというのは主眼ではありませんでした。インターンをきっかけに自分で頑張って理解するかどうかが理解度の95%ぐらいを決めると思うので、特に技術だけに興味がある人には向かないと思います。インターン中も、「あくまで企業の戦略が先にあって、モデルの良さはその戦略と適切にリンクするかによって評価されるべきである」という話をたくさんしていただきました。

私もアーキテクチャ設計やDDDなどの技術に興味を持って参加しましたが、インターンで得られた知識としては重要そうなキーワードをいくつか学んだという程度だったので、この点だけは少しギャップがありました。知識をつけて理解して覚えるタイプの勉強は結局自分の脳みそを稼働させないとできません。あくまで知識のインデックスを作成して、これから学ぶための足掛かりにするというスタンスが良いです。

体感ですが、参加者も特定技術だけを突き詰めたみたいな人は少なくて、何か目標を持って開発をしている人が多かった気がします。

### 開発経験をガンガン積んでいきたい場合
開発系インターンっぽい見た目をしているが、すでに書いた通り、実は実践パートは講義パートの学びを深めるためのものですので、機能を作って特別手を動かす力が向上するようなものではありませんでした。そういう経験がしたい場合はハッカソン型や就業型に応募したほうがいいと思います。

# 選考で考えたこと

やはりインターンの内容通り、プロダクト開発への関わり方が重視されていたように思います。
プロダクト開発は積み重ねと経験が大事なので、これさえやってれば受かる的なのはあんまり思いつかないです。
これから参加したい人は、自分のプロダクトに対して、ただ漫然とコードを書くのではなく、目的意識を持って作成することを心がけてみたり、開発手法のカイゼンを自分なりに行ってみたりと、実際の会社でのプロダクト開発に役立つようなことを考えながら取り組むのがいいと思います。
私は```Unity```使いなので業務の内容とは全然違うプロダクトの話をしながら選考を受けました。しかし、作品の内容というより**プロダクトとの関わり方が重要そう**だったので、そこまで選考上の辛さを感じませんでした。なんでもいいので技術的な何かを作っておくとプロダクト開発における辛さは色々見えてくるので、話しやすいでしょう。

しいて言えば「半年以上チームでWeb系の開発をして、実際にそれがどこかで運用されて、フィードバックをもとにさらに開発をした、みたいな経験があればな～」とかぼやきながらESを書いていたので、そういう経験があるといいかもしれません（適当）
ただ、インターン参加者にはプロダクトを持っている人と持っていない人が両方いて、人間性も重視してそうな感じなので、興味があればとりあえず申し込んでおくといいでしょう。

# インターン参加までにやったこと

## 課題図書
なんと**2冊も技術書を無料でくれます！** これはうれしい。

- [現場で役立つシステム設計の原則](https://gihyo.jp/book/2017/978-4-7741-9087-7)
- [Webアプリ開発で学ぶRust言語入門](https://www.shuwasystem.co.jp/book/9784798067315.html)

これらの本をいい感じに読み進めればインターンでも十分戦えました。技術的な不安を取り除いてくれるので結構助かりました。

## もくもくRust勉強会
Rustでの躓きに対応するため、勉強会が開催されました。
なんでも質問できる環境でいい感じに適当に勉強ができます。
毎回社員の方が雑談をしており、会社の雰囲気をいい感じに感じられました。

## 自主的な予習
Rustが分からなさ過ぎて1冊参考書を買って全部読みました。

- [Rustプログラミング完全ガイド](https://book.impress.co.jp/books/1121101129)

予習で頂いたRust本は実践重視で分からない文法が大量に出てきたので、いったん大体の```Rust```の仕組みを抑えることが出来ました。

あとは個人的に受ける予定だったDBスペシャリスト試験対策としてテーブル設計とか```SQL```とかを頑張っていました。

- [徹底攻略データベーススペシャリスト](https://book.impress.co.jp/books/1122101156)
- [達人に学ぶSQL徹底指南書](https://www.shoeisha.co.jp/book/detail/9784798157825)

また、Rust本にはふんわりした説明でバリバリ実践級のコードが出てくるので、予習を進めるうえで```Docker```や```Docker Compose```周りを勉強したり、```GitHub Actions```を書いたり、```Web API```の設計の勉強をしたりしていました。~~前提知識が多すぎて10ページ進めるのに知識を埋めるのに5時間ぐらいかけてた…~~

この予習が今回のインターンで自分が行った最大のファインプレーだったと思います。というのも、純粋に技術的な部分は結局自分で勉強するしかないので、その部分をしっかり学んでおくことで、インターンではインターンでしか学べない点を学ぶことができたからです。インターン中に```Rust```の文法と特有の概念をちゃんと把握していることは非常に助けになりました。

ただし、私がやった予習は全く必須ではありません。なにかをひとつを知っておけば、それに関する講義はしっかり吸収できるようになりますし、開発パートでもそれを中心に活動できますので、```React```の書き方を勉強するもよし、より```Rust```の型システムに踏み込むもよし、システム設計の原則の内容を深堀りするもよしだったと思います。**自分で学びに行くという姿勢は大事にしたい**です。逆に興味が薄く予習を全くしなかった```React```+```TypeScript```については全く理解できないままインターンを終えてしまいました…

# 迷っている人へ

非常に学びが多かったので経験不足で尻込みしている人は**とりあえず応募したほうがいい**です。自分に必要なインターンかどうかを勘案して応募しないというのはアリです。しかし、少なくともChatworkに関してはなんか敷居が高そう・怖そうという理由で応募をやめてしまうのはもったいないと思います。みんな暖かい雰囲気でしたし、私はWeb開発の勉強を始めて1か月程度での参加でしたが、それでも快適に過ごせたので、怖い場所ではないです。

# おわりに
[後編](https://qiita.com/wolfmagnate/items/5eb285b29c30b7fecc48)では、実際に参加してみた感想を書いていきます。