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

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

B5f0b0a84d9063dbe2cb2f1f6025f2f3?s=47 yy_yank
November 05, 2021

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

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

B5f0b0a84d9063dbe2cb2f1f6025f2f3?s=128

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

  2. 自己紹介 01 | 中表紙タイトル やんく(@yy_yank) 株式会社ユーザベースのプログラマ。 Product Team 所属。 FORCASの開発に関わっています。

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

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

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

    5 目次
  6. 01 | Kotlinの感触

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

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

  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 )
  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 )
  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
  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<String>) {} 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
  13. 13 ・その一方、KotlinはJavaを知らなくても書け る ・たとえば、SwiftとObjective-Cの関係 ・LLのように書けJavaの資産が使える Kotlinの感触 Javaを知らなくても書ける

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

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

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

    番外:Javaも進化している
  18. 02 | ユーザベースでのKotlin採用

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

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

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

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

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

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

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

    2など) ・DIが普通に使える ・Spring AOPやMockitoなどがサ クッと使える ・Annotation Processingが使える (Dagger、Doma 2など) 現在
  26. 26 ハマりどころがない 過去と現在 過去 Kotlinをサーバーサイドで使 えたものの、地味にハマりど ころがあった Kotlinをサーバーサイドで使うの にハマるところがなくなった 現在 ・過去は小さなハマりどころを把握している必要があった

    ・現在はハマりどころは無くなっている
  27. 27 ハマりどころがない 過去と現在 過去 Kotlinをサーバーサイドで使 えたものの、地味にハマりど ころがあった Kotlinをサーバーサイドで使うの にハマるところがなくなった 現在 多くの企業で採用されるということを考えると

    この、当然のように普通に使える現在の状態は大事だと思う
  28. 28 ・KotlinがJavaのエコシステムと共存しやすい ようになっている ハマりどころがない

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

  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の色々なアノテーションが自 然に使えるようになる
  31. 31 ハマりどころがない 例えばSpring Bootを使う Maven(pom.xml) <groupId>org.springframework.boot</groupId> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin>

    <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <configuration> <args><arg>-Xjsr305=strict</arg></args> <compilerPlugins><plugin>spring</plugin></compilerPlugins> </configuration> <dependencies> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-allopen</artifactId> <version>${kotlin.version}</version> </dependency> </dependencies> </plugin> </plugins> </build> </project> • kotlin-maven-allopenプラグイン ◦ 特定のアノテーションのついたクラ スやメソッドをopenする • springコンパイラ プラグイン ◦ Springの色々なアノテーションが自 然に使えるようになる
  32. 32 ハマりどころがない 例えばSpring Bootを使う Maven(pom.xml) <execution > <id>kapt</id> <goals> <goal>kapt</goal> </goals>

    <configuration > <sourceDirs > <sourceDir >src/main/kotlin </sourceDir > <sourceDir >src/main/java </sourceDir > </sourceDirs > <annotationProcessorPaths > <!-- Specify your annotation processors here. --> <annotationProcessorPath > <groupId>com.google.dagger </groupId> <artifactId >dagger-compiler </artifactId > <version>2.9</version> </annotationProcessorPath > </annotationProcessorPaths > </configuration > </execution > • kaptプラグイン ◦ Annotation Processingが使えるよ うになる
  33. 33 注意: 大体Spring Initializrが作ってくれたり、 サンプルが公式から提供されているので普段意 識することはありません!! ハマりどころがない 例えばSpring Bootを使う

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

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

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

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

  38. 38 - フロントエンド Angular/Dart, Vue/TypeScript... - バックエンド Kotlin, Clojure, Go,

    Rust, Elixir, Python... - インフラ Docker, Kubernetes - そのほか GCP, Jenkins, Buildkite... ユーザベースでの技術選択 採用技術
  39. 今は大体Clojureでプロジェクトを回してい て、Kotlinは今後SPEEDAの国内開発で使う 予定で、entrepediaではすでに使い始めて います。なのでJavaに関してはSPEEDAで昔 から残っている部分以外は、書くことがな くなる想定です。 最高のプロダクトを作る、最高のチームを(後編)2017/04/18 https://newspicks.com/news/2185954/body/ より 39

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

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

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

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

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