アカウント削除機能に意味はない

Webサービスでアカウント削除機能を要求するユーザの話はよく聞くわけですが、これには残念ながら全く意味が無いと、1Webエンジニアであるぼくは思っているのですが、その理由をだらだらと書いてみようと思います。非エンジニアでも分かるように書いたつもりですが、作者が特にそういう能力に秀でているわけでもないので難しいかもしれません。

## 技術的な問題
現代の多くのWebサービスはデータの保存をRDB(SQL)に依存しています。これには色々特徴があるわけですが、実際の実装を想定して説明していきましょう。

ユーザがいます。ここではUserというTableとしましょう。RDBで定義したTableは同じ形式の物を沢山保存することができます。なので、作られた沢山のUserは1箇所のTableに纏めて配置されます。

Twitterみたいなサービスを想像すると、ここでTweetできる必要がありますね。TweetはTweetという名前のTableに保存するとしましょう。本文とかつぶやいた日時とかはTweetというTableに纏めて保存されます。このTweetというTableには当然全てのTweetが記録されています。誰が呟いたのかの情報が必要です。なのでUserIdというものを配置します。UserIdはUserを数値化したりしたもので、何故Userを数値にするかというと検索しやすくするためと、同じ名前のユーザがいたりしたら困るからですね。

Tweetは当然誰かが呟くものなのでUserIdは必須にしてRDBの機能で外部キー制約というものを付けましょう。これを付けるとTweetからUserを辿ることが必ずできるようになります。便利ですね!

さて、この状態からUserを削除しましょう。このとき正しい挙動はどれでしょうか。

- その人のTweetが存在し、外部キー制約違反になってしまうのでエラーになる
- Userを消すとその人がしたTweetも消える

これは「外部キー制約のときにした設定による」というのが解になります、少なくともUserのみを消すことは「できません」。外部キー制約はTweetからUserを引けることを保証するからです。従ってUserを完全に削除したい場合はTweetも消えるということになります。これが問題になる話はあとでします。

外部キー制約付けると削除しづらい気がしてきました。では付けるのをやめましょうか。そうすると「誰がツイートしたか分からない謎のツイート」が登場することになります。

これはプログラミング的に実にやっかいな代物です。TweetからUserを引くとNULLが返ってくることになるからです。NULLになることを想定していないコードが沢山エラーになることが予想されます。みんな大好きNullPointerExceptionですね。プログラマはみんな嫌いなんですけど。

面倒くさいとかいいだろ、プログラマちゃんと働け、という意見もごもっともなので、ここでは1案ということにしておきましょう。後でちゃんと否定しておきます。

ただ人類とエンジニアはもうちょっと賢いのでもう1つの案を提示します。つまり「削除しておいたことにする」です。先程のUserを削除する代わりにdeletedというフラグを用意します。これがtrueになっていると、プログラム側が「まるでそれが無かったかのように」振る舞うようにコードを書きます。キチンと設計されてればまあ上手く動きます。DB的には存在しているので外部キー制約も問題ありません。ただうまくやらないと消したユーザがウッカリ表示されてしまったりします。当然ですね。でもNullPointerExceptionよりはマシかな？とぼくなんかは思ってしまいますね。一応なんか表示されますからね。

でもこれ、分かるようにDBにはキッチリ残っているので、運営が覗こうと思えば覗けます。バグがあると他の人にも見えます。こわい。アカウント削除機能を求める人間は、きっとそのサービスから自分の痕跡を消したいと思っているはずなのであんま意味ないですね。まぁでもとりあえず1案ということにしておきましょう。削除した「風に」見せることはできるので。

## 運営の話
### 仕様の話
さて、先程例で出てきたTweetするサービスはヒットしたとしましょう。ヒットすれば、エンジニアを張り付けて色々な機能を追加したりすることになるでしょう。

たとえばTweetで犯行予告するとかそういう、すごい悪いことするやつが出てきたとしましょう。流行ったサービスでは良くある話です。で、警察に通報がいき、運営にもデータの提出が求められたりします。社会的にはそれに応じる必要があると思っているので提出しようとします。ところがアカウント削除機能でUserが消えてるとどうでしょう。我々がバラ撒いた犯行予告はなんと犯人によって消されているではありませんか!我々は警察による求めに対して「いやあ、犯人がアカウント消してしまったので分かりません」と答えるわけです、とても反社会的なサービスだとおもいませんか？これまずくない？

別の例で言えば課金サービスみたいなものがあるとするじゃないですか。当然内部に支払いログみたいなのが残ってるわけですが、Userを消してしまって同時に支払いログが消えてしまったりしたら、この手元にある売上がどこから来たのか分からなくならないですか。それ国税庁に怒られが発生しますよ多分。いやまあ奴ら半年前の記録普通にロストしたりしてるし別にいいんじゃねーのって思ったりしますけど、誰から幾らもらったかの記録は7年保存する義務があるんですよね。あいつらは半年でロストするけど。

以上は必須な項目なんですけど、「アカウント間違えて消してしまったから復帰したい」みたいなのありそうじゃないですか。あとアカウント削除したユーザの傾向を知りたいとかで調査するとかする可能性もあったりとか考えると、

- Userを消し関連データも全消し→×
- Userを消し関連データはNULL許容→△
- 削除フラグ→○

ってな感じになってきますね。俄然削除フラグ良さそうな気がします。

ただやはり個人情報みたいな必要の薄い上にコンプラ的にも問題がありそうなのは削除する優先度が高いので、今のところのベストは削除フラグに加えて既存機能への影響とコンプラやユーザの心象を考慮しつつ必要なデータを選んで削除するのが理想というところでしょうか。とてもしんどそうですね。

### マネーの話
Webサービスの運営会社は殆どの場合民間企業なので、最終的には売り上げを立てねばなりません。雇ってる優秀だったり無能だったりするエンジニアもタダじゃないですからね。そして当然ながら開発リソースは有限です。限られた開発資源を必要なものに投資しないといけません。

さて、アカウント削除機能、エンジニアに要求するタイミングは何時でしょうか。リリース前？素晴しい。先見の明があります。が、流行るかも分からんWebサービスのアカウント削除機能を付けてる暇があったらヒットする可能性が少しでも上がる機能を付けたいですね。そも先まで延々と技術的に難しい点をずらずら並べてきたように難しい上に手間が掛かるんですよアカウント削除機能。優秀な方のエンジニアじゃないと難しいと思ってるんですよね。優秀なエンジニアを数週間張り付けるの？ヒットするかも分からんWebサービスのアカウント削除機能に？マジ？ヒットして人員増強して苦情が増えてきたあたりで対応しよう、と考えるのが普通だと思ってしまうんですよね…ぼくは…。

## ユーザが本当に必要だったもの
さて、そもそも考え直して欲しいんですが「なんでユーザってアカウント削除機能欲しいの？」っていうことなんですよ。ぼくが思うにいくつかあります。

- 自分に関する痕跡を残らず消して欲しい
- メールとかの連絡(特にスパムっぽいの)受け取りたくない
- 課金とかを全部お手軽に止めたい

まず1つめなんですが、殆どのサービスで痕跡を残らず消すのは「不可能」な場合が殆どです。なのでこれは「ごめんなさい」と言うしかないと思います。

んで2つ目3つ目なんですが、これは解決が可能です。「メール全部止める」「課金全部やめる」みたいなボタンをそこそこ分かりやすいところに付けておけばいいだけの話です。アカウント削除機能より遥かに簡単です。

そもそもアカウント削除機能が無くて炎上したりするサービス、自分に不利益があるが機能上必須なものを、反社会的なレベルまでに隠したり面倒くさくしたりするサービス多くないですか？そういう魂胆が一番クソなのでそういうところをきちんとdisっていこう、という気持ちがあります。

## まとめ
### Toエンジニア
- 削除機能を要求されたら理由を根堀り葉掘り聞け
- 「メール全部止める」「課金全部やめる」系機能を提案しろ
- それでもだめなら反社会的組織なので転職しろ

### Toユーザ
- アカウント削除という幻想を捨てろ
- スパム送ってくる・課金の終了が難しい点を積極的にdisれ