ベンチプレス80kgで潰れた直後、スマホで「重量入力 → 回数入力 → 保存 → タイマー開始」という4ステップを要求されたとき、こう思いました。
「こんなの、続くわけがない」
既存の筋トレアプリは「正確な記録」を優先し、ユーザーに多くを求めすぎています。
この記事では、1回のワークアウトで操作回数を半分以下に削減した「Zero Friction UX」の設計思想を解説します。
TL;DR
- ジムで息が上がっている時、スマホ操作は認知的負荷が高すぎる
- 「ユーザーが考える前にアプリが答えを出している」状態 = Zero Friction を目指した
- Smart Pre-fill では、重量入力を「前回値コピー」から「文脈を読む提案」へ進化させた
- Intent-Based Timer では「タイマー停止ボタン」を削除し、行動から意図を推測するUIにした
この設計思想を実装した筋トレ記録アプリ Attain を公開中。コア機能は無料で使えます。 👉 アプリを見る
課題: ジムでのスマホ操作は「苦痛」である
Cognitive Tunneling(認知トンネル)問題
高強度のトレーニング中、人間の認知リソースは極端に制限されます。 心理学では「Cognitive Tunneling」と呼ばれる状態です。
通常時: 判断・記憶・操作・計画に余裕がある
高負荷トレーニング中: 認知リソースの大半が「呼吸・筋肉制御」に消費され、UIを操作する余裕がほぼない
この状態で「重量を入力 → 回数を入力 → 保存ボタン → タイマー開始」という4ステップを要求するのは、ユーザーへの暴力です。
既存アプリの問題点
多くの筋トレアプリ・ワークアウト記録アプリは「正確な記録」を優先し、ユーザーに多くの入力を求めます。UX設計の観点から見ると、これは問題です。
| 操作 | 認知負荷 | 問題 |
|---|---|---|
| 重量入力 | 高 | 「前回何kgだっけ?」と思い出す必要 |
| 回数入力 | 中 | セット終了直後なら覚えている |
| 保存タップ | 低 | でも「もう1回タップ」が地味にダルい |
| タイマー開始 | 中 | 「あ、タイマー押し忘れた」問題 |
| タイマー停止 | 中 | 「次セット始めたいけど、まずタイマー消さないと」 |
合計5回以上のインタラクション。 これを1セットごとに繰り返す。10セットやれば50回以上の操作です。
設計哲学: Zero Friction
目標
ユーザーが考える前に、アプリが答えを出している
「設定画面は敗北」という思想のもと、以下の原則を定めました。
- Learn, Don't Configure - 設定画面を作る代わりに、行動から学習
- Silent Learning - 学習していることをユーザーに意識させない
- Intent over Action - 明示的な操作より、意図の推測を優先
Smart Defaults の優先順位
| 優先度 | データソース | 例 |
|---|---|---|
| 1 | 学習値 | このユーザーの過去の行動 |
| 2 | 文脈推論 | 直前のセットの状態から推測 |
| 3 | カテゴリデフォルト | 胸筋なら○kg等 |
| 4 | グローバルデフォルト | 最終フォールバック |
解決策1: Smart Pre-fill(文脈を読む重量提案)
「前回と同じ」では不十分
単純な「前回値コピー」は、以下のケースで破綻します。
- 失敗セット後はどうする? 前回80kg×8回で潰れた → 次も80kg? それとも75kgに落とす?
- ウォームアップ後はどうする? 40kg×10回のウォームアップ → 次はメイン重量に飛びたい
- 漸進性過負荷の場面は? 先週80kg×8回できた → 今週は82.5kgに挑戦すべき?
ルールベースの提案エンジン
新しいセットを開始する際のロジック:
- 前セットがあるか確認
- 前セットなし → 履歴のベスト重量を提案
- 前セットあり → 前セットが失敗かどうか確認
- 失敗 → 同じ重量を維持
- 成功 → ウォームアップかどうか確認
- ウォームアップ → ベスト重量へジャンプ
- 通常セット → 前セットの重量を維持
なぜ「失敗後は維持」なのか
ユーザーは「リトライ派」と「ドロップ派」に分かれます。
- リトライ派は同じ重量で再挑戦したい
- ドロップ派は重量を落として確実にこなしたい
どちらが正解かはユーザー次第。 だからデフォルトは維持し、減量オプションをUIチップで提示します。
+-----------------------------------+| Suggestion: 80 kg || || [-5%] [-10%] |+-----------------------------------+リトライ派は0タップ、ドロップ派は1タップ。どちらも最小限の操作で済みます。
解決策2: Intent-Based Timer(意図駆動タイマー)
「タイマー停止ボタン」を削除した理由
従来のタイマーUIには「停止」ボタンがあります。
+-----------------------------------+| 2:30 || [-10s] [Stop] [+10s] |+-----------------------------------+問題点は明確です。
- 「停止」を押す操作が必要
- 押し忘れるとタイマーが鳴り続ける
- 「次のセット始めたいけど、まずタイマー消さないと」というフリクション
Intent-Based(意図駆動)アプローチ
「入力開始 = 休憩終了」と再定義する
ユーザーが重量や回数の入力を始めた瞬間、それは「次のセットの準備ができた」という意図のシグナルです。
- ユーザーがセット完了 → タイマー自動開始
- 休憩中...
- ユーザーが入力欄をタップ → タイマー自動停止
- 実測値を学習
タイマー停止ボタンは不要になりました。 ユーザーの「次やるぞ」という意図を検知して、自動で停止します。
実際に触ってみませんか? Smart Pre-fillとIntent-Based Timerは Attain で体験できます。コア機能は無料。
実測値から学習する
休憩時間の学習には中央値を使います。
過去5回の休憩時間: [90, 95, 180, 88, 92](180秒は電話が来た等の外れ値)
- 平均は109秒 ← 外れ値に引っ張られる
- 中央値は92秒 ← ユーザーの「普段」を反映
UI実装: フローティングタイマー
なぜ画面下部なのか
+-----------------------------------+| Header |+-----------------------------------+| Set Input Area |+-----------------------------------+| [Add Set Button] || +-------+ || | 2:30 | <-- Here || +-------+ |+-----------------------------------+- 視線移動が少なく、入力エリアと近い位置にある
- 親指が届く。片手操作でタップできる
- 入力の妨げにならないサイズなので邪魔にならない
最終セット検出
「3セットやる人」が3セット目を終えた時、タイマーは自動開始しません。
ロジック:
- セット完了時に何セット目かを確認
- 1-2セット目 → タイマー自動開始
- 3セット目 → 過去の履歴を確認
- 普段3セットで終わる → タイマー開始しない
- 普段4セット以上 → タイマー自動開始
ユーザーの「普段」を学習し、不要なタイマーを出さない。 これもSilent Learningの一例です。
結果: 操作回数の削減
| 操作 | Before | After |
|---|---|---|
| 重量入力 | 手動入力 | プリフィル済み |
| 回数入力 | 手動入力 | 手動入力 |
| 保存 | タップ必要 | タップ必要 |
| タイマー開始 | タップ必要 | 自動 |
| タイマー停止 | タップ必要 | 自動 |
5操作 → 2-3操作 に削減。
1回のワークアウトで50回以上の操作が25回以下に。この差が、継続率に直結します。
おわりに: 「設定画面は敗北」
ユーザーに設定を求めることは、開発者の怠慢です。 ユーザー自身も、最適な値を正確には把握していません。
| シナリオ | 設定画面アプローチ | Smart Defaultアプローチ |
|---|---|---|
| 休憩時間 | 種目別設定画面 | 前回の値を記憶 |
| 単位 | 設定で切り替え | 前回使った単位を維持 |
| 重量刻み | 選択画面 | よく使う刻み幅を学習 |
「設定してください」ではなく「覚えました」。
このUX設計を、React Native + TypeScriptで実装した筋トレ記録アプリ「Attain」を公開しています。
Attainを試す(無料)
この記事で紹介したZero Friction UXを、実際に体験してみませんか?
3つの特徴
- 操作回数を半減 - 1回のワークアウトで25回以上の操作を削減
- 設定画面ゼロ - 使うだけで学習し、最適化される
- PWA対応 - Webブラウザから即利用可能(iOS/Androidアプリは準備中)
すぐに始められます
- PWA対応 - Webブラウザからも利用可能
- コア機能は無料 - ワークアウト記録、Smart Pre-fill、Intent-Based Timer
※ 開発中のため、機能は今後変更される可能性があります。
質問・フィードバックは X (@paveg_) まで!