freee株式会社の就業型インターンに参加した話
はじめに
初めまして、enkeyです。
9/2(月) 〜 9/13(金)までの2週間でfreee株式会社の就業型インターンに参加してきました。
freeeさんについてはこちら
自己紹介
広島のとある情報系の大学院でネットワーク関連の研究をしています。
普段は、自宅サーバのお世話したり、気が向いた時にプログラミングをしたりゆるくやってます。
自身のプログラミング経験は以下の通りです。
- C, Python, Java: 主に大学の授業で使用
- Ruby: ハッカソンで使用経験あり
- Go: 研究で使用
- React: 少しだけ
参加のきっかけ
エンジニアの働き方について詳しく知りたいという興味があり、就業型のインターンシップに参加したいなと思っていました。
そのため、就活サイトに色々登録したり、魔法のスプレッドシート見たりしてどこかいいインターンないかなぁと探していました。
特に、研究でGoを使ってネットワーク周りの実装をしていたことからGoがかけるとこが理想でしたが、あんまり開発経験ないしなーと思っていました。そんな中、freeeさんからアカリク経由でスカウトをいただきました。
もともとfreeeさんは知ってはいましたが、具体的に何をしている会社なのかは存じ上げていませんでした。まぁ説明会ぐらいは参加してみるかなという軽い気持ちでエントリーしました。
選考について
本インターンに参加するにあたり以下のような流れで選考を進めました。
-
説明会の参加
- マイクロサービスやってるやん!面白そう!になり応募してみることに
-
コーディングテストの受験
- 2問あり、Pythonで受験しました。
- 1問目は残り20分ぐらいでギリ解けたけど、2問目は...という感じでした
(正直あんまり自信なかったです)
-
面接
- 主に聞かれたこと
- 自己紹介
- 研究について
- 開発経験とその取り組み方
- 逆質問では、Goとかマイクロサービス周りを聞いてました。
そんなに硬い雰囲気ではなく、非常に話しやすかったことが印象に残っています。
- 主に聞かれたこと
参加まで
逆質問で技術的なことを色々聞いたのが功を奏したのか、合格通知をいただきました。
メールをいただいた時は東京におり、インターンで知り合った人と夜ご飯を食べている時でした。
当時、このような就業型インターンのお祈りメールをたくさんいただいていたことから本当にびっくりした覚えがあります。
その後、リクルータ面談があり面接のフィードバックをしていただきました。
それからしばらく経ち、配属希望アンケートがやってきました。思ったよりもチーム数が多く、企業規模の大きさを感じました。
配属どうしよう...と思うところですが、私はやりたいことが明確だったので希望するチームは絞れました。それでも希望順位をつけるのにすごい悩んだ覚えがあります。
配属先は... 「統合モジュール」 でした。
(第1希望ではなかったのですが、納得はできる内容だったのでよかったです)
インターンの概要について
以下がインターンの概要になります
- 期間: 9/2(月) 〜 9/13(金)
- 基本的には10:00 ~ 19:00 (実稼働8時間)
- 1人のメンターさんにつき3人のインターン生が配属
- 就業型なのでもちろんお給料が発生
- 業務用のPC(Macbook Pro)が支給
- US配列使ったことないけど、あえてUS配列にしました
- 技術スタック
- Rails
- Go
- React (TypeScript)
取り組んだこと
今回私たちのチームが取り組んだタスクは詳しいことは言えないのですが、ざっくり言うと一つの情報しか保持できなかったものを複数の情報を保持できるような機能改修をすることでした。
この「統合モジュール」チームではマイクロサービスを取り扱っており、複雑なアーキテクチャ構成を理解するところから始まりました。
まあ最初は????????という気持ちでしたが、徐々に解像度を上げることができました。
環境構築
記念すべきインターンの初日はPCのキッティングや環境構築をするところから始まりました。
まず、全体の説明があり、PCのキッティングをした後に、配属チームからお迎え用のURLが来てインターンが始まるという流れでした。
チームに合流後は自己紹介をして、「統合モジュール」がやっていることだったり、アーキテクチャやタスクの説明がありました。
環境構築に関してはインターン用のドキュメントに手順が記載されており、手順に従って作業を進めました。しかし、使用するミドルウェアなどのバージョン依存問題が多数発生したことから思ったより手こずりました。ただ、freeeさん本当にすごくて、社内のSlackやwikiなどに先人たちが残してくれたエラーとその対処法が載っており、だいぶ助けられました。
その甲斐もあり、2日目には環境構築が完了しました。
メンターさん曰く想定より早かったそうで、褒められたのが嬉しかったです。
設計
3日目から朝会、夕会がスタートし、一日ごとのTodoや振り返りが明確になった気がします。
タスクの説明と環境構築が終わり、どのように実装していくかの設計方針を立てるためにDesignDocの作成に取り掛かりました。(DesignDocとは設計書のようなものです)
しかし、複雑なアーキテクチャ構成だったことにより、どこをどのように変更したらどこが変化するのかが全くわかりませんでした。そこで、処理の流れを見てどの関数を通っているかを確認しようということでデモページで遊ぶところから始まりました。
色々触ってみるとわかることも多く、DeveloperToolでAPIの流れや利用されているメソッド、プログラムのログを確認したりして、触っていくごとに理解を深めていきました。そうするうちに、大体どこをいじれば良いかの目星をつけることができました。
処理の流れを見ていくうちにこれはなんでこのような設計になっているんだろう...?と疑問に感じた箇所がいくつかありました。その疑問をメンターさんに聞くと、新たな知見を増やすことができてとても勉強になりました。そこで初めて知った技術は以下のとおりです。
- CQRS (Command Query Responsibility Segregation)
- dependency Injection
- Clean Architecture
そんなこんなでインターン生同士で話し合っていくうちに何個も実装案が浮上してきました。
個人的にはあれでもないこれでもないと設計方針を話し合っている時間が楽しくて、無限にできそうでした(笑)。
そして、4日目には出来上がったDesignDocの共有会がありました。
DesignDocの共有会に関しては自分が発表を担当したのですが、チームの方がかなり真剣に聞いてくださっていることからめっちゃ緊張しました。現役エンジニアの目線から見たアドバイスや、デザインに関してもデザイナーさんに直接聞くことができたりと、設計に関してあらゆる観点からアドバイスがいただけたことが本当に貴重な経験になったと感じました。
5日目は中間発表があり、他のチームに対して自分たちのチームはこんなことやってますーっていう感じで軽く発表しました。
(中間発表、現地勢がすごく楽しそうだったのでできれば現地で参加したかった...)
実装
土日を挟んで、6日目に入りました。私は2週間のインターンが初めてだったことからインターンで2週目に入ることが非常に新鮮に関しました。
それはさておき、ついに5日目に見てもらったDesignDocをもとに実装に入ります。と言いたいところですが、修正した方が良い箇所が何点か見つかったので、少し修正した後に、最終確認をしてもらいました。それと同時にタスクの割り振りも行なっており、競合せず綺麗に3人で仕事を分担することができました。ちなみに私はGoでDB周りとかAPIとかのバックエンドを書く仕事を担当しました。
今回のタスクで何が難しかったかというと、3人の各々のタスクを連携させないと完成させることができなかったことです。それゆえ、各々が今何をやっていて、どこでつまづいているのかを逐次共有しなければならなくて、大変でした。なので、基本的には何かあったら共有というか相談という形で各々の進捗を確認しながら開発を進めていきました。
また、今回の実装において困ったこととしては、私がDB周りの経験がなく、とりあえずタスクと似たような処理をしているところを参考に実装を進めましたが、なんか実装がうまくいかないということがあり、そこでかなり多くの時間を使ってしまいました。
もうここでつまづいてても仕方ないなと思い、Slackで聞いてみると、チームのとある方がどのような処理にしたいかやそれに対してどう実装していけば出来そうなのかという対話形式で教えてくださり、その一日だけでDBに関する解像度が上がり、実装を進めることができました。
教えていただいた方には本当に感謝しかないです。
ちなみに、余談にも書いたとおり8日目から私は出社したのですが、オンラインもいいですが、個人的には対面の方が開発は進むかなと感じました。
あと、オフィスに備え付けのヘッドセットが優秀で使いやすかったです。
余談
8日目から私ははるばる広島から東京のオフィスまで出社しました
飛行機の便が早朝でかなりしんどかったですね...、あと飛行機の到着が遅れて始業に間に合わなかったです(チームの人はそんなに気にしてなかったけど)
それはそうと、オフィスが本当に綺麗で感動しました!
この時点で、与えられたタスク全てを実装することは難しそうだったので、優先度をつけてどこまでデモで見せるかを意識しながら取り組むこととしました。基本的に今回のインターンはfeatureブランチに対してプルリクを出していたのですが、使用しているツールにバージョンアップがあったらしくその差分だけmainブランチにプルリクを出すという大変貴重な経験をさせていただきました。本当に栄誉なことです。
最終発表
いよいよ、最終日になりました。実はこの段階でデモができる段階ではなく、各々が作成したプログラムがきちんと連携して動作するかを確認しなければなりませんでした。一応、自分が作成したバックエンド箇所はうまく動いていて、お昼前ぐらいにフロントとバックエンドが連携しており、全てのプログラムがきちんと動作しました。最終発表用のプレゼン資料に関しても最終発表が始める10分前ぐらいになんとか完成させることができました。
最終発表に関しては、私たちのチームの発表内容に対してSlackの最終発表用スレッドとかでも盛り上がっていたので、とても嬉しかったです。また、チームによって特色があり、その取り組みとかを聞いていて面白いなと思いながら聞いていました。あと、実装がしっかりできているチームが多くて技術力の差を感じる場面もありました。
最終発表の後は、懇親会がありました。チーム以外のインターン生や社員の方ともキャリアについて相談したり、雑談をしたりできてとても楽しかったです。そして、中締めが終わった後、なんと特別にオフィスツアーを実施してくださいました。
あまり見かけない風変わりなものが多くて面白かったです。
オフィスツアーで撮った写真たち
終わりに
学んだこと
- 技術的なところ
- Webサービスのアーキテクチャの設計指針について
- DB周りの処理について実装を通して学ぶことができた点
- SQLの組み立て方や扱い方に加えて、現場で使われるような考え方やデバック手法について知ったこと
- GitHubのプルリクに関するメッセージの書き方や、コンフリクト時の解消方法などを学ぶことができた点
- 特に、困ったらgit statusを見ることの大切さを教えていただきました
- それ以外
- 作業の進捗状況をチームで共有しながら開発を進めること
- チームで認識を合わせながら開発を進めることの重要性
- 積極的にアウトプットをすることの重要性
- とりあえず、考えたことや取り組んだことはドキュメントに転記したり、簡単に図を作成してみたりして、考えた跡を残しておく
- わからないことに時間を使いすぎない
- 質問をする際に、どのような表現をしたら相手にわかりやすく伝わるかを意識すること
感想
- 全体的にいい人が多く、Slackなどで質問をすると、割と早く返信が来たり、お手隙の際にGoogle Meetに入っていただいて直接教えていただいたりとサポート体制が充実していて、
実装を進める上で非常に助かりました- freeeさんの文化にある「世話を焼いていくスタイル」ってこういうことなんだぁと思いました
- 計3回ほど実施していただいたランチ会にて、様々なバックボーンを持つ社員のお話を聞くことができて、キャリアに関してとても勉強になった
- CI/CDや社内ツールが豊富で開発のしやすさが際立っていた
- GitHubでpushをすると、すぐに反映されるわけではなく勝手にCIが周り、テストが成功したかどうかを判断してくれました
- 社内ツールが本当に便利すぎて、作ってくれた人、神って思いました
- 社内ドキュメントがしっかりしており、開発しやすい環境が非常に整っていました
- フィードバックをしていただける機会が多く、自身の振り返りもしやすいし、自己成長を後押しできる環境がしっかりしているなと思いました
この2週間を通して、現場の開発力をしっかり体感することができました。
本当に楽しかったです! ありがとうございました!
Discussion