🎃

【開発日誌 Day6】「送ったら消える」を3ヶ月半信じて、間違えていた──送信に2秒の取り消しを足す

に公開

3ヶ月半前のDay2で、僕は「送信ボタンを押した瞬間に画面がクリアされる」設計を、ちょっとした手柄のように書いた。今日はその設計を、自分で覆す話を書く。結論から言うと、あの即時クリアには取り消しがなかった。そしてその取り消しを誰より欲しがっていたのは、ユーザーではなく自分だった。

TL;DR

  • Day2で「送信=即クリア=不可逆」を気持ちよさ優先で設計した。これは間違いだった
  • Day5で6週間ぶんの自分のメモを読み返したら、「誤送信」「さっきのやつもう一回」系の自分宛てメモが9通あった
  • 送信直後の2秒だけ取り消せる窓を足した。確定送信を2秒遅らせるだけで、体感のTime-to-Textは0msのまま保てた

何を「正しい」と思い込んでいたか

Day2の「送信ボタンを押した"あと"の体験を、全部設計し直した」で、僕はこう書いた。送信ボタンを押す、画面がクリアされる、メモがメールで届く——この一連を一切の確認なしで通すのがCaptioらしさだ、と。「本当に送信しますか?」の一言が書き捨ての速度を殺す、確認ダイアログは敵だ、と。

ここまでは今でも正しいと思っている。間違っていたのはその次だ。僕は「確認をなくす」と「取り消しをなくす」を同じことだと勘違いしていた。確認は事前の摩擦で、取り消しは事後の保険だ。前者は速度を殺すが、後者は殺さない。両者を一緒くたにして、保険のほうまで一緒に捨ててしまった。

間違いは自分のメールボックスに残っていた

Day5で6週間ぶんの自分宛てメモを読み返したとき、妙なメモが何度も出てきた。「さっきのメモ、書きかけで送った」「○○の続き(さっきのやつ)」「誤爆」。数えたら9通あった。全部、自分が自分に宛てた“やり直し”の痕跡だった。

メモアプリの誤送信なんて笑い話だと思っていた。宛先は自分なのだから、間違えようがない。でも誤送信は宛先の問題ではなかった。「まだ書き終わっていないのに指が送信を押した」「送った直後に追記を思いついた」——この2つが、即時クリアでは救えなかった。画面はもう空っぽで、さっきの文章は自分のメールの中にしかない。開き直すしかない。その手間こそが、僕が9回くりかえした“やり直し”の正体だった。

取り消せる即時性:操作の結果を即座に画面へ反映しつつ、ごく短い時間だけ、その結果を“なかったこと”にできる状態を残す設計。即時性と可逆性はトレードオフではない。時間軸を少しずらせば、両方とも手に入る。

2秒だけ、送信を遅らせる

直した内容はシンプルだ。送信ボタンを押した瞬間に画面をクリアするのは変えない。変えたのは裏側で、実際のWorker呼び出しを2秒だけ遅延させ、その2秒のあいだ画面下に「取り消し」を出す。2秒待って何も起きなければ暗号化して送信を確定する。取り消されたら、メモを編集画面に戻す。

実装の勘所は3つだった。

  1. 楽観的UI:画面のクリアと実送信を切り離す。ユーザーが見る「送れた」と、サーバーに届く「送った」を別のタイミングにする
  2. 遅延中のキャンセル:UndoManagerに丸投げせず、2秒のタイマーと保留中ペイロードを1件だけ持つ軽い仕組みにした。保留は常に最新の1件だけ。連続送信しても破綻しない
  3. E2Eは触らない:暗号化のタイミングを送信確定時に寄せただけで、平文が端末の外に出ない設計は1行も変えていない

GmailのUndo Sendと発想は同じだ。新しくはない。むしろ「メールの世界では当たり前にある仕組みを、自分は3ヶ月も自分のアプリから外していた」という事実のほうが、書いていて恥ずかしい。UndoManagerの存在は知っていたのに、「シンプルなアプリに取り消しは過剰だ」という思い込みで、検討すらしなかった。

速度は犠牲になっていない

気になるのは「2秒遅らせたら遅くなったのでは」だろう。ならなかった。ユーザーが体感する速度は、送信ボタンから画面クリアまでの時間——以前から僕がTime-to-Textと呼んできた数値——で決まる。これは0msのまま、つまり即時だ。遅れたのは「サーバーに本当に届くまで」で、書き捨てる人はその瞬間を見ていない。見えない2秒は、体感速度を1msも悪くしなかった。

逆に、見える2秒は邪魔になる。だから取り消しのバーは徹底して控えめにした。色も音もなし、触覚フィードバックもなし。ただ2秒だけそこにいて、何もされなければ静かに消える。取り消しは保険であって主役ではない、という線をUIでも引いた。

次に間違えそうなところ

正直に書いておく。次に僕が間違えそうなのは、この2秒を「もっと長くしたくなる」ことだ。5秒にすれば誤送信はさらに減る。でもそれは即時性そのものをじわじわ殺す方向で、確認ダイアログを別の形で復活させるのと変わらない。猶予は短いほどいい、という逆詬に、僕はまだ確信を持てていない。3秒を試して、結局2秒に戻すかもしれない。そのときはまた「間違えていた」と書く。

次回は、この取り消し窓をオフライン時にどう振る舞わせるか——電波がないあいだの「保留中の1件」をどこに置くか、という設計の話を書くつもりだ。

書いて、タップして、自分に送る。その一連に、初めて“戻る”を足した記録でした。

SimpleMemo(メモしてタップ、すぐにメールが届く):https://simplememofast.com/

Discussion