記事

モチベーションの数学:React Nativeで雪だるま方式と雪崩方式を実装

TinyDebtの開発を通じて、数学的に最適なコードが人の気持ちに合わない場合があると学び、2つの返済戦略を実装した理由を解説します。

モチベーションの数学:React Nativeで雪だるま方式と雪崩方式を実装

多くの開発者は、金融アプリを純粋な数学の問題として捉えます。つまり、何よりも利息を最小限にすることです。

技術的には、これは 雪崩方式と呼ばれます。利率の高い順に借金を並べ、余剰資金を最上位の借金に充てます。数学的には最も効率的な方法です。

しかし、TinyDebtを開発していたとき、「数学的に正しい」コードが「人に合うか」という点ではうまくいかないことがあると気づきました。そこで残高の少ない順に返済する 雪だるま方式も実装しました。その技術的な実装から、ユーザー中心のロジックについて多くを学びました。

ロジック:成功につながる並べ替え

ローカル優先のReact Native環境では、バックエンドなしで計算するため、クライアント側のロジックは素早く確実に動作する必要があります。ここでは「数学的効率」と「心理的な勢い」を切り替えるために使ったロジックを簡略化して紹介します。

type Debt = {
  id: string;
  name: string;
  balance: number;
  interestRate: number;
};

// The "Avalanche" Logic: Maximizing Interest Savings
const getAvalancheOrder = (debts: Debt[]) => {
  return [...debts].sort((a, b) => b.interestRate - a.interestRate);
};

// The "Snowball" Logic: Maximizing Psychological Wins
const getSnowballOrder = (debts: Debt[]) => {
  return [...debts].sort((a, b) => a.balance - b.balance);
};

技術的な課題:リアルタイム比較

ユーザーにとっての本当の価値は、一覧を見ることだけではなく、自分の選択がどんな結果につながるかを確認できることです。TinyDebtでは、毎月の追加返済額を使って両方のアルゴリズムを実行し、異なる「完済予定日」を表示する予測エンジンを作りました。

アプリはローカル優先で、シンプルかつプライバシーを重視したデータモデルを使うため、計算は即座に完了します。サーバーが返済計画を計算する間のローディング表示もありません。反応が速く、前向きになれるUIを実現できました。

UXでは「雪だるま方式」が選ばれる理由

長期的には雪崩方式のほうが利息を節約できますが、雪だるま方式のほうが「完了率」は高くなります。

プログラミングでは、これを摩擦の軽減と呼びます。

  • 雪崩方式 は、巨大で複雑なレガシーモジュールを最初にリファクタリングするようなものです。正しい選択ですが、疲れてしまいます。
  • 雪だるま方式 は、月曜の朝に簡単なバグを3つ直すようなものです。火曜に大きな課題へ取り組むための達成感と勢いが得られます。

まとめ:データベースだけでなく、人のために設計する

ツール、特に金融分野のツールを作るときは、「人間という変数」を考慮する必要があります。ミニマルでプライベートな環境で両方の選択肢を提供したところ、ユーザーはより長く使い続けてくれると分かりました。

ユーティリティアプリを作るなら、自分に問いかけてみてください。ロジックはプロセッサ向けに最適化されていますか、それとも使う人向けですか?