ハコヅミを作る #49:規約に「料理」が書かれていなかった(規約・データ・テストの見直し)

前回(#48)は、バグとセキュリティの観点でした。今回は、残りの3つです。

  • 利用規約・プライバシーポリシーを、実装と突き合わせる
  • データの出入り:預かる・見せる・書き出す・消す
  • テストの甘いところ

規約・ポリシーの観点

利用規約とプライバシーポリシーは、#36 で、実装と照らしながら書きました。それから2日しかたっていません。それでも、食い違いが 10 件ほど出てきました。

料理が、書かれていない

いちばんはっきりした食い違いが、これです。

規約の「サービスの内容」も、ポリシーの「預かる情報」も、「ギア、消耗品、コンテナ、プラン、キャンプ」のままでした。料理(名前、レシピ、参考の URL、食材)を預かっているのに、どちらにも書いていません。

料理を足したのは、規約を書いた翌日です。プロジェクトの決まりには、「預かる情報を変えたら、ポリシーの文も合わせて直す」と書いてあります。書いてあるのに、守れていませんでした。

決まりを文書に書いておくことと、それが守られることは、別の話です。気づける仕組みがない決まりは、忙しいときに落ちます。

幸い、規約もポリシーも、まだ誰にも同意してもらっていません。「改定」ではなく、制定の前の直しとして入れられました。

「すべて消える」と言い切っていた

規約と、退会の画面は、「退会すると、すべて消えます」と言い切っていました。ポリシーだけが、「障害のときにデータベースを戻すための記録には、最長 7 日のあいだ残ります」と書いています。

規約だけを読んだ人には、残るものがあると伝わりません。規約と退会の画面に、「しばらく残るものがあります。くわしくは、プライバシーポリシーに」と足しました。

テスタへの約束が、2通りに読める

ベータ版のテスタには、お礼を約束しています。募集の枠には、こう書いていました。

有料のプランを始めるときは、テスタの方は、始めた日から1年間、無料で使えます

指摘は、2つです。

  • 「1年たつと、料金がかかる」とも読める
  • 「始めた日」が、その人が使い始めた日とも読める

言いたかったのは、「有料のプランが始まった日から1年間、有料のプランをただで使える。そのあとは、申し込まないかぎり、無料のプランに戻るだけ」です。書いた側の頭の中では、1通りにしか読めませんでした。

トップページのテスタの募集の枠。「有料のプランが始まったら、テスタの方は、その日から1年間、有料のプランを無料で使えます(1年たったあとも、申し込まないかぎり、料金はかかりません)」などの箇条書きと、「テスタに応募する」のボタン

直したあとの募集の枠

「疑い」だけで、消せる書き方

凍結の項は、こう書いていました。

してはいけないことに当たることをしたとき、またはその疑いがあるとき、運営者は、前もって知らせずに、アカウントを凍結することや、登録内容を消すことができます

運営する側としては、持っておきたい権限です。ただ、読む人からすると、「疑いだけで、知らせずに消される」と読めます。

凍結は、疑いの段階でもできる。登録内容を消すのは、実際に当たることをしたときに限る。この2つに、文を分けました。

利用規約の「6. 利用の停止(凍結)」と「7. 退会」。凍結の項は、凍結できる場合の文と、登録内容を消せる場合の文に分かれていて、「疑いがあるだけでは、登録内容は消しません。」とある。退会の項には、「ただし、復元用の記録などに、しばらく残るものがあります。くわしくは、プライバシーポリシーに書いています。」とある

直したあとの利用規約(凍結と退会)

戻すと、退会した人が戻ってくる

推論から出てきた指摘が、1つありました。

データベースには、障害のときに、過去の時点へ戻す仕組みがあります。そして、ハコヅミは、「退会した人の記録は、残しません」と約束しています。

この2つを組み合わせると、困ったことが起きます。障害でデータベースを3日前に戻すと、その3日のあいだに退会した人のデータが、復活します。誰が退会したかの記録がないので、誰を消し直せばよいかが分かりません。

「記録を残さない」という、よかれと思った約束が、別の約束(「消えます」)を守れなくしていました。

直し方は、退会した人を見分ける番号と、退会した日時だけを、戻せる期間(7 日)のあいだ残すことにしました。戻したときに、その一覧で消し直します。ポリシーの文も、合わせて直します。


データの出入りの観点

全部のテーブル(18 個)について、「預かる → 見せる → 書き出す → 消す」がそろっているかを、表にしてもらいました。テーブルの抜けは、ありませんでした。ほかの人のものが混ざる経路も、ありません。

見つかったのは、「これから落としそうなところ」です。

約束したのに、消す手段がなかった

規約の凍結の項に、こう書いてあります。

データの削除を希望するときは、お問い合わせフォームから連絡してください

ところが、連絡を受けたときに消す手段が、ありませんでした。

消す処理を呼べるのは、本人の退会の画面だけです。凍結された人は、その画面に届きません。データベースのコンソールで、その人の行を手で消すと、ギアやキャンプの行と画像が、持ち主のいないまま残ります。どの画面にも出ないので、残ったことにも気づけません。

規約を書いたときは、「人が対応する」で済むと考えていました。その「対応」の中身を、誰も確かめていませんでした。管理画面に、凍結された人のアカウントを消すボタンを足すことにしています。

気づく仕組みが、途中までだった

退会とエクスポートには、「テーブルを足したら、足し忘れに気づける」仕組みを入れてありました(#30)。テーブルの一覧に足すと、型が合わなくなって、エラーになります。

この仕組みが、途中までしか効いていませんでした。

  • 退会:消す文の「まとまり」には、型の守りがある。ところが、実際に流すところは、1つずつ手で並べていた。まとまりに足して、流すところに足し忘れると、型は通って、そのテーブルは消えない
  • エクスポート:気づけるのは、テーブルの足し忘れまで。列を足したときは、黙って抜ける。実際に、キャンプの列が1つ抜けていた

「気づける仕組みを入れた」と安心していた場所です。仕組みがどこまで効いているかは、入れた本人には見えにくいものでした。

置き去りの画像

ログインを入れる前、利用者は固定の1人(owner)でした。そのときのデータは、マイグレーションで消しています。SQL のコメントに、「画像は残る(必要なら人が消す)」と書いてありました。

消したかどうかの記録が、ありません。見に行くと、開発環境にも本番にも、そのフォルダが残っていました。消しました。

「あとで人が消す」と書いたものは、たいてい消されません。


テストの観点

前回、守りのテストの空振りが見つかりました。そこで、頼み方の文に、一言足しています。

「断られること(404・403・400)だけを見ているテスト」を全部挙げて、断られた理由が、
テストの名前の言っている理由と同じかを確かめてほしい。

1つ見つかった種類の問題を、次の観点で、全体に広げて探してもらう形です。

結果は、こうでした。画面を通さずに送っている約 75 か所を、全部の処理の名前と照らして、空振りは、前回の3つだけ。ほかは、名前どおりの理由で断られていました。

悪い知らせを探しに行って、「ほかにはなかった」と分かるのも、大事な結果です。

方針に書いてあるのに、1つもなかった

もっと大きな指摘が、別にありました。

プロジェクトの方針には、テストを3段に分けると書いてあります。

種類 書いてあること 実際
ユニット 計算・判定のロジック ある
結合 サーバーの処理とデータベースを、つないで確かめる 1つもない。そのための道具も、入っていない
E2E 主要な画面操作の流れ ある

結合テストは、最初に方針を書いたときに「やる」と決めて、そのまま一度も書いていませんでした。データベースを触る処理は、E2E を通してだけ確かめています。

ふつうの動きは、E2E で見られています。足りないのは、E2E では作れない場面です。途中で失敗したとき、同時に2つ送ったとき。前回の「直さない」と決めた指摘の多くが、ちょうどこの場面でした。

今すぐ足すかどうかを、考えました。新しい道具と設定が要るので、ベータ版の前に入れる重さではありません。今は、方針の文を、実際に合わせることにしました。「結合テストは、今は入れていない。途中の失敗と、同時の送信は、確かめていない」と書きます。入れるかどうかは、一般に公開する前に決めます。

やっていないことを、やっていると書いたままにするのが、いちばんよくありません。


何度も出てきたもの

5つの観点を通して、同じ種類の指摘が、何度も出てきました。

書いてあったこと 実際
上限は、同時に送ると「1件だけ」超えることがある 同時に送った数だけ、超えられる
預かるのは、ギア・消耗品・コンテナ・プラン・キャンプ 料理も預かっている
ほかの人のデータを変えられないことを、テストで確かめている 一部は、何も確かめていなかった
サーバーの処理は、結合テストで確かめる 結合テストは、1つもない
削除を希望するときは、連絡してください 消す手段がない

どれも、「書いてあること」と「実際」のずれです。

コードの不具合は、動かせば見つかります。文書とコードのずれは、動かしても見つかりません。両方を読んで、比べた人だけが気づきます。そして、作っている本人は、文書を「自分が書いたとおりのはず」と思って読みます。

外の目がいちばん効いたのは、ここでした。


おわりに

  • 規約と実装は、書いた2日後でも、もうずれている。「変えたら直す」という決まりだけでは、落ちる
  • よかれと思った約束(記録を残さない)が、別の約束(消える)を守れなくすることがある
  • 「人が対応する」と書いたら、その対応が本当にできるかを、確かめる
  • 気づく仕組みは、どこまで効いているかを、外から見てもらう
  • 1つ見つかった種類の問題は、次の見直しで、全体に広げて探す
  • やっていないことは、やっていないと書く

次回は、見つかったものを直します。数が多いので、まとめて進めようとして、つまずきました。

← トップページに戻る