KotlinでB+Treeを実装してみた-初めてのデータベース実装

ふと思い立って1ヶ月程でKotlinを使ってB+Treeの単純な実装をしてました。一区切りついたのでコードを晒しつつ、英語でブログを書きました。

あとは、例によって落ち穂拾い。

InnoDBは情報が豊富にあるので題材としてよかった

SQLiteや他にも参考にする候補はあったのですが、いずれもコードを読む時間は取りたくなかった(コードを書くことが目的な)ので、資料やブログが豊富にあるInnoDBを題材にしたのは正解でした。

Kotlinは想像通り良かった

僕は今のところSwiftが一番好きな言語なんですが、言語仕様的にもコンセプト的にもよく似ているKotlinは一度やっておきたかったので、よい経験になりました。事前の感覚通り、ほぼほぼ自分が書きたいイメージのままに書けるので気持ちよかったです。

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年前はプログラムを書くなんてほぼできないに等しかった人間がここまでなれたのかぁとしみじみしていたところでした。

riywo

Software Engineer, DevOps, DBA, Solutions Architect, NFL, working for AWS. All posts are my own, not endorsed by any org.