1 ポイント 投稿者 GN⁺ 2025-02-01 | 1件のコメント | WhatsAppで共有
  • Jane StreetはOMakeへの不満から Jenga を作ったが、外部での採用は伸びず、互換性のために作ったJbuilderが予想外にOCamlコミュニティの基盤ツールへと成長した
  • Jbuilderの初期の魅力は機能よりも 速度と移植性 にあり、Jane StreetのプロジェクトではOCamlbuildより約 5倍高速なコンパイル が採用を後押しした
  • JbuilderはOCaml Labsと協力しながら完全なビルドシステムへと発展し、既存のBorland Java IDEとの名前衝突のため、コミュニティでの議論を経て Dune になった
  • Jane StreetはしばらくJengaとDuneを並行して維持していたが、コードベースが 6,500万行のOCaml500万行のPython にまで拡大し、内部移行の難易度が大きく上がった
  • 1年以上にわたる集中的な作業の末、Jane StreetのコードベースはDuneでビルドされるようになり、キャッシュがほぼ埋まっているビルドは 2〜3倍高速化 した

OMakeへの不満から始まったJenga

  • ビルドシステムは、複数のソースファイルから実行可能なプログラムを作り、コンパイラの呼び出しやテスト実行まで担う、開発者の日常的なツールである
  • Jane Streetは2012年ごろ、OCamlの標準的なビルドシステムの1つだった OMake に不満を感じ、自前のビルドシステム Jenga を作った
  • 社内ではJengaがうまく機能していたため、Jane Streetはコミュニティでも有用に使えるはずだと考え、公開を決めた
    • 外部ユーザーがJengaを使い、貢献してくれることを期待していた
    • Jane Streetのコードをオープンソースとして公開することも容易になると見ていた
  • 実際の外部採用は期待に及ばなかった
    • Windowsで動作しなかった
    • Jengaを採用するには、事実上OCamlをビルドする Jane Street方式 全体を受け入れる必要があった
  • 外部利用が増えなかったため、Jane StreetはJengaを再び非公開に戻し、オープンソースコードのビルド問題は残ったままだった

互換レイヤーとして作られたJbuilder

  • 2016年、Jane Streetは外部ユーザーがJenga全体を受け入れなくても自社コードをビルドできる、シンプルなクロスプラットフォームツール Jbuilder を作ることにした
  • このツールには、当時OCamlプロジェクトのビルド新標準として台頭していた OCamlbuild 向けにビルドを書き直す負担を減らす目的もあった
  • JbuilderはJengaがビルド設定に使っていた jbuild ファイルを理解し、必要なコンパイルコマンドを トポロジカルソート順 に実行した
  • 初期のJbuilderは、一般的な意味でのビルドシステムとはやや離れていた
    • 入力が変わったコマンドだけを選んで再実行することはしなかった
    • 毎回すべてのコマンドを再実行する方式だった

JbuilderがDuneに変わるまで

  • Jbuilderはもともと小さな互換レイヤーとして意図されていたが、ユーザーはJane Streetのパッケージを超えて、自分たちのプロジェクトのビルドにも使い始めた
  • 採用を後押しした最大の要因は 速度 だった
    • Jane StreetのプロジェクトのコンパイルでOCamlbuildより約 5倍高速 だった
    • 移植性が高かった
    • 構造がシンプルで修正しやすかった
  • Jane Streetは OCaml Labs、現在の Tarides と協力し、Jbuilderをより完全なビルドシステムへと発展させ始めた
  • 名前は別の問題になった
    • すでにBorlandのJava IDEである JBuilder が存在していた
    • そのシステムはずっと前に事実上消滅していたが、著作権保有者に名称使用の意向を問い合わせても許可は得られなかった
  • コミュニティでの議論の末、新しい名前として Dune が選ばれた

2つのビルドシステムを並行維持するコスト

  • Duneの人気が高まるにつれ、Jane Streetは自社で作った2つの完全なビルドシステム、JengaとDune を同時に維持・サポートすることになった
  • Duneは、再設計された構造、ほとんどのユーザービルドでの高速な性能、より広い採用、より良いAPIとユーザー体験を備えたシステムとして定着した
  • 社内をいつDuneへ移すかが自然と課題になったが、ビルドシステムチームは拡大し続けるコードベースに追いつくだけでも手一杯だった
    • 2016年にDuneが始まった当時、OCamlコードは 400万行 だった
    • 現在は 6,500万行のOCaml500万行のPython がある
  • Duneへの移行は負担が大きく、本格的に着手できず、「今後6〜12か月以内には可能かもしれない」という希望的観測だけが繰り返されていた
  • 昨年、Jane Streetはビルドシステムチームを フルタイムエンジニア5人 に拡大した後、長く先送りされていた移行作業を開始した

Jane Street社内でJengaを置き換えたDune

  • 最大の作業の1つは、DuneをJane Streetの巨大なコードベースに合わせて スケール するようにすることだった
  • 外部でDuneが高速だった理由の1つは、ほとんどのユーザーがJane Streetの 7,000万行のリポジトリ よりはるかに小さいプロジェクトをビルドしていたからだ
  • Jengaも10年間そのまま止まっていたわけではなかった
    • Jane Streetはコードベースの成長に合わせてJengaの実装を継続的に改善してきた
    • Jengaは大規模モノレポの要件に合わせてかなり最適化された状態だった
    • この最適化作業のかなりの部分をDuneへ移す必要があった
  • 日常的な統合作業も簡単ではなかった
    • ビルドシステムは複数のワークフローから呼び出される
    • Vim、Emacs、VSCodeの3つのエディタがそれぞれJenga向けのカスタム統合を持っていた
    • 各統合をDuneへ1つずつ移行しなければならなかった
  • 1年以上にわたる集中的な作業の末、Jane Streetのコードベースは現在Duneでビルドされている
    • 移行時点でのDuneの性能は、全体としてJengaと同等かそれ以上だった
    • 一部のケースでははるかに良い性能を示した
    • ほとんどのビルド作業がすでにキャッシュにある場合、ビルドは 2〜3倍高速化 した

単一システムの上で可能になる次の改善

  • Jane StreetはDuneの性能改善作業のかなりの部分をオープンソースとして公開する計画で、一部はすでに公開されている
  • Jane Street向けDuneフォークと外部向けDuneという2つの系統が再び生まれないよう、可能な変更は アップストリーム に反映することを重視している
  • Duneは新機能を作るための基盤としてより適したものになった
    • コードベースがよりシンプルで作業しやすい
    • 1つのシステムに集中できる
  • 次の機能もより現実味を帯びてきた
    • 分散ビルド

      • 浅いビルド、すなわち “builds without the bytes”
      • ビルドグラフ自体のキャッシュ読み込み
      • ビルドシステムチームはニューヨーク、ロンドン、シンガポールにまたがる フルタイムエンジニア12人 に拡大し、Dune改善の速度も上がっている

1件のコメント

 
GN⁺ 2025-02-01
Hacker Newsのコメント
  • Duneのクラッシュメッセージ:

    セグフォルトは起こさない。不確実性は精神を殺すものだ。例外は完全な消滅を招く小さな死だ。私はすべての場合を完全に表現する。実行は私を過ぎ、私を通り抜ける。それが過ぎ去った後には、その経路に沿ってスタックを巻き戻す。場合分けが処理された場所には何もないだろう。ただ私だけが残る

  • Jane Streetの技術ポッドキャストSignals and Threadsには、2020年にビルドシステムを扱ったエピソードがあり、強くおすすめする
    他のエピソードも良く、特にRichard Eisenbergが出演したThe Future of Programming、Anil Madhavapeddyが出演したWhat is an Operating System?もおすすめ
    ¥https://signalsandthreads.com/build-systems/
    °https://signalsandthreads.com/future-of-programming/
    §https://signalsandthreads.com/what-is-an-operating-system/

  • Jane Streetが、HM型の関数型プログラミングも十分に力を入れれば本番投入可能で、非常に高速にもなり得ることを証明した点は敬意に値する
    いまだに、より学術寄りのスタイルの関数型言語は本番では使えないという話を時々聞くが、OCamlは高性能要件があっても十分可能だと示している

    • MercuryもバックエンドでHaskellを使っている
      https://mercury.com/
    • その通り。本番環境では**F#**もかなり使われている
      既存システムと幅広く相互運用しながら高品質なプログラムを作るのに優れた選択肢だ
    • NoRedInkもバックエンドの一部にHaskellを使い、フロントエンドの大部分にはElmを使っている
      数年前のブログ記事によるとRocも試したことがあるようだが、今も使っているかは分からない
      [0] https://blog.noredink.com
    • pandocもHaskellで書かれている。Facebookも一時期スパム対策にHaskellを使っていたし、今もそうかは分からない
    • 型システムが実行速度に影響するという意味なのか? 知る限り、型システムはただの静的解析で、ランタイム速度には影響しない
  • Janestreetのブログ記事を見るたびに、Janeで金融業界の仕事をする方が、いわゆるテック業界の仕事の90%より面白く、報酬も良さそうだと思って内心笑ってしまう

    • Jane Streetと一部のエリート企業は、金融業界の技術者の中ではごく小さな割合にすぎない
      金融系の技術職には、Jane Streetはおろか平均的なテック企業ほどにも面白くなく、報酬も良くない仕事がはるかに多い
    • 隣の芝生は青く見えるものだ
      金融業界の多くの仕事は、20年前のJavaコードを直したり、カスタムレポートのためにExcelファイルへデータを出し入れする新しい方法を探したりすることだ
    • 証明できない逸話だが、同僚の一人はJSで6か月働いた後、仕事が退屈すぎてFAANGに移った。年収はより高かったにもかかわらずだ
      それにJSに入るのはGoogle/Metaよりずっと難しいと聞いた
      私も以前応募したが、面接官がかなり不快で、ビッグテックの面接ではそんなことはなかったので、良い印象ではなかった
    • 本当にそうだろうか? 労働時間は長く、基準は非常に厳しく、結局は利益のために数字を操作する仕事なので、多くの人にとってはそれほど意味のある仕事ではない
      それでも、人々に広告をクリックさせる仕事よりは高く評価する
    • Jane Streetや同じように選抜の厳しい高頻度取引企業での仕事を、人々は過大評価しすぎている
      他の会社と同じように、興味深いプロジェクトと退屈な仕事が混在している
  • 複雑なコードベースより悪いものは、複雑なビルドシステムだけだ。CMakeは忌まわしい
    「この言語をコンパイルするには、さらに別の新しい言語を学べ!」というありさまだ

    • 複雑なビルドシステムより悪いものは、必要なものをビルドできない単純なビルドシステムだ :(
    • 「このひどい新言語を学べ」に近い
    • CMakeが嫌いというわけではない。ひどいのは確かだが、すでにCやC++を使っているので基準がかなり低くなっている
      ちゃんとできていることもいくつかあるし、間違っていることの一部は管理可能だ
      人間が編集できる設定ファイル一式で複数プラットフォームのビルド手順が得られるなら、ある程度の苦痛は受け入れられる
    • モダンなターゲット指向CMakeに含まれるアイデアには価値がある
      ひどいスクリプト言語が足を引っ張っているが、十分な動機があれば改善できるはずだ
  • 以前、Lispのあとで初めての関数型体験としてHaskell方面で数年を過ごしたことがある
    OCamlはあまりピンと来ず、珍しいタイプのセミコロンアレルギーがあったので、Haskellのほうがずっと見やすかった
    ところが最近Reasonを使ってみたらとても良くて、急にOCaml関連のあらゆるものが面白くなった

    • F# は、OCamlのより興味深い機能の一部、たとえばモジュールシステムの表現力は欠けているが、インデントに敏感な構文なので、ほとんどの場合セミコロンを含む多くの構造物を取り除いてくれる
      https://learn.microsoft.com/en-us/dotnet/fsharp/language-ref...
    • 「ファイルをスクリプトとしてコンパイルまたは解釈する目的なら、OCamlでは二重セミコロンは避けられるし、避けるべきだ。残しておいてもエラーにはならないが、役には立たない。コンパイラがこれを許している理由は、UTopからファイルへコピー&ペーストするときに削除しなくて済むようにするためだ」
      https://ocaml.org/docs/toplevel-introduction#loading-librari...
      https://reasonml.github.io/は格好よく見えるし、JavaScript風のOCamlのようだ
    • 面白いのは、Haskellでいつも気が進まなかった部分は、構造を見分ける視覚的な手がかりなしに、空白と識別子の流れのように感じられる点だった
      その線が分かれば大丈夫なのだろうが、Lispのように、その構造で考える方法を学ぶ必要がある気がする。それでもHaskellコードが画面いっぱいにあると怖気づく
      その中ではSML/NJがいちばん読みやすかった
    • Reasonの構文がデフォルトの構文だったらいいのに
  • Jane StreetのオープンソースのOCamlライブラリとツールを、ある程度本格的なプロジェクトで使ったことがある人がいるのか気になる
    ざっと見た印象では、エコシステムを作り、コードをオープンソースとして公開することに多くの労力を注いではいるものの、Jane Street外部の人が使うには「準備ができた」状態ではないように思えた

    • 使っている。最初にOCamlを学んだプロジェクトで彼らの標準ライブラリ代替を使い、それ以来ずっと使い続けている
      何かを探すには関数シグネチャをかなり上手に読める必要があるが、それ以外に不満はない。たとえば、すべての基本型についてS式へ変換したり戻したりする関数は、存在を知っていて事前に計画しておけば、ものすごく時間を節約できる
      ほかのライブラリも使ったことがあり、ロギングとユニットテストのppxは、OCamlの世界でそういうものが可能なら、事実上の標準に近い。コードフォーマッタ、テストフレームワークの1つ、高度なデータ構造の実装も使った
      ときどき、別のコメントにあるように本当に動かないものにも出会う。別途配布された文書化されていない何かに依存していたり、秘密の設定が必要だったりする類だ。悪意があるわけではなく、issueを開いて1〜2年後に戻ってくると動くことが多い
      フラストレーションがまったくないわけではないが、より少ないリリースをテストして磨くことにリソースを使うより、すべて公開するという姿勢はありがたいと思っている。コード品質は総じて非常に高く、自分で動かせなくても、厳密で検証済みの実装例になる
    • 本格的なプロジェクトではないが、個人用の静的サイトジェネレータで彼らのstdlibを使っている
      標準のstdlibよりAPIがずっと良いと思う
    • magic-trace ツールを使おうとしたが、些細なdotnetプログラムでも少なくとも4種類の別々のクラッシュが起きた
    • Bloombergで使っていた
    • 複雑な数学研究プロジェクトのテストを回しているところだが、実行時間は驚くことに今のところ Lean 4 << Haskell << OCaml の順だ
      Lean 4は好きだが、AIに手伝ってもらうのは簡単ではない。今日進めている作業は、リファレンスマニュアルを200Kのコンテキストウィンドウにうまく収まるように消化することだ。役に立つか見てみるつもりだ
  • 独自の新しいビルドシステムを開発してそこへ移行することが、buck2やbazelのような既成ツールを採用するよりもなお筋が通るという点はかなり驚きだ
    こうした高度なビルドツールを導入しやすいという意味ではないが、自作するのと比べるとどうなのだろうか。duneを大きく違うものにしている特別な点があるのか気になる

    • 具体的な内容は経験豊富な人たちのほうがうまく説明できるだろうが、JSが2012年に独自ツールを作り始めた時点では、buckもbzlもなかった
      Bazelの初リリースは2015年、Buckは2013年だ
      JSにはNIH文化が多少あるが、ここでそれが作用したのかは分からない。当時は良いビルドツールが多くなく、特に非主流の技術スタックを使う会社にとってはなおさらだった
    • OCamlに特別詳しいわけではないが、言及されたものの中で、実際にOCamlを正しくコンパイルするための意味論を持つビルドシステムはbuck2だけだと理解している
      特に、事前にocamldepを実行できる必要があるか、二度コンパイルする必要があると理解しているが、buck2では可能で、Bazelは記憶ではハックが必要だ
    • 私たちのチームには大きなOCamlコードベースと二重のビルドシステム、つまりbuck2とduneがある
      両者はおおむね似ている。OCamlビルドツールを呼び出す純粋な速度はduneが速く、多くを再ビルドする必要があり分散ビルドシステムを使うときはbuck2が勝つ
      大きな痛みはLSP統合だ。LSPサーバーがファイルの依存関係を知る唯一の方法がビルドであるため、ビルドシステムと密接に結びつく必要がある。duneではすべてがきれいに提供される。buck2でも何とかつなぎ込んではいるが、それほど良くはない
  • Duneはビルドシステムの名前としては断然最高で、近いものすらない

    • その通り。「ビルドシステムを支配する者が宇宙を支配する」
    • ソフトウェアが動く砂の上に築かれているからかな?
  • より良いビルドシステムを作ろうとして始めたあとで「偶然」より良いビルドシステムを作ったとは、そういう偶然の起き方は実に奇妙だ