nabeliwo blog

nabeliwo blog は nabeliwo の日々の出来事だったり生活の中で感じたことだったりを雑にお届けします。

適切な問題設定をして適切な解法で解決するのは難しい

CATEGORY:ポエム

目標を立てるとその目標に到達するための問題が発生する。
発生するというか、問題は常にそこにあるんだけれど目標と道筋を立てることでそこにあった問題が浮き彫りになる。

その問題に対して適切な解法を見つけることで問題を解消して目標に到達することができる。
それが基本的な道筋だと思うんだけれど、意外とこれが難しいんだなって思ったって話をする。

やりたいこと

最近は個人で Web サービスを作っていて、そこで今問題にぶつかっているのでその話を前提で進める。
どういうサービスかと言うと、一言で言えば「お題目に対してみんなで投票してランキングを作ろう」っていうサービス。

僕はアニメやゲームや小説に時間を消費するのが趣味なわけだけれど、特に今は良さげな新作がないなーって時期がたまにある。
そういうときはまだ見ていない過去の作品を漁る必要があって、僕はある程度のジャンルを絞って検索したりする。

「ホラー アニメ」とか「ミステリー 小説」とかもっとふわっと「アニメ おすすめ」とかでも探したり。
余談だけれどそういうときに「タイムリープ」とか「ループ」とかで検索するのは絶対やってはいけないのでやめような。タイムリープものだとわかった上で見るタイムリープものは本当につまんなくなるぞ。

で、なんかこうもっと具体的に探したいなーって思うときがある。例えば「学園異能バトルもので俺TUEEEEではないアニメ」とか。
そういうときって「学園異能バトル」という要素はそのワードで検索すればそういう紹介のされ方をしてる記事が出てくるから出てきたものの中から気に入りそうなものを見れば良いんだけれど、「俺TUEEEEではない」っていう要素ってなかなか検索することができない。
だから結局「学園異能バトル アニメ」とかで検索して出てきたものの中から「俺TUEEEE」ではなさそうなものを選ぶっていう工程を経ることになる。

そういう自分のわりと絞った要求に対して、他のユーザーたちからの投票によって作られたランキングを提供するっていう形でニーズを満たしてくれるサービスがあったら嬉しいなーっていうところ。
そんなサービスを今作っています。

問題

ここからが本題で、僕は今そのサービスを作る過程で問題に当たっている。
ユーザーが「○○なアニメが見たい」っていう募集をかけると他のユーザーたちがその投稿に対して一押しの作品を投票してランキングが形成されるんだけれど、その投票をするときの作品データをどうやって取得するのかっていう問題。

多分理想の UI としては投票したいユーザーが検索フォームに作品名を入力するとインクリメンタルサーチによって候補を表示してくれて、その候補の中から選択をするとその作品データが投票される。
じゃあそれをどうやって実装するかっていうと文字入力のたびにサーバーにリクエストを送って DB からタイトルで検索して取ってきた情報を返すってだけなんだけれど、じゃあそのデータってどうすんだって話。

解法

僕が思いついた方法としては3つしかなかった。

  1. 外部の作品データベースの API を利用する
  2. 都度都度スクレイピングして情報を返す
  3. 作品データベースを用意してそこから情報を返す

それぞれの可能性について考えてみる。

1. 外部の作品データベースの API を利用する

これはやっぱり一番簡単だしまず最初に思い浮かぶ選択肢だと思うんだけれど、色々探した結果どれも若干用途に対して不足している感が否めないのかなと思った。
まず絶対的な作品数が少なかったり、今のクールのアニメしか返さなかったり、などなど。

そして欲を言うとアニメ・漫画・小説・ゲームっていう4つのメディアで展開したいからそうなるとまあまず該当するような公開 API は存在していなくて、なので順次実装すれば良いかということでとりあえずアニメに絞って探してみたけど先に言ったようにどれも不足している。
網羅率で言うと文句なくても時間単位のアクセス制限とかによって実際のサービスだと使い物にならなそうな気がするやつもあったり。でもそこらへんは上手くキャッシュ効かせて工夫すれば超えられる問題なのだろうか、そこらへんちょっと思考が足りてないかもしれない。

ここに関して言えば、このブログを読んだ人で良い API 知ってるよとか、こういうやり方だと外部の API でもいけるのではとかあったら @nabeliwo まで教えてほしい。

2. 都度都度スクレイピングして情報を返す

1のやり方がだめだってなったとしたらこのパターンももしかしたらありかもしれない。
というのも実はメディア芸術データベースというサイトを見つけたのでこの案が出てきた。

このサイトは本当に夢が溢れていて、漫画・アニメ・ゲーム・メディアアートの4ジャンルの作品を幅広く収めていてしかも商用利用も自由にできるっていう素晴らしいサイト。
ここからデータを取ってきてしまえば色々捗るのでは?って感じ。

でも問題が色々あって API が存在しない(一応漫画用の WebAPI は試験的に公開されている)とか、データの表記揺れの問題とか、そういう話。
このサイトは文化庁が運営しているんだけれど、問い合わせ窓口もあるからそこからどんどん要望を飛ばすことでもしかしたらこのデータが将来的に全ての Web 開発者の助けになったりするのかもしれない。

その方向性は置いておいて、とりあえず現状だとスクレイピングして検索結果を取り出してこっちのサービスにリストとして返すみたいなやり方が考えられるかなーと思っている。
実際にそのやり方でメディア芸術データベースの漫画情報を取得できる gem を作っている人もいた。

メディア芸術データベースのラッパーGemを作ってみました

スクレイピングと取得データの整形の手間はわりと大変だろうけどこのやり方だと一応問題の解決はできそうな気がしている。
ただこのやり方だと(1もそうなんだけど)、検索結果を出すまでは解決するんだけれど結局その検索結果で投票したときに投票された作品のデータをどう持つのかみたいな話がある。別の人が同じ作品を投票するときに、その作品の投票数が2にならなきゃいけないんだけれど、1と1になりそうなパターンが無限に思いついてしまうのがなーって感じ。

そこはでも今回の論点からは外れているので一旦ステイで。

3. 作品データベースを用意してそこから情報を返す

これが一番サービスのシステムとしてはシンプルになるんだけれど一番労力がかかる解法。
というかこれは yak shaving どころじゃないやつ。

実際このやり方したいなあーって何度も考えていて、というのも色々なサービスを見ている中で思ったこととしては、多くのアニメやゲームや小説や漫画に関わるサービスがあるんだけれどそのどれもが独自で作品データベースを作っていてそれって本当にみんな労力を無駄遣いしてるんじゃないかっていう。
一つの大統一データベースがあって各サービスがそこから API でデータとってこれればみんなハッピーなんじゃないかっていう。

いやまあそれが先にあげたメディア芸術データベースなんだけれど。
文化庁としては今後 API 化も進めていく計画なのかもしれないしどんどんデータの使い勝手も良くしていくっていう気概なのかもしれない。
だからそこに期待するのは一つの手なのかもしれないんだけれど、ただそれにしても思うところとしてはやっぱりユーザー投稿型であるべきなのではっていう。 wikipedia 方式。

必要な人みんなでデータベース作っていければ良さそう。そうするとデータの正当性であるとか表記であるとかいろんなところに問題が発生する可能性があるんだけれど、そこは結局いくらでもこちらで改善できるしなんとかなりそうと思っている。

とここまで話してまあでも結局これをやると自分のサービスどころではないのではっていうところで問題がすり替わってしまっている感がある。

適切な問題と適切な解法

ここまで考えてみて、そもそも問題設定に間違いがある説も考慮するべきかもしれないなと思ったり。
本当に適切な UI は「投票したいユーザーが検索フォームに作品名を入力するとインクリメンタルサーチによって候補を表示してくれる」というものなのか。

もっとシンプルな問題にしてシンプルに解決できる方法があるんじゃないかとか思っている。
そう考えたのがもうだいぶ前で、僕の個人開発は完全にそこで止まってしまっている。

ここが僕の良くないところなんだけれどとりあえず思いついた方法でガシガシ実装していくっていうスタイルが取れなくて、結局後々問題が出そうとか難しそうとかそういう理由で手が止まってしまう。

ちょっとこのままではやばいなと考えたのでこうしてブログに書き起こして考えをまとめてみた。
とりあえずは UI は初めに考えた通りに進めて解法としては2のやり方でやってみようかなと思っている。

すごくふわっとしたただの感想文を書いてしまった。
こんなに退屈な話をここまで読んでくれた方、ありがとうございました。何かアドバイスをもらえると嬉しいな!