KotlinConfと.droidconSF振り返り

  • このエントリーをはてなブックマークに追加

Yahoo! JAPAN Tech Advent Calendar 2017の4日目の記事です。一覧はこちら

こんにちは。1年ぶりに記事を書きます。Androidエンジニアの森です。
ヤフオク! アプリの開発を行うかたわら、ヤフーの黒帯制度にてAndroidの黒帯としても活動しています。
11月2日からサンフランシスコで行われたKotlinConfと、同月5日から行われた.droidconSFに、社内のトップカンファレンス参加支援制度を利用して参加しました。
関係しているようで対照的だったこの2つのイベントについて、振り返ってみたいと思います。

KotlinConfとは

KotlinConfは、Kotlinにとって初めての公式グローバルカンファレンスです。
Kotlinは2011年にJetBrainsから発表されたプログラミング言語で、2012年にオープンソースとなってからは、多くの開発者たちとともに開発が進められてきました。JVM(Java Virtual Machine)上で動作し、その簡潔さや安全性、Javaとの高い相互運用性から、急速に利用者が増えてきています。特に、今年5月に行われたGoogle I/Oで、Androidの公式開発言語としての採用が発表されてからは、その勢いに拍車がかかりました。
まさにいま注目があつまっているKotlinのイベントですし、社内でもKotlinの導入を進めているところですので、良い機会だと思い参加を決めました。

会場について

KotlinConfは、Pier27というサンフランシスコの埠頭で行われました。豪華客船が停泊することもある埠頭だけあって、広く開放感のある会場で、1200枚のチケットが完売しても移動に困ることはありませんでした。
会場ではスポンサー企業のブースが開かれ、参加者にTシャツやヨーヨーなどのノベルティを配布していました。
KotlinConfの会場では、企業ブースでノベルティが配布されていた
スポンサー企業の一覧を見ると、Google社のKotlinに対する期待がうかがえます。
設備についてもすばらしく、部屋のどこからでも見ることのできる複数の巨大なスクリーンや、登壇者専用のカンペ用スクリーンなどが用意され、会場では巨大なビデオカメラで撮影されていました。
ランチのメニューがKotlinのDSL風に書かれていたり、1日目の終わりにはマジックショーが行われたりと、細かなところまで気配りされており、参加者に楽しんでもらおうという気持ちの伝わるイベントでした。
ランチメニューはDSLで書かれていた
Kotlinは2011年の7月に発表された言語ですが、2015年頃から徐々に採用するサービスが見られるようになり、今年になってAndroidの公式開発言語への採用が発表されてから、利用者が爆発的に増加しました。こうしたKotlinの若々しさを反映してか、これから導入を始める人や、初心者向けのセッションも見られました。
内容についてはAndroid向けのものばかりというわけではなく、SpringなどサーバサイドでのKotlinの利用についても同じ程度ありました。少し意外でしたが、Kotlinでは既存のフレームワークもライブラリも問題なく相互運用できるため、Javaを使用しているのであれば、Kotlinの利用をためらう理由もありません。日本でもサーバサイドKotlinに特化したコミュニティも生まれていますので、今後はサーバサイドでの利用者も増えていくでしょう。

KotlinConf Keynote

一言で要約すると、「Kotlin/Anywhere」。どのプラットフォームでもKotlinを使おう、となります。

Kotlin/JVM

サーバサイドではKtorという、Kotlin製のWebフレームワークがリリース目前です。
自由度が高く、Kotlinのcoroutineという非同期処理のためのメカニズムを簡便に利用できるよう作られています。
個人的な感想ですが、自由度が高いというよりも提供する機能がコンパクトといったほうが正確なので、各種機能を提供するライブラリが増えるまでは、ピュアKotlinへの熱い思いと、DIY精神を求められるでしょう。SpringがKotlinをサポートしているなかで、Ktorをあえてつかう必然性はまだないかな…と思いました。

Kotlin/Android

Androidでは、Google I/OでKotlinの正式採用を発表してから、Google PlayにアップロードされているKotlinを利用したアプリが2.5倍に増加しました。
Google社内むけのKotlin規約が公表され、Androidのサンプルコード集もKotlin対応が進められ、Android Studio 3.0からはKotlinプラグインがバンドルされるなど、GoogleのKotlinへの力の注ぎぶりがわかります。

Kotlin/JS

Kotlin/JSについても発表されました。Kotlinをコンパイルして、jsファイルを出力することができます。
KeynoteではReactのWebアプリを作るデモがされました。

Multiplatform Project

サーバサイド、Androidアプリ、Webページと、さまざまなプラットフォームをサポートしているKotlinですが、これらプラットフォーム間でコードをシェアし、1プロジェクト内で各プラットフォームを完結させる仕組みも発表されました。それが「Multiplatform Project」です。
Android StudioのベースであるIntelliJ IDEAでは、プロジェクトを複数のモジュールで構成することができます。
プラットフォーム間で共通のロジックを配置するモジュール(共通モジュール)をつくり、各プラットフォーム用のモジュールが共通モジュールに依存するようにします。
プラットフォームと共通モジュールの関係

共通モジュールは、プラットフォーム依存のクラスや関数を必要とした場合、それをexpect修飾子をつけることで、実装を省略したまま定義し、ロジック内で使用することができます。
実装を省略したクラスや関数は、それぞれのプラットフォームモジュール内でactual修飾子をつけて実装します。
そうすることで、コンパイル時に、expectで省略した箇所の実装を注入しつつ共通モジュールのロジックを取り込むことができます。
データクラスをWeb APIと各クライアントで共通化してしまえば、一貫性を維持でき、非常に扱いやすいものになるでしょう。また、1プロジェクト内にクライアントとサーバサイド用モジュールが共存することで、手軽にテスト用サーバを立ち上げてみるなどの利便性も見込めます。
KotlinConfアプリも、Multiplatform Projectの形式で作成されています。commonモジュールに共通のロジックが置かれ、common-jvmモジュールでは、JVM(Androidおよびサーバサイド)向けの実装を注入し、common-jsモジュールでJavaScript向けの実装を注入しています。

Kotlin/Native

Kotlin/Nativeについても発表がありました。
Kotlin/Nativeは、LLVMベースのコンパイラで、Kotlinコードをネイティブの実行形式に変換するものです。
Windows/Mac/Linuxはもとより、Android/iOS/Web Assemblyにも対応しています。つまり、Kotlinの世界にiOSも含まれるようになったわけです。
先に挙げたKotlinConfアプリでも、iOS向けのアプリはKotlin/Nativeで作成されています。
また、デモ用に作成されたSpinnerアプリでは、サーバサイド、Android、iOSのすべてがKotlin/Nativeで作成されています。

セッション・ピックアップ

KotlinConfで面白かったセッションを、いくつかピックアップします。
なお、各セッションはすでに動画が公開されていますので、視聴する際の参考にしていただければと思います。

Kotlinに詳しくなる

ここに挙げる3つは、Kotlinについてもっと詳しくなれるセッションです。
JVM向けのKotlinコンパイラは、Kotlinコードをclassファイルに変換します。そのバイトコードから見た時、Kotlinの言語機能はどんなコストを支払って実現しているのかといったことを解説してくれます。

Kotlin Types: Exposed

Kotlinの型システムについて、その詳細を解説しています。Any, Unit, Nothingの関係や、Read-Onlyなコレクションをどうやって実現しているかがわかります。
Kotlin Types: Exposed

Two Stones, One Bird: Implementation

複数の実装方法がある場合の、選択の指針がわかります。自由な書き方のできるKotlinでは、ある処理を行いたい場合に、複数の実装方法があることも珍しくありません。そうした場合の具体例と、どれを選べばいいかを解説しています。
たとえば、

class Person(val name: String, val age: Int)

というクラスに、「成人しているかどうか」を判定するロジックを含める場合、

class Person(val name: String, val age: Int) {
  fun isAdult() = age >= 20
}

のように関数で行う方法と、

class Person(val name: String, val age: Int) {
    val isAdult get() = age >= 20
}

のように、プロパティで行う方法が考えられますが、バイトコードに変換されたとき、どう違ってくるのかといったことなどです。
また、let/run/apply/with/alsoといった、いわゆる「スコープ関数」の使い分けについても触れています。
Two Stones, One Bird: Implementation Tradeoffs

The Cost of Kotlin Language Features

KotlinのNull安全や第一級関数といった言語仕様が、どのようなバイトコードに変換され、実行時のパフォーマンスにどう影響するかをベンチマーク結果をもとに解説しています。よりパフォーマンスが求められる場面での参考になるでしょう。
The Cost of Kotlin Language Features

Kotlinの導入

Kotlinの導入経験をもとにしたセッションのなかで、特に興味深かったのは「Kickstarting Kotlin Culture」でした。
SNS管理サービスであるHootsuiteが、Android向けアプリにKotlinを導入した経験をもとに、どう社内に布教していったかなどを解説しています。
HootsuiteのAndroid向けアプリは、ライブラリ駆動開発(Library Driven Development)という作り方をしています。サービスの機能が、ライブラリというかたちでアプリに提供されており、ライブラリをつなぎ合わせてアプリをつくります。各ライブラリはそれぞれリポジトリを持ち、異なるチームによってメンテナンスされています。こうすることで、ライブラリ単位でKotlin化するなど、変化に対して柔軟に対応できます。また、修正がライブラリ内に閉じられることで、メインアプリのコードベースに影響を与えません。
これによってたくさんの小さなチームに分断されますが、Hootsuite社では、もともと各分野において、ギルドという社内の有志で構成される、自然発生的なコミュニティがあり、その分野での指針や規約、学習といったことをおこなう文化があったので、Kotlinギルドがチームをまたがる水平的なコミュニケーションレイヤとなったそうです。このセッションのCfP(Call for Papers)も、ギルド内でブレストが行われたものです。
ライブラリ駆動開発を導入するなら、Hootsuite社のように、社内横断的で開かれたコミュニケーション文化も必要となるでしょう。
Kickstarting Kotlin Culture

楽しい

ここに挙げる2つのセッションは、発表内容もさることながら、その発表形式が面白かったものです。どちらの発表もスライドは使わず、ずっとIntelliJの画面を映しており、内容はそこに書かれていました。
「Road to Kotlintown」はKotlin初学者がつまづきやすい文法について解説します。
IntelliJの画面を映すことで、コンパイラエラーの発生箇所が赤い波線で表示され、それが修正される様子がわかりやすくなっています。また、Kotlinの標準APIの実装がどうなっているかなども、IntelliJの実装クラスへのジャンプ機能ですぐに見せることができます。
Kotlin Puzzlersは、Kotlinのごく短いコードを画面に映し、その実行結果を参加者に予想させ、答えはその場で実行してみせるという形式でセッションが進んでいきます。
とても意地悪な問題なので、Kotlinについて相当詳しくないと、全問正解はできないでしょう。
たとえば次のような問題です。

infix operator fun Int.plus(i: Int) = this + i + 1

println(-1 + 2)
println(-1 plus 2)
println(-1.plus(2))

// What will it print?
// a) 1  1  1
// b) 2  2  2
// c) 1  2 -3
// d) 2 -4 -4

このセッションは聴講者参加型の形式であり、また問題の難解さもあって、とてもおもしろかったです。
上にあげた問題の答えはあえて書きませんので、実際に動画で確かめて(24分頃です)みてください。
The Road to Kotlintown
Kotlin Puzzlers

.droidconSF

KotlinConfについてはここまでにして、.droidconSFに話を移します。
.droidconSFは、Droidconのひとつです。
Droidconは、Androidでは世界最大のカンファレンスネットワークで、2009年にベルリンで開催されて以来、世界各地で開かれてきました。ここ数ヶ月の間にも、サンフランシスコの他にニューヨーク、ロンドン、北京で開かれています。
Droidconは知名度の高いカンファレンスであり、サンフランシスコで開催されるとあって、近郊にオフィスのあるGoogle、Facebook、Square、Twitter、Pinterestといった名だたる企業からの登壇者も多く、非常にレベルの高い話が聞けそうだということで参加することにしました。

.droidconSFの会場について

.droidconSFはMission Bay Conference Centerという、カリフォルニア大学サンフランシスコ校の、メディカルセンターにあるカンファレンス会場を借りて行われました。
KotlinConfよりはやや狭い会場に多くの企業ブースが置かれ、さまざまなノベルティが配布されていました。
知名度の高いイベントだけあってスポンサーも力を入れており、Facebookが抽選でRaspberry Pi3を配布したり、SquareがCodelabでクレジットカードリーダーを配布するなどしていました。
会場の2階から見た1階のようす
各セッション会場は、KotlinConfと比べるとやや狭いものでしたが、同時間帯に4~6ものセッションが開かれるため、よほど人気のセッション以外では人で一杯になるということはなく、むしろアットホームな雰囲気のなかでリラックスして聞くことができました。
セッション会場のようす
セッションの内容はすべてAndroidに関するものです。初心者に向けたものはほとんど無く、Dexファイルを分解し、解析し、最適化したうえで再生成するなど、底知れないものもありました。
他にも、遅くなってしまったビルドをなんとか高速化する話や、スパゲッティコードを何とかする話など、Androidがうまれて9年たち、そろそろ溜まってきた負債について向き合う時期であることを感じさせるものも複数見られました。
スパゲッティと向き合うSquare

Androidの歴史

.droidconSFにKeynoteはありませんが、かわりにGoogleでAndroid UI Toolkitチームを率いているChet HaaseとRomain Guyによる、中の人から見たAndroidの歴史が話されました。
m3版Androidエミュレータ
当初のエミュレータは、HTC製の実在する端末をベースとしており、80MHzのCPUに32MBのRAM、QVGA(320x240)の画面解像度でした。今年の10月に発売されたPixel2 XLが8コア2.45GHz/1.9GHzのCPU、4GBのRAM、2880x1440の画面解像度であることを考えると、隔世の感があります。
そのほか、標準APIとサポートライブラリのFragmentのフラグメンテーションなど、興味深い話を聞くことができました。
このセッションの動画は、Realm Academyで公開されています。

セッション・ピックアップ

.droidconSFで面白かったセッションからいくつかピックアップします。まだ動画は公開されておりませんが、いずれ公開されるでしょう。スライドが公開されているものについてはリンクをつけます。

ビルド高速化

ビルドを高速化するための、具体的な設定方法です。
具体的な設定方法を解説しているのでとても実用的ですし、動画が公開されていなくても、スライドだけでも内容を把握することができます。テストの並列実行やR8コンパイラの適用は効果的です。
また、Gradle社は製品としてGradleを作っており、ビルドツールにとって速度は重要なファクターですから、ビルド速度向上に力を入れています。そのため、最新のバージョンを使うようにしましょう。
.droidconSFから離れますが、同じ発表者によるMultidexとなってしまったアプリを、Singledex化する話も参考になります。

Make Your Build Great Again

セキュリティ

Androidのセキュリティについては、「誰かに壊される前に自分で壊してみよう」というものと、「Androidのセキュリティは、今や安全になっている。危険というのは神話にすぎない」というものがありました。
セキュアに実装されていない箇所を指摘してくれるプラグインや、ペネトレーションテストの方法なども紹介されており、実用的です。

Break your app before someone else does
Debunking Android Security Myths with Data

Facebook

Facebookでは、Androidの公式のビルドツールを使わず、buckという独自のビルドツールを作成してapkを作成していたり、ReDexという、Dexファイルの最適化ツールを作っていたりなど、あまり他社がやりそうもないことの紹介をしていて、興味深い内容となっていました。
このうちReDexでは、有名なAndroidエンジニアも聞きに来ていて、意地悪な質問を投げかけていたのが印象的でした。

Blazing Fast Android Development: Hot-Swapping Modules with Buck
Redex, Your Build, And You

海外のカンファレンスに行こう

海外のカンファレンスというと、お金がかかるのではと考えたり、英語だからと気がねして、参加をためらっている方もいるかもしれません。
しかし、最新の情報をキャッチアップできるだけでなく、世界でもトップレベルの企業がどんな課題をもち、取り組んでいるのかを垣間見ることができ、また最高峰のエンジニアたちがその辺を歩いているなかに身をおくことができ、普通に話しかけることさえできます。これほど贅沢な環境もありません。
そしてなにより、自分のモチベーションを高めることができます。
皆さまも、海外のカンファレンスに行く機会があれば、迷わず参加してみてください。
念のため、繰り返しになりますが、Yahoo! JAPANにはトップカンファレンス参加支援制度があります。
自腹で行くのはためらわれる…という場合には、ぜひ当社の門を叩いてみてください!

Yahoo! JAPANでは情報技術を駆使して人々や社会の課題を一緒に解決していける方を募集しています。詳しくは採用情報をご覧ください。

  • このエントリーをはてなブックマークに追加