Scala as a Better Java

もし次のプロジェクトを探しているならコードベースの依存関係を整理して小さいモジュール (Maven 的な意味で) にわけてビルドを速くする仕事はどうかと TL がいう。人にいわれたことをやるのは基本的には嫌だけれど、これは動機を共有できる。今の spaghetti monolith を殺したい。

社内ではモジュールの単位として Java のパッケージをつかう流儀で、モジュール間に cirular dependency があってはいけない。なので適当に class file をパースして dependency graph を作り、circle を探しつつ殺していけば最初のステップとしては良い気がする。そこに ASM とかがある Java のエコシステムはさすがに成熟してるなと思う。

とはいえ Java でグラフいじりみたいなコードを書きたくないなーどうせ移行が済んだら捨てるコードだし手元で動かすだけだから Scala で書いてみるか・・・と久しぶりの Scala. そして file traversal の API をみたら Stream がつかわれている。それじゃと Java 8 にもちょっとだけ入門.

Kotlin をやってから Scala に来るとcollection まわりが混乱する. なんとなく List と書いてコンパイル通らねえーとおもったら java.util.List じゃなくて Scala の List だったとか、Stream も Scala の Stream と Java の Stream は別物とか。しらねー。Kotlin は自前の collection はわずかだし、あってもだいたい Java 互換なのでそういう混乱は少ないのだった。Scala は Scala native な API の上で暮らさないとイマイチだね。

とわいえ高階関数をギュっと凝縮して書けるところは Kotlin にはない Scala の良さで、このトラバースしてフィルタして変換して・・・みたいな仕事には向いている面もある。ASM をつなぐところから先は全部 Scala のコレクションで頑張れば良いのかもしれない。あと SBT は良いと思うのだよな。Gradle よりちょっと速い。IntelliJ ともうまくつながってる。あと Kotlin との比較はともかくさすがに Java よりはだいぶ良い。


しかし家に帰ってきて冷静になってみると、会社員としてこれほんとに Scala で書き続けてよいのだろうかと疑問が湧く。プロジェクトのレポジトリにはチェックインできないし、他の人に動かしてもらうのもだいぶかったるい。残念だけど Java で書きなおそうか、それともダンプする部分だけ Java で書いてその先は Python にしようか。調査が終わったら何らかの指標を日次で集めて dashboard にしたりしたいかもしれず、それには Python の方が都合よく思える。でも言語を跨ぐのはそれはそれでめんどくさい気もする。はー。Java 書きたくないなあ。

追記

結局 Scala のまま続けている。データサイズが小さいので Stream とかいらねーな、ということで早めに Scala のコレクションに変換して作業。やーこの手の雑だけどロジックが微妙に複雑みたいな作業には便利だね Scala。まあまあ速いし。でも世の中の雑用は I/O bound な上にロジックより手前の細々したところが複雑なことが多いせいで出番がすくなくて残念・・・。

あと書き捨てスクリプトとして使うのに SBT は大げさすぎなので pip や gem みたいにグローバルにライブラリをつっこむオプションもほしいところ。まあ探せばあるんだろうけれど。