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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  6. 01 |
    Kotlinの感触

    View full-size slide

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

    View full-size slide

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

    View full-size 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 full-size 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 full-size 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 full-size 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 full-size slide

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

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

    View full-size 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size 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 full-size 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 full-size 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide