TODESKING
技術ブログ

Scala雑記

しばらく前ですが、Scalive #1というところでLTしてきました。

Scalaのコンパイルを3倍速くした話

こういう実務寄りのScalaイベントって珍しい気がしますね。なんと発表者が誰もモナドって言わなかった!! その代わりコンパイル速度について言及されまくってましたが……。

3月末からScalaでアドテクやるという会社に転職したのでScalaでアドテクをやってますが、Rubyでソシャゲやるのとそれほど感覚は変わらない。どちらも制限時間付きの大量リクエストをさばく必要があるけど、それなりのインフラがあれば、あとはふつうに高品質なコードを書いて粛々とレスポンスを返すのみですよワハハ。なのでハイパフォーマンスまわりのおもしろい話はできません。まあ常識で設計してふつうに開発すればいいんじゃないの。とか言ってると強い人から殴られそうだな……

最近は技術的負債の返済を主なミッションとしてビルドシステムの見直しとかフラジャイルなテストを叩いて直すとかやっているのだけど、とにかく依存性管理に悩まされることが多い。これはScalaというよりJavaのエコシステムに起因してるのだけど、とにかくお前らライブラリをちゃんと管理してほしい……。

例を挙げる。

  • プロジェクトが依存している hbasejruby-complete に依存しており、jruby-completeにはなぜかjoda-timeライブラリ(古い)のクラスまで同梱されている
  • いっぽうプロジェクト自身もjoda-time(新しい)へ依存している

その結果、クラスパスの順序によってコンパイルが通ったり通らなかったりする。

この手の「複数のモジュールが同じクラスを含んでいる」問題があまりにだるいのでsbt-conflict-classesというsbtプラグインを作った。クラスパス内の衝突しているクラスを抽出して表示するという代物で、トラブルシュートにたいへん便利。このへんの依存性解決ノウハウはそのうちまとめたいです。あとジャバコミュニティは同一jarに別ライブラリのクラスを同梱したりバージョンアップ時にorganization名変えたりするのをやめろ(みんな困ってないんだろうか……)。

Comments