はじめに
はじめまして。
Ruby on Rails を中心に学習している さとう です。
今回は
「毎日できなくてもいい。行動をゼロにしない」
をコンセプトにした習慣管理アプリ Step Log を個人開発しました。
この記事では、
なぜ「毎日」を捨てたのか
そしてそれを どう仕様・設計・実装に落としたのか を中心に書いています。
※ 技術的な内容も出てきますが、
「なぜそう考えたか」を重視して書いています。
サービスはこちら
GitHubリポジトリ
なぜ「毎日」という前提を捨てたのか
習慣化において最大の敵は、
一度できなかっただけで「自分はダメだ」と感じてしまう 完璧主義 だと思っています。
私自身、
- 毎日やれなかった日を「失敗」と捉えてしまう
- 罪悪感が強くなり、再開する気力がなくなる
- 結果、習慣そのものを諦めてしまう
という経験を何度も繰り返してきました。
転機になったのは、
「毎日やる」ことを目標にするのをやめたことです。
- 週に数日でもいいから続ける
- できなかった日を責めない
- 行動をゼロにしない
この考え方に切り替えた結果、
- 食事改善を「週に数日」から始め、4ヶ月で5kg減量
- 資格学習の過去問正解率が 約3割 → 6割以上に向上
という成果が出ました。
この経験から、
毎日できていなくても、
再開しやすい状態を保てていれば、それは習慣化のプロセスである
と考えるようになり、
この思想をそのまま形にしたのが Step Log です。
UXの思想を、どう仕様に落としたか
「続ける」より「再開できる」を優先する
多くの習慣管理アプリは「連続記録(ストリーク)」を重視しています。
しかしこれは、挫折した人にとって 再開を妨げる負債 になりがちです。
Step Log では、あえて次のような仕様にしました。
- 記録がない日を「失敗」と見なさない
- できた日だけを肯定する
- 連続性より「積み上げ」を重視する
習慣は「1件だけ」に限定する
複数の習慣を同時に管理すると、
結局すべて中途半端になって挫折しやすくなります。
そこで Step Log では、
- 1ユーザー1習慣のみ
- 「まずは一つを大切にする」体験に集中
という割り切った仕様にしました。
Rails ではルーティングに resource :habit(単数形)を採用し、
思想をコード構造そのものに反映しています。
記録は3択。「お休み」も肯定する
行動記録は以下の3択です。
- できた
- 少しだけ
- お休み
「お休み」を選んだ場合でも、
否定的な扱いはせず、肯定的なメッセージを表示します。
また、累計日数のカウントからは除外することで、
連続記録のプレッシャーを生まない設計にしています。
設計思想を「壊れない形」で守る
DB制約で「1日1記録」を物理的に保証
「1日1記録」という仕様を守るため、
- Rails のバリデーション
- DB レベルでの複合ユニーク制約
(habit_id × recorded_on)
を両方設定しています。
アプリケーション側の実装ミスがあっても、
データとして壊れない ことを重視しました。
「未来に落ちない」テストを書く
日付に依存する処理は、
実行するタイミングによってテストが壊れがちです。
そこで ActiveSupport::Testing::TimeHelpers を使い、
時間を固定した状態で RSpec を書いています。
これにより、
- 今日実行しても
- 数ヶ月後に実行しても
同じ結果が得られるテストになっています。
作ってみて学んだこと
今回の個人開発で一番学びが大きかったのは、
思想は、仕様にしないと簡単に崩れる
ということでした。
- 仕様に落とさなければ、ただの気持ちで終わる
- 実装に落とさなければ、簡単にブレる
- DB制約やテストが、最後の砦になる
「優しさ」や「再開しやすさ」も、
きちんと設計すればコードで守れると実感しました。
おわりに
「完璧であること」よりも
「ゼロにしないこと」。
Step Log が、
挫折しやすい誰かの 再開のきっかけ になれば嬉しいです。
最後まで読んでいただき、ありがとうございました。
