KotlinでB+Treeを実装してみた-初めてのデータベース実装
ふと思い立って 1 ヶ月程で Kotlin を使って B+Tree の単純な実装をしてました。一区切りついたのでコードを晒しつつ、英語でブログを書きました。
I just published Learned about database by implementing B+Tree in Kotlin https://t.co/nTXq12LF2b
— Ryosuke Iwanaga (@riywo) April 1, 2019
あとは、例によって落ち穂拾い。
InnoDB は情報が豊富にあるので題材としてよかった
SQLite や他にも参考にする候補はあったのですが、いずれもコードを読む時間は取りたくなかった(コードを書くことが目的な)ので、資料やブログが豊富にある InnoDB を題材にしたのは正解でした。
Kotlin は想像通り良かった
僕は今のところ Swift が一番好きな言語なんですが、言語仕様的にもコンセプト的にもよく似ている Kotlin は一度やっておきたかったので、よい経験になりました。事前の感覚通り、ほぼほぼ自分が書きたいイメージのままに書けるので気持ちよかったです。
Java => JVM <= Kotlin と、Objective-C => LLVM <= Swift がいい感じのアナロジーな気がするなぁ。
— Ryosuke Iwanaga (@riywo) March 31, 2019
Java のライブラリを自然に扱えるのはとても大きい利点ですね。Extension や Protocol まわりは Swift の方が僕の好みなのでちょっとやりづらさを感じましたが(特に既存の Java クラスの拡張)、Elvis operator はとってもいいなと思いました。Delegated properties は文字列ベースになるのがちょっと気持ち悪いけど、まずまず。
Gradle + Kotlin DSL もまぁまぁ良かった
今まで Maven しか触ったことなかったのですが、新規なのでいきなり Gradle + Kotlin DSL に突撃してみました。動き始めるまでに半日くらいかかった感覚ですが、一度動いてしまえばpom.xml
よりはよっぽど見通しのよいコードになるのでよいですね。
Kotlin DSL はまだ浸透しきっていないので、コピペしようとすると文法エラーでひっかかることが多々あったのがちょっとアレでしたが、全てを Kotlin でできるのはよい。
Apache Avro がとても良かった
今まで触る機会が全くなかったのですが、データを扱うケースにおいてとてもいい感じのフォーマットだなと思いました。Protocol buffer はどちらかというと RPC が中心ですが、Avro は RPC もあるものの中心はデータの取り扱いなので、今回のようにデータを行単位で読み書きしたいケースにはぴったりでした。ちなみに、巷では Apache Kafka での利用が最大勢力ですかね。
コード生成するパターンも動的にスキーマを読み込むパターンもどちらも対応してるし、固定長バイトもあるし、バイナリのままソートできるし、色々と便利です。今回は使ってないですが、スキーマの進化にも対応できるし、利用用途は夢が広がります。今回はちょうど JVM 言語だったので Java API もそのまま使えてそれも良かった。ただ、コード生成すると deprecated な property がまだ利用可能なままなので、Kotlin が自動で getter/setter から property 生成してくれる機能が使えなくてちょっとしょぼかったです。
まとめ
ちょうど社会人になって 10 年経ったところでしたが、10 年前はプログラムを書くなんてほぼできないに等しかった人間がここまでなれたのかぁとしみじみしていたところでした。
働き始めてからようやく10年経った。飯を食えるだけの手に職をつけるのと、日本を脱出することだけで終わってしまい、自分のやりたいことは後回しにしてきた10年だった。次の10年はもう少しやりたいことを重視したいな。
— Ryosuke Iwanaga (@riywo) April 1, 2019