-
-
Speaker 2
じゃあ、このエピソードを聞いて、べきとうせい完全に理解したよーって人は買って、周りのプロダクトマネジャーに。
Speaker 1
一万円してください。
一万円してください。
え、それなんて読むの?って聞かれますから。
Speaker 2
べきとうせいですとやーって。
Speaker 1
マウント。
Speaker 2
マウント取ります。
で、みちらさんは、え、それべきとうせい大事じゃないですかって、エンジニアに言います。
Speaker 1
あー、そうね。
確かに最近、そう、最近もね、自分が担当しているプロダクトでべきとうせい、マジ大事みたいな話があったんですけど、うわ、出たよってなりました。
なんやねんべきとうせいって。
Speaker 2
なんか前々からみちらさんが、なんか再現性との違いなんやねんっていう話をしてたんで。
そうですね、そう。
Speaker 1
それは、そうなんですよ。
Speaker 2
それを軸にして、なんかいろんな現実世界の例を使いつつ。
Speaker 1
あー、そうですね。それが聞きたいかも。
Speaker 2
やっていく感じにしようかなと思います。
だから、あんまりコンピューターの話は出てこない。
Speaker 1
あ、そうなんだ。ありがたいですね。
Speaker 2
ありがたいですね。
Speaker 1
なんで再現性との違いがわからんかっていうと、そのべきとうせいってなんですかって聞いたときの、こういうものですっていう、その抽象化された回答は、それは再現性も一緒だろみたいなことを言っているからわからないんですよ。
Speaker 2
はいはいはい。
Speaker 1
なので、ちょっと一旦そのべきとうせいとは何ですかという質問に答えてもらっていいですか。
Speaker 2
はい。べきとうせいは、例えばある操作を何回やっても得られるもの。
ここで最終的な状態って呼ぶんですけど、それが何回繰り返しても、その1回目の動作と変わらない。
だから、N回やったからといって、N回変わったりしないっていう性質のことです。
なんでミスって、これ本当は1回だけでいいのに、10回操作しちゃったっていうときに、その10回にならずに1回になる性質がべきとうせいです。
Speaker 1
その後半のやつは、今初めて聞いた言葉なんですけど、その10回やってもと1回やってものやつは、初めて聞いた解説ですが、前半部分は再現性でも同じ説明が成立しますよねって思ってるという感じですね。
Speaker 2
はい。じゃあこれ、こっからしないですよっていう説明を。
はい。
ちなみに、そのべきとうせいの話したんで、再現性はそもそもどういう定義なのかっていう話をすると、
同じ条件とか同じ手順である操作を行ったときに、毎回結果が同じになることの性質を再現性っていうふうに言います。
Speaker 1
今のさっきのべきとうせいとの説明の差分は?
Speaker 2
べきとうせいは、同じ操作何回やっても最終的な状態は初回の1回だけ。10回やってもその操作を1回だけやったことになるのがべきとうせい。
Speaker 1
へー、なるほどね。
Speaker 2
再現性は、
Speaker 1
再現性は、1回目をいっぱいやったときに全部1回目の結果になること?
あー、そうですね。
あー、なるほど。確かにそれは若干違うかもしれない。
Speaker 2
そう。
Speaker 1
でもずっと、例がもうちょっと聞きたい気もする。
Speaker 2
そうですね。なんでちょっと、もう1回なんか性質と具体例を整理すると、性質的には再現性は、ここでちょっとコンピュータチックに言うと、
同じ入力に対して常に同じ出力が得られますっていうのが再現性です。
たぶん1と1を入力して足し算だったら常に2が返ってくる。たまに3になったりしない。
Speaker 1
うん。
Speaker 2
これが再現性ですよね。
うん。
で、べきとうせいは同じ操作を何回実行しても、ここが何か再現性にない概念が出てくるんですけど、
状態が最初と変わらないっていう。
Speaker 1
何も分からなくなった。最初って何の?
Speaker 2
あ、その状態っていうものが出てきたんで、再現性とのここが一番違い。
Speaker 1
はい。
Speaker 2
まあ置いておこう。
はい。
じゃあそうですね、ちょっとみちるださんの、なんかよく使われるのが、
なんか照明とかエアコンのオンオフな話とかなんですけど、みちるださんの、
みちるださん多分あの照明とかエアコン普段使わないと思うんで、
Speaker 1
なんで?
Speaker 2
もっと身近な話を言うと、例えばサブスク何かしら使ってますよね。
Speaker 1
はい。
Speaker 2
例えばSpotify、Spotify大好きのみちるださんが、
ちょっと話簡単にするために毎月1000円だとしましょう。Spotify。
で、Spotifyのサブスクの引き落としに対して再現性があるっていうのは、
つまりどういうことかっていうと、
決済されたら1000円が引き落とされるっていうのが再現性で、
2回目になったら1001円になったり999円に毎回なんかランダムになったりしないっていう、
サブスクは常に1000円で引き落とされるみたいなのが再現性ですと。
Speaker 1
それ、今のはめっちゃわかりやすい気がします。
なるほど。
それを状態って、状態の変化って捉える?
そうなんですよ。ステートとかで言いますね。
Speaker 2
大学とかだと、ステートマシンっていう図を書いたりして、
Speaker 1
ABCみたいなこの丸を書いて、そっからどの操作によって、どの状態からどの状態に移るのかみたいなのを書いたりしますね。
で、この操作は適当性を持たせたい操作とか状態変化みたいなのを定義するみたいな感じ?
Speaker 2
そうですね。結構、システム開発にかなり寄ってるんで、そこのステートマシン図上で、ここは適当性あるみたいなのはあんま聞いたことないけど。
そうなんだ。
Speaker 1
じゃあ、いつ適当性について考えるんですか?実装するとき?
Speaker 2
実装、えーと、なんだろうな。
Speaker 1
設計の段階で欲しいってなる?
Speaker 2
そうですそうです。設計の段階で欲しいっていう風になります。
例えば、そうだな。じゃあ、なんか現実世界の例はもう良さそうだから。
Speaker 1
たぶん。
Speaker 2
ちょっとなんか、オンラインショッピングってよくある。
Speaker 1
はい。
Speaker 2
で、例えばですけど、アマゾンとかでカートに物詰めて、ポチポチっと押して最終的に決済するっていう風なやつあるじゃないですか。
Speaker 1
はい。
Speaker 2
そこで、えっと、ここの決済するっていうボタンを押したら、たまにミテラさんの家の電気がついたりすることなく、普通に決済が走る。
Speaker 1
はい。
Speaker 2
たまにミテラさんの家の電気がチカチカするったりする行動にならないっていう点で、それは再現性がある行動っていうか仕組みなんですよ。
うん。
はい。
で、さっきの例とあんまり違わないからわかると思いますけど、ここに適当性が欠けてると、ユーザーが10回クリックしたら10回決済されちゃうっていう問題なんですよね。
で、ここで適当性を導入すると、ユーザーはあるカートの中身を何回決済しようと、最終的にユーザーに決済されるのは一度きりっていうのが、適当性になります。
なるほど。
なので、これは重要層ですよね。
Speaker 1
適当性がある状態にするっていうのが正しい日本語ですか?
適当性を担保する。
Speaker 2
そうですね。どの言い方でもいけると思います。
適当性を持たせるとか。
Speaker 1
さっきの適当性を持たせようと思ったら、ボタンのクリックじゃなくて、どのIDの商品を交流ステータスにしたかを見て請求内容を決めるとかってすると、適当性が保てるみたいな感じなのか。
Speaker 2
なので、システム開発だと、適当性を考えずに、とりあえず来たら何でもやりますっていうふうにしちゃうと、結構大変なことになることが往々にしてありますね。
Speaker 1
適当性って保とうと思って保ちきれるんですか?なんか99%適当みたいな感じになりますか?
すごいね。
さっきのやつも、例えばIDが同じ時間にいっぱい掲載されたらやらないとかって、できるなって素人なりに思ったんですけど、
Speaker 2
でもそれだと時間がちょっとずれたりとかしてたら重複掲載されちゃうなと思って、やり方次第なのか、そういうもんなのかみたいなのを知りたいなと思いました。
結構、場合場合によって結構やり方はいろいろあります。
例えば、めっちゃ簡単な例で言うと、
例えばカードポチッと押した瞬間に、その瞬間に例えばユニークなIDを渡してあげて、
例えば整理番号みたいなのを渡してあげて、1番目みたいな。
今回の購入の整理番号。
で、決済をするときには、その番号札を常にもらうようにする。
そしたら、2回目来たら、あんたもう決済してるよっていうふうにできたりする。
すっごい簡単に言うと、なんかそういう感じで保つんですけど、そうですね。
Speaker 1
じゃあ、基本は100%になることを目指すんですか?
Speaker 2
目指しますね。
Speaker 1
目指す、達成するんではなく目指すんですか?
Speaker 2
そうですね、基本的にはいけるはずだけど、
そうですね、いけます。
けど、けどっていうか、その適当性が大事なんで、
コンピューターの世界で絶対に1回だけこれを実行してねっていうのはめっちゃ難しいんですよ。
Speaker 1
へー、なんで?
Speaker 2
そのExactly OnceとAt Least Onceっていうのがあるんですけど、
なんか1回だけ、絶対1回だけここの、なんだろう、
エンドポイントっていうのが難しい。APIを叩いてくださいっていうのはめちゃくちゃ難しいんですよね。
Speaker 1
へー。
Speaker 2
なんだろうな。
例えばそのAmazonとかのカートの例でも、それはもう普通に無理だなっていうのがわかるじゃないですか。
例えば、その例だとユーザーが2回クリックしたら、もう2回叩かれるから、
普通にノーガードの状態でいたら、決済2回走っちゃいます。
で、そのために適当性を持たせたら、同じ操作が何回されても1回だけ決済されるっていうふうにできます。
なんで、他にもさっき言ったような、Exactly OnceとかAt Least Onceっていうのがあって、
そのAt Least Onceは、これ説明するの無理だな。
少なくとも1回みたいな。
こっちは結構簡単なんですよ。
少なくとも1回叩いてね。1回読んでねっていうのはいいんですけど、
Exactly Onceってめちゃむずいんですよ。
Speaker 1
本当に1回だけ。
Speaker 2
本当に1回だけ叩いてください。
Speaker 1
へー。
Speaker 2
で、なんで、例えば、At Least Onceの世界で生きていくためには、絶対に自分に適当性が必要なんですよね。
少なくとも1回だったら、100回叩かれる可能性もあるじゃないですか。
Speaker 1
まあ、そうね。1回以上だからね。
Speaker 2
そうそうそうそう。
だから、その世界だと、自分が適当性前提のシステムにならざるを得ない。
そうしないと、例えば、あるユーザーに通知を送りますみたいな。
Speaker 1
あー、あれか。その100%が難しいっていうのは、全てのものに対して適当性を持たせるのは大変という意味。
Speaker 2
適当性を持たせて決めたものについては、基本100%でやるっていうことか。
できなかったら、バグか、すっげー難しい特有のケースがあるかっていう感じですね。
Speaker 2
1位なキーみたいなやつを、よく適当にするためのキーっていう意味で、アイデンポテンシーキーみたいな名前するんで。
Speaker 1
そうなんだ。
Speaker 2
その時にも、例えば、アイデンポテンシーキーをどうやって、どういうアイデンポテンシーキーにするかっていうのは結構重要なんですよ。
Speaker 1
そうですね。
アイデンポテンシーキーとしてだけ使うのかどうかとかもありますか?
アイデンポテンシーキーって、もうその適当にするためだけに使う?
Speaker 2
その単位だとそうですね。
Speaker 1
そうなんだ。
さっきの購入整理番号だったら普通に、なんか購入のIDみたいな感じでも使えちゃいそうだなと思ったが。
Speaker 2
その場合なんか、アイデンポテンシーキーをもとに、別のシステムがもっとランダムなIDを生成してみたいなケースもありますね。
Speaker 1
なるほど。
Speaker 2
1番みたいなの出したら、はい、これあなたのID。
そういうランダムなIDの場合もあるし、逆にランダムなIDだと難しいケースもあって、保存しないと難しいケースがあって。
例えばさっきのSpotifyの引き落としみたいなの。
うん。
もっと簡単にアイデンポテンシーキーを作ることができて、
例えばシンプルに、みちるださんのユーザーのIDと、
例えば2025年2月分みたいなのをこうやってくっつけて、アイデンポテンシーキーにすれば、
Speaker 1
確かに確かに。
Speaker 2
そうそうそう。
Speaker 1
それに対して消せば1回ですよっていうふうにできます。
Speaker 2
それをランダムにしちゃうと、みちるださんの2月分に紐づいてる謎のランダムのキーはこれだからっていうふうに、
データベースとか保存して、1回作っておかないといけないから、
そういうアイデンポテンシーキーにすると便利。
Speaker 1
ちょっと専用のキー作るのはトゥマチだなみたいな。
Speaker 2
そうそう。
Speaker 1
時があるよって。
Speaker 2
そうそう。
で、決済システムとかは、そういうアイデンポテンシーキーとかをサポートしてたりするんで、
みちるだ2025年2月分みたいなやつを何回送っても、1回しか決済されないという感じですね。
Speaker 1
なるほど。
でもなんかめっちゃ大事というか、安心してインターネット決済できてるのは、
ビクトセのおかげでしかない。
そうですね。
信頼します。
Speaker 2
これは送る側がバカになれるんですよ。
例えば3回、4回、5回送っちゃうっていうのはちょっとバカすぎるけど、
例えばその時に一時的に障害が起こって、
1回決済投げたんだけど失敗しましたみたいなエラーが返ってきた時に、
失敗したんだと思って、もう1回決済お願いしますってやるじゃないですか。
その時にベクトー性があったら、もし失敗したって言い張ってても、
システムの中ちゃんと見たら成功してたわみたいなパターンも大々にしてあるんですよ。
その時もベクトー性あったから、
さっき失敗したって言ったけど、本当は成功しましたわって、
成功の結果を返せるんですよね。
もしベクトー性なかったら、さっきと同じように、
Speaker 1
二重で決済されちゃうっていう。
Speaker 2
ベクトー性は大事なんです。