ニコニコでアナリティクスを作ったら「分からない」が怖くなくなった話

この記事はドワンゴ Advent Calendar 2020　14日目の記事です。
13日目は [saka1_p](https://qiita.com/saka1_p) さん[^5]の [ボードゲームの画像認識とアルゴリズム](https://qiita.com/saka1_p/items/0d8eef1925372905b3ab) についての記事でした。

[^5]: saka1_pさんは貪欲に技術を吸収していらっしゃっていて、私が心から尊敬しているエンジニアさんです。

-----

こんにちは！ [@namaozi](https://twitter.com/namaozi) です。ドワンゴでニコニコ動画の開発を担当しております。今年でもう入社4年目になります。主に投稿者向けの機能開発に携わることが多く、最近では「 [ガレージ](https://dic.nicovideo.jp/a/%E3%82%AC%E3%83%AC%E3%83%BC%E3%82%B8) 」と呼ばれる投稿者向けのサービスの開発をよく担当させていただいております[^1]。 

[^1]: 「ガレージ」のリリース時の目玉機能だった「シリーズ機能」も、DBから見てフロントサイドを担当しました。この時最近のWebフロントエンドを担当するのが初めてで、色々な試行錯誤がありました。

先日リリースされた「投稿動画のアナリティクス機能」も開発を担当させていただきました。
この記事では、アナリティクス機能の開発で得た経験が問題解決のスキームを俯瞰するきっかけになり、「分からない」への価値観が大きく変わった、という話をしたいと思います。

# 言いたいことを3行で
- 「分かる」が増えると「分からない」は増える。「分からない」は自然なので怖くない
- 想像不能領域の「分からない」であっても、アプローチ方法さえ分かっておけばそんなに怖くない
- 「分からない」を理解するカギは「共感」

# 注意⚠️

- プログラミングの話はほぼありません。
- ただの持論をまとめただけの記事になります。
- 持論については思っているだけで私がすべて実行出来ているとは言っていません😇
- 「分かる」「分からない」の漢字表記は完全に気分で使い分けています。
- 多分、というか絶対に同じようなことを考えている先人が居るはずです。（ご存知の方いましたら、勉強したいので教えて下さい！）
- もしかしたら私が気付いていないだけで全人類「こんなの当然じゃん笑」と思っているのかもしれません。


# アナリティクス機能について📊

2020年7月27日、ニコニコ動画にアナリティクス機能が追加されました。
投稿した動画の再生数やコメント数などの基本的な数値の日ごとの推移や、視聴者やアクセスの数値分析を閲覧できます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【お知らせ/PC版ニコニコ動画】<br>7月27日(月)、動画投稿者向けにアナリティクス機能をリリースしました。<br>直近一ヶ月で再生数が伸びている動画や、下記画像のような詳細な分析結果が確認できます。<br>今後の動画作りにお役立て下さい。<br>詳細は↓<a href="https://t.co/8Yzo1Gv24f">https://t.co/8Yzo1Gv24f</a> <a href="https://t.co/PoTMrLVp6T">pic.twitter.com/PoTMrLVp6T</a></p>&mdash; ニコニコ窓口担当 (@nico_nico_talk) <a href="https://twitter.com/nico_nico_talk/status/1287669180469108736?ref_src=twsrc%5Etfw">July 27, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

私の推し機能は動画別レポートの「変動値ソート」です。30日間で伸びた数値でソートできるので楽しいです。ソート順も保持されますので便利。投稿者のみなさま是非使ってみてください！
https://www.upload.nicovideo.jp/garage/analytics/uploaded
（私の動画だとこんな感じです！）
<img width="600" alt="変動値ソート" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103754/3920391c-86db-d1e0-9c3c-81e3bbae7c23.png">


# 自分の担当範囲🐟
コードを書いていたのは3人で、うち2人プログラマー、1人デザイナーという感じでした。
私は企画さんにいただいた要件の整理と見積もりから始まり、開発ではDBから見てフロントサイドにある部分をだいたい担当しました。
もう1人のプログラマ（先輩）はビッグデータ的な数値集計の部分とインフラ、つまりDBから見てバックサイドを担当いただき、デザイナーさんにはフロントの画面組みなどを協力いただきました。

# 開発前：なんもわからん😇

開発担当が自分に決まった時の感想がこれです。 

**「マジで何も分からない。どうすりゃええねん」**

結果としては開発完了し無事リリースすることができたのですが、始める前は本気で何をどうしたらいいか分かりませんでした。
アナリティクス機能といえばYouTubeをはじめ、各種メディア投稿系サービスでは"あたりまえ"のように実装されている機能です。私も他サービスではユーザーとして当たり前に使っていました。

それが自分が実装する段になってしまい、どうすれば実現できるのか当時の自分では何も分からず、自分でこの案件をやり切ることができるのか怯えていました。



# リリース後：「分からない」は怖くない😌

仕事の大きなリリースが終わって数カ月後。ライフワークの音楽活動で大きく経験値を得たのもあり、ある日寝る前に突然今までの経験が整理され、こうした考えに至りました。

**「今も何も分からないけど、分からないのは"自然"で恐れることじゃない」**

この考えに至った詳細な経緯は省略し、以下ではどのような価値観を得たのか話していきたいと思います。


# 命題: 「分かる」が増えれば「分からん」は増える📈

まずはこれです。逆説的に見えるかもしれませんが、そう思っている理由を図示します。

<img width="600" alt="わからんが増える" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103754/ce9fbbd9-9220-1953-197a-a51dd3104238.png">

私は「分からない」領域を「分かる」領域の境界だと捉えています。
とすると、**わかる領域が単調増加するならば、わからない領域も単調増加します。**

よって、命題を示すことができました✅

なお、この「分からない」領域の外側にある部分は**「想像不能領域」**だと思っています。**想像不能領域も「分からない」ではあるんですが、まずうまく知覚できないので領域の広さを自分で把握することができません。**
なので最初は100くらいの広さかな？と思っていたけど、後から分かってみたら2359283759832473929352328くらいの広さがあったことに気付いたりします。なので分かる前からあまり深く考えてもしょうがない領域になります。

なおアナリティクス開発は私にとってまさにこの想像不能領域にありました。

<img width="600" alt="space cat" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103754/a6ba1117-b3fa-4b04-b1cb-8d75075bd138.png">

分かることが増えれば分からないことも増えるので、「分からない」状態が自然ではあるのですが、想像不能領域にある「分からない」は一種恐怖を感じるかもしれません。

しかし、 **想像不能領域にある「分からない」であってもアプローチの方法さえ把握しておけばそんなに怖がる必要はない** と思うようになりました。ここからはその方法論について書きます。


# 問題解決における「わからない」について🤔

問題解決においての「分からない」はいくつかのパターンがあると思っており、私は2通りに大別しています。
また、私は今まで研究・創作（音楽）・仕事の3つの分野で少なくとも1度は本気で問題解決をしてきた経験があるので、研究や音楽での例も交えながら話していきます。


## 1. ゴールが分かっている場合🏁

先程の図のうちのどこかの領域にゴールが存在する場合です。

<img width="400" alt="ゴールがわかっている" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103754/bbcf6069-99e9-d0d5-28ab-f6c8531c48fe.png">

アナリティクス開発でもこの場合に該当します。つまり「**自分の投稿動画の統計情報を閲覧できるページを作りたい！**」というゴールですね。
実際には企画の方がもう少し細かい機能要件（要求）について考えてくれているので、「このページでは動画視聴者の年齢や性別を分析したい！」のようにゴールは具体化されています。

研究で例を出せば
「機械学習のとあるタスクで高精度を実現できる手法があるが、実行に時間がかかりリアルタイム性がないので、極力精度を残しつつもリアルタイム性を向上させたい」
みたいな感じでしょうか。研究テーマに近い部分だと思います。

音楽で例を出せば
「クリスマスに嫌気が差している人でも、聴いたら『クリスマス、悪くねーな』と思ってもらえるような曲を作りたい」
みたいなゴール設定だと思います。


ゴールが分かっている場合のアプローチは以下の2つがメインなのではないかと思います。

## A. 先駆者や類似物を調査する📖

自分のゴールに近いことを実現しているターゲットが既に存在すれば、それをつぶさに観察することでそのゴールに至る経路を想像することができます。そして部分的にターゲットへ至る経路を自分のゴールの達成に利用することができます。


<img width="500" alt="サーベイランス" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103754/9f553a33-88d8-3cab-61d4-eea2a3a762cc.png">

アナリティクス開発では、まず他サービスでのアナリティクス機能を調べまくりました。特に実行時間についてが一番の懸念だったので、それを念頭に置きながら他サービスのアナリティクスの機能や挙動について調査しました。
また、ドワンゴには社内にデータ分析基盤があるので、その既存のユースケースを調べたり、データ分析基盤でできることのヒアリングを行ったりしました。

研究で言えば「サーベイランス」に他ならない行為になります。

音楽で言えば「リファレンス曲を探したり、曲を耳コピしてみたり、歌詞を考察してみる」などでしょうか。[^2]

[^2]: 音楽は自身の「感性」に頼る部分が大きいのが仕事や研究などとの違いだと思います。対象を観察することも重要ですが、何より自身の感覚自体を注意深く観察しながら音楽を聴くことが重要なのも難しいところ…



## B. 仮説検証を繰り返す⚗️🧪

「分からない」が対象であっても、地道な仮説検証を繰り返すことで「分かる」を広げていき、「分からない」を「分かる」に取り込むことができます。

<img width="500" alt="仮説検証" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103754/f0177856-48ff-10d5-2213-af9d1b6c9370.png">


ただし、 **想像不能領域にあるゴールは実現できるかも分からないので、仮説検証を繰り返しても辿り着けない場合もあります。** その時は「できないことが分かった」と諦めるか、新たなアプローチの探索などが必要になると思います。

アナリティクスでは、アナリティクスのプログラムのコードに落とし込む際のドメインモデリングに一番苦心しました[^3]。モデリングも無数のバリエーションがあるので、まずは自分でユビキタス言語を設定して世界観を作りつつチームメンバーに相談しながらモデリングを進め、より良いドメインを構築できました

また、私がフロントエンド技術に不慣れだったのもあり、ユーザーのクリックによって各種グラフを描画し直したり、複数グラフのうち一部だけデータが足りない場合に一部だけグラフを隠したりなど、やや複雑な動きを考える際には仮説検証のプロセスが活きました。

[^3]: いわゆるドメイン駆動設計(DDD)的なやつだと思っています

研究で言えば、提案手法を模索して実験を繰り返す段階になると思います。

音楽で言えば、楽器やDAWに向き合って音楽を作り上げる、作編曲の段階でしょうか。

このプロセスで何より大事なのは、**想像不能領域にあるゴールはやってみる前からどれくらい大変なのか分からないし、それが実現できるかも分からない**ということを認識しておくことだと思います。


## 2. ゴールが分かっていない場合 🌠

「分からない」の種別その2。**いちばん大変な「分からない」で、クリエイティブパワーが最も必要な過程**だと思います。私自身あまり詳しくない「分からない」なのでちゃんとしたことが言えません。。

<img width="500" alt="ゴールがわかっている" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103754/408d2a3d-bd10-5cb2-9ae5-f5de42d4828f.png">


仕事で言えば、例えば「サービスの利用率が低下しているのでなんとか戻したい！」という場合に企画を立案する場合などでしょうか。私は仕事において自分で企画を立案したり、それに類するほど大きな問題提起をしたりした経験がないので何も言えません。。それゆえ世の企画者さんたちを大変尊敬しております。

研究で言えば、詳細なテーマを決める以前の「方向性選び」でしょうか。画像認識をやるのか画像生成をやるのか、ARやVR、ウェアラブルデバイスやインターフェースをやるのか。今挙げた分野それぞれに無数のサブジャンルが存在しますし、それらを世の中のニーズや課題意識、それから自分のやりたいことなどと照らし合わせて選ぶ必要があると思います。

音楽で言えば、「どんな曲を作るか」。作品のOPであれば作品を象徴するような曲を、劇伴であれば作品に寄り添うような曲を。自分で作品全体をプロデュースするとしたら、どういう世界を表現したいのかから考えなければなりません。まさに「生む苦しみ」という部分なのだろうと自分は思っています。

ゴールが分かっていない場合の「分からない」で重要だと自分が思っているのは、**問題発見の過程が苦しい過程であることを受け入れたうえで可能な範囲で悩み尽くすこと**です。期限までに問題を発見する必要がある場合などは相当なプレッシャーがかかるでしょうし、答えが出るセオリーなども無いでしょうからメンタルへの負担は相当なものだと思います。自身の精神とも向き合いながらひたすら悩む、コレしか今の自分にはやり方が分かっていません。



# 「分からない」を理解するカギ：共感的理解

ここまで2通りの「分からない」についての大局的な自分の知見を書いてきました。
最後に、もっと普段の生活に寄り添った「分からない」について書きたいと思います。

何かを見るとき、何かを読むとき、何かを聴くとき、誰かと話すとき、誰かの話を聞くとき。どんな時でも「あれ？これどうなってるんだろう」と思うタイミングはそこかしこにあるはずです。そうしたあらゆる場面で何かを理解する際に最も重要なのが **相手の立場に立って考えて共感しようとすること** だと思います。

基本的に人間から発せられたモノは、作られた過程において何らかの意思決定が行われた結果として存在しています。
それならば、相手がそのモノを作った背景や感情を想像し、なるべく相手の身になって理解しようとする「 **共感的理解** 」があらゆる事象において有効なのではないでしょうか。

プログラマーの仕事においては、例えば誰かが出したPull Requestに問題が複数含まれている場合、全てを指摘するのではなく最も根源的な問題を理解しようとする際などにこうした思考は役立つはずです。誰かが何かを迷っている時の原因察知などにも有効でしょうし、ふつうにコードを読む際にも作り手のことを想像すると見えてくる情報は多いはずです。

研究においては、論文は感情を排した書き物とはいえ、あらゆる意思決定の結果による成果物に違いありません。論文を読む際もコードリーディングと同じことが言えると思います。あとは論文添削をしている時なども役立つはず。

音楽において。作り手のことを想像すると、音の端々に意思や感情を色濃く感じられるはずです[^4]。

[^4]: この記事で紹介したような持論を持つ前から、私は作り手を想像した音楽の聴き方が大好きでした！



# おわりに

この記事では、アナリティクス開発の経験などをもとに得た自分の問題解決の認識について書きました。

再度まとめると

- 「分かる」が増えると「分からない」は増える。「分からない」は自然なので怖くない
- 想像不能領域の「分からない」であっても、アプローチ方法さえ分かっておけばそんなに怖くない
- 「分からない」を理解するカギは共感

こうした理解から、 **「わからない」に毎回真摯に向き合うことができればわからなくても何も問題無い** 、というのが今の私の見地です。
今後も「分からない」とうまく付き合いながら生きていきたいと思います。

長文お読みいただきありがとうございました！私も開発者である前にニコニコ動画のユーザーのひとりなので、これからもユーザーのみなさまと一緒に良くしていきたい気持ちでいっぱいです。ニコニコ動画をこれからもよろしくお願いします！

明日は [lambdataro](https://qiita.com/lambdataro) さんの記事になります！

それでは！メリークリスマス！🎅