土曜日, 8月 2, 2025
土曜日, 8月 2, 2025
- Advertisment -
ホームニューステックニュース関数型言語を採用し、維持し、継続する

関数型言語を採用し、維持し、継続する


松澤 有 (ymtszw) (Siiibo証券株式会社 CTO)
@関数型まつり2025 (2025/06/14) [1]


Siiibo証券株式会社

  • 2019年創業、筆者はfounding engineer / CTO
  • ↓の構成で社債専門の証券システムを作り上げてきた

w:600 言語構成






  • mix releaseによってパッケージ化し、あとは仮想サーバなりコンテナなりに置いて実行するだけ

    • 2020年のv1.10で導入されて大変やりやすくなった
    • DockerのMulti-stage buildによる軽量化とも相性が良い
  • しかもreleaseスクリプトには、remote console機能が同梱されていて、インフラがECSならECS Execと相性抜群
    • デプロイ環境でのデバッグに重宝する



  • Elmの良いところは、Elm-runtimeで区切られた内部世界は純粋なので、その範囲では脆弱性の導入される余地がないこと
    • 少なくとも現行のアーキテクチャが確定したElm 0.18以来10年くらい経つが、筆者の認知している範囲ではこの前提は破られていない
  • サプライチェーン攻撃に耐性があると言える


  • 該当するmix testの件数は最新のコードで4,500件ほどある
  • かなり多くの割合がDB I/Oを含む
  • これを少なくともApple Silicon MacBook系のローカル開発機では1分程度で実行できるよう維持している

w:800 mix test実行時間


  • 実際にやっているのは、
    • テストの並列実行
    • 並列実行を可能にするための、
      • DBの複製
      • Test fixtureの独立化
      • Sandbox接続の利用
    • DB初期化を高速にするためのsnapshot活用

  • 並列実行自体はmix testの標準機能
  • DB接続のSandboxingもEcto(ElixirのORM+Query Builder)の標準機能
  • ただし、
    • module単位でしか並列実行できない
    • 自然体だと同じDBを使うので、sandboxingしていてもWRITE操作の内容によってはdeadlockする

  • そこで、
    • テスト同士の相互依存をなくすために、必要なfixtureデータはsandbox内で独立して作成する
    • テストDBを実行並列度に応じて複製する
    • テストごとに利用DBをcheckout/checkinする機構を設ける
      • EctoのDynamic Repo機能がこれを可能にしてくれる

  • しかしEcto migration(よくあるパッチ方式のDB migration機能)を複製DB全てに適用するのは時間がかかる…
    • そこで、最新のDB schema snapshotを定期的に取得しておき、新規のテストDB作成時にはsnapshotから開始できるようにして高速化
  • ここまで見てきたように、Ectoの諸機能は快適なテスト実行に大いに寄与しており、こいつがデファクト・スタンダードとして存在していることはElixirの大きな強み




  • が、Atomを使った「直和的な」データ表現はかなり頻出で(Erlang/Elixirの標準ライブラリ内でも!)、そのことに自覚的になると「自然な」実装パターンが見えてくる(主観)
    • 筆頭は{:ok, value} | {:error, reason}
  • 「Elmだとそういえばこう書いてたな、これElixirでもやれないの?」はそれなりにやれる
    • 特に副作用の絡まない関数では表現を似せられて腹落ちすることが多い
    • Result型に対する諸APIはElixir側にも実装してある

  • elm-testではExpect系関数をpipelineで受けて書かれる
String.split " " "Betty Botter bought some butter"
    |> Expect.equal [ "Betty Botter", "bought", "some", "butter" ]
  • 一方mix testではassertマクロを手続き的に並べて書くことが多いが、場合によってはElmからの影響もあってpipeで書きたくなる

  • siiibo/assert_matchはそのような日常的洞察から生まれたOSS
  • 手前味噌ながらこのassert_matchマクロは結構強力で、どのような構造に対してもパターンマッチとしてassertionを書けるので、
    • pipeで書けて気持ちいいし
    • Elixirの強力なパターンマッチ機構を活かせるし、
    • 「関数とは入力と出力なのだ」という意識が高まる
    • (主観)


  • Elixir v1.18で一部型検査機能がすでに有効化され、早速既存コードベースでもいくつかの潜在バグを発見・解消できた
  • Elixir v1.19でもさらに入る:

    • Type checking of protocol dispatch and implementations
    • Type checking and inference of anonymous functions
  • ついでに大規模コードベースでのコンパイル速度改善施策も入る
  • Upkeepをこまめにやるのは、このような新施策をすぐ採用できる強みに直結

  • elm-reviewは、Elmでルールを書けるElmプロジェクトのためのLinter
  • Elm 0.18時代に存在していたelm-analyseやAtom Editorのelmjutsuに搭載されていたLint機能の多くを引き継いでいる
  • Linterとしては、前述の通りCIでのチェックとセットで開発プロセスの屋台骨になる



  1. Marpスライドとして作成しているので水平線がいっぱい入っています ↩︎



Source link

Views: 0

RELATED ARTICLES

返事を書く

あなたのコメントを入力してください。
ここにあなたの名前を入力してください

- Advertisment -