Upgrade to Pro — share decks privately, control downloads, hide ads and more …

サーバーサイドKotlinという選択肢とユーザベース

yy_yank
November 05, 2021

 サーバーサイドKotlinという選択肢とユーザベース

Server-Side Kotlin Lounge #1「サーバーサイドKotlinの現在地」 の発表資料です #SSKotlin_Lounge

yy_yank

November 05, 2021
Tweet

More Decks by yy_yank

Other Decks in Technology

Transcript

  1. サーバーサイドKotlinという選択肢
    とユーザベース
    2021/11/04
    Uzabase. Inc,
    Product Team
    yy_yank

    View Slide

  2. 自己紹介
    01 | 中表紙タイトル
    やんく(@yy_yank)
    株式会社ユーザベースのプログラマ。
    Product Team 所属。
    FORCASの開発に関わっています。
    Java, Kotlin, Goが好き。
    過去にKotlin in Actionという本の共同翻訳をしたりしまし
    た。
    2

    View Slide

  3. 3
    はじめに
    自分がFORCASというプロダクトに関わり、また、FORCAS以外のコード
    ベースやチームから見たり聞いたりした情報のお話をしようと思います。
    具体的には、Kotlinが社内でサーバーサイドでどのように使われているか。
    そして、サーバーサイドで使いやすいKotlinにはどんな特徴があるかなど
    僕の目線から見えているものをまとめた資料です。

    View Slide

  4. 4
    ・サーバーサイドでKotlinは普通に使える
    ・Javaを使っている企業は選択肢に全然入る
    ・新しい言語に抵抗ない企業にも、きっと選択
    肢になる
    伝えたいこと

    View Slide

  5. Kotlinの感触
    ユーザベースでのKotlin採用
    ハマりどころがない
    ユーザベースでの技術選択
    まとめ
    01
    02
    03
    04
    05
    5
    目次

    View Slide

  6. 01 |
    Kotlinの感触

    View Slide

  7. 7
    Kotlinの感触 過去と現在
    過去
    ・書きやすい! ・書きやすい!!!
    現在
    変わらぬ書きやすさ、分かりやすさ

    View Slide

  8. 8
    ・KotlinはJavaのバイトコードを吐く
    ・KotlinはJavaのボイラープレートを書かなく
    て済む
    ・KotlinとJavaには相互運用性がある
    Kotlinの感触 一般的な話

    View Slide

  9. 9
    Kotlinの感触 Kotlinのクラス
    Java
    public final class NormalClass {
    @NotNull private final String a;
    @NotNull public final String getA()
    {
    return this .a;
    }
    public NormalClass (@NotNull String
    a) {
    Intrinsics.checkNotNullParameter (a,
    "a");
    super ();
    this .a = a;
    }
    }
    Kotlin
    class NormalClass(
    val a : String
    )

    View Slide

  10. Java
    Kotlin
    10
    Kotlinの感触 Kotlinのデータクラス
    public final class DataClass {
    @NotNull private final String a;
    @NotNull public final String getA() {/*(略)*/}
    public DataClass(@NotNull String a) {/*(略)*/}
    @NotNull public final String
    component1(){/*(略)*/}
    @NotNull public final DataClass copy(@NotNull
    String a) {/*(略)*/}
    @NotNull public String toString() {/*(略)*/}
    public int hashCode() {/*(略)*/}
    public boolean equals(@Nullable Object var1)
    {/*(略)*/}
    }
    data class DataClass(
    val a : String
    )

    View Slide

  11. 11
    Kotlinの感触 KotlinのSealedクラス
    public abstract class Animal {
    private Animal() {
    }
    /*(略)*/
    public static final class Dog extends Animal
    {
    @NotNull public static final Animal.Dog
    INSTANCE;
    private Dog() {/*(略)*/}
    }
    public static final class Cat extends Animal
    {
    @NotNull public static final Animal.Cat
    INSTANCE;
    private Cat(){/*(略)*/}
    }
    }
    sealed class Animal {
    object Dog: Animal()
    object Cat: Animal()
    }
    Java
    Kotlin

    View Slide

  12. 12
    Kotlinの感触 Javaとの相互運用性
    public static void main(String[] args)
    {}
    @Override
    new KotlinHoge()
    public int a;
    private final transient int b;
    private volatile int c;
    public final synchronized void hoge() {}
    public final strictfp void piyo() {}
    public final void fuga() throws
    IOException {)
    @JvmStatic fun main(args: Array) {}
    override
    @file:JvmName ("KotlinHoge" )
    @JvmField var a : Int = 0
    @Transient val b : Int = 0
    @Volatile var c : Int = 0
    @Synchronized fun hoge(){}
    @Strictfp fun piyo(){}
    @Throws(IOException:: class) fun fuga(){}
    Java
    Kotlin

    View Slide

  13. 13
    ・その一方、KotlinはJavaを知らなくても書け

    ・たとえば、SwiftとObjective-Cの関係
    ・LLのように書けJavaの資産が使える
    Kotlinの感触 Javaを知らなくても書ける

    View Slide

  14. 14
    Kotlinの感触 LLのように書ける(?)
    Ruby
    [1,2,3].reduce(:+) # => 6
    [1,3,5].map{ |a| a+1 } # => [2, 4, 6]
    [1, 2, 3, 4, 5, 6, 7, 8].select {|item|
    item % 2 == 0 } # => [2, 4, 6, 8]
    Kotlin
    listOf(1, 2, 3).reduce{ acc, i -> acc + i }
    //=> 6
    listOf(1,3,5).map{ it+1 } // => [2, 4, 6]
    listOf(1, 2, 3, 4, 5, 6, 7, 8).filter {item
    -> item % 2 == 0 } // => [2, 4, 6, 8]

    View Slide

  15. 15
    ・JavaもKotlinもあまり業務で書いた経験は無
    かったですが、抵抗なくKotlinを書き始めるこ
    とが出来ました(FORCASのAさん)
    ・サーバーサイドでKotlinを使うことで特に
    困ったことがないです(FORCASのBさん)
    Kotlinの感触 社内の声

    View Slide

  16. 16
    番外:Javaも進化している 過去と現在
    過去
    ・switch文
    ・単純なクラスのみ
    ・switch式
    ・クラス、sealedクラス、recordク
    ラス
    現在

    View Slide

  17. 17
    ・最新のJavaももちろん進化している
    具体的には project amber https://openjdk.java.net/projects/amber/ のswitch式、
    record、sealedなど
    ・けど、Kotlinの方が柔軟な気がしている(個人
    の感想です)
    番外:Javaも進化している

    View Slide

  18. 02 |
    ユーザベースでのKotlin採用

    View Slide

  19. 19
    ユーザベースでのKotlin採用 過去と現在
    過去
    2016年頃に社内でKotlinを試
    し始めた
    約30ほどのAPIがサーバーサイド
    Kotlinで動いている
    現在
    ・2016年は試してみるかーという段階
    ・現在は当たり前に、普通に選ぶ選択肢の1つ

    View Slide

  20. 20
    ・社内で一番初めに使われ始めたのは2016年12
    月ぐらいらしい(社内用のWebアプリ)
    ・2017年ぐらいからはAPIなどプロダクション
    コードに採用されていった
    ユーザベースでのKotlin採用 Kotlinを採用したタイミング

    View Slide

  21. 21
    実際サーバーサイドKotlinは社内でどのぐらい使われてい
    る?
    ・リポジトリ数で20〜30ぐらい
    ・APIが30ぐらい
    ・その他、ツールやテストなど色々
    ユーザベースでのKotlin採用 使われ方

    View Slide

  22. 22
    実際サーバーサイドKotlinは社内でどのぐらい使われてい
    る?
    ・フレームワーク的なものだとSpring Bootが多く、Ktor、
    Fuel、JAX-RSなど
    ・DBライブラリだとJPA、JDBCTemplate、Doma2、Exposed
    など(きっと他にも色々ある)
    ユーザベースでのKotlin採用 使われ方

    View Slide

  23. 23
    ・Kotlinが得意な人が集まった会社かといえば
    そうではない
    ・しかし(多少のキャッチアップは必要だ
    が)、普通に皆Kotlinを書ける
    ・その理由として、Kotlinのハマりどころのな
    さがあると思います
    ユーザベースでのKotlin採用 使う人々

    View Slide

  24. 03 |
    ハマりどころがない

    View Slide

  25. 25
    ハマりどころがない 過去と現在
    過去(2014年ぐらい)
    ・DIが使いにくい
    ・Spring AOPやMockitoなどが
    サクッと使えない
    ・Annotation Processingが使え
    ない(Dagger、Doma 2など)
    ・DIが普通に使える
    ・Spring AOPやMockitoなどがサ
    クッと使える
    ・Annotation Processingが使える
    (Dagger、Doma 2など)
    現在

    View Slide

  26. 26
    ハマりどころがない 過去と現在
    過去
    Kotlinをサーバーサイドで使
    えたものの、地味にハマりど
    ころがあった
    Kotlinをサーバーサイドで使うの
    にハマるところがなくなった
    現在
    ・過去は小さなハマりどころを把握している必要があった
    ・現在はハマりどころは無くなっている

    View Slide

  27. 27
    ハマりどころがない 過去と現在
    過去
    Kotlinをサーバーサイドで使
    えたものの、地味にハマりど
    ころがあった
    Kotlinをサーバーサイドで使うの
    にハマるところがなくなった
    現在
    多くの企業で採用されるということを考えると
    この、当然のように普通に使える現在の状態は大事だと思う

    View Slide

  28. 28
    ・KotlinがJavaのエコシステムと共存しやすい
    ようになっている
    ハマりどころがない

    View Slide

  29. 29
    ハマりどころがない エコシステム
    Java
    Maven
    Kotlin

    View Slide

  30. 30
    ハマりどころがない 例えばSpring Bootを使う
    Gradle(build.gradle)
    classpath("org.jetbrains.kotlin:kot
    lin-allopen:${kotlinVersion}")
    }
    apply plugin: 'kotlin-kapt'
    apply plugin: 'kotlin-spring'
    ● allopenプラグイン
    ○ 特定のアノテーションのついたクラ
    スやメソッドをopenする
    ● kaptプラグイン
    ○ Annotation Processingが使えるよ
    うになる
    ● kotlin-springプラグイン
    ○ Springの色々なアノテーションが自
    然に使えるようになる

    View Slide

  31. 31
    ハマりどころがない 例えばSpring Bootを使う
    Maven(pom.xml)
    org.springframework.boot


    org.springframework.boot
    spring-boot-maven-plugin


    org.jetbrains.kotlin
    kotlin-maven-plugin

    -Xjsr305=strict
    spring



    org.jetbrains.kotlin
    kotlin-maven-allopen
    ${kotlin.version}






    ● kotlin-maven-allopenプラグイン
    ○ 特定のアノテーションのついたクラ
    スやメソッドをopenする
    ● springコンパイラ プラグイン
    ○ Springの色々なアノテーションが自
    然に使えるようになる

    View Slide

  32. 32
    ハマりどころがない 例えばSpring Bootを使う
    Maven(pom.xml)

    kapt

    kapt



    src/main/kotlin
    src/main/java




    com.google.dagger
    dagger-compiler
    2.9




    ● kaptプラグイン
    ○ Annotation Processingが使えるよ
    うになる

    View Slide

  33. 33
    注意:
    大体Spring Initializrが作ってくれたり、
    サンプルが公式から提供されているので普段意
    識することはありません!!
    ハマりどころがない 例えばSpring Bootを使う

    View Slide

  34. 34
    ・DI、AOP、Annotation Processing(JSR269)
    などのハマりどころがない(なくなった)
    ・ハマるのは大体がKotlin以外の部分
    ・手こずるとすれば、ググった内容がJavaだっ
    たりなど
    ハマりどころがない

    View Slide

  35. 04 |
    ユーザベースでの技術選択

    View Slide

  36. 36
    ・ユーザベースのプロダクト、コードベースは
    特に言語やフレームワーク使うライブラリは決
    まっていない
    ・各プロダクトのチームが自由と責任のもとに
    決める
    ユーザベースでの技術選択 社内での方針

    View Slide

  37. 37
    ・歴史的な経緯で社内にJavaのプロダクトコー
    ドも多く、Kotlin採用での親和性が高い
    ・Androidではなく、サーバーサイド
    ユーザベースでの技術選択 既存コード

    View Slide

  38. 38
    - フロントエンド
    Angular/Dart, Vue/TypeScript...
    - バックエンド
    Kotlin, Clojure, Go, Rust, Elixir, Python...
    - インフラ
    Docker, Kubernetes
    - そのほか
    GCP, Jenkins, Buildkite...
    ユーザベースでの技術選択 採用技術

    View Slide

  39. 今は大体Clojureでプロジェクトを回してい
    て、Kotlinは今後SPEEDAの国内開発で使う
    予定で、entrepediaではすでに使い始めて
    います。なのでJavaに関してはSPEEDAで昔
    から残っている部分以外は、書くことがな
    くなる想定です。
    最高のプロダクトを作る、最高のチームを(後編)2017/04/18
    https://newspicks.com/news/2185954/body/ より
    39

    View Slide

  40. Javaはずっとユーザベースの開発で取り組
    んできたので、Java以外の技術などを積極
    的に取り組みたいと考えています。もちろ
    ん生産性を高めるというのは大前提として
    あるんですけど、いろんな技術を取り込ん
    で、エンジニアの成長も高めつつ、組織と
    しても高めたいっていうのがありますね。
    最高のプロダクトを作る、最高のチームを(後編)2017/04/18
    https://newspicks.com/news/2185954/body/ より
    40

    View Slide

  41. 個人のプライベート時間で努力をする必要
    はあるかもしれないのですが、組織として
    考えた場合、開発をする組織自体がエンジ
    ニアを成長させることができる組織である
    べきだと思っています。ですので、業務時
    間の中でエンジニアのスキルを伸ばせるよ
    うな取り組みをやり続けていきたいんで
    す。
    最高のプロダクトを作る、最高のチームを(後編)2017/04/18
    https://newspicks.com/news/2185954/body/ より
    41

    View Slide

  42. 42
    まとめ Product Teamの現在
    ・今ではSPEEDA、INITIAL、MIMIR、
    FORCAS、FORCAS Salesなど多くのプロダクト
    のサーバーサイドでKotlinが使われている

    View Slide

  43. 43
    まとめ サーバー再度Kotlinにはハマりどころがない
    ・2021年現在、何もハマることなくサーバーサ
    イドでKotlinを使えるようになっている
    ・ユーザベースでは、安定して使える選択肢に
    なっている
    ・色んな企業にとっても、選択肢の1つになっ
    て欲しい

    View Slide

  44. 44
    サーバサイドでKotlin使っていきましょう
    Have a nice Kotlin!
    BTW we are hiring!

    View Slide