エンジニアHubPowered by エン転職

若手Webエンジニアのための情報メディア

「Kotlinで書くとJavaには戻れない」Androidアプリ開発にKotlinを導入したヤフーが感じたメリット

GoogleがAndroidアプリの開発言語に選定したことで「Kotlin」の注目度が高まっています。展開しているAndroidアプリの半数以上でKotlinを導入しているというヤフー株式会社に、Kotlinの魅力を伺いました。

Androidアプリを作るならJavaではなくKotlinを使った方がいい」という声をよく聞くようになってきました。Kotlinは2011年に発表された言語。2017年にGoogleがKotlinをAndroidアプリの開発言語に選定したことがきっかけで、近年導入する企業が増加しています。

その中の一つが、ヤフー株式会社です。現在ヤフーでは、展開しているAndroidアプリの半数以上でKotlinを導入。特に「Yahoo!ニュース」のAndroid版では、多くの画面でKotlinを利用しています。

Javaよりも自由に書くことができ、型変数の推論や高階関数(クロージャ)⁠、拡張関数などを備えたKotlin。モダンな言語でありながらJavaとの互換性も非常に高い言語として知られていますが、ヤフーのようなエンジニアが数千人いる大企業で、どのようにJavaからKotlinへの移行を進めていったのでしょうか。Kotlinの魅力や、新しい技術をどう導入していったのかなど、移行の裏側を伺いました。

森 洋之(もり・ひろゆき/@moridroid)(写真左)
ヤフオク!開発本部のアプリ開発部に所属。入社以来Androidのアプリ開発に関わっており、ヤフー社内で、ある分野に突出した知識とスキルを持つ第一人者にだけ任命される「黒帯」にも選ばれている。社内はもちろん、外部での講演も多数行っている。
樫村実紅(かしむら・みく/@k_miku)(写真中央)
2013年に新卒で入社後、ニュース・スポーツ事業本部開発部に配属され「Yahoo!ニュース」のAndroidアプリをリリースから担当。Yahoo!ニュースのJavaからKotlinの移行の際は、数千行のコードをメイン開発担当としてリファクタリングした。
池田 惇(いけだ・じゅん/@jun_ikd)(写真右)
Yahoo!ニュースAndroidアプリ開発チームリーダー。2011年に新卒でヤフーに入社。映像配信サービス「GYAO!」や「Yahoo!ニュース」のiOS・Androidアプリ開発を行い、PMや開発チームリーダーを経験。3年ほど前からKotlinに注目しており、社内でいち早く導入した人物。

Kotlinでコードを書くと、Javaには戻れない

――Yahoo!ニュースやYahoo!カレンダーなどのアプリで、JavaからKotlinに移行しているとお聞きしました。現在、ヤフーではどれくらいのAndroidアプリでKotlinを導入しているのでしょうか?

現在、Google Playで公開しているアプリは38個で、そのうち20個にKotlinを導入しています。また、ヤフーには技術的に推奨する言語などを定めた「スタンダード(開発標準)」という制度があり、そこにKotlinも入っています。

――すでにかなり数のアプリがKotlinを導入しているんですね。導入はいつ頃から始まったのでしょうか?

:ヤフー全体としては、AndroidにKotlinが公式採用されてからなので、2017年以降ですね。ただ、その前からイベントを開いたり、少人数でセッションしたりする動きはありました。池田もかなり前から導入していたみたいで。

池田:GYAO!を担当していたころに、少しだけKotlinを導入しました。おそらくヤフーでは、一番最初にKotlinを導入して世に出したサービスだと思います。「一番初めに導入した」と後で言えればいいな……と思って(笑)

いち早く導入できたのは、僕がいたGYAO!チームが技術をある程度自由に選択しやすい環境だったのも大きいですね。ただ、KotlinがAndroidに公式採用される前にヤフー社内に広まらなかったのは、仕方のないことだとも思っています。オフィシャルじゃない言語に抵抗があるのは当たり前で、せっかく学んでも廃れてくリスクだってありますし。やっぱり公式に採用されているかどうかで、安心感が違いますから。

――GYAO!はもともとJavaで作られていたんですよね。どういう流れでKotlinへ移行していったのでしょうか?

池田:GYAO!でKotlinを導入したタイミングは全部で2回ほどです。最初は先ほども話した3年ほど前。ただ、初めての導入ということで試しに数行書いたくらいで、「機能」と呼べるものを作ったわけではありませんでした。

本格的に導入したのは2017年1月からです。新機能の画面を2つほど作る際に、Javaだとうまく設計できなくて「Kotlinならうまくいくんじゃないか?」と思い、もう一度Kotlinをちゃんと導入してみることにしました。開発期間が1〜2週間ほどと規模が小さく、失敗しても巻き返せるものだったので。

――そこからヤフー全体に広まるまで、どのように働きかけていったのでしょう。

:うーん。実は社内でスタンダードになってからも、強制的に「Kotlinを使いなさい」というような働きかけは特にしていません。ヤフーには数千人のエンジニアがいて、サービスの内容も多岐にわたるので技術を強制するのはあまりよくないんです。大切なのは「ユーザーに価値を提供できるかどうか」であり、使うかどうかは各サービスによって決めるのがいいと考えています。技術を移行するためだけのプロジェクトは避けるべきかなと。ただ、Kotlinを使うとJavaが書きたくなくなるエンジニアが多いのか、自然に広まった感じですね(笑)

――「Javaが書きたくなくなる」というのは驚きです。それほどKotlinが書きやすいんですね。では、これからまったく新しいアプリを作るときもJavaではなく、Kotlinを採用しますか?

:逆に、これから新しいアプリを開発するときに、Kotlinを選ばない意味が分からないくらいです(笑)。それほどKotlinの書きやすさを実感しています。現在は外部のAndroidアプリ勉強会に参加すると、発表時のスライドに掲載されている例題コードがほとんどKotlinで書かれていたりします。

シンプルに書きやすいというのは大事なことで、コードレビューなどがしやすいという利点にもつながりますから。

――それほどまでにKotlinの良さを体感している、と……! 森さんと樫村さんはAndroidに正式採用された頃からKotlinを触り始めたと伺っているのですが、使い始めた最初の印象を教えてください。

:私はもともとSwiftを触っていて、Kotlinは文法がSwiftに似ていることもあり、特に違和感なく使い始めることができました。勉強した記憶もほとんどないですね……。

樫村:私はずっとJavaで開発をしていて、モダンな言語に触れるのはKotlinが初めてでした。触ってみるとJavaで歯がゆかった部分がキレイに書けることが分かり、すぐに使いやすい言語だなと感じました。例えば、Javaだとファイルを分けて書かないといけないことが多くて、どうしても冗長になってしまうときがあるけど、Kotlinだと1つのファイルで書くことができたり。一度Kotlinを触ると、もうJavaには戻れません(笑)

――書きやすさ以外にKotlinを導入してよかったメリットはありますか?

:そうですね、例えばヤフオク!のAndroidアプリではクラッシュ率が目に見えて減っています。もともとクラッシュ率が高かったわけではないのですが、Kotlin導入前の3分の1ほどに減りました。

あとは、Kotlinで書くと値が変わらないイミュータブルな宣言で変数を書けるので、Nullではないことがすぐに分かる点もメリットですね。値が変わらないことが分かっているのは、安全性を保つためにも大事だと思います。

Yahoo!ニュースアプリは、Javaからの移行で数千行のコードを減らした

――池田さんと樫村さんは、Javaメインで書かれていたAndroid版Yahoo!ニュースを、Kotlinメインでリニューアルしたと伺いました。どうやってKotlinに移行していったのでしょうか。

池田:最初は新規の機能を作るタイミングや新しいクラスの作成時に、少しずつKotlinを使用し始めました。その後、Androidアプリのメイン画面をリニューアルする際に、設計のリファクタリングをする計画があり、そのタイミングで大部分をKotlinに差し替えていきました。あくまでユーザーに届ける機能開発のために書き換えただけで「Kotlinに移行するためだけの作業」というのはほとんどしていません

設計変更の結果、開発速度が上がりましたし、コードを数千行ほどリファクタリングすることができました。その数千行のリファクタリングはほとんど樫村が担当しました。Yahoo!ニュースに関しては、僕たち2人だけでAndroidアプリの開発をやっているので。

――1人で数千行も! コードの移行で苦労した点があれば教えてください。

樫村:実は、それほど苦労した部分はありませんでした。強いて挙げるとすれば、既存のJavaライブラリと密接に関わっている部分は、やりにくいですね。今回は大きな設計変更での改修だったので、そういった古いライブラリを考慮する大変さはありましたが、Kotlin自体に苦労した部分というのは、やはりあまりないと思います。書き方に慣れてからは、JavaよりもKotlinの方が楽なくらいでした。

――なるほど。ではJavaメインだった頃と、Kotlinメインになった今、新規の機能開発の工数はどれくらい違いますか?

樫村:設計を変えたため開発スピード自体変化したという点も大きいですが、Javaだと1週間かかっていた機能追加が、Kotlin移行後は2〜3日でできるようになりました

――工数が半分以下に減ってるんですね……! Android版Yahoo!ニュースではまだJavaを使っている部分もあるかと思いますが、今後Kotlinへ完全移行する予定はあるのでしょうか?

樫村:正直、現時点ではそれはなかなか難しいと思います。もし実現するとなると、フルリニューアルするタイミングになるのかなと。

池田:先ほども話したように、僕らはユーザーに新機能を届けるためにKotlinを使用しましたが、JavaからKotlinへの移行だけを目的に開発することはありません。それは森が話していた「技術を強制しない」という点とも共通してくることかなと。私はKotlinでコードを書くこと自体が楽しいと感じます。だから、開発していると自然にKotlinのコードが多くなっていくんじゃないかなとは思います。

――「移行ありきの開発」はせず、あくまで「必要な部分に必要なだけ導入していく」ということですね。すでにAndroid版Yahoo!ニュースの多くの画面をKotlinで書いているとのことですが、じっくり使ってみて感じたメリットはありますか?

池田:Kotlin導入後、Androidアプリに複数の新機能を追加しているのにもかかわらず、コード量がほとんど増えていない点ですね。冗長なコードが減っている何よりもの証拠だと思います。

樫村:Android版Yahoo!ニュースはクラッシュしないことを重視して実装していたため、Nullチェックなどでコードが冗長になっていました。本質と違うところで工数がかかっていたんです。しかし、Kotlinにしたことで「コードのためのコード」を減らすことができ、プロジェクトの本質的な部分に集中できるようになりました

池田:あとは少し個人的な話になりますが、Kotlinをじっくり学んだことで自分自身がスキルアップしたとも感じています。1年前より開発スピードがあがりましたし、出せるものの品質も向上していると思います。

JavaからKotlinへの移行デメリットは「ほぼない」

―― JavaからKotlinへの移行はストレスが少ないということですが、「いち言語」として気に入っている部分はありますか?

データクラスが便利ですね。JavaでPlain Old Java Object(POJO)を作ったとき、getterやsetterを書くと思うのですが、Kotlinだとデータクラスで簡単に書ける。equalsメソッドなどもプロパティから自動生成してくれます。Javaでプロパティが多いときにequalsメソッドをオーバライドするとなると辛いですから……。

樫村:私は引数に初期値を設定できる点が便利だと感じています。おかげで以前よりテストが書きやすくなりました。

JavaだとDependency Injection(DI)したい場合、フレームワークやアノテーションを入れる必要があります。でもKotlinならそのようなDIコンテナの仕組みを導入していないシステムでも、引数の初期値を書けばDI的なことがしやすくなります。引数違いで同じメソッドを大量につくらなくて済むのもメリットですね。

池田:僕はもともとモバイルアプリのアーキテクチャを考えるのが好きで、特にメンテナンスしやすい設計がどういうものかという点について学んでいます。その視点から見てもKotlinはコードを簡潔に書けるので、読み手がそういった設計を理解しやすくなるのも利点だと思っています。

読みやすいということは同時にメンテナンスもしやすいということなので、開発において大きなメリットがあると感じています。

樫村:あとはAndroidではViewに対応するクラスが必要になる場面があり、JavaだとViewの種類が増えるほど大量の細かなファイルを作る必要がありました。Kotlinだと、それらを一つのファイルで書けるのが楽で助かります。

:入れ子になっているクラスを別々のファイルに書く必要がないのはいいですよね。

池田:そういった使いやすさから、Kotlinだと人間の読みやすさに合わせた開発ができると感じています。

――言語としても気に入っている点が多いんですね。最近ではサーバサイドでKotlinが使われることが多くなってきましたが、ヤフーでもそういった事例はあるのでしょうか?

:Yahoo!カレンダーなどのいくつかのサービスで使用されています。サーバサイドとして社内のスタンダードに選定されているわけではないので、まだまだこれからという印象ですが、個人的には、どんどんサーバサイドにKotlinを導入していきたいと思っています。

池田:業務としてサーバサイドに導入したことはまだありませんが、個人的にBotを作ったときに使用したことがあって、非常に使いやすかったですね。その際はJavaのSpring Frameworkと一緒に使ったのですが、ほとんど問題なくスムーズに開発できました。

樫村:Yahoo!ニュースでも、サーバサイドにJavaではなくKotlinを採用するかどうか話題に上がるときがあります。しかし、サーバサイドだと最新のJavaが使えますし、Androidほど切羽詰まっている状況ではないので、導入はまだしないと思いますね。

――Kotlinのメリットをたくさん伺ってきましたが、一方で「コンパイルが遅い」という話をきいたことがあります。触っていて実感したことはありますか?

:一般的に、アノテーションプロセッサを使った場合は遅いと言われることもあるようですね。ただ個人的にはまったく感じません。

樫村:私もほとんど感じたことはありません。

――「Kotlinは自由に書けすぎる」という面もあるかと思いますが、それによるデメリットはあると感じますか?

:それも、チーム内でお互いにコードを確認しながら開発すれば心配ないと思いますよ。ヤフオク!の開発では、普段からペアプロで行っているので、新しい言語を導入する際も教え合いながらコードを書いています。

池田:Android版Yahoo!ニュースのリニューアルでは、先ほども話したように「プロジェクトにただKotlinを入れる」というわけではなく「Kotlin導入に合わせて設計の大きなリファクタリングもする」という方針だったので、合わせてチームでコードのガイドラインについて決定しました。そのときの話し合いのおかげで、ある程度はキレイなコードを書けていると思います。

――お話しを聞けば聞くほど、JavaからKotlinへの移行にデメリットがないような印象を受けるのですが、逆にJavaでアプリを開発するメリットはどのあたりにあると思いますか?

樫村:そうですね……。困ったときの資料の豊富さ、でしょうか。Stack Overflowで事例を調べると過去のナレッジの量が多いですし。ただ知りたい回答がJavaで書かれている場合は、自分でKotlinに書き直すこともあります。

池田:JavaのコードをAndroid StudioにコピペするとKotlinに書き直してくれるという機能もあるので、そのあたりも特に問題にならないと思います。

:あえて挙げるなら、採用などだとまだJavaの方がエンジニアが集まりやすいという現状はあります。ただJavaしか触ったことがないエンジニアでも、Kotlinならすぐに使えるようになるので、そこまでネックにはならないと思います。ヤフー自体も、Kotlinでの採用が増えてきていると聞いています。

Kotlinは、今後さらに広まっていくだろう

――今日お話を伺って、Androidアプリ開発の世界ではこれからますますKotlinへの移行が進んでいきそうだと感じたのですがが、そうなるとJavaが廃れていく、ということもあるのでしょうか?

:さすがに、それはないと思います(笑)。もしかするとAndroidアプリ開発に関しては使われなくなっていく可能性があるかもしれませんが、サーバサイドに関して言えば、ないかなと。

池田:個人的にはサーバサイドでもJavaではなくKotlinを選ぶと思いますが、だからといってJavaという言語自体が衰退していくかどうかは、Kotlinの優位性とはまた別の話なのかなと思います。

―― なるほど。では、他の企業のエンジニアに「Kotlinの導入を検討している」と相談されたらどう答えますか?

:Androidアプリを開発するのであれば、間違いなく勧めます。先ほど「ヤフーでKotlinが使えるエンジニアの採用が増えている」と話しましたが、「KotlinConf」という技術カンファレンスでも、「Kotlinを使っている企業は採用面で有利」だという発表がありました。それほど、Kotlinで開発したいエンジニアが増えている。採用側も、Kotlinを使いたいという意志のあるエンジニアの方がチャレンジ精神があって一緒に働きたいと感じると思いますし。そういった面でも、これからいろんな企業がどんどんKotlinを導入してくのではないかなと感じています

――最後に、これからKotlinでやっていきたいことがあれば教えてください。

:先ほども触れましたが、サーバサイドもKotlinにしていきたいです。マルチプラットフォームも視野に入れると、APIのプロパティがNullなのかどうかという点はドキュメントベースだと信頼できるか不安になります。そもそもKotlinならコンパイルが通らなくなるため、サーバサイドも安全になりますし。

樫村:サービスに関わるエンジニアとして、Kotlinを含めもっとさまざまな知識を深めてプロダクトに貢献していきたいですねAndroid Jetpackなどの導入もしていきたいと思っています。

池田:Kotlinは柔軟な書き方ができるので、いろんなアーキテクチャを学んで身につけて、きちんと使えるようになりたいです。アーキテクチャはこれが一番優れている、とかはないと思うので、サービスに合わせて柔軟に設計していけるように、Kotlinを生かして学んでいきたいと思います。

関連記事

取材:megaya megayaのブログ

【修正履歴】初出時、記事内に一部脱字がありました。ご指摘ありがとうございました。(2018年12月10日15時15分)