iOSDC 2016 ベストトーク賞の感想と裏話

iOSDCの感想を書こうと思ってよく考えたら自分のブログを持っていなかった[@inamiy](https://github.com/inamiy) です、こんにちは。
こういう時にQiitaは便利ですね。2年ぶりに投稿します。

<img width="900" alt="iosdc1.png" src="https://qiita-image-store.s3.amazonaws.com/0/2249/2c1960b3-519a-586c-cb63-2840ade1d05c.png">

先週、2016年8月19日〜20日にかけて開催された「[iOSDC Japan 2016](https://iosdc.jp/2016/)」というiOSカンファレンスで、「Reactive State Machine」をテーマに発表させていただきました。
嬉しいことに、多くのオーディエンスの方々から、[厚さ3cm以上の<del>肉</del>](https://docs.google.com/presentation/d/1Q2qdCbIHOmNQwkufFQH3K3DOALr2V9Doi69H33zMmeU/pub?start=false&loop=false&delayms=3000&slide=id.p4)スライドとして認められ、なんと**ベストトーク賞**に選んでいただきました！ (賞金は1.70302628ビットコイン by [bitFlyer社様](https://bitflyer.jp/))
投票して下さった方々、並びにイベントを円滑に運営して下さったスタッフの方々に、厚く御礼申し上げます。

- スライド
    - [Reactive State Machine (Japanese) // Speaker Deck](https://speakerdeck.com/inamiy/reactive-state-machine-japanese)
- 動画: 
    - [iOSDC Japan 2016 | FRESH! by AbemaTV](https://abemafresh.tv/tech-conference/32381) (3:00:00〜)
    - [iOSDC Japan 2016 08/20 Track A / Reactive State Machine / 稲見 泰宏 - YouTube](https://www.youtube.com/watch?v=Yvz9H9AWGFM)
- GitHub
    - [inamiy/ReactiveAutomaton](https://github.com/inamiy/ReactiveAutomaton) (ReactiveCocoa版)
    - [inamiy/RxAutomaton](https://github.com/inamiy/RxAutomaton) (RxSwift版)
    - [個人用gistメモ](https://gist.github.com/inamiy/1835a88e00bd19dff003e779fe63a2ed)

- 当日の雰囲気
    - [Reactive State Machine-FRPでの最適な設計手法を探る- #iosdc #a - Togetterまとめ](http://togetter.com/li/1014220)
    - <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/iosdc?src=hash">#iosdc</a> どっちも食べ物の話ししてて、えっ？iOS？ってなっていた <a href="https://t.co/ONPliW2xf9">pic.twitter.com/ONPliW2xf9</a></p>&mdash; ジャンボ (@jumbOS5) <a href="https://twitter.com/jumbOS5/status/766848618770763777">2016年8月20日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

今回の発表は、普段なかなか話題に上がらない「関数型リアクティブプログラミング ([RxSwift](https://github.com/ReactiveX/RxSwift), [ReactiveCocoa (RAC)](https://github.com/ReactiveCocoa/ReactiveCocoa)) の問題点」のほか、「[React.js](https://github.com/facebook/react) + [Redux](https://github.com/reactjs/redux)（の問題点）」や「[Elm](http://elm-lang.org/)」といった新しいプログラミングパラダイムについて幅広く紹介できたので、共感してくれる方が普段よりも多かったように思います。
現時点では、どれが正解と結論づけることはできませんが、それぞれの長所・短所を知ることは、今後のFrontend開発の動向を追っていく上で重要な手がかりになると思います。

## 発表のきっかけ

裏話をすると、今回の発表のきっかけは、2年前にQiitaに投稿した 

- [Swiftで有限オートマトン（ステートマシン）を作る - Qiita](http://qiita.com/inamiy/items/cd218144c90926f9a134) 

が元になっています。
当時は、「Swiftのカスタム演算子をオシャレに使いたい」という謎の欲求があり、勢いで[SwiftState](https://github.com/ReactKit/SwiftState)というライブラリを作りました。

その後、JavaScript方面でReduxが注目され、Swiftでも[ReSwift](https://github.com/ReSwift/ReSwift)というライブラリが登場しました。ちなみに、このライブラリをヘビーに使っているチームが[Fablic](https://fablic.co.jp/)社で、今回のiOSDCでも[@huin](https://twitter.com/huin/status/766586835468365824)さんが導入事例を発表しています。

- [iOS DC 2016 : フルSwiftでバイクフリマアプリRIDEを作って得た学び // Speaker Deck](https://speakerdeck.com/huin/ios-dc-2016-huruswiftdebaikuhurimaapuriridewozuo-tutede-taxue-bi)

そんな中、同社の[@ninjinkun](https://twitter.com/ninjinkun)さんと[アプリ開発と状態遷移の管理 - ninjinkun's diary](http://ninjinkun.hatenablog.com/entry/2016/02/02/183136)について意見交換をする機会がありました。当時の私は、React.jsの「状態をimmutableにする」考え方や、Reduxで「アプリ全体の状態を集約する」という発想が、あまりにも非効率的でiOSの設計にそぐわない、と違和感を覚えました。例えば「RxSwiftであれば、ViewModelをいっそのことシングルトンしてしまって、必要な数だけ`Variable`を生やしてデータフローを構築すれば、Reduxと実質同じような動作を簡単に達成できる」と考えました。この辺については、同ブログ記事でも取り上げられています。

>
状態遷移の管理という観点で捉えると、Flux、ステートマシン、MVVM、Promise、FRPは**対象としている状態の大きさの違い**なのかもしれないとも思う。Fluxはアプリという大きな単位で状態を管理するためのアプローチである。Promiseはもっと小さな単位の状態遷移、ステートマシンはその中間くらいというイメージを持っている。PromiseやObservableはまとめることでより大きな状態遷移を作ることもできるので、小さな状態遷移を積み重ねて大きな状態遷移を作るものとして考えても面白い。

つまり、アプリ全体の状態を「点在した`Variable`の集合」として扱うか、「状態コンテナに格納された唯一の(代数的データ型の)値」と見なすかの違いです。前者が「FRP + MVVM」、後者が「Model-View-Automaton」の世界です。

そして、それから「Redux = ミーリ・マシン」と気づくのに少し時間がかかってしまいましたが、ミーリ・マシンの「出力」の型にFRPを活用して非同期処理を克服するのは自然な流れでした。さらに調べていくうちに、このアプローチが（つい先日学んだ）Elmの設計とほぼ同じで、むしろ向こうの方が「FRP的な副作用管理を言語内仕様に組み込んでいる」時点で、何倍も上手だと思いました（参考：[A Farewell to FRP](http://elm-lang.org/blog/farewell-to-frp)）。

## まとめ

というわけで、Elmについては（もう少し勉強しないといけませんが）、**今回の私のプレゼン（とFRPそのもの）が無に帰するくらいの高いポテンシャルを持っている**と考えています。現在のiOS開発ですぐに役立つ内容ではありませんが、iOSアプリ開発の未来を_予測する_のに役立ってくれれば幸いです。