• Twitter
  • Facebook
  • Google+
  • RSS

サーバサイド開発にKotlinを全面採用! ビヘイビア駆動開発(BDD)をマイクロサービスに導入するNewsPicksが求める開発者体験は?

サーバサイドでKotlinを全面的に採用したり、ビヘイビア駆動開発(BDD)を取り入れたりと、同時に複数のチャレンジに取り組んでいる株式会社ニューズピックス。そこには、開発体験(DX)の向上という大きな狙いがありました。

アーリーアダプタの草の根的な動きを大きな社内トレンドに 開発者体験の向上に向けたNewsPicksの取り組みとは

ソーシャル経済メディアNewsPicksを開発・運営する株式会社ニューズピックスは2021年9月、これまでサーバサイドの主要な開発言語としてきたJavaに代えて、Kotlinをメインに採用する方針を明らかにしました。

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

Androidアプリだけでなくサーバサイドも「Kotlinで開発できるようにする」というこの宣言の背景には、数年間にわたってマイクロサービスを中心にKotlinを採用してきた実績と知見の蓄積があるだけでなく、そういった現場からの挑戦をよしとするNewsPicksのエンジニア風土も大いに追い風となっています。

この挑戦をどのように進めようとしているのか? 開発者体験(DX)をどのように高めようとしているのか? NewsPicksのCTOを務める高山温さん(上写真右)、SREという立場からDX向上に取り組む武藤雅幸さん(同左)、そして社内のKotlinアーリーアダプタの1人として実際に課金サービスの実装に取り組んだ西山浩太郎さん(同中央)に伺いました。

※この記事は株式会社ニューズピックス、およびホールディングカンパニーである株式会社ユーザベースによるSponsoredContentです。

新旧の開発言語を混在させて徐々にモダン化を進める

── モバイル開発で立ち位置を確立したKotlinですが、サーバサイドでも存在感を増していると聞きます。開発言語として現在はどういった状況にあるのでしょう。

高山 Kotlinが誕生して、今年(2021年)10周年を迎えました。存在感を確立したきっかけは、やはり2014年ごろからAndroidアプリ開発の用途でJavaからKotlinへのシフトが一気に働いたことが大きかったように思います。

その後のKotlinは、広く一般に利用できる開発言語として進化してきました。NewsPicksでも実は、2017年くらいから既にサーバサイドで利用した事例があります。

NewsPicks におけるサーバーサイド Kotlin 活用事例 | by monzou | Medium

世の中を見渡してもそんな感じだと思いますが、4〜5年前のAndroidアプリと同じような形で「Javaもあるし、Kotlinもある。どっちを選んでもいいよ」と、サーバサイドでもJavaと共存しながら普通の選択肢の1つになってきたように思います。

── 既存のコードを完全に置き換えるのではなく、KotlinをJavaと共存させるんですね。

高山 はい。世の中的にもそういう流れがあります。例えばFacebookでも、PHPから自社開発したHackへの乗り換えを、まず一部だけでも書けるようにして徐々に徐々に進めてきました。iOSアプリのObjective-CからSwiftもそうですね。

武藤 TypeScriptもそうですよね。JavaScriptと共存して徐々に書き換えができる。

高山 アジャイルからの流れで、コードを「大きく一気に変更すべきではない」ということがソフトウェア開発の共通認識になっていると思います。動いているコードを動いた状態を保ったままリファクタリングして、どうやってよりよくしていくか? というこれまでの知見が業界に蓄積されているので、我々のように「少しずつKotlinに置き換えていく」という選択が取りやすくなっていますね。

武藤 大きなゴールにたどり着くまでの階段は、小さな段差をたくさん積み重ねるといいですよね。その方が転ばずにすみます。

高山 前述のように社内の先人が4年前からサーバサイドKotlinにチャレンジして、実体験を踏まえて「どんな問題があるのか?」という知見をためてきました。その歴史があるからこそ、「Kotlinにフルコミットしていこう!」と高らかに宣言できたのです。

高山 温(たかやま・あつし)edvakf
株式会社ニューズピックス 執行役員 CTO(Chief Technology Officer)
ピクシブ株式会社CTOを経て、2020年2月より現職。DX向上の施策設計を含め、技術戦略全体をディレクションするかたわら、レコメンドシステムの開発をリードする。

SREが主導してKotlinっぽい「コピペ元」を社内に展開

── 西山さんもそうした社内の先駆者の1人ですね?

西山 はい。一昨年からNewsPicks本体とは別に、Kotlinを使ってマイクロサービスを作ってきました。ですので今回の「ガンガン使っていくぞ」宣言には違和感がないというか、むしろ「書きやすくなるかな」と期待しています。

一方で、JavaとKotlinを両立させるためにうまく工夫していく必要があるなとも思います。

── 今回の取り組みではマイクロサービスに限らず、サービス本体でも新機能や改修でKotlinのソースファイルを追加できるようになったわけですよね。

武藤 NewsPicks本体のサーバはずっとJavaで書かれてきましたが、そろそろ古くなっています。ここに手を入れないと、今後の発展で足かせになる恐れが出てきました。

このままJavaを維持して発展させるか? それとも前例のあるKotlinを採用して、よりモダンな書き方、モダンな考え方で作っていくか? この2つの選択肢に直面して、発展を加速させる上でよりよい選択肢として、Kotlinを採用しました。

問題は、Javaで書かれていた部分と、新たにKotlinで書いた部分をどうつなげるかです。

高山 良くも悪くもJavaとKotlinは同居が可能で、JavaのコードベースにKotlinが入ってくるときには、書き方の違いで戸惑うときがあります。そこで武藤さんをはじめとするSREのメンバーが、「こういう場合には、こういうふうに書く」というテンプレートをまとめて、社内で共有しています。

僕は「優秀なコピペ元」と呼んでいるんですが、これを用意することで、みんなが迷うことなく「Kotlinではこう書くんだな」と分かる状況を目指しています。

武藤 Kotlinへの変換自体は、エディターを使えば機械的にできるのですが、そのままではあまりKotlinっぽくない書き方になってしまうので、修正が必要なんですね。

たくさんの人が関わるプロジェクトなので、あらかじめ「こういうふうにつなげましょう」と整理しておかないと混乱が起きかねません。そこで、SREで交通整理しています。

── そのタスクをSREが担うんですね。

武藤 SREのミッションとしてインフラだけではなく、NewsPicksにおいては「DXを向上させる」ことを幅広く実践しています。例えばコミットを見て、Kotlinで書かれたコードがあったら、必要に応じてコメントしたり、場合によってはリファクタリングしてプルリクエストを送ったりしています。

── レビュワーに指定されなくても、Kotlinのコードがコミットされたらチェックしているということでしょうか? 

武藤 DXを向上させるために必要なら何でもやるという感じです。Kotlinへの置き換えを推し進めて、開発全体をスムーズにさせることもSREのミッションなので。

高山 NewsPicksのSREのほとんどは、もともとアプリケーションエンジニアなので、伝統的に社内の基盤開発も担ってきた流れがあります。

西山 浩太郎(にしやま・こうたろう)
株式会社ニューズピックス ソフトウェアエンジニア
人材系のIT企業において新卒から2年間でサーバーサイドやクラウドインフラの構築を経験した後、2019年に入社。有料会員向けの機能開発やインフラ環境の構築、改善を担当。

BDDやSlackOpsの導入など新たな取り組みも進行中

── Kotlinだけでなくいろいろ面白い取り組みをされている中で、例えば決済機能のマイクロサービス開発で導入されたビヘイビア駆動開発(Behavior Driven Development、BDD)について教えてください。西山さんが開発者ブログを書かれていましたが。

KotlinではじめるBDD - Uzabase Tech

西山 NewsPicksではいくつかの新機能をマイクロサービスで開発しており、Kotlinもそこで先行して導入したのはお話しした通りですが、また別の文脈として、マイクロサービスのテストをどう進めるかについてずっと議論していました。

マイクロサービスである以上、そこで完結したテストをしたいと考えています。テスト用ライブラリをいろいろ探してみて、マイクロサービスと相性のいいCucumberを導入することにしました。BDDは、その流れで結果的に取り入れた形です。

── BDDではどのようにテストを進めるのでしょうか?

西山 最初に自然言語、私たちの場合ならば日本語で、システムの振る舞いを定義します。例えばタスク管理のAPIを開発するならば、「ログインしたユーザー名で『タスクA』というタスクを登録する。その結果、タスク一覧にタスクAが表示される」という具合です。

その後に、この自然言語で記述した内容であるログイン処理やAPIアクセスの処理を、コードとして実装し、テストします。このとき、自然言語で書いた内容がそのままテストになり、GitHubでプルリクエストが作成される単位で、自動的に動くようにしています。

── 決済サービスでBDDを導入することになった経緯やメリットを教えてください。

西山 それまでNewsPicksではテストを書く文化が歴史的にあまり強くなく、テストケースも「ユーザーAさんを作って、この月額プランに登録すると、1500円が引き落とされる」といった項目を一覧で管理していました。決済という性質上、テストをちゃんと実施しないと大変なことになってしまいますから、BDDを導入したことでプルリクエストを単位に自動で実行され、全部が動けば問題ないことが分かる仕組みにできてよかったです。

また、コードを変更しても挙動が変わらないことが担保できるというメリットも得られました。裏側の処理がどう変わっても、ユーザーから見える機能は何も変わらないことが担保できるので、リファクタリングしやすくなりましたね。

武藤 テストについては、関連してQAの組織を立ち上げようとしています。テストのカバレッジ率に関する目標をSREが主導して定め、重要だけれどテストが書かれていない既存のコードに対して、テストをどんどん書いていこうとしています。リファクタリングも加速できるし、仕様も整理できると考えています。

高山 西山さんのように開発手法やテスト手法に対する感度の高い人たちが加わってくれたおかげで、新しい取り組みも増えています。Kotlinの採用やテストの改善に限らず、これまで力業でやっていた部分を仕組みレベルで変えて、より良くしていくんだという動きがいくつもあります。

── 仕組みが改善されていると実感する取り組みは他にもありますか?

武藤 最近では、CMPという入稿システムのデプロイ方式を変更し、Slack上からコマンドでデプロイできるようにしました。CMPは歴史ある大きなサービスの1つで、以前は踏み台サーバにログインして、スクリプトを叩いて、という手順が必要でしたが、Slackでコマンドを入力するだけでデプロイできるようにできたんです。

ずっと携わってきたベテランのエンジニアにも、初めての実行で「めちゃくちゃ簡単でした」と言ってもらえて、うれしかったですね。別のプロジェクトからも「Slackでデプロイできるようにしたい」と相談を受けていて、SlackOpsの流れが広がっています。

高山 スマホアプリのアーキテクチャの変更や、Webフロントエンドの変更、GraphQLを採用してAPIを変更したり、開発環境を刷新したり、本当にいろいろな動きが進んでいます。年に3〜4件ずつは、そんな動きを起こし続けたいと思っています。

武藤 雅幸(むとう・まさゆき)masaedw
株式会社ニューズピックス ソフトウェアエンジニア
2018年に入社。主にSRE領域の業務にリーダーとして携わり、高速かつ安全な開発環境の構築に尽力する。

「やってもいいんだ! 挑戦してもいいんだ」となるように

── Kotlin化を宣言した2021年9月の開発者ブログに「1ヶ月程度経ち」とあるので、取材時点では3カ月ほど過ぎましたが(2021年11月取材)、社内の反応や行動はどうですか?

高山 社内への広まり方は本当に早かったと思います。社内に宣言したお盆あたりで、新しく追加されるJavaとKotlinのファイル数は2対1くらいでJavaメインだったんですが、直近1カ月ではKotlinの比率が6割くらいと逆転していて、大きく変化してます。

それにしても半年くらいやってきた感じがあるんですが、まだ3カ月なんですね。

武藤 個人的には、Kotlinにはシーケンスの処理が組み込まれているのがうれしいですね。書き味がまったく違いますし、処理効率も圧倒的に違います。分かりやすくて間違いも少なくなるので、新しいファイルだけKotlinにできるのなら、そうする人も多いでしょう。

高山 そういう意味では、間違いのない選択だったのかなと思います。先ほどもお話ししたようにJavaと共存する際のはまりどころを解消する知見もたまってきているので、これから新しく作るファイルはどんどんKotlinで書かれるだろうと考えています。

── 社内の雰囲気がスムーズに導入に向かったのはどうしてでしょう?

高山 西山さんや武藤さんたち社内のアーリーアダプタが試行錯誤して、知見をためてくれたおかげです。草の根の機運がこれだけあれば、あとは僕が発信すれば「自発的にみんなで変化を起こしていけるな。雪だるま式に転がり始めるな」と感じましたし、スタッフもみんな「やってもいいんだ! 挑戦してもいいんだ」という気持ちになってくれました。

これまでの遺産には敬意を表すべきですが、それだけでなく自ら試行錯誤し、技術を学んで自ら選択することで「自分たちの未来を、自分たちで決めていくんだ」と実感することが大切です。それでこそ、開発者としての体験がより良いものになっていくはずです。

── 社内の自主的な活動をうまく生かして全体の改善を進めるのは良いですね。

高山 これに限らず、NewsPicksではいろいろな物事がそのように進んでいます。達成したい目標は共有するけれども、やり方は皆さんに任せる。試行錯誤する中でテンプレートが決まってきたら、共通化していく。そんな感じです。

武藤 あるべき状態は共有して、どう実践するかは個人の裁量なんですよね。

高山 ユーザベースの「The 7 Values」にも「Be free & own it(自由主義で行こう)」とありますが、大切にしたいマインドにさえ向いていれば、個別の事象は自由にやってください、というやり方をとっています。

── それは高山さんのやり方でもあるんでしょうか?

高山 会社って、いろいろなスキルを持つ人たちで成り立っています。基盤技術に強い人もいれば、UXに強い人も、仕組みを作るのがうまい人もいる。そんなさまざまな強みが発揮されるように、価値を発揮できるようにしたいですね。

僕ができることは「こうしていきたいんだよ」と言うことくらいです。ただ、言い続けることは大事だと思っています。

── 今後も自主的な挑戦からの改善に期待しています。本日はありがとうございました。

リンク先では募集一覧を確認できます。すぐに転職を考えていなくても、副業やスカウトのために情報を登録できます。興味がある方は「Working at NewsPicks/Uzabase.」をクリック!

[SponsoredContent] 企画・制作:はてな
取材・構成:高橋 睦美
撮影:小野奈那子

関連記事 - NewsPicksの開発者体験

NewsPicks開発チームのDX(開発者体験)への取り組みについては、以前にもはてなニュースで記事を掲載しています。あわせてお読みください。