Cross-Platform · Spaced Repetition
MediWords — 医療英単語 5,951 語の SRS 学習アプリ
医療従事者向けの医療英単語学習アプリを、Android (Kotlin) と iOS (Swift) にネイティブ実装した事例。約 6,000 語のローカル DB 設計、忘却曲線に基づく SRS(間隔反復)アルゴリズムの自前実装、完全オフライン・プライバシー重視設計までを一人で完結させたプロジェクト。
プラットフォーム
iOS / iPadOS / macOS (Apple Silicon) / Android
言語・技術
Swift / Kotlin / SQLite
データ規模
5,951 単語 × 15 専門カテゴリ(解剖学・疾患・薬剤・救急など)
学習方式
Spaced Repetition System(SRS)— 忘却曲線に基づく自前実装
課金モデル
Free(一部カテゴリ+各 30 単語)/ Premium(買い切り ¥360)
担当範囲
企画・設計・実装・UI・データ整備・ストア申請・運用(全て一人)
プロジェクト概要
MediWords は、医師・看護師・薬剤師・医学生など医療従事者を対象にした、医療英単語の学習アプリです。15 の専門カテゴリ(解剖学、疾患、薬剤、救急、看護、診療科など)に体系的に分類された 5,951 語の医療英単語を、Spaced Repetition System(SRS)で効率的に習得できるよう設計されています。
一般的な英語学習アプリと違い、対象を「医療現場で実際に使われる専門用語」に絞ることで、ユーザー(医療従事者)が日常業務で直接活用できる学習体験を提供しています。クラウド同期なし、アカウント登録不要、完全オフラインという設計は、医療業界特有のプライバシー意識への配慮でもあります。
技術的な難所
このアプリを「動くプロトタイプ」ではなく「ストア配信できる完成品」にするには、以下のハードルがありました:
- 約 6,000 語のローカル DB 設計:単語データに加え、ユーザーごとの学習進捗・復習スケジュール・お気に入りなどを高速に読み書きできる構造設計
- SRS アルゴリズムの実装:忘却曲線に基づき、ユーザーの記憶定着度に応じて次の復習タイミングを動的に計算するロジック
- 完全オフライン・プライバシー重視:クラウド同期・アカウントなしで、学習データはすべてローカル保存。にもかかわらず、データ消失への配慮(バックアップ/復元)も必要
- フラッシュカード UI のスムーズなインタラクション:スワイプで快適に学習を進められる体感の作り込み
- クロスプラットフォーム展開:同じ仕様を Android (Kotlin) と iOS (Swift) のネイティブ実装で揃える
主要な技術判断
1. クロスプラットフォーム fw ではなく、両プラットフォームともネイティブで実装
PocketTune と共通する判断ですが、MediWords でも Android は Kotlin、iOS は Swift でネイティブ実装を選択しました。理由は MediWords 固有のもので、ローカル DB クエリの最適化・検索性能・OS 標準のフラッシュカード的 UX を各プラットフォームの標準コンポーネント(Android の RecyclerView、iOS の UIPageViewController など)で実装する方が、複雑度に対して結果が良いと判断したためです。
2. SRS アルゴリズムの自前実装
SRS(Spaced Repetition System)は Anki などで採用されている SM-2 アルゴリズムが有名ですが、医療従事者の使用シーン(スキマ時間で短時間ずつ復習)に最適化するため、既存ライブラリに依存せず、自前のロジックを実装しました。
各単語に対して以下を保持し、次回出題タイミングを動的に決定:
- 学習状態:未学習 / 学習中 / 習得済み
- 正答・誤答の履歴:直近の回答結果による習熟度
- 次回復習日時:忘却曲線に基づく動的計算
- 復習間隔:正答を重ねるごとに延長、誤答でリセット
これにより、忘れかけたタイミングでちょうど復習が出るため、医療従事者の限られた学習時間でも長期記憶に定着しやすい設計になっています。
3. 完全オフライン・プライバシーファースト設計
医療従事者というターゲット属性を考えると、「学習データを外部に送信したくない」というニーズは強い。これに対応するため、設計レベルで以下を徹底しました:
- クラウド同期機能を実装しない(バックエンド自体を持たない)
- アカウント登録不要、メールアドレスも収集しない
- 学習データはすべてローカル DB に保存
- 分析・ログ送信を最小限に
この方針は、運用コスト(サーバー不要)・プライバシー訴求・障害点の削減の三方良しでした。「アカウント+クラウド同期」を前提にしがちな現代のアプリ設計に対するアンチテーゼでもあります。
4. 部分無料化+買い切りのフリーミアム
収益化は PocketTune と同じく サブスクリプションではなく買い切り(¥360)を選択。加えて、無料体験の設計を工夫しました:
- 1 カテゴリ(医療器具)は無料で全単語アクセス可能 — アプリの価値を十分に体験できる
- 残り 14 カテゴリは各 30 単語まで — 全体感を掴める
「機能制限」型の無料版ではなく「データ制限」型にすることで、無料ユーザーでも本格的な学習体験ができ、必要性を感じた人だけが Premium に進む動線にしています。Google Play Billing と StoreKit、両方の API でこの構造を実装しました。
クロスプラットフォーム展開
Android 版を先行リリースし、iOS 版を後追いしました。データモデル(DB スキーマ)、SRS アルゴリズム、課金フローなどの中核ロジックは Android 版で確立済みだったため、iOS 版は移植コストが大幅に削減。同じ仕様で両プラットフォームを単独運用しています。
iOS 版は単一バイナリで iPhone / iPad / macOS (Apple Silicon) に対応。データサイズは 12.5 MB と軽量で、約 6,000 語の医療データを内包しながらもオフラインで完結します。
結果
- Google Play / App Store の両方でリリース完了
- 15 カテゴリ × 5,951 単語の医療英単語データベースを実装
- SRS アルゴリズムによる適応的な復習スケジューリングを実装
- 完全オフライン動作・サーバー不要のアーキテクチャ
- iOS 版は iPhone / iPad / macOS (Apple Silicon) の単一バイナリ対応
- Android / iOS 共通の Premium IAP(買い切り)を実装
What this project demonstrates
このプロジェクトで証明できること
- 大規模ローカル DB を扱うアプリの設計・実装ができる
- アルゴリズム(SRS など)の自前実装が可能
- 完全オフライン・プライバシーファーストのアーキテクチャ設計ができる
- iOS / Android のネイティブ両方を一人で完結できる(再現性のある実績)
- 業界特性(医療従事者のプライバシー意識)を踏まえたプロダクト設計ができる