NewsPicksのサーバーサイド言語をJavaからKotlinに切り替えるために

NewsPicksでCTOをしている高山です。

NewsPicksではサーバーサイドの主要な開発言語としてJavaを利用してきましたが、今後Kotlinをメインにしていくことを目指して取り組みを始めました。

今回はその背景や取り組み内容を紹介します。

NewsPicksとKotlin

2013年から開発されているNewsPicksではJava+Springという技術スタックのモノリス(通称NewsPicks本体)がシステムの中心ですが、マイクロサービスやサテライトサービスにおいては2017年からKotlinを利用してきました。

そしてついに、2021年の8月にNewsPicks本体においてもKotlinでコードを書けるようにしました。

まずはこれまでのNewsPicksのサーバーサイドKotlin利用を挙げてみます。

NewsPicks Academia

2017年に作られた社内のサーバーサイドKotlin第一事例です。

このサーバーサイドを当時1人で開発した文字(もんじ - 現在はNewsPicksの取締役Chief Product Officer)のブログ記事が出ています。

medium.com

一方でこのようなマイクロサービスの実装言語に関しては決め手に欠ける印象を持っていました。Java は安定しておりエコシステムも十分に発達していますが、如何せん冗長であることは否定できない短所です。この点に関しては Java 8 と Lombok の採用により多少改善しており、特別大きな不満があるわけではないものの、果たしてこのまま Java を使い続けるのかと問われると、ややモヤっとするというのが正直な気持ちでした。これまで Java でサービスを運用してきている組織/メンバーのナレッジは活かしつつ、もう少し書きやすくモダンな言語機能を持つプログラミング言語 、「Better Java」となる言語は無いものか — —そう思っていたところに登場したのが Kotlin でした。

まさにこのモチベーションが今も継続しています。

検索基盤

2018年に作られたNewsPicksの検索基盤です。NewsPicksの検索はElasticsearchを利用して作られていますが、その検索リクエストやインデックス化リクエストを処理するためのマイクロサービスです。

元々は検索に関するコードはモノリスの中にあったようですが、ジョブキューがあったりバッチ処理があったりして、ここだけでそれなりの規模になっていたためKotlinで書き直されたようです。

現在は僕のチームで開発しています。(開発したい人はぜひご連絡を!)

JobPicks

2020年にリリースされたNewsPicksの姉妹サービスです。

tech.uzabase.com

課金基盤

こちらも2020年にリリースされたNewsPicksのマイクロサービスです。

元々課金にまつわる処理が継ぎ足しで作られてきたので、ドメインロジックを抽出してゼロから設計し直してマイクロサービスに切り出したものになります。

クレジットカード、Apple、Googleの課金を抽象化するためのレイヤーです。

フィード(レコメンド)

2020年に刷新されたNewsPicksのトップページ(通称フィード)に関するマイクロサービスです。

レコメンドエンジンの部分はPythonで書かれていますが、ユーザーのリクエストを受ける部分や、いくつかのLambdaについてはKotlin+Micronautで作っています。

直近の取り組み

NewsPicks本体においては、Javaのソースと同じ src/main/javasrc/test/java にKotlinファイルも置けるように設定しました。コンパイラの設定を追加したぐらいで、特に問題なく利用できたのが印象的です。

1ヶ月程度経ちましたが、26ファイルがKotlinで書かれ、3分の1がテストコードだったようです。

新しいファイルはKotlinで書くという人が早くも多数派になったような印象です。

Kotlin知見共有会

社内でKotlin知見共有会というゆる〜い勉強会も始めました。

このような取り組みをするには、アーリーアダプターがアーリーマジョリティを置き去りにせず巻き込んでいくことで推進が加速すると思っています。

どんどん知見を共有してくれるアーリーアダプターは賞賛し、かといって初心者の質問も歓迎するような温かい雰囲気を目指して2週間に1回ぐらいのペースで開催しています。

会のルール

  • 社内のKotlin使いこなし力アップを目的とする
  • 資料は簡素でOK。もちろんガッツリ作ってもOK
    • プルリクを見せながらとか、公開されてる資料を見ながらでもOK
    • 発表準備に疲弊するぐらいなら、より持続することを優先したい
  • 初心者を排除しない
  • 繰り返しの質問も歓迎しよう
  • 良い知見をもたらしてくれる人には最大限の賞賛を

これまで知見共有されたネタは例えばこちらなどがあります。

speakerdeck.com

qiita.com

Server-Side Kotlin Study #2

再来週の9月22日にはServer-Side Kotlin Study #2というイベントがあり、NewsPicksでも協賛 & 登壇しますので、様子が知りたい方はぜひご参加ください!

server-sider-kotlin.connpass.com

今後の展望

今年中には新しく作られるファイルはJavaからKotlinに完全に切り替わり、来年からは積極的に書き換えもしていく予定です。とはいえ全部を書き換えるということにはならないでしょう。そのようなやり方を選択できるところがJava→Kotlinの良いところだと思います。

また、昨今ではJavaもかなりモダンになっており、待っていればどんどん便利になっていくんじゃないかというもっともな意見もあります。しかし、だからこそKotlinはさらに高速でモダンになっていくことを運命づけられた言語であると考えて、そんな変化を楽しむことを選択しました。

ちょうど最近公開したプロダクト開発組織のテックビジョンにも、「ワクワクしながら不確実性に飛び込む」といった節もあります。ビジョンを掲げるだけでなく、文化にするためにも、Kotlin化はNewsPicksにとって合理的な選択といえるはずです。

f:id:edvakf:20210910172551p:plain

tech.uzabase.com

© Uzabase, Inc. All rights reserved.