アインシュタインの思考実験が、私の開発中アプリの「隠れたバグ」を言い当てた話

私はエンジニアではない。プログラミングは個人開発として独学で触っている初学者だ。だからこの話は「物理に詳しい技術者が応用しました」という賢い話ではない。むしろ逆で、開発とは全然関係ない好奇心から入った寄り道が、気づいたら開発の一番大事なところに届いていた、という話だ。

Contents

きっかけは「子どもに説明したい」だった

最初の入り口は開発ですらなかった。アインシュタインの思考実験を、小学生にも分かるように説明できないか——ただそれだけの興味から調べ始めた。光を追いかけたらどう見えるか、走る電車の前後に落ちた雷は誰にとって「同時」なのか、落ちるエレベーターの中では重力と無重力を区別できるのか。こういう話を、たとえ話で噛み砕いていた。

その中の1つ、「動く電車と雷」の話が妙に頭に残った。線路わきに立つ人には2つの雷が同時に見えるのに、走る電車の真ん中にいる人には前の雷が先に見える。つまり「同時」も「今」も、見る人の立場によって違う——という話だ。電車という題材が、たまたま自分が開発しているアプリと同じだったせいかもしれない。

「これ、自分のアプリに関係あるんじゃないか」

私はいま、電車が遅延したときに「待つべきか、すぐ動くべきか」を答えるアプリ(train-delay-advisor)を作っている。雷の思考実験を読みながら、ふと引っかかった。「立場によって”今”が違う」って、自分のアプリにも当てはまるんじゃないか、と。

素人なりに考えてみた。アプリは電車の位置データを受け取って「今こうなっています」と判断を出す。でも、そのデータが作られた瞬間と、ユーザーが画面を見る瞬間は、本当に同じ「今」なのだろうか。雷の話を読んだあとだと、それが急に怪しく思えてきた。

この引っかかりを調べてもらったところ、まさに図星だった。アプリが使っている公共交通データは、約90秒ごとにしか更新されない。つまり画面に出ている電車の位置は、最大で90秒前の「過去の今」だった。私はそれを「リアルタイム=今そのもの」だと思い込んでいた。データが届いた頃には、電車はもう先に進んでいる。これはこの種のアプリで最大の事故になりうる落とし穴だった。

整理すると、私のアプリには立場の違う「今」が4つも同時にあった。データが作られた今、データの賞味期限、電車の本当の今(推測)、そしてユーザーが画面を見た今。素朴なロジックは、この最初と最後を「同じ」と決めつけていた。雷の思考実験で言えば、ホームの人と電車の人の「今」を同じだと思い込んでいたのと、まったく同じ間違いだった。

気づいたこと

一番おどろいたのは、100年前の物理学者が頭の中だけでやった想像が、現代の私の小さなアプリの設計ミスを、こんなにもまっすぐ言い当てたことだった。アインシュタインは、お金も設備もない場面で「現実には作れない状況を頭の中で完璧に再現する」という方法で真理に手を届かせた。私がやったことも、規模はまるで違うけれど、構造は少し似ている。手元のデータで確かめられない部分を、思考実験という他人の頭の中のシミュレーションを借りて点検した、とも言える。

そして、これは非エンジニアの自分にとって、すごく勇気の出る発見だった。良いアイデアは、必ずしも技術書の中にあるわけではない。物理や哲学のような、一見プログラミングと無関係な分野が、設計の盲点を一撃で照らすことがある。「専門外だから関係ない」と切り捨てない好奇心が、むしろ初学者の隠れた武器になるのかもしれない。

もう1つ。「リアルタイム」と呼ばれるものの多くは、実は少しだけ過去だ。届いた瞬間にはもう古い。この「データの今 ≠ 自分の今」という視点は、電車アプリに限らず、あらゆるリアルタイム系のアプリに効く考え方だと思う。子どもに説明するつもりで始めた寄り道が、結局いちばん自分の開発の役に立った。学びの入り口は、まじめな技術書である必要はないのだと、今回しみじみ感じている。


個人開発 / 設計思想 / 物理 / train-delay-advisor

このブログでは、ローカルLLM・Aider・個人開発の試行錯誤をそのまま記録しています。