RubyとGoでゼロから作る証券システム: 実際に開発してみて良かった点と辛かった点、 そこから得た学び

654 Views

November 06, 25

スライド概要

RubyWorld Conference2025で使用した発表資料です

https://2025.rubyworld-conf.org/ja/program/day1/

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

RubyとGoでゼロから作る証券システム: 実際に開発してみて良かった点と辛かった点、 そこから得た学び 2025.11.06(Thu.) RubyWorld Conference 2025 Day1 小林悟史(noel) ブルーモ証券株式会社 ©2025 Bloomo Securities Inc.

2.

• 小林 悟史(小林 ノエル) @free_world21 • ブルーモ証券株式会社 取締役CTO • 2009年度 未踏事業採択 • Omotesando.rb, Roppongi.rb, Shinjuku.rbとかによくいま す • 旅行・世界のコワーキングスペースめぐり(ワーケーション 的な何か)が好き • 趣味で【政治資金データベース】を開発してます 好きなバンド • LʼArc~en~Ciel THE FARM@NY ©2025 Bloomo Securities Inc. CARR WORKPLACE@Chicago

3.

Index 01 導入:会社紹介&銀座Railsが生んだ起点 02 初期的な設計とシステム境界:RubyとGoの役割分担 03 Ruby on Railsが担う領域:顧客データ等 04 Goが担う領域:お金を扱う領域 05 何が良く、どこが辛かったか 06 まとめ • 対象者:高信頼領域のシステムをどのように作り上げるかに興味がある人 • 持ち帰れる知見 • – 複数の言語を採用したときのシステム境界を引くポイント – 発生する技術的な問題に対しての工夫ポイント – 証券システムもゼロから作れるということをイメージを持ってもらえる 発表資料は後ほど公開します ©2025 Bloomo Securities Inc.

4.

01 会社紹介&背景紹介 ‒ プロダクト 米国株資産運用アプリBloomoを提供中! コピペで「バフェット投資」 スマホ完結で若者も気軽に YOUTH FINANCE① ©2025 Bloomo Securities Inc.

5.

01 会社紹介&背景紹介 ‒ プロダクト機能 ポートフォリオ機能で、高度な資産運用のハードルを下げている ポートフォリオ投資機能 米国株・ETFで理想のポートフォリオを作成したら、 両替や買付はブルーモが自動執行してくれる。 複数銘柄への分散投資が手間なく実現できる (ユーザーの保有銘柄数は10以上(日本平均の3倍程度)) 共有・コピー機能 専門家や他のユーザーのポートフォリオを見て、 ワンタップでコピーできる。 初心者でもポートフォリオ作成が可能に (ユーザーの9割以上がコピーから開始) ©2025 Bloomo Securities Inc.

6.

会社紹介&背景紹介 ‒ 創業からこれまでの歩み 6年ぶりの証券会社スタートアップとして立ち上がった 個別株を取扱う証券会社スタートアップとしては、Finatext・FOLIO以来の存在。史上最速ペースで⾦商1種(証券会社) ライセンス取得・プロダクトリリースを続けてきた。 シードラウンド 8億円の資金調達 2022 6月 創業 2023 4月 NISA口座 提供開始 招待制リリース 2023 6月 2024 2月 2024 5月 第一種金融商品取引業 ライセンス取得 正式リリース 2024 10月 シリーズA 20億円の資金調達 2024 11月 2025 3月 ブルーモ初の金融機関連携 ©2025 Bloomo Securities Inc.

7.

実は Rubyコミュニティーの勉強会がきっかけで ⽣まれた会社です ©2025 Bloomo Securities Inc.

8.

©2025 Bloomo Securities Inc.

9.

https://speakerdeck.com/free_world21/jin-rong-ji-guan-false-sisutemufalse-zuo-rifang ©2025 Bloomo Securities Inc.

10.

銀座RailsでLTした後 • LT資料はSpeaker DeckにあげてLinkedInにもリンク載せてた • 2020年に当時勤めていた会社を退職 • フリーランス1本生活に戻りつつ、自分の趣味のサービス開発をしていた • そんな中ある日、1本のDMがTwitter(現 X)に届く – それが、後に一緒に会社を立ち上げ、現在のブルーモ証券代表でもある中村だった • 会って話して意気投合 • そのまま起業へ・・・ ©2025 Bloomo Securities Inc.

11.

そうしてできたのが【ブルーモ証券】 https://bloomo.co.jp/ ©2025 Bloomo Securities Inc.

12.

02 初期的な設計とシステム境界: RubyとGoの役割分担 ©2025 Bloomo Securities Inc.

13.

創業当時からこだわっているポイント • UI/UXに徹底的にこだわりたい UI/UXに徹底的にこだわりたい – 金融系のサービスは供給者側の原理(古くからあるシステムの仕様)に引きずられがち – UI/UXの観点から初期からネイティブアプリでやりたい • 最初から第一種金融商品取引業(証券会社)のライセンス取得を目指す 最初から第一種金融商品取引業(証券会社)の業登録を目指す – 米国株(米国ETF含む)専業 – つまりガチの証券会社 • 小林が前職で経験したのは第一種少額電子募集取扱業務(株式投資型クラウドファンディング) – 個人情報やお金の取り扱いなど、多くのセキュリティー要件を満たさないといけない ©2025 Bloomo Securities Inc.

14.

まずは技術選定 • モバイル(ネイティブ)アプリ:Flutter • クラウドインフラ:Kubernetes (Google Cloud Platform) • バックエンド:下記のように選択肢が多く、かなり悩んだ Ruby Python TypeScript Golang Framework Fullstack (Rails) Fullstack (Django) microframework 無限 (Flask, FastAPI等) (Express, Nest等) microframework (gin, echo等) ORM ActiveRecord Django ORM SQLAlchemy TypeORM, Prisma等 自作, ent migration ActiveRecord::Migration Django migration alembic db-migrate等 golang-migrate, goose テスト minitest, rspec Django test, pytest pytest Jest, Jasmine等 built-in 型サポート RBS Type Hints(built-in) built-in (ただしコンパイルオプ built-in ション多数) 勢い 下火? web単独では? (基本AIとセット) ある その他 ライブラリ多数、 コミュニティが成熟 TypeScriptの 同左だが、あくまでAIというcontextで native runtimeは 語られることが多い まだまだ黎明期 ある なかったらとりあ えず自分で作る的 な文化が強め ©2025 Bloomo Securities Inc.

15.

バックエンドの結論:Ruby on RailsとGoを併用 お金 お金以外の部分(アプリのAPIサーバ、管理画面)=Ruby on Rails ■ ORMやmigration、テストのフレームワークとか個別に選ぶ必要がない:考慮・調査工数を大幅に削減できる ■ 認証認可やセキュリティーとかはいったんフレームワークやデファクトのライブラリで対応 ■ 要件がころころ変わるフロントや管理画面に柔軟に対応できる ■ Rails人材:スタートアップ界隈、プログラミング初学者など人数はそれなりにいる お金を取り扱う部分=Golang ■ 硬く作るべき部分を硬い言語で作ってるというイメージ感 ■ インターネットから直アクセスなし:こまかい認証認可とかセキュリティーとかの考慮・調査工数を減らす ■ Golang人材:メガベンチャーでの採用事例が多いので、メガベンチャー転職組とかの受け皿になれたらいいな ©2025 Bloomo Securities Inc.

16.

03 Ruby on Railsが担う領域: 顧客データ等 ©2025 Bloomo Securities Inc.

17.

Ruby on Railsが担う領域 • スムーズな口座開設機能 – 本人確認・同意フロー – 暗号化と個人情報管理 • 前段ゲートウェイ – 認証・認可 – 入力内容の正規化やvalidation • 証券オペレーション向け管理画面 – 口座開設審査 – 顧客対応、取引状況の確認 – 重要書面管理 • システム運用者向け機能(管理画面の一部) – 強制アップデート、メンテナンスモード – FeatureFlag ©2025 Bloomo Securities Inc.

18.

口座開設機能 • 顧客に氏名や住所をアプリで入力してもらう • 本人確認フローは外部のeKYCサービスを活用 • 個人情報管理と暗号化はRailsレイヤーで自前実装 – Ruby on RailsにはActiveRecordが提供する暗 号化機構があるが、より高度な要件を満たすため にattr_enctypted gemを活用して実装 – 個人情報のレコードごとに暗号鍵が異なる、安全 性の高い構造 https://kaigionrails.org/2024/talks/f-world21/ ©2025 Bloomo Securities Inc.

19.

前段ゲートウェイ 安全なリクエストが来る前 提で各処理を実行 • 初期実装時はRuby on Railsでよく使われるdevise gemを活用して実装 • Railsの後ろにいるGoのモジュールは認証・認可が取れてる前提で、メインの取引機能の実装に 集中できるようになった • ネット証券を中心とした不正アクセスや乗っ取り騒動時には速やかに二要素認証を導入 – devise -> firebase̲authentication へ移行 ©2025 Bloomo Securities Inc.

20.

証券オペレーション・システム運用者向け管理画面 • ActiveAdmin, RailsAdminといったAdmin Dashboard系を一通り調査 • motor-admin-rails gemを使って初期的な管理画 面を実装 – 選定理由は『一番UIがキレイだったから』 – カスタマイズもかなりできて、自由度高い • Railsの複数DB接続機能を活用し、Go側モジュール が管理してるDBの内容も見れるようにした – Go側モジュールのDBについては読み込みはDB 直アクセス、書き込みやAPI経由 – 最終的にはすべてR/WどちらもAPI経由に移行予 定 • 強制アップデート、メンテナンスモード、 FeatureFlag管理といったシステム運用者向け機能も 管理画面内に実装 • 非同期処理やバッチ処理はsidekiqで管理 https://www.getmotoradmin.com/ ©2025 Bloomo Securities Inc.

21.

04 Goが担う領域: お金を扱う領域 ©2025 Bloomo Securities Inc.

22.

Goが担う領域 • 投資をするうえでの目標値となる目標ポートフォリオと実際 に保有している資産のポートフォリオ管理 • 注文計算 – 買付、売却、リバランス – 自動での配当金再投資 • 目標 ポートフォリオ 保有 ポートフォリオ 米国の証券会社(Alpaca Securities)に取り次いでもらって 米国市場に発注 – Alpaca Securitiesが公開しているAPIを使用 – 日本の証券会社で米国株を買うときは他社も現地証券会 社に取り次いでもらってる • 約定取込→顧客への資産配分→金銭照合 ©2025 Bloomo Securities Inc.

23.

Go側モジュールを実装するうえで気をつけていること • (今は)パフォーマンスより整合性重視 • 冪等性を担保できるようにAPI設計 – 例:同一顧客から注文リクエストが複数同時にきても、整合性が保たれるように実装 • 変更が入るリクエストがきた場合、処理の開始時点で、起点となるレコードの行Lockを取得し てから排他処理を実現 • データが不整合な状態になっていないかを検証するバッチを複数回実行している • バッチ処理はKubernetesレイヤーで管理 ©2025 Bloomo Securities Inc.

24.

05 何が良く、どこが辛かったか ©2025 Bloomo Securities Inc.

25.

良かった点 お金 取引、資産管理、整合性 チェックに集中 • 境界を「お金」で引くことで各コンポーネントの責務が明瞭化し、認知負荷が下がった • RailsとGoで独立してデプロイが可能になり、変更の局所化できている点 • チーム内に技術的な多様性が生まれた – Ruby:動的型付け、オブジェクト指向 • 設計レイヤーの話は『とりあえずRuby on Railsのお作法にできるかぎり乗る』 – Go:静的型付け、(独自の?)オブジェクト指向 • 設計レイヤー含め自分たちで決めて作る文化が強い – エンジニアチーム内で各言語やパラダイムの良い点、悪い点を共有しつつ ©2025 Bloomo Securities Inc.

26.

辛かった点 • 統合・結合テスト • 監視・モニタリング • 二言語運用の教育/採用コストと増加 • Rails側とGo側でどうしても重複・2重管理せざるを得ないデータが出てきてしまう点(技術的 負債) ©2025 Bloomo Securities Inc.

27.

学び(=辛かった点を覆すための工夫や課題) • 統合・結合テスト 統合テスト – E2Eのテストは顧客が口座開設から入金・発注までを行 うパスを中心に見ることによりデグレや後方互換性を 検証するようにした – 自動化できてるのはごく一部でまだまだ人間が手で検 証してる • 監視・モニタリング 監視モニタリング – OpentelemetryやSentryを導入 – SLI/SLOダッシュボードを構築し、エンジニア全員で 確認&改善していってる – エラーが起きたときのアラート通知からのインシデン ト対応プロセスの整備 – 監視モニタリングプロセスの効率化も今後の課題 ©2025 Bloomo Securities Inc.

28.

学び(=辛かった点を覆すための工夫や課題) • 二重言語対策 二言語運用対策 – 技術カットでチームを区切るのではなく、顧客の関心領 域ごとにチームを区切るようにした – RailsとGoを書くエンジニアがワンチームにまとまり、顧 客が抱える課題に対して同じ目線を持てる – 『幅広い技術に触れたい』というモチベーションを持つ メンバーを迎え入れる • 2重データなどの技術的負債に対する対策 2重管理データに治する対策 – スピード優先でデータが重複してしまう領域がどうして も発生する – ビジネスサイドを含め、継続的なリファクタリングを行 うことに同意 – 常により良く整合性の取れたアーキテクチャに変更して いくための投資をする文化を醸成 ©2025 Bloomo Securities Inc.

29.

06 まとめ ©2025 Bloomo Securities Inc.

30.

覚えて帰ってほしいこと • ブルーモ証券=Rubyコミュニティー発の証券会社 • 『顧客のお金を扱うかどうか』でシステムとしての実装と採用技術を分けている • 何か特別なことをしているわけではなく、一つ一つはよくある技術課題 – リリース時点で実装しておかなければいけない機能や運用ルールなどが幅広い – 証券会社のシステムもゼロから作れる • エンジニアチーム内の適度な技術的多様性が生まれた • テストや監視・モニタリングは仕組みを整えつつも今はまだ人力で頑張ってる点も多い • ビジネスサイド含め、会社全体で継続的な改善に投資することを合意 ©2025 Bloomo Securities Inc.

31.

We are Hiring! 一緒にBloomoのサービス開発を してくれる仲間を募集中! https://careers.bloomo.co.jp/ ©2025 Bloomo Securities Inc.