Kotlin で DX がめちゃくちゃ改善されました

この記事は、Advent Calendar 2021 / Qiita主催「開発者体験:DXをめちゃくちゃ改善した話」 2日目の記事です。

はじめに

こんにちは。しゅん(@MxShun)です。

私は昨年アスクルに入社し、中小事業所向けサービス「ASKUL」と大企業向けサービス「SOLOEL ARENA」を統合することで売上1兆円企業をめざす取り組み「PJ Trylion(プロジェクト・トライオン)」でサーバサイド Kotlin を書き始めました。

今回の記事では、アスクルで Kotlin を書き始めて、DX、とりわけ開発者体験がめちゃくちゃ改善された話をしたいと思います。



対象読者

「これから Kotlin を味見しようとしている人」に向けた記事になります。

Kotlin って?

Kotlin は2011年頃 JetBrains 社より発表された、型推論のある静的型付けオブジェクト指向プログラミング言語です。

Android ネイティブアプリケーション開発言語の第一選択肢、また Better Java としても知られていますね。Kotlin(コトリン)という名前もかわいらしいです。Kotlin かわいい!

What is Kotlin all about? It’s a new programming language targeting the Java platform. Kotlin is concise, safe, pragmatic, and focused on interoperability with Java code. It can be used almost everywhere Java is used today: for server-side development, Android apps, and much more. Kotlin works great with all existing Java libraries and frameworks and runs with the same level of performance as Java.

Dmitry Jemerov and Svetlana Isakova, Kotlin in Action (Manning Publications, 2017) より引用。

なぜ Kotlin が選ばれたの?

アスクルのプロダクト、特筆してサーバサイドの多くに Kotlin が採用されています。

サーバサイド開発言語といえば Java や Ruby、PHP、Go などがイメージされますが、なぜ Kotlin がメイン言語として選ばれたのでしょうか。

Kotlin 導入に至った歴史を知るマネージャに話を聞いてみました!

アスクルで Kotlin を採用したのはいつごろですか?

2017年11月 Kotlin バージョンが1.2に上がったばかりの頃、Android が Kotlin を採用した年です。(参考 Android Announces Support for Kotlin)

アスクルで Kotlin を採用したのってどうしてですか?

新規アプリケーション開発時の技術選定にて「Kotlin って言語がよさそうなので使ってみよう!」というエンジニアメンバーからのボトムアップがきっかけです。

その当時作ろうとしていたのが社内向けの Web アプリケーションだったので、本番サービス影響も少なくマイクロサービスに作れることから「せっかくだし新しい技術に手を出してみよう!」ということで採用しました。

他の言語の選択肢もあったけど、社内に Java エンジニアが多かったため、Java から Kotlin への言語シフトのしやすさも多少加味しました。当時の技術部長(現 CTO )からも、2つ返事で OK もらえました。

Kotlin を採用してみて、会社・プロダクトとしてどうなったと思いますか?

会社としては「アスクルといったらサーバサイド Kotlin」と社外に向けていえるようになったこと。それまで特に注力している技術はなかったため、大きな武器ができたなと思います。

プロダクトとしては、品質のよいコードで保守性の高いプロダクトになったと思います。はじめは社内アプリケーション向けに Kotlin を使ったけど、今ではアスクルのアプリケーションの多くはサーバサイド Kotlin で作られていますね。過去には、とあるプロジェクトにて、Java から Kotlin に移行したところコード行数が半減しました。

1.3からは「Coroutine」という概念も出てきて、より高品質なプロダクトを作れるようになったと思います。

Kotlin はなにが嬉しいの?

ここからは、私個人が感じた Kotlin の素晴らしさを紹介します。なお、文脈上 Java と比較しています。

スマートに書ける

Kotlin は超スマートです。

まず、冒頭でも書いたとおり型推論ができます

val x = 1      // 整数型であることを明示的に示さなくてもコンパイラが文脈から判断します
val x: Int = 1 // 明示的に示すこともできます

近年はランタイム時の信頼性やパフォーマンス性の観点から静的型付け言語が好まれる傾向にありますね。しかし、静的型付け言語の弱点に型を常に宣言する必要がありコードが冗長になりがちという弱点があります。Java も例外ではありません。

これに対し、Kotlin は静的型付け言語でありながら、コンパイラがコードの文脈から型を推論できます。

開発者は冗長な型宣言をする必要がない。という訳です。Kotlinかわいい!

次に、Kotlin は Java のボイラープレートの多くを排除しています

data class Person(val name: String?) // String? は nullable な文字列を意味しています

上記は Kotlin の一般的なクラス宣言です。(参考 Data classes)

同じことを Java で書く(デコンパイルする)と次のようになります。*1

public final class Person {
   @Nullable
   private final String name;
   @Nullable
   public final String getName() {
      return this.name;
   }
   public Person(@Nullable String name) {
      this.name = name;
   }
   @Nullable
   public final String component1() {
      return this.name;
   }
   @NotNull
   public final Person copy(@Nullable String name) {
      return new Person(name);
   }
   @NotNull
   public String toString() {
      return "Person(name=" + this.name + ")";
   }
   public int hashCode() {
      String var10000 = this.name;
      return var10000 != null ? var10000.hashCode() : 0;
   }
   public boolean equals(@Nullable Object var1) {
      if (this != var1) {
         if (var1 instanceof Person) {
            Person var2 = (Person)var1;
            if (Intrinsics.areEqual(this.name, var2.name)) {
               return true;
            }
         }
         return false;
      } else {
         return true;
      }
   }
}

Kotlin のスマートさが一目瞭然かと思います。

開発者は、コンストラクタやアクセサなどの同じようなコードを書き回る必要がないということです。Kotlin かわいい!

最後に、Kotlin は比較的モダンなコード表現ができます

fun Person.hasName(): Boolean = name.isNullOrBlank().not() // Person クラスの拡張関数( Person クラス内で持つべきというつっこみはさておき。)

この後も紹介しますが、if・when 式や拡張関数、エルビス演算子など Swift やGoにも似たモダンな表現ができます。

モダンな表現のすべてがよいとは言いませんが、開発者として使う/使わないの選択ができることが素晴らしいと思います。Kotlin かわいい!

nullの取り回しが楽

Java がはらむ課題として、NullPointerException の多発がありますね。

Kotlin はコンパイル時にこれらを検査することで、ランタイム時の NullPointerException の発生を大幅に削減します。つまり、実行時ではなく実装の段階で NullPointerException の発生を開発者が容易に検知できるという訳です。

また、nullable なオブジェクトを扱う表現も豊富です。(参考 Null safety)

fun getLowerCaseName(): String = name?.lowercase() ?: throw IllegalArgumentException("name is null") // nullableなプロパティのセーフコールとエルビス演算子
fun getUpperCaseName(): String = if (name is String) {
  name.uppercase() // 型チェックによりifブロック内ではスマートキャストが効く
} else {
  throw IllegalArgumentException("name is null")
}

Java には Optional 型がありますが、扱いが煩雑になる印象があります。

NullPointerException を心配することなく、nullable なオブジェクトを楽に取り回すことができます。Kotlin かわいい!

IntelliJ IDEA(IDE)との親和性が高い

冒頭でも紹介しましたが、Kotlin は JetBrains 社が開発したプログラミング言語です。JetBrains 社といえば、統合開発環境「IntelliJ IDEA」ですね。

IntelliJ IDEA の Kotlin プラグインは言語と併行して開発されており、高機能なことに加え言語と親和性が高いです

Kotlin の哲学に相互運用性の重視がありますが、IntelliJ IDEA には Java コードをクリップボードから貼り付けると自動で Kotlin コードに変換する機能があります。

Java to Kotlin

Java エンジニアが Kotlin コードを実装するとき、プロダクトの実装コードを Java から Kotlin に乗り換えるとき、IntelliJ IDEA によってそのハードルが下がることでしょう。

また、IntelliJ IDEA には Kotlin のコードを簡易的・対話的に試すことができる「Kotlin REPL」が搭載されています。

REPL

さくっと Kotlin のコードを動かしたいときに便利です。

最後に、Kotlin とは直接関係ありませんが、IntelliJ IDEA 2021.1 で搭載された「Code With Me」を紹介します。

Code With Me は、IDE プロジェクトに他のユーザを招待し、リアルタイムに共同作業を行うことができる機能です。オンラインでのペアプログラミング、モブプログラミング、トレーニングにも役立てられるといえます。

Code With Me is a new collaborative coding and pair programming service. It makes it possible for you to invite others into your IDE project, and work on it together in real time.

JetBrain, Code With Me より引用。

Code With Me

これまで難しかったオンラインでのペアプログラミング、モブプログラミングがスムーズにできることに加え、実装やバグフィックスの相談を手軽にできそうな予感がします。

このように、高機能かつ親和性が高い統合開発環境との相互作用で、開発者はストレスレスでよりスムーズな開発ができるでしょう。Kotlin かわいい!

おわりに

アスクルで Kotlin を書き始めて、DX がめちゃくちゃ改善された話をしました。

今回は定性に寄った評価や意見ばかりでしたが、今後、実際のコード量や保守コストをトラッキングして定量的に Kotlin の素晴らしさを示せればと思います。 Kotlin で DX をさらに改善していきます。

最後にもう一度、Kotlin かわいい!

*1:一部省略しています。また、Java SE 14 のレコード・クラスLombokの利用はあえて無視しています。

ASKUL Engineering BLOG

2021 © ASKUL Corporation. All rights reserved.