• 株式会社メドレー
  • 執行役員 MEDLEYプロダクトマネジャー
  • 石井 大地

流行りではなく「原理」で選べ。動作速度は絶対善、「MEDLEY」開発者の技術選定

今回のソリューション:【MongoDB】

〜オンライン病気事典サービス「MEDLEY(メドレー)」は、ひとりの開発者によって生み出された。サービスの「原理」から選んだ技術は「MongoDB」と「Phalcon PHP」〜

Webサービスを開発する際に、どのようにフレームワークやデータベースといった技術を選定しているだろうか。「流行っているから」「新しいから」という理由でそれを選ぶことは、必ずしも正しいとは言えない。むしろサービスのあるべき形を考えた時に、最良のものを選択できていない可能性も高い。

「MEDLEY(メドレー)は、現役の医師がつくるオンライン病気事典サービスだ。一般ユーザーにもわかりやすいように、病気の基礎知識、原因、症状、治療や検査の情報を分かりやすくまとめている。

2015年12月には全国約16万件の医療機関が探せる病院検索サービスも追加され、「納得できる医療」の実現を目指すべく躍進を続けている。

そんなMEDLEYの初期開発をひとりで行ったのが石井 大地さんだ。東京大学文学部(医学部より転部)に在籍時より、事業の立ち上げやWebサービス開発に関わり、また作家としても10冊以上の実用書を上梓。2011年には小説家として第48回文藝賞を受賞しているという異色の経歴の持ち主である。

石井さんは「サービス開発における技術選定は、そのサービスの『原理』に立ち戻って選ぶべき」と語る。MEDLEYでは、ユーザーが素早く正しい情報にアクセスできるというパフォーマンス性を最も重視し、Phalcon PHPMongoDBn-gramを使って開発を行っているという。石井さんに、詳しいお話を伺った。

大学に入ってまずやりたかったのは「本を書く」こと

私自身は会社の創業メンバーではなく、2009年創業のこの会社に2014年の後半にジョインしました。

大学時代から、塾の経営に関わったり、携帯電話向けのアプリ開発をしたり、ひとりでWebサービスを作ったり……様々なことを同時進行で経験してきたのですが、大学に入って最初に取り組んだのは、「本を出版する」ことでした。

高校生のときから、東大に受かったらその勉強法について本を書こうと思っていました。元々家庭の方針として、大学生からは自立するように言われていたこともあったのですが、一生懸命に勉強したので、元を取るためにはそのノウハウを公開するのが一番良いと考えていました。

入学試験を受けて「これは合格した!」という確信があったので、合格発表の前から企画書を持って出版社を回っていました(笑)。入学したら、なるべく早く出版したかったのです。

結果的に、大学1年生の11月に最初の本を出すことができました。その後は大学生として勉強しながら、事業に関わったり、執筆活動をしたり。大学院1年生のときに新人賞をいただいたことがきっかけで、小説家としてもデビューしました。

ちょうど私は、「事業を立ち上げて成果を出す」ことが評価され始めたネットバブルの時代に思春期を迎えています。大学でも周りに会社をおこしたり、テレビに出ているような人がいたので、自分が特殊だとは思いませんでした。

医学部から文学部に転籍しているので驚かれることもありますが、もともと「絵画や文学に『感動』する、人間の感情の仕組みを理解したい」という気持ちがあって脳科学の研究室に出入りしていたので、自分の中では自然な流れなんですよ。

小説家として活動する傍ら、小説投稿サイトを開発・運用

Webサービスを自分で開発するようになったのは、小説家として活動していたときのことです。文学に関わる人はインターネットに疎いことが多く、この状況は時代遅れでまずいと思ったんですね。小説を書くだけでは暇だったこともあって、自力でプログラミングの勉強を始め、「CRUNCH MAGAZINE」という小説投稿サイトを立ち上げました。

当時はプログラミングの知識もあまりなかったので、とにかくGoogleで調べまくって作りました。最初から奇をてらうことはできないので、まずは人気のあるフレームワークやデータベースでしっかりと構築できるようになろうと、PHPとMySQLを使って構築しました。

その当時から、サイトのパフォーマンスにはこだわりを持っていました。*動作が遅いというのは、人の時間を無駄にしているということじゃないですか。人を待たせるというのは本当に良くないことですよ。

この考え方は今も変わっていなくて、MEDLEYにおいても「ユーザーが素早く情報にアクセスできる*」ということを非常に大切にしています。

ユーザーに必要十分な情報を網羅する病気事典「MEDLEY」

MEDLEYは、数百名の協力医師の方々とつくる、一般ユーザー・患者さん向けのオンライン病気事典です。病気や薬に関する様々な情報をわかりやすくまとめ、日々医師の方とともに情報を更新しています。

####▼現役の医師がつくるオンライン病気事典サービス「MEDLEY」

ユーザーはMEDLEY上で症状から病気を検索し、概要や治療法などを知ることはもちろん、その病気に対応した近隣の医療機関を調べることができます。また、最新の医学研究の話題を、「MEDLEYニュース」として提供しています。

大切にしているのは、あくまでも一般ユーザーの目線でコンテンツを編集・配信するということです。

コンテンツは現役の医師が執筆しているのですが、病気や薬に関する正確な情報が揃っている一方、 専門家にしか分からない難解な用語や複雑なグラフの使用はできるだけ避けています。あくまでも、ユーザーにとって必要十分な情報が網羅されるかどうかを基準に考えています。

さらに、病気について調べるユーザーは大抵、自分自身やご家族などが何らかの病気にかかっていることが多いと思います。そうすると的確な情報に素早くアクセスできるかが重要になるので、これまで独自の検索エンジン、データ構造化基準、統計解析システムなどを拡充させてきました。

「流行り」では選ばない サービスの「原理」に沿った技術を使う

MEDLEYのチームではつい最近まで私が開発と運用をひとりで引き受けていました。私の場合、新しい事業を構想するときは、自分が理想とするWebサービスとはどういうものかをまずは考え、最初に技術の選定を行います。

「今流行っているから」「目新しいから」という理由で技術を選定するようなサービス開発はしません。いや、使いたいという好奇心はありますよ(笑)。*でも何が一番大切かと言うと、サービス自体の「原理」です。

ユーザーにサービスをどう使って欲しいのか、というサービスの原理に立ち返って技術を選ぶべきです。*すごいテクノロジーを使うことが、偉いわけではないと思うんですよ。

MEDLEYを構想する際にWebの技術動向を調べていて、「これだ」と感じたのが、Phalcon PHP(以下、Phalcon)とMongoDBでした

MEDLEYのユーザーにとって大切なパフォーマンスに優れていることと、開発の生産性が高いことがその理由です。Phalconは日々のアプリケーション開発の際に使われ、MongoDBはそれらがアクセスするデータベースとして、一般的なサービスの運用に組み込まれています。

素早く動作するサービスを、短期間で作るための技術を選んだ

Phalconは PHPのC拡張として書かれたフレームワークなので、PHPの開発生産性と高速動作を両立させています。JavaやGo言語などに比べて劣っていた速度面のハンディキャップをかなり克服できています。そのため、これ以外の選択肢はないだろうというくらいの感覚で愛用しています。

MongoDBをデータベースに選定した理由についても、Phalconと同様、パフォーマンスと生産性が大きな理由でした。

昔からMySQLなどのリレーショナルデータベースを使っていましたが、一般のWebサービスで、 スキーマの変更やJOINなどに手間がかかる上に動作速度も速いとは言えない、こうしたデータベースを使うのは合理的ではないと感じています。

さらに、リレーショナルデータベースでは、大量のアクセスがあった際のスケールアウトの方策も限られており、かつ設定が面倒です。

テーブル同士の関係を定義し、マッチングテーブルを量産するような作り方も、 開発生産性を落としている割にはユーザーにとっての価値を生まない、いわば管理のための管理になりがちです。

MEDLEY事業の立ち上げ期、まだ仕様も確定していない状況で素早く動作するサービスを短期間で作るため、 スキーマレス、ハイパフォーマンス、スケールアウトが簡単、という3つの特徴を備えたMongoDBを選ぶのは、きわめて合理的な判断だったと感じています。

MongoDB + n-gram で、サービスに最適な検索エンジンを実装

MongoDBで個人的に気に入っているのが、配列をネイティブに扱えることです。これまでリレーショナルデータベースで作っていたような煩雑なマッチングテーブルの大半をなくして、データ構造をシンプルにすることができます。

MEDLEYのキーワード検索や症状からの病気検索といったシステムは、MongoDBがなければあれだけのスピードでは開発できなかったと確信しています。

サイト内検索システムも、最初は単純なテキストマッチを使っていました。MongoDBの場合はしっかりインデックスを貼れば、配列をネイティブに扱えるので、検索ワードの一部に合致したものは正規表現を含めてヒットさせることができます。

ただ、言葉の先頭からの検索以外の場合が遅いんです。例えば「インフルエンザ」を検索したいときに「インフル」で検索すると速いけれど、「エンザ」だと非常に遅くて3秒ほどかかるケースもありました。これではダメだと思い、検索エンジンの改造に着手しました。

具体的には、n-gramという言葉を数文字ごとに区切って判別するアルゴリズムを用いて、小規模な検索エンジンを実装しました。

n-gramの場合、インフルエンザだったら「イン」「フル」「エン」という感じで言葉を区切って検索が走ります。MongoDBだけで構築可能なので実装してみたところ、爆速だったのでこれでいけるなと。

幸いにもMEDLEYの場合は、一般的なサーチエンジンのように裏側に何千億ページといったデータはありません。病気のデータは、すべて足しても数万レベルです。

そうすると重要になるのは、精度高く少数をマッチングさせるのではなく、いかに漏れなく網羅的にヒットさせるかということになります。インフルエンザに関する情報がすべて出てくることが大切なので、このような形が良いと考えました。

MongoDBは、トランザクションの必要が少なく、パフォーマンスが重要でスケールアウトの必要性があるサービスには良いと思います。 小規模で低負荷のシステムや業務基幹システムで、リレーショナルデータベースに強いエンジニアが多い場合には、あえて選ぶ理由はないかも知れません。

医療の質と効率の向上に貢献するサービスを作っていく

今後は何よりもまず、さらなるコンテンツの拡充と、使い勝手の向上がもっとも重要と考えていますが、 最近はMEDLEYを医療の外来現場で活用していただく取り組みも始めています。その一例が、MEDLEYが作成したポストイットです。

受診された患者さんに「MEDLEYでこの病気について調べて下さい」と病名を書いたポストイットを渡し、 あとで病気について復習してもらう、といった使い方をして頂いています。

もともと医療現場は「3分診療」という言葉があるほど多忙なところです。患者さんが納得ゆくまで病気について理解するには時間が不足している面もあります。

医師の方が、MEDLEYの病気情報を患者さんに紹介し、復習してもらうようにすれば、 患者さんは病気についての理解を得られますし、医師の方も「MEDLEYで読んでおいて下さい」といえば、同じ説明を何度も繰り返す必要がありません。

こうした取り組みを通じて、医療の質と効率の向上に今後も貢献していきたいと考えています。(了)

▼この記事を読んだ人へのオススメ記事はこちら

;