🆓

freee株式会社でインターンしてきました

2024/09/07に公開

はじめに

こんにちは、taro137です。8/19(月)〜 8/30(金)の2週間、freee株式会社でエンジニアインターンをしてきました。
https://corp.freee.co.jp/

TL;DR

  • 認証基盤開発した
  • めっちゃアウトプットした
  • めっちゃ楽しかった

どんなインターン?

26新卒向けエンジニアインターンはレベルに合わせて3コースあります。今回参加したのは実務経験半年以上が目安の学生向けの2週間就業型有給インターンです。
期間は8/19(月)〜8/30(金)の2週間、勤務時間は平日10:00〜19:00で、給料はトータル16万円です。

出会い、選考、配属、準備

このインターンに参加したきっかけはサポーターズ経由でインターン説明会に招待されたことです。ほかの企業でインターンをしていた際にfreeeのサービスを使っていたため会社自体は知っていましたが、まさかその開発に自分が携わるとは当時は思っていませんでした。

選考は

  1. オンライン説明会
  2. コードテスト
  3. 面接
  4. 結果通知
  5. 採用担当面談

という流れでした。
コードテストは競プロっぽいアルゴリズムの問題が2問あり、1問目はAtCoder Beginners ContestのBくらい、2問目はCかDくらいの難易度だった気がします(コードテストから3か月以上経っているのでかなり記憶が曖昧です)。採用担当の方との面談では面接官が僕に対してどのような印象を持ったのか細やかにフィードバックしていただきました。
ところで、面接を受けたのは5月末だったのですが、ちょうどその頃freee技術の日があったので前夜祭も含めて対面で参加してきました。
https://freee-tech-day.freee.co.jp/2024/

しばらくして各部署の紹介がメールで送られてきて、第5希望くらいまでフォームで提出しました。
実際に配属されたのは第一希望の部署。freeeのサービス全体の認証基盤を開発している部署でした。

インターンではGoを使うと聞いていたのですが、自分はGo未経験。1週間ほど前からA Tour of Goをやったり、以下の記事をRustaceanのためのGo入門だと思って読んだりしていました。
https://zenn.dev/skanehira/articles/2024-08-12-go-rust-pros-cons

1日目

初日は全員オンライン。
インターン用のMacBook Pro(メモリ32GB!)が宅配で届いていたので、午前中は全員共通でそのセットアップをしました。
Slackやjira、GitHubなど各種ツールの設定もしました。
キーボードがUS配列だったので若干苦戦しましたが、午後には多少慣れてきました。

午後はそれぞれの配属先へ。同じ部署に配属されたもう一人と一緒に、メンター2人から開発するものについて説明を受けました。

簡単に説明すると、「各種サービスに導入されている認証基盤システムの設定ファイルのyamlを読み込み、誤った設定やリスクのある設定をしている箇所を検出するプログラムをGoで実装し、それをGitHub Actions[1]で動かす」というものです。現在は設定ファイルを認証基盤の開発チームが人力でチェックしており、今後のサービス拡大を見据えてチェックを自動化したいという背景から生まれてきたタスクです。
デザインドックが既に作成されており、仕様はそれを読めばだいたいわかるようになっていました。
一通りメンターから説明を受けたのち、2人で早速設計・実装に取り掛かりました。ざっくりと

  1. ファイルのパスを受け取り、パース結果を返す関数(Parse
  2. パース結果を受け取り、実際にlinterのロジックを適用していく部分(Lint
  3. Lintの結果を出力する部分

に分け、それぞれの関数の引数や戻り値の型を固めていきました。メンターの方々は説明が終わったらそれぞれの通常の仕事に戻っていき、初日からいきなり放任されて面食らったのですが、Slackで質問すると爆速で丁寧に答えていただけたので安心感がありました。
ところで、巨大サービスを開発しているだけあって大量のドキュメントが存在しているのですが、そのどれもがインターン初日の自分でもギリギリ読めるくらいわかりやすく書かれています。この手厚さには翌日以降も何度となく助けられることになりました。

2日目

2日目以降出社するかどうかは自由でした(実際フル出社でもフルリモートでも問題なく働ける環境です)が、自分は4日目までオンライン、以降対面ということにしました。

前日に引き続き型定義をペアプロで固め、ある程度固まったところでそれぞれの関数の実装に分担して取り掛かりました。
自分はファイルパスを受け取ってからそのファイルの中身を読んで然るべき型にパースする部分、相方はパースされた結果に対して検出すべきルールを適用する部分を担当しました。
ライブラリを使えばyaml文字列から対応する構造体に簡単に変換できますが、今回作成するプログラムでは行番号などのメタデータも欲しかったので一旦yaml.Nodeに変換して、得られるASTからパース結果を組み立てる部分は自分で実装することにしました。
https://github.com/go-yaml/yaml

わからないところや気になったところは積極的にSlackに投げるようにしました。ほんの数分で誰かしら答えてくれます。
既存のコードを読む際も、ドキュメントやコメントが非常に充実しており、昨日のドキュメントに引き続き先人への最大限の感謝を心の中で唱えながらコードリーディングを進めました。

3日目

3日目は以下の3つを主にやりました。

  1. 前日実装したParseのPR (Pull Request) にレビューがたくさんついたのでその対応
  2. 相方がLintロジックのドラフトPRを上げてくれたのでそのレビュー
  3. GitHub Actionsのワークフローを作るのは初めてなので作り方・使い方の調査

当初の予定では初週にCLIを作成し、次週にそれをGitHub Actionsに載せてより使いやすくしていくという予定でしたが、3日目の時点でCLIはそこそこ完成に近づいていました。そこで、CLIの細かいところはいったん相方に任せ、自分はその先にやることを固める作業に取り掛かりました。
https://docs.github.com/en/actions

4日目

4日目は

  1. 前日に引き続きPRレビューの対応
  2. Goで書かれたlinterをビルドし実行するGitHub Actionsワークフロー作成
  3. 巨大な設定ファイルで実行時間測定実験

などをやりました。PRのレビューは30件を超えており、この対応はかなり時間がかかりました。
中にはこのPRで対応しきれないものもあり、それらはJiraにチケットを残しておいて一旦後回しにしました。
GitHub Actionsの方もいかんせん作るのが初めてなので原因不明のエラーを連発していたのですが、社員の方に相談して問題の切り分けを行い解消にこぎつけることができました。

5日目

初出社日です。大崎のオフィスに来たのは6月のfreee技術の日以来2回目でした。

  1. 最初のParseのPRで後回しにした部分の実装
  2. インターン生同士の中間発表

などを行いました。また、初PRがマージされました!
昼食は社員の方と一緒に、社内で売られている弁当を食べました。
中間発表では、さまざまな部署に配属されたインターン生が集まってお互いに何をやっているのか共有しました。自分の部署ではDesign Docは配属時点で既にあり初日から実装に取りかかれたのですが、部署によってはDesign Docの作成から取り掛かってようやく実装に入れそう、というところもありました。

余談ですが、オフィスはめちゃめちゃ居心地がいいです。

  • 32インチの巨大モニター
  • 飲み放題のドリンクバー
  • 何時間座っても疲れない椅子(値段を調べて驚愕した)
  • なんかいい匂いの空気

など、挙げるとキリがないですが、バイトや研究も自宅でやりがちな自分ですらオフィス出社したくなるような環境が整えられています。

6日目

後半戦が始まりました。

  1. GitHub Actionsと格闘
  2. Design Docで曖昧になっていた部分の確認
  3. Lint機能の実装漏れを拾う

などをやりました。GitHub Actionsとひたすら格闘し続けた1日でした。linterの出力結果をSlackに投稿したり、PRに対してコメントを追加したりする機能を実装しました。

PRのレビューをお願いしたり、ドラフトPRの実装方針について議論したり、Design Docについて相談したりと社員の方をSlackで鬼メンションしてしまいましたが、毎度ちゃんと反応していただいて頭が上がりません。

ところで今日のランチは初出社した相方のインターン生や配属先の社員の方と一緒にオフィスの近くの焼肉屋へ。
美味しかったです。ごちそうさまでした。

7日目

今日は大量のタスクをしばきました。

  1. 新規Lintルールの追加のためのParseの追加実装
  2. Parseのコード量を減らして保守性を上げるリファクタリング
  3. 今までLint関数内で行っていた結果の出力を切り出し、別の関数としてリファクタリング
  4. GitHub Actionsの拾いきれていなかった細かい仕様の対応
  5. Slackの通知やPRへのコメントが失敗しても下流のjobが止まらないようにGitHub Actionsを修正

かなり爆速でコードを書いた1日でした。保守性を上げるリファクタリングについては社員同士の間でも議論が交わされ、リファクタリングに対する向き合い方はとても勉強になりました。

ところで、今回作成するワークフローはPRをトリガーとして実行されるため、テスト用のリポジトリを作成してダミーのPRを立て

  1. mainブランチでワークフロー定義を修正してcommit + push
  2. developでmainをpull
  3. developをpush

を何度も繰り返していました。ワークフローはPRのbase側のワークフロー定義をもとに実行され、しかし一方で発動するタイミングはPRが開かれた時やhead側が更新された時でありbase側の更新はトリガーにならないためです。ワークフローを自分で作るのは初めてだったので、このような試行錯誤を何十回も重ねて完成を目指しました。
ふと見るとGit Graphが綺麗な階段状になっていて面白かったです。

8日目

いよいよ最終日が近づいてきました。実装に追い打ちがかかります。

  1. 残り時間と残タスクを見比べてやること・やらないことを整理
  2. GitHub Actionsのランナーを社内のself-hosted runnerに変更した際に生じたエラーの解決
  3. 設定ファイルの静的解析だけでなく、PRの変更の前後を比較して差分に対してLintを実行する機能の追加
  4. docsの整備

などをやりました。特に2つ目のエラーの解決には時間がかかりました。linterの出力結果をSlackに投稿する部分で、Slackへの投稿がなされるにも関わらずGitHub Actions上ではエラーになっているという謎現象が発生しており、社内の他のリポジトリのPR履歴を読み漁ったりSlackの履歴を掘り返したりしてようやく解決することができました(結論としては、self-hosted runnerのコンテナイメージを作成する際に余計な環境変数をつけてしまっており、それが影響して想定外の処理が走っていたためエラーになっていた)。

また、この日は終業後に研究室のミーティングがあったのですが、社員の方に相談したところオフィスの会議室を使わせていただけました。ありがとうございました。

9日目

最終日は昼過ぎから最終発表なので、開発ができるのは実質的に今日が最後でした。

  1. PRの差分に対して適用される追加のLintルールを実装
  2. GitHub Actionsの細かな修正
  3. リリース告知の文章錬成
  4. 最終発表のスライド作成
  5. 突然のPC強制再起動からの復帰

を行いました。1つ目の追加ルールの実装では、設定ファイルのリファレンスに穴(というと大袈裟ですが、極めてバグのもとになりやすい抜け道)があることが判明し、その穴を埋めるためにリファレンスに対してコントリビュートすることもできました。

インターン生2人とメンター2人で2日目から毎日17時に行ってきた進捗報告ミーティングも今日で最終回です。
今回実装したlinterは部分的にリリース(社員が使うツールなので一般公開ではなく社内リリースですが)され、残りも最終発表には間に合わなかったものの準備が整い次第リリースされることになりました。全てをリリースできなかったのはちょっと心残りですが、この2週間のアウトプットについてメンターの方々にたくさん褒めていただくことができました。
実はlinterを作りたいという話は認証基盤の開発初期からあり、今回のインターンで社員の方にとっても長年の念願が叶ったようです。まだまだ追加で実装したいことはたくさんあるのですが、まずは最初のlinterをリリースすることができ、誇れる成果を残すことができました。

10日目

最終日。今日の業務らしい業務は

  1. GitHub Actionsをちょっと手直し
  2. CLIのα版リリースSlack告知

くらいで、朝から14時のスライド提出期限までほとんどの時間を最終発表の準備に費やしました。発表は15時からasobibaで行われ、認証基盤以外にもさまざまな部署に配属されたインターン生がそれぞれ2週間の成果を10〜15分程度で発表しました。なんとトップバッターだったのですが、どんな背景があって、何を作って、何を学んだか、といったことを成果物のデモを交えて発表しました。多くの社員の方がオンラインの配信を視聴してくださり、Slackのスレッドでは延べ263件もの実況、コメント、感想をいただきました。
他の部署でのインターン内容も非常に面白そうで、たった2週間でここまでできるのかと何度も驚かされました。

感想

顧客の会計情報という相当センシティブなデータを扱うだけあって、初日のオンボーディングではガチガチのセキュリティに多少ビビりましたが、蓋を開けてみるといわゆるお堅い企業では決してなく、守るべきところはしっかりしつつ遊び心を忘れない、和気藹々とした活気ある企業でした。
2週間という短い期間でしたが、基盤開発の面白さ、freee社員の方々の熱意、技術力など多くのことを学べました。

Aekyo

freeeにはあえて共有、略して「あえ共」の文化があり、社員同士積極的に情報を共有しています。業務に直接関わることはもちろん、SlackなどのツールのちょっとしたTipsも対象で、ちょうどこの時期に開催されていた「まなつのじゆうけんきゅう」ではConfluenceに数々の有益な知見が集められていました。
そこで、感想に入りきらかなかったあれこれを皆さんに「あえ共」してこの記事を締めくくりたいと思います。

  • freeeでは出社してもフルリモートでも快適に働けます。実際メンター方の一人は東京にはいませんでした。働く時間もかなり自由で、昼前から働き始めて夜は遅めに終わる人、夕方に一旦抜けてまた戻る人など様々な方がいました。
  • コードのコメントやドキュメントが非常に充実しており、joinから自走できるようになるまでが圧倒的に早いです。開発しているものの規模には大小がありますが、大きなプロダクトに配属されたインターン生も他に全く引けを取らない成果を残していました。
  • PRレビューでは仕様通りに動くことはもちろん、他のエンジニアにとって読みやすいことや今後の改修・機能拡張がしやすい構造になっていることが求められます。2週間で完璧に会得できたわけではないですが、自分たちのコードを将来の負債にはさせまいとする社員の方々の熱意をひしひしと感じました。
  • 「理想ドリブンで考えよう」という文化もあります。リファクタリングで2つの案のどちらが良いのか決めあぐねている時、(一旦現状がどうであるかはさておき)理想はどうなっているのがいいかをまず考え、そこへの移行コストがより低い案を採用しようというアドバイスをいただいたのが印象に残っています。

社員の皆さん、インターン生の皆さん、2週間本当にありがとうございました。

脚注
  1. 余談ですが、公式が「GitHub Actions is ...」などと説明しているように「GitHub Actions」は単数扱いです。ワークフローを実行するプラットフォーム自体をGitHub Actionsと呼んでいるためです。 ↩︎

Discussion