🕊️

Freee Eng. Advance Internship 2024 (Term 1) 体験記

2024/09/26に公開

freeeエンジニアインターン

8/19~8/30の二週間、アドバンスコースのインターンに参加しました。
配属は freee申告 のチームで技術スタックとしては Rails/React を用いました。
自分がこのインターンを通して得た知見を日報感覚でまとめた記事になります。
今後の就活生の参考になれば幸いです。

Background

きっかけはサポーターズ経由で参加した説明会からでした。カルチャーや開発文化に惹かれ、申し込みを決めました。コーディングテスト+面接一回で合格となり、結構あっさりしていた記憶があります。
自分のスキルとしては、インターン参加時点でWeb開発は始めてから半年ほど、プログラミング自体は3年ほどといったレベル感です。

インターン自体は2社目、就業型としては初のインターンになりました。
配属可能部署はたくさんありましたが、freeeらしいプロダクトを触りたいという観点で申告のチームを希望し、配属されました。
インターン前のキャッチアップとして指示を受けたのはRails/Reactのチュートリアルでした。
Reactはある程度経験があったため、Railsのチュートリアルだけを軽く勉強し、当日に臨みました。

Day 1

前半は全体でのPCのセットアップやセキュリティ面の研修(オンライン)でした。
お昼休み明けからはチームごとに分かれ、自己紹介や取り組むタスクの説明を受けました。
申告チームはインターン生3人に対しメンターさん二人についていただきました!

最初にメンターさんから言われて驚いたことは

  • 基本的に放任なのでインターン生で協力して自由にやってほしい
  • 現エンジニアの自分達でやっても10日間で終わるか怪しいタスク
    ということです!!

やはり、就業型だけあって一エンジニアとして扱われているんだな、とこのとき実感しました。
ただ、放任と言っても決して見離しているわけではなく、メンションを飛ばせば3分以内には手厚い回答が返ってくるという感じでした。(向こうも迷ったら聞いてくれスタンス)

やったこと

すぐにインターン生3人だけとなり、最初の難関となる環境構築を始めていきました。
まずEC2インスタンスの作成から取り掛かりました。ドキュメントは手厚かったのですが、見落としがあったり必要な操作が結構多かったりで思ったより手こずりました。
自分はEC2を触るのが初めてだったのですが他の二人が経験者で助けてもらいました!
その後実際に触るプロダクトとなる freee顧客先管理 の環境構築に移り、なんやかんややっていたら業務終了時間となってしまい、一日目は環境構築で終わってしまいました。

支給PC

M2 MacBook Pro RAM32GB を新品で支給していただきました!
普段はWindowsユーザーですがキー設定などを変えれば特に問題なく使えました!

Day 2

2日目から出社が可能ということで、自分は出社を選択しました。(初日と6日目を除く計8日間出社しました)交通費は上限5万円で飛行機だけでなく在来線の分まで支給していただきました。

配属先チームが使っている席の横並びの席を使わせていただきました。
32インチ4Kモニター+ハーマンミラーのセイルチェアが設置されており最高の作業スペースでした。

目標タスク

今回与えられたメインのタスクは次の二つでした。

  • freee会計の一部機能を『freee顧問先管理』に移植する
  • 移植の際にメール送信のロジックを社内の通信基盤に移行する
    これらを10日間(環境構築や最終発表時間を除くと実質8日)で行うということで、メンターさん曰くかなりタイトな設定とのことでした。

やったこと

2日目の目標としてはDesignDoc(設計の詳細などをまとめたドキュメント)を完成させることだったので、何が必要なのかを正確に把握するには動かしてみないと!ということで、開発環境におけるデモアカウントの作成から始まりました。

作成したデモアカウントを用いて移植対象となる機能を手元の環境で動かしたり、コードを見たりして、必要な開発を明確にするための知識をインプットしました。

また、今回申告チームとして初めて使うことになる通知基盤のキャッチアップのため、社内ドキュメントの読み込みをして2日目は終了となりました。

Day 3

DD(:DesignDoc)の詳細作成

3日目はメンターさん達とのコードの読み合わせからスタートしました。
フロントエンド・バックエンドのディレクトリの切り方やアーキテクチャなどプロジェクト固有のもので不明瞭なものを説明していただきました。

コードの読み合わせを通して必要な実装がより明らかになり、インターン生3人で分担してDDの作成を続けました!
自分は通知基盤関連の設計詳細を担当しました。申告チームでは未導入の基盤であったため、メンターさんもわからないような内容でしたが、ドキュメントが非常に充実しており、想像していたより困ることはありませんでした。

ずんだWeeklyへの参加

昼には所属チームずんだのWeekly(定例会)があり、対面で参加させていただきました。
詳しい内容は書けませんが、エンジニアメンバーが「マジ価値[1]」を届けるために課題に向き合っている場面を拝見することができ、感激しました!!!

(お昼休みは、ずんだチームの皆さんとランチに行き、奢っていただきました...!)

DDの仕上げ

午後からもDDの作成を進め、不確実性の高い箇所についてはインターン生で議論をし、一通り完成したところでメンターの方にレビュー前の壁打ちをしていただき3日目は終了となりました。

Day 4

4日目は午後からDDのレビュー会があり、午前中はそれに向けてシーケンス図を作ったり、詳細の整理をしたりしました。レビュー会ではずんだチームの皆さんに対して作成したDDを説明し、もう少し詰めた方がいい点などを指摘していただきました。
予想したより詰められることはなく、会議終了後に聞いたところ出来が良かったとのことでした!!

外部チームへask

レビュー会後は、指摘された点の解消のために、外部チームとの連携を行いました。
外部チームへSlackを飛ばすのは少し緊張しましたが、他のチームのエンジニアの方もみなさん優しく対応していただきました。社内ドキュメントの説明が不十分だったとして、すぐにドキュメント修正の対応にもあたっていたのには驚きました!(ハートフルじゃない人はいないんでしょうか?)

ここで、DDはほとんど完成し、セキュリティーチェック待ちとなったので、それに依存しない部分の開発を進めていこうというところで4日目は終了となりました。(ついに明日から開発メイン!!!!!)

Day 5

やったこと

5日目は共通基盤の制約やセキュリティー上の理由による仕様変更の可否をPMと相談しつつ、関係のない箇所の開発を進めました。自分の担当としては今回の機能を制御するfeature flag (新規機能のリリースを制御)の新規作成・通知基盤に今回作成する通知の機能・テンプレートの登録を担当しました。

ファイルを少し修正するだけだったので、すぐに対応し、PRを作成、マージさせていただきました(とはいえ初PRだったので緊張した)

通知基盤への登録はメール送信の動作確認まで行い、本文に関してはまだ使用が確定していない部分があるので一旦対応待ちというところで終了しました。

中間発表

最後の一時間では全チームのインターン生で中間発表会があり、自己紹介をしつつ自チームのプロジェクト概要を発表しました。この中で気づいたこととして、自分らのチームは比較的タフなプロジェクトとなっており、なおかつ順調であったため少し自信が持てました!

前半を振り返って

5日目はこれまでのインプットが伏線のように回収されていき、依存するマイクロサービスたちの全体像がつかめてきたり、プロダクト内のRails/Reactの使われ方がわかってきたりとかなり頭がすっきりしながら作業が進められました。後半はこの勢いをキープしつつ、さらにスピード感のある意思決定と高いパフォーマンスを出せるように頑張っていこうと思いました。

Day 6

やったこと

6日目はインターン生3人で完全に分担してタスクを行いました。自分は5日目に引き続き通知基盤を用いたメール送信のテストから始め、仕様変更に伴うメールの内容の変更確認、通知基盤への機能登録のPR作成を行いました。

詰まりポイント

通知基盤からのメール送信テストの際に、リクエストは成功するが、メール受信ができない(過去には何度化成功している)というポイントで詰まりました。

結果から言うと、通知リクエストを受ける処理と通知送信を行う処理はそれぞれ独立したコンテナかつ非同期で行っており、送信を行うコンテナだけが落ちていたという原因でした。

過去に成功していた状態を再現するなど自分で出来ることはかなり試したのですが、そこにかなり時間を使ってしまいました。今思うと、真っ先に通知基盤チームに相談して、コンテナの起動を確認するべきだったなと思います。

PRはレビュアーを思いやろう

PRにはレビュアーに余計な手間を書けないように親切に書こうというお話です。

↑のつまりポイントで時間を溶かし、焦っていたのもあるのですが、メンターさんから動作確認の方法をもう少し詳細に書いた方がいいと指摘されました。

  • 自分が役立った資料を貼ってあげる
  • 資料の中で詰まったポイントがあれば共有する

こういったことを徹底すると、レビュアーが無駄な時間を溶かすことも無くなり、チーム全体の生産性向上に繋がるなと思いました。freeeの「あえて共有」「世話焼きスタイル」にも繋がるポイントですね!

Day 7

やったこと

通知基盤側の登録PRがマージされたため、バックエンドにリクエストを行うクラスを実装し、疎通を行う作業から始めました。

作業途中でメンバーのPR Reviewや相談に乗っていると結構直ぐに時間がとけました。が、チームとしてのアウトプットには必須なものなので後悔はしていないです!

疎通のためのPRへのメンターさんからのコメントで、単体でも出来ればテストを書いて欲しいと言われ、テストを書くことになりました。ところが、外部サービスとの通信を伴うクラスのテストはMockを作成する必要があり、意外とてこずってしまい、7日目は終了しました。

Day 8

やったこと

前日のテストコード続きは早めに片付け、バックエンドのControllerの実装に入りました。

今日も前日に引き続きメンバーのPR reviewや相談事が間に入り、思っていたより自分のコードを書く時間は取れませんでした。

何より今日大変だったのはテストコードの実装です。
自分がほとんどRails/Rubyを書いたことがないのに加え、動的型付け言語の特性上、型が分かりずらいという点に苦しめられました。

とうとうインターンも終盤です(終わっちゃうの寂しい😭)。全体の進度としては

Front End:

  • 設計通りのUI完成
  • 状態管理やCustom Hooksによるバックエンドとのやり取りといったロジック部分8割完成

Back End:

  • 通知基盤にリクエストを行うラッパークラス完成
  • RoutingとController完成
  • ビジネスロジックにあたるInteractorのSpec途中

という感じになっています。悔いの残らないよう、残り2日全力で楽しんで行きたいと思います!!!

Day 9

やったこと

並行してフロントを書いていたメンバーは最低限の機能を終わらせてPRも通り、残すはバックエンドという状況なりました。

朝イチにInteractorのSpecを終わらせ、Controllerからの繋ぎ込みに入りました。
ここでもSpecを書いて動作を保証(Request Specと呼ばれるやつ)したのですが、デバッグにかなり手を患いました。

RSpecは失敗した時にテストコード自体のエラーしか吐いてくれず、テスト対象のクラスのどこで落ちているのかは自力で調べる必要があります。

RSpecのデバッグ

メンターさんに教えていただいた方法としては、binding.pryを使うという方法でした。
動作を確認したい行でこれを挿入することで、その行で止まった上でコンソールで変数の中身を確認できます。

(これをもっと早く知りたかった🤣)

ついに繋ぎ込み

就業時間ギリギリにバックエンド繋ぎ込みのPRがマージされ、E2Eの動作確認まで完了しました!!!

残すは明日一日。リファクタリングや最終発表準備を頑張りたいと思います!!

Day 10

最後の追い込み

当初の予定であったQAテストまでは行けそうになかったので、開発環境でどこまでしっかり作り切れるかの追い込みでした。

最終発表が15:00からであったため、休憩や発表準備も考えると開発できる時間は3時間弱しかありませんでした。

9日目では上手く動いてそうでしたが、フロントもバックもちょこちょこバグが見つかり、細かい修正とPRを繰り返していたらあっという間に時間が尽きてしまいました。

最終成果発表

会場はasobiba大ホールで行いました!
インターン生やメンターさんだけでなく、他のfreeeエンジニアの皆さんもリモートで参加しており、少し緊張しました。

リリースまで行けず悔しい気持ちもありましたが、自分たちがやり切ったこと、学び得た知見を振り返ることが出来ました。

懇親会

2週間連れ添った貸与MacBookに別れを告げ、懇親会へと向かいました。

再度asobibaに集合し、お酒と軽食が出されました!
他チームのインターン生やメンターさんと交流したり、夜9時のオフィスツアーをしたり、しみちゃんさんからありがたいお言葉を頂いたりと、楽しい3時間でした!

最後に担当していただいたメンターさんに挨拶をし、大崎ネストを後にしました。

まとめ

  • freeeの1エンジニアをそのまま体験出来る、非常に濃密な2週間だった
  • freeeはマジ価値を届ける集団だった (適当に見えるかもしれませんが、本当にこれに集約されます!!)
脚注
  1. https://jobs.freee.co.jp/about-us/culture/ ↩︎

Discussion