はじめに
こんにちは。
ファンズ株式会社でサーバーサイドエンジニアをやっている中村です。
2022年7月に新卒から2年半ほど勤めた会社を退職し、ファンズに入社しました。
部署としては私はプロダクト開発部に所属し、主に資産運用サービス「funds」のサービスサイト・管理画面のサーバーサイド開発やインフラ開発を担当しています。
入社してから時間が経過し、新しい環境にも慣れてきたので私自身がこれまで実際やったことをご紹介したいと思います。
入社してからやったこと(業務)
タスク
入社してから半年間で以下のようなタスクに取り組みました。
- 大手証券会社連携のための機能開発
- 解約時の機能修正開発・リファクタリング
- 法定帳簿発行ジョブの仕様修正及び不具合修正
- 社内向け管理画面の不具合修正
- インフラ(AWSリソース)の修正
ファンズでは数ヶ月単位の大規模な開発は、プロジェクト単位で動くことが多いのですが私自身は特定のプロジェクトに属することなく、保守・運用チケットを中心にアサインさせてもらっていました。
おかげで口座開設や投資注文、解約といった様々なドメインを広くゆとりを持ってキャッチアップできる良い機会だったと思います。
開発フロー
またfundsは金商法に則りサービスを運営していることから、システムとしても高い品質保証及び法律の遵守が求められます。
上記を実現するためにファンズではざっくり以下のフローで開発しています。
- 設計・仕様書作成
- 実装
- QA
- リリース
基本的にはエンジニアとPMが協力して仕様書を作成し、その後エンジニアが実装をし、QAチームがQAを実施します。
私が普段行っている設計・仕様書作成と実装のフローについて雰囲気を簡単にご紹介します。
設計・仕様書作成
システム仕様書はRust製のmdBookでマークダウン形式で書いており、Gitで管理しています。
API仕様書はOpen API(Swagger)で記述しています。
アジャイルな開発だとGithubのPRのdescriptionにjiraのチケットリンクやSlackのリンクが貼ってあるのみで、レビュワーとレビュイーで後に認識齟齬が発生したり、仕様書=コードとなってしまい仕様を把握するためにコードの海を彷徨うことになりがちです。(個人談)
コードと文書を両輪として行う開発スタイルは、fundsのように遵守すべき法律要件が存在したり、顧客口座・決済・ファンド運用といった複雑なドメインを持つプロジェクトに合っていると思いますし、個人的にはドキュメントをちゃんと書くスタイルは好みです。
実装
PRを作成してコードレビューを受けます。
私はサーバーサイドチーム所属なので基本的に以下はサーバーサイドの話です。
fundsのサーバーサイドはScala・Play Framework・Slickという構成です。
設計手法はClean Architectureでかつ、各レイヤーがsbtのマルチプロジェクトで依存関係が制御されているので、例えばusecase層やdomain層の修正のみであれば特にPlayやSlickの知識不要で進められます。
私自身、前職でScalaの経験はあったもののPlayやSlick自体は未経験でしたが、レイヤーがしっかり分けられているので割とスムーズに実務に入れた気がします。
またアーキテクチャやライブラリ導入の決定経緯はADR(Architecture Decision Records)で管理されており、コード見ていて「何だこれ?」と感じた部分はADRを読むことで解決することが多く助かりました。
レビューについてはがっつりめで、一つのPRにかける時間は多めです。
私自身、そもそもの実装方針だったりcatsのライブラリの扱い方、Slickのトランザクション周り、ユニットテストの実装で先輩からアドバイスをいただくことが多くとても学びになりました。
個人的にはある意味福利厚生だなと思います。
その他の日常業務
また日常業務では以下の業務も担当させていただきました。
- リリース作業
- オンコール対応
- 他部署からのデータ抽出依頼
- コードレビュー
オンコール対応では主にfundsを利用いただいているお客様や、管理画面を利用している社内のオペレーターの方からのフィードバックに対して返答したりシステム不具合があれば調査を行ないます。
実際にサービスを利用してもらっているお客様からの声が聞けるのは、to Cサービスならではの面白さだと思います。
入社してからやったこと(業務外)
次に業務外で取り組んだことについてご紹介します。
Scala with cats 輪読会
fundsではサーバーサイドの言語としてScalaを採用しています。
Scalaといえば関数型言語ということで、弊社でももれなく関数型プログラミングライブラリであるcatsを利用しておりサーバーサイドの実装でもEitherTやOptionT、Free Monadといったcatsのデータ型が利用されています。
catsのデータ型の扱いに慣れるために、入社当時のメンターにお願いして9月頃からcatsの入門ドキュメントであるScala with Catsの輪読会を開催させてもらっています。
輪読会も3ヶ月ほど続き、もうドキュメントの後半まで差し掛かっています。
モナドやファンクタ、アプリカティブといった関数型プログラミングで登場する概念は勉強すればするほど面白く、業務でも楽しくプログラミングさせてもらっています。
梯子部
サーバーサイドチームでは隔週で梯子部という部活動があり、そちらにも参加しています。
梯子部ではみんなで関数型プログラミングの梯子を登っていくことを目的し、主に関数型プログラミングに関する書籍の輪読会を実施しています。
参考: Ladder of Functional Programming 〜関数型プログラミングのレベル分け〜
最近まではFunctional and Reactive Domain Modeling という関数型プログラミングとリアクティブプログラミングのテクニックを使ってDDDにアプローチする方法を書いた本を輪読していました。
個人的にはAkka Streamsやリアクティブプログラミングは全く馴染みがなかったので難易度が高かったのですが、アプローチ自体は面白いものばかりだったのでまた一人で読み返したいなと思っています。
今後やってみたいこと
当社のミッションである「未来の不安に、まだない答えを。」の実現に向かって技術で貢献するべく、引き続きScalaでの機能開発に取り組みながらサーバーサイドエンジニアとしての専門性を高めていきたいと思っています。
※本記事は社員個人のnote記事より加筆・修正して掲載しております。