映像配信プラットフォーム「FRESH!」では、2017年12月 スマートフォンのみで配信が完結する配信専用アプリ「FRESH! CAST」iOS版をリリースしました。

専門的な配信機材や技術がなくても、スマートフォンのみで高画質かつ業界最速水準の低遅延配信を行うことのできる同アプリの開発の中心を担ったのが新卒2年目の青山です。

Developers Blogでは青山に、「FRESH! CAST」における技術選定や開発におけるチャレンジなどを聞きました。

 

青山 遼
映像配信プラットフォーム「FRESH!」 iOSエンジニア。
2016年サイバーエージェント新卒入社。内定者時代から「FRESH!」でiOSエンジニアとして開発を行い、入社後同プロジェクトに配属。
https://github.com/ra1028

 

 

 

最初はサイバーエージェントの開発現場といってもイメージが湧かなかった

 

ーーどのくらいiOS開発に携わっているのでしょうか?


開発を始めたのは大学3年からなので、約4年ですね。学生時代はサイバーエージェントグループとは別のマッチングアプリの会社で、1年半アルバイトとして働いていました。学生当時はOSS活動も盛んに行っていたのですが、社会人になってから遠のいてしまっていたので最近また積極的に参加するようにしています。

 

ーーサイバーエージェントに入社を決めた理由は?


サイバーエージェントの他に2社内定を頂いていたのですが、その中でも特にサイバーエージェントのエンジニアや開発現場ってブラックボックスというか、どういう方々がいるか正直イメージがつかみにくかったんです。そこでインターンに参加させてもらうことになったのですが、先輩エンジニアがみなさんいい人たちばかりで、特に「FRESH!」の技術力の高さには驚きました。先進的な技術に多く取り組んでいるし、抵抗なく積極的に新しいことを取り入れていく姿勢にも感銘を受けましたね。

 

採用面接も、自分のやりたいことや性格をよく見てくれた上で色々な先輩方とお話させてくれたことで好感を持ち、入社を決めました。

 

 

 

ーーご自身の担当について教えてください


元々は「FRESH!」視聴アプリを開発していて、2017年6月頃から配信専用iOSアプリFRESH! CAST」を担当しています。「FRESH! CAST」には私の他にデザイナーとサーバーサイドエンジニアが一人ずつ関わっているのですが、仕様策定やスケジューリングなどディレクション業務の一部にも携わっています。視聴アプリの方はたまに新機能開発も行いますが、ほとんどは他エンジニアのコードレビューのみですね。

 

 

 

メインのライブラリにはReactiveSwiftとReactiveCocoa、アーキテクチャにはVueFluxを導入

 

ーー配信アプリ「FRESH! CAST」の技術選定について詳しく聞かせてください


「FRESH! CAST」の技術選定においては新たな技術を多く取り入れました。まず、メインのライブラリにはReactiveSwiftとReactiveCocoaを使用しています。iOS界隈で流行っていて、かつ社内の大規模サービスだと「AbemaTV」で取り入れているものにRxSwiftがありますが、個人的には堅牢性や設計の美しさがReactiveSwiftの方が優れていると考えており導入を決めました。ちなみに「FRESH!」視聴アプリでも、Swiftバージョン1系の早い段階からReactiveを使っています。

 

また、今回配信アプリを開発するにあたって、アーキテクチャは特に入念に吟味しました。

視聴アプリではMVVMを使っているのですが、アーキテクチャの中では自由度が高すぎて、実装者によってクオリティに差異が出たり一貫性が取りづらいなどつらみが多いと感じていました。そこで今回新しくWebフロント界隈のアーキテクチャであるFlux、Redux、Vuexの3つを参考にして検討してみたところ、ReduxやVuexの構造はとても優れているものの、SwiftやiOSのシステムにあまり合っていないと判断しました。さらにFluxも社内では「AbemaTV」で採用事例があるものの、まだiOSにおけるFluxは確立していないことが懸念として残ったんです。

そこで、FluxをベースとしてVueFluxという新たなアーキテクチャライブラリを考案し、配信アプリならではの状態管理の難しさなどを解決しようと考えました。視聴アプリで採用しているMVVMでは、画面の状態に対するインプット・アウトプットのデータフローの複雑さや、画面同士の依存関係の強さ、Reactiveに頼り過ぎた実装などに問題があったのですが、VueFluxでこれらを解決することができました。

VueFluxはOSSとして公開していますので、是非ご覧ください。

 

また、このあたりの技術選定の一部については、先日開催された当社主催のiOSエンジニアによるiOSエンジニアのための勉強会「CA.swift #5」でお話しましたのでぜひスライドも見ていただけると嬉しいです。

 

 

さらに配信アプリの開発と同時に、視聴アプリのUI変更を容易に行えるようにするためのライブラリも作成しました。アプリ開発では、画面の狭さから必然的にリスト系のUIが多くなるのですが、たとえば1カラムと3カラムのリストだと別のUIになってしまうので、その管理が難しくて。でもデザイン変更を容易にできないことを技術のせいにしたくなかったので、それらを解決するためのライブラリを作りました。まだモック段階のためライブラリ自体は非公開ではあるのですが、UITableView・UICollectionViewの変更の容易さや、リストを管理するモデルの更新スレッドを気にしないで実装することができ、その差分更新をアルゴリズムで解決きるようになったのが大きかったですね。同じチームの新卒エンジニアが数学に強いので、今は一緒に既存のものより計算速度の早い差分アルゴリズムを用いたライブラリを作れないか考えています。

 

 

 

 

ーー開発において特に工夫した点や苦労した点はありますか?


配信アプリの場合は、やはり配信中の状態が多く管理が難しかったですね。でも先ほどお話したようにこれらはVueFluxでかなり解決できました。

これから解決しなければいけない点でいうと、例えばアプリ内で配信番組の予約や編集をを行う画面でにその番組がライブ、アーカイブ、予約なのか配信状態に応じてロジックを分ける必要があって複雑なため、現状のコードがかなり複雑で属人化してしまっているので、ここは今後解決していかなければいけないと感じています。

 

また、今回は仕様策定やデザイン、サーバーサイドのスケジューリングも行ったので苦労しましたが、個人的に良い経験になりました。

 

 

 

 

“強すぎるくらい強い” コードレビュー文化

 

ーー「FRESH!」ならではのやりがいはありますか?


動画配信サービスなのでそれだけで技術として難しい分野だと思いますが、「FRESH!」の場合はライブ配信なのでまた違った面白さがあることが魅力の一つですね。オンデマンド配信と違って遅延対策が重要ですし、配信者によって番組や映像の品質も全く異なるので技術やデザインで解決しなければいけない点が多いんです。配信技術も必要になってきますし。

 

また、開発環境としては「FRESH!」チーム自体サーバーサイド中心に技術力が強いので、毎日刺激になる環境です。iOSでいうと入社した当時から感じているのは、コードレビュー文化が強すぎるくらい強いこと。社内外の他iOSチームと比べてもレビューの件数が多いんじゃないかなと思っていて、たとえば大きな修正や機能追加の際には、300件近いコメントを付けたこともありました。コードや設計に問題があれば、たった数十行の修正に100コメントくらい付け合う環境です。

私自身は入社までそんなにレビューしないタイプだったのですが、同じチームだった先輩がすごく熱心にレビューしてくれるタイプの方だったんです。他人のコードをレビューすることって自分も100%そのコードに責任を持つことと同義だと思うのですが、それもあってエンジニアのコードレビュー文化は素晴らしいと感じています。

 

そのほかにも、配信主のみなさんからたくさんのフィードバックを密に受けられることも魅力です。配信主はユーザーでありながら、「FRESH!」というプラットフォームを一緒に作り上げていく存在だと個人的には感じているので、要望が特に多い機能は積極的に開発優先度を上げて取り組むこともあります。

 

 

 

ーーどんな人がサイバーエージェントでの開発に向いていると思いますか?


技術感度が高くて開発を心から楽しめる方でしょうか。物怖じしないで自分の考えを積極的に言えて、かつ柔軟に他人の意見も受け入れられる方だと、なお活躍できるのではと思います。というのも、サイバーエージェントのエンジニアは皆技術感度が高くて社内コミュニティも盛んなのですが、どの技術領域のコミュニティも温和で攻撃性が少なく居心地が良いんですよね。個人的な開発についてもみなさんよく話していますし、何よりも技術進歩が速いと思います。

 

 

 

 

ーー最後に今後の展望について教えてください


個人的には、しばらくはiOSのスペシャリストの方向性でやっていきたいと考えています。iOS界隈がさらに発展してほしいという意味で、品質を重視したOSS活動を積極的に進めていきたいです。最近では少しずつReacitveSwiftなどの巨大OSSにコントリビュートするようにしています。

「FRESH!」としては、ライブ配信は技術力の競争が特に激しい分野なので、そこで勝っていきたいです。競合サービスと差別化できる「FRESH!」ならではの機能も整えていきつつ、何よりも品質が一番重要なので継続的な改良を重ねていければと考えています。