この投稿は、AbemaTV Advent Calendar 2017 11日目の内容です。
エンジニア・デザイナー・ディレクターがお題フリーで展開していますので、大変機知に富んだ内容になっているかと思います。その他の記事も是非にご覧くださいませ。
はじめに、私はAbemaTVのWebチームでチームリーダーをしている @asukaleido と申します。AbemaTVはディレクター・デザイナー・サーバー(インフラ)・iOS・Android・Webでチーム分けされており、機能実装の際には各チームから数名がアサインされ、デザイン・仕様作成・実装を進めて行くことになります。2017.12時点では、Webチームには私含めて9名が所属しており、Webクライアントサイドのサービス実装を担当しております。私自体はAbemaTVのWebサービスが高いクオリティを維持できるよう、チームマネジメントやアーキテクチャ設計を主に行なっている次第です。
さて、本日はお仕事とは切り離せない「依存」と「品質」について、ITサービスの運営という面から掘り下げお話していきます。
お仕事をするということは成果物を産み出すこととなります。それが有形であったにせよ無形であったにせよ、何かを作り出すということは共通しています。そして何かを作り出すためには人と道具が必要になります。詰まるところ成果物は人と道具に依存していると言えます。
これをITサービスに置き換えると、人とはディレクター・デザイナー・エンジニアであり、道具とはインフラやバックエンド・クライアントプラットフォーム、さらにはビルドツールやCIツール、果てはプログラミング言語などサービスを構成するために必要なものすべてとなります。
依存と品質
人への依存
人への依存を減らし自動化を推し進めれば、成果物は一定の品質を保つことができる。これを良しとするかどうかは、時と場合によるかと思います。AbemaTVで働いて見ればよくわかりますが、品質を極限まで追い求めていく必要がある場合、人に依存することが重要になってきます。AbemaTVには今、「他の追随を許さないほどの成長」が求められており、優秀な人々が自身のスキルを存分に発揮しながら品質の向上を追求しています。詰まるところ、成長が必要な場面では人に依存してでも成長を勝ち取ることが重要であると言えます。逆に、「現状維持ないしはゆるかな衰退」の局面において人に依存しすぎると、成果物の品質に差異が出て来るために現状を維持することが難しくなってしまいます。
もちろん、成長の過程においても人への依存を減らすことが重要な部分は存在しています。例えば、ITサービスにおけるリリース前のテストは品質を維持するためにとても重要な過程です。現在、AbemaTVのWebサービスはヒューリスティックテストへの依存が高いのですが、この部分についてはE2Eテストやユニットテストの拡充などである程度の自動化を行うことができます。そうすれば人的リソースをケーステストやストーリーテストなどに充てることができ、これは品質の向上に直接的に結びついていきます。
このように、人への依存とは「人がやるからこそ意味がある」部分への依存をサービスの状況に応じて適切に調整して行くことが必要であると言えます。
道具への依存
他方、道具への依存は難しい問題です。なぜならば、道具もまた人に依存しているからです。例えば、GoogleのCloudサービスであるGCPとGAEを比べると、GAEの方が万人向けてである一方、柔軟性にかけます。GCPは逆に基本自由ですがそれを十全に使用できるかどうかは人によります。人が使いこなしてこその道具であるため、より良い成果物を求めるあまりに道具にこだわりすぎると、その道具を扱える人に依存しすぎてしまい結果として人のスキルにサービスが依存してまうことがありうるわけです。上記の通り、サービスの成長過程においては人への依存も重要になってくるわけですが、道具についてはおいそれと変更するわけにはいきません。それが基盤に近いものになればなるほど、長期的なロードマップによって依存度合いを管理して行く必要があります。
また、人の数と道具の関係も重要です。クライアントプラットフォームでは、UIライブラリやビルドツール、ことWebに関して言えばReact.jsに代表されるビューライブラリなど外部ソフトウェアを使用する場面が多々見受けられます。当たり前ですがこれらのソフトウェアにもアップデートが存在するわけで、使う道具を増やせば増やすほど、そのメンテナンスに人を割かなければいけなくなるわけです。他方、外部に頼らず社内で完結できるようにする場合は、外部ソフトウェアを使用することによって省くことのできたはずのコストを余計に支払わねばならぬ可能性が高まります。
つまり、どのような道具にどのような関係性を持って依存していくかは、サービスを構築するにあたり避けては通れぬ課題であるにも関わらず最善は時と場合によって変わるという、非常に厄介な問題であると言えます。
投資との関係
こと人に関してはどうしても人件費がかかってきます。目指しているサービス像とかけられる金額に差異が出て来ると、上記の通り依存の制御が難しくなるわけです。成長させたいが人は増やせない。人を増やせないから自動化と道具に頼る。そして依存が高まっていき、技術革新への対応が遅れていく。それが成長に影響を与える。
まさに負のスパイラルです。
理想を追うことも重要ですが、会社の状況にあった人・道具への依存度合いを経営層に理解してもらうことが、やはりサービスを提供して行く上で不可欠だと言えるでしょう。
転職を考えている人は、会社の投資額とサービスの成長速度、人と道具の充実性が妥当かどうかをひとつの指標に据えると良いかと思います。内部にいる人は、そういう目線で見られているのだということを忘れずに技術選定や機能実装を進めて行く必要があります。
まとめ
- 依存の脱却=品質の向上ではない
- 品質を求める過程において人への依存は許容されるべきである
- 品質を維持するために道具をこだわることは必要だが、こだわりすぎると逆に品質を維持しづらくなる
- 人への依存を高めすぎたが上の失敗は十分ありうる
- 人の数によって道具への依存度合いを調整するべきである
- 費用対効果以上の品質を求めることは危険である
- 理想とコストは切り離せないことを意識するべきである
少し抽象的な話を続けてきましたが、この後は以上のことを鑑みながらAbemaTVのWebサービスにおける「依存」と「品質」との付き合い方について、具体例を交えてお話します。
AbemaTVのWebにおける依存と品質
Webチームは現在9名が所属しており、AbemaTVのWebサービスと管理画面のクライアントサイドを担当しています。リソースの割り振りは以下をご覧ください。
AbemaTVのWebサービス
- 機能実装:3人
- アーキテクチャ・リファクタ:3人
- ビルド・CIツール:1人
管理画面
- 機能実装:1人
多少の流動性はあるものの、現状ではだいたいこのような人数で実装を行なっております。
さて、人への依存についてですが、これはもう「依存を許容している」状態であると言えます。例えば、ビルド・CIツールについては9月に入社された方が大幅な刷新をはかってくれています。またアーキテクチャ部分については私が初期実装からかなりの手を加えており、自賛ではないですが今携わってくれているエンジニアが数名入れ替わっただけでも、現状の品質への追求の維持は厳しくなると思います。
これはAbemaTVが成長を支えるために優秀なエンジニアを多数抱えることを是としているからであり、それを推進してくれている経営層の賜物であると言えるでしょう。また、今以上の品質・実装速度を求めるためにさらなる人員増強に向けて日々採用も積極的に行なっております。優秀なエンジニアを増やし、大胆に依存しながらAbemaTVの成長を支えて行く所存です。
では、道具についてはどうでしょうか。
現在、Webのツール群は以下のような構成になっています。
- バックエンド
- Node.js
- ビューライブラリ
- React.js
- UIライブラリ
- React.jsを用いているOSS複数(管理画面ではReact Material UI)
- 周辺ライブラリ
- RxJS、Universal Router
- 動画関連
- Theo Player、Flashls
- ユニットテスト関連
- Enzyme、Skin Deep、Blue Tape、Karma
- ビルド関連
- Webpack、Babel、TypeScript、FlowType、TSLint、ESLint、StyleLint、Make
- 設計思想
- Flux
細かいものは省きますが、大まかなものだけでもこのようなツール群を使用しています。
先ほど、人への依存は許容しているという話をしましたが、それはあくまで品質を高める手段としてであり、自動化を無視しているわけではありません。よって、ことCIとテスティングについては現在それ相応のコストを割いているところとなります。
他方、その他のツール群については品質を強化するために必要なものを適宜利用することを重要視しています。
よってReact.jsを使うことにこだわりがあるわけではありません。
むしろ、React.jsへの依存を減らすために「React.jsを用いているOSS」については自前のものに置き換えている最中となります。これは、道具への依存が成長の妨げとなることを避けるためとなります。Webのクライアント技術は今後も革新が続くことが予想されます。その中で、React.jsよりも良いものが登場するのならばすぐに置き換えていきたい。それを可能とするとために依存を減らしているわけです。
すでにReact.jsに依存している状態でそれに依存しているOSSを利用すると、React.js自体のアップデートがしづらくなります。
例えば、AbemaTVではReact Routerを使用していましたが、来年1月のアップデートでUniversal Routerへ変更される予定です。これにより、React.jsの周辺OSSをかなり減らすことができるため、今後は柔軟なアップデートが可能になります。
また、品質を維持するために今年初めにFlowTypeを導入しましたが、BabelのアップデートによりTypeScriptの導入も安易になったため、現在TypeScriptへの移行もすすめています。
新たな依存を増やしていることになりますが、これは人の数で圧倒しながら実装を推し進め、FlowTypeは無くして行く方向を考えています。
つまるところ、道具に関しては依存すべきものと依存してはいけないものの取捨選択をはっきりとした上で、いざとなったら潔く別のものへと依存を切り替えられるような状態を作り上げることに重きをおいていることとなります。
まとめ
- 優秀な人には積極的に依存してより良いものを作っていく
- 道具についてはWebの技術革新に遅れを取らないようにするため、依存度合いは減らしていく
- 他方、品質を高めるために必要なものについては積極的に利用していく
今後の付き合い方
最後に、今後についてお話しします。
現在、AbemaTVでは積極的な人材採用を行い、人の数がボトルネックとならぬようにしています。
ただし、チーム構成が現状のままだと、チームマネジメント層への依存度が高くなることが予想されています。もちろん、マネジメントがとても優秀なエンジニアがいれば解決する話ではあるのですが、弊社エンジニアはソフトウェアエンジニアリングが行えることをモチベーションにしている人が多く、またそれを良きとする文化があります。これから対策を練り、成長の妨げとならぬようにしていく所存です。
このように、「依存」と「品質」の状況は常に流動的に変化していきます。数年後を見据えて可能な限りこの問題をコントロールし、事前に対応して行けるかどうかが、サービスを成長させていくために必須なスキルであるといえるでしょう。
最後に、AbemaTVでは上記の通り採用に力を入れておりますので、興味のある方はぜひこちらからエントリーいただければと思います。よろしくお願いいたします。