AI governance in dialogue with classical wisdom

時間計算量 vs. 時間の本質

シリーズ:プログラマーの哲学的思索 #04/11 | 読了時間:25〜30分 | 概念:時間の哲学(Philosophy of Time)— 存在、変化、そして不可逆性

著者:Wina @ Code & Cogito


午前3時のカウントダウン

それはリリース前の深夜のことでした。

チーム全員がデプロイの進捗バーを見つめ、ターミナルで跳ねる数字がある種の神秘的なカウントダウンのように見えました。右下に目をやると02:47。半生分の時間が過ぎたかのような感覚でした。

「あとどれくらい?」とPMが聞きます。

「3分くらいです」と答えました。

その3分間に、ロールバックスクリプトを再確認し、モニタリングダッシュボードを二度チェックし、冷めたコーヒーを半分飲みました。昼間の3時間よりも遥かに長い3分間でした。

デプロイ完了。グリーンライト点灯。02:51。

「たった4分か」とPMが笑います。「40分みたいに感じた。」

苦笑しました。そして気づいたのです。

今、私たちが経験した「4分間」には、少なくとも3種類の異なる時間が同時に流れていた。

CPUの時間:数十億回のクロックサイクル、ナノ秒精度。サーバーは焦りも期待もしない。ただ忠実に各命令を実行するだけ。

壁時計の時間:02:47から02:51まで、ちょうど4分。物理世界の計量。あなたの気持ちとは無関係。

そして私たちの内なる時間:不安に引き伸ばされ、プレッシャーに歪められ、不確実感に膨張させられて、ほとんど永遠のように感じられた待ち時間。

プログラマーは毎日、時間と向き合っています。Big-Oでアルゴリズムの未来を予測し、タイムアウトで待機の限界を設定し、cronジョブで昼と夜を切り分けます。しかし、もっと根本的な問いを立ち止まって考えることは稀です。

時間とは一体何なのか?

それはリソースの一種——「使う」「節約する」「無駄にする」ことができるもの? それとも、そもそも「モノ」ではなく、変化を記述する方法に過ぎないのでしょうか?

これは「プログラマーの哲学的思索」シリーズの第四回です。毎日使っている時間計算量から出発し、時間哲学の深層へ潜ります。

Let’s debug time itself.


背景:私たちの時間の量化方法、そしてそこから漏れ落ちるもの

Big-O:時間の抽象言語

プログラマーなら誰でもアルゴリズムを学ぶ際にBig-O記法に出会います。優雅で簡潔。一つの関数で「事態がどれだけ悪化するか」を記述します。

# O(1):入力がどれだけ大きくても時間は一定
def get_first(arr): return arr[0]

# O(n):線形成長
def find(arr, target):
    for x in arr:
        if x == target: return True

# O(n^2):二次成長——災厄の始まり
def bubble_sort(arr):
    for i in range(len(arr)):
        for j in range(len(arr)-1):
            if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j]

Big-Oが記述するのは成長の形——入力規模が1,000から1,000,000に増えたとき、実行コストがどう膨張するか。未来についての予言です。データが成長し続けるなら、システムはいつ持ちこたえられなくなるか。

しかし注意してください。Big-Oが語っているのは「時間」そのものではなく、「作業量」の関数です。O(n log n) はソートに何秒かかるかを教えてくれません。教えてくれるのは、データ量が倍になったとき、ソートが「おおよそ倍より少し多い」手間になる、ということです。

Big-Oはスケールの言語であり、存在の言語ではありません。

壁時計時間:物理世界の審判

エンジニアリングではもう一つの時間——wall-clock time、すなわちユーザーが実際に待つ時間も重要です。アルゴリズムがO(n log n)でも、ネットワーク遅延が200ミリ秒、データベースクエリが3秒停滞、CDNキャッシュ失効で1.5秒追加——ユーザーが体験するのはこれら遅延の総和であり、あなたのアルゴリズムの美しさではありません。

def total_latency(compute_ms, network_ms, db_ms, queue_ms):
    """ユーザーが体験する時間 = 全遅延の合計"""
    return compute_ms + network_ms + db_ms + queue_ms

壁時計時間は冷酷な審判です。コードの優雅さなど気にしません。ユーザーがどれだけ待ったかだけが問題です。

主観的時間:人間の時間バグ

そして三つ目の時間——最も扱いにくいもの。

同じ10秒の待ち時間でも、何もない白いローディング画面では1分に感じられ、プログレスバーとフレンドリーなアニメーションがある画面では5秒に感じられ、プログラミングに没頭しているフロー状態では30分が5分のように感じられます。

心理学の研究によれば、人間の時間感覚は少なくとも3つの要因に影響されます。フィードバック(進捗が分かるか)、コントロール(キャンセルや操作ができるか)、感情(不安なのか没頭しているのか)。UXデザイナーはこれをとっくに知っています。プログレスバーの存在意義は真の進捗を表示することではなく、時間に対するあなたの感じ方を変えることです。

この三層の時間——アルゴリズムの時間、物理的時間、主観的時間——はエンジニアリングの実践において共存しています。しかし哲学者はこれよりもっと根本的な問いを立てます。この三層の下に、時間そのものとは何なのか?

哲学者の時間をめぐる戦場

時間の本質について、哲学史には2つの大きな陣営の長期にわたる対立があります。

絶対的時間観——ニュートンの立場。時間は宇宙の背景となる容器であり、均一に流れ、何ものにも影響されない。宇宙に何もなく、何も起こらなくても、時間は一秒一秒と刻み続ける。万物がその上に配置される無限の時間軸のようなもの。

関係的時間観——ライプニッツの立場。時間は独立に存在する容器ではなく、出来事間の関係の抽象。宇宙で何も起こらなければ、「時間」という概念は意味を失う。時間とは「前後」と「変化」を記述する方法にすぎない。

プログラマーにとって、この2つの立場はそれぞれ馴染みのある設計に対応します。

ニュートンの時間はグローバルクロック——System.currentTimeMillis() のように、プログラムが何をしていようと常に動いている。ライプニッツの時間はイベント駆動——イベントがなければ時間はなく、時間とはイベントシーケンスのソートツールにすぎない。

アインシュタインの相対性理論は最終的に、ライプニッツにより近い見解を支持しました。時間は絶対的ではなく、重力場と運動速度によって流れる速さが変わります。GPS衛星上の時計は地上の時計より速く進みます。補正しなければ、ナビゲーションは毎日約10キロメートルずれます。

時間は背景ではなく、システムの一部です。

日本の哲学にも独自の時間観があります。道元禅師は「有時」(うじ)の概念で、存在と時間の不可分性を説きました。「山も時なり、海も時なり」——存在するものはすべて時間であり、時間はすべて存在である。これはライプニッツの関係的時間観と深い共鳴を持ちます。


3つの時間モデル:アルゴリズムから存在へ

一、Big-Oが予言するのは未来の形であり、今の感覚ではない

Big-Oが実際に何をしているか、じっくり見てみましょう。

あるアルゴリズムがO(n^2)だと言うとき、実際に述べているのは「入力規模の成長に伴い、このアルゴリズムのコストは二次関数的に膨張する」ということです。これはトレンドについての言明であり、今この瞬間についての言明ではありません。

哲学的には、これは重要な区別に対応します。時間的順序(temporal order)と時間的瞬間(temporal moment)。

Big-Oが関心を持つのは時間的順序——「入力の変化に伴って物事がどう変化するか」です。「今何時か」には決して答えません。答えるのは「このまま続けるとどうなるか」です。未来に対する構造的予測です。

古代ギリシャの哲学者にも、時間に対する類似の区分がありました。アリストテレスは時間を「前後に関する変化の数」と定義しました。時間は変化を計量する道具であり、変化の外に独立して存在する実体ではない。世界が完全に静止し、何の変化も起きなければ、アリストテレスの枠組みでは「時間」は意味を失います。

これはBig-Oのロジックと驚くほど一致します。入力規模が変わらなければ(変化がなければ)、Big-Oに記述するものがありません。変化なくして時間計算量なし。

しかしエンジニアは、Big-Oに大きな盲点があることを知っています。定数を捨象するのです。O(n) が0.001秒かかるかもしれないし、10秒かかるかもしれない。Big-Oはそれを気にしません。関心は構造であって、体験ではない。しかし人間が生きるのは体験の中であり、漸近分析の中ではありません。

二、同期と非同期:待ち方がいかに「時間の質感」を書き換えるか

エンジニアリングにおける最も深い時間の洞察の一つはこれです。同じ物理的時間でも、「待ち方」が違えば体験は天と地ほど異なりうる。

同期呼び出しはブロッキング待機です。リクエストを送り、レスポンスが返ってくるまでプログラム全体がそこで止まる。何もできません。カウンターで並んでいるようなもので、前の人を見つめるしかない。

非同期呼び出しはノンブロッキング待機です。リクエストを送り、別の仕事をし、レスポンスが来たら処理する。レストランで注文し、番号札をもらい、呼ばれるまで買い物に行けるようなもの。

# 同期:待機に閉じ込められる
response = http.get(url)  # 世界全体が一時停止
process(response)

# 非同期:待機の中に自由がある
future = async_http.get(url)  # 世界は回り続ける
do_other_work()
response = await future

哲学者ベルクソン(Henri Bergson)は百年以上前に、類似の区分を提案しました。彼は時間を2種類に分けました。

空間化された時間(temps)——時計上の時間。切り分け、計量し、時間軸上に並べることができる。ニュートン的で、均質で、数量化可能。

持続(duree)——意識が体験する時間。連続的で、分割不能で、質感を持つ。期待に満ちた待機と退屈な待機は、時計上では同じ長さでも、持続においてはまったく異なる。

エンジニアリングにおける「レイテンシー最適化」の本質は、ベルクソン的な時間の質感を操作することです。リクエストの応答を速くできなくても、待っている間のユーザー体験を変えることはできます。

  • 進捗フィードバックが予測不能な待機を予測可能なものに変える——不安が減り、持続が短縮
  • キャンセル機構が受動的な待機を能動的な選択に変える——コントロール感が増し、持続が短縮
  • バックグラウンド処理がブロッキング待機をノンブロッキングに変える——自由度が増し、持続がほぼ消失

UX最適化をしているとき、あなたは実は時間哲学をしているのです。

三、時間の矢:なぜUndoは現実世界でこれほど難しいのか

git checkout <commit> で過去の状態に戻れます。Ctrl+Zで直前の操作を取り消せます。バックアップからデータベース全体を復元できます。

しかし、割れたコーヒーカップが自動的に元に戻ることはありません。口から出た言葉を取り消すことはできません。去ってしまった人が再び現れることはありません。

なぜソフトウェアの世界では「時間旅行」がこれほど簡単なのに、現実世界ではこれほど不可能なのでしょうか。

答えは物理学の概念に隠されています。エントロピー(entropy)——システムの乱雑さの尺度です。熱力学第二法則は、閉じたシステムのエントロピーは増加するか維持されるかであり、減少はしないと述べます。これが時間の矢の物理的基盤です。時間に方向があるのは、宇宙がより高い乱雑さに向かう傾向を持つからです。

git が「過去に戻れる」のは、時間を本当に逆転させているからではありません。その仕組みは3つの前提に基づいています。

完全な記録——すべてのcommitが完全なスナップショットを保存している。過去に「戻る」のではなく、過去の記録を再ロードしている。しかし現実世界は、あらゆる瞬間の完全な状態を保存してはくれません。

隔離可能な副作用——git checkout はあなたの作業ディレクトリだけを変え、他の人のブランチやリモートサーバーの状態には影響しない。しかし現実のあらゆる行動には、バタフライエフェクトのような副作用があります。

離散的な状態——コードはテキストファイルで、状態は離散的なビットです。正確にコピーし、正確に比較できる。しかし現実世界は連続的であり、量子レベルでは不確定性原理がいかなるシステムの完全な記録をも妨げます。

聖アウグスティヌスは『告白』でこう述べました。「過去はもはや存在せず、未来はまだ存在せず、現在は絶えず滑り去っていく。」エンジニアが「過去を保存」できるのは、過去の状態を現在も存在するデータに変換したからです。これは時間旅行ではなくセーブデータです。

そして本当の時間は不可逆です。この不可逆性は技術的制約ではなく、宇宙の基本構造です。


現代への接続:AI時代の時間的危機

アテンションエコノミー:あなたの時間は誰にスケジューリングされているか

スマートフォンとプッシュ通知の時代において、あなたの時間はもはや完全にはあなたのものではありません。

すべての通知はコンテキストスイッチです。研究によれば、一度の中断後、深い集中状態に戻るまで平均23分かかります。1時間に3回中断されると、真の深い作業に入ることは事実上不可能になります。

エンジニアリングではこれに正確なアナロジーがあります。スラッシング——OSのメモリが不足し、ディスクとメモリの間でページを頻繁にスワップすると、システムのほぼすべての時間がスワップに費やされ、実際の計算には使われなくなります。CPU使用率は100%に見えるのに、実際のスループットはほぼゼロ。

あなたも人間版のスラッシングを経験したことがあるかもしれません。一日中忙しくて疲れ果てたのに、夜になって振り返ると何も成し遂げていない。時間が無数の断片に切り刻まれ、どの断片も深い思考を収めるには短すぎた。

ソーシャルメディアプラットフォームの設計思想がこの問題を悪化させています。そのコアメトリクスは「ユーザー滞在時間」——しかし追求しているのは主観的に充実した時間ではなく、客観的に占有される時間です。ベルクソンの枠組みで言えば、彼らはあなたの持続を奪い、断片化された空虚な時計時間だけを残しているのです。

AIアクセラレータ:すべてが圧縮されるとき

生成AIは、ほぼすべてのナレッジワークの時間を圧縮しつつあります。以前は1日かかったレポートが今は10分で書ける。以前は1週間かかった新しいフレームワークの習得が今は午後には使い始められる。

しかしこれは哲学的な問いを生みます。圧縮された時間はどこに行ったのか?

4時間の作業をAIで30分に圧縮したとして、残りの3時間半をどうするのか。もっと多くの仕事をして、一日全体が30分のスプリントの連続に圧縮されるのか。

それとも、圧縮できないことに使うのか——思索、ぼーっとすること、散歩、人との深い対話。

ハイデガー(Martin Heidegger)はこう警告しました。技術の本質は道具ではなく、一種の「枠組み」(Gestell)であり、すべてを利用可能な資源として見させるものだ、と。時間を圧縮可能な資源として扱うとき、時間の中で最も価値ある部分——効率を追求せず、数量化もできない持続——を失いつつあるのかもしれません。

道元が「有時」で示したように、時間は所有するものではなく、存在そのものです。時間を「効率化」しようとすることは、存在そのものを効率化しようとすることに等しいのかもしれません。

即時性の専制

現代のソフトウェアシステムは「リアルタイム」を追求します。即時メッセージング、即時プッシュ通知、即時更新。レイテンシーは欠陥であり、待つことは失敗と見なされます。

しかし時間哲学は思い出させてくれます。価値あるすべてのことが即時であるべきではない。

醸成には時間がかかります。悲しみには時間がかかります。理解には時間がかかります。人間関係には時間がかかります。

ソフトウェア設計の「即時性」の思考を人生に当てはめ、すべての問題が即時に解決でき、すべての感情が即時に処理でき、すべての成長が即時に起こると期待するなら、間違った時間モデルで人間の存在を理解していることになります。

茶道の世界には「一期一会」という言葉があります。この瞬間は二度と訪れない。即時性の追求とは正反対の時間感覚——かけがえのない「今」への深い敬意です。


省察と示唆:プログラマーの時間リテラシー

管理しているのは時間か、それとも注意力か

多くの時間管理手法は、本質的には注意力管理です。ポモドーロテクニックは時間を管理していません。25分間の物理的時間はポモドーロを使おうが使うまいが変わりません。管理しているのは注意力の配分です。

アリストテレスが言ったように、時間が「変化についての計量」であるなら、本当に重要なのはどれだけの時間を持っているかではなく、その時間の中でどれだけ意味のある変化を生み出したかです。

1時間のフロー状態は、1日の断片的な作業よりも多くの変化を生み出すかもしれません。時間の価値は長さではなく、密度にあります。

時間はあなたが「持っている」ものではない

私たちは「時間がある」「時間がない」と言います。まるで時間が所有できるリソースであるかのように。しかしより正確に言えば、あなたは時間の「中に」いるのではない。あなたが時間「そのもの」なのです。

ハイデガーの「現存在」(Dasein)の概念はこう指摘します。人間の存在は本質的に時間的なものである。時間の中を移動する固定された実体ではなく、絶えず展開する過程である。過去が記憶と習慣を形成し、未来が計画と不安を形成し、現在はその二つが交わる瞬間です。

プログラマーにとって、これは次のことを意味します。あなたは時間を「使って」プログラミングしているのではなく、プログラミングというプロセスを通じて、ある版の自分自身になりつつあるのです。デバッグの一つひとつ、リファクタリングの一つひとつ、新技術の学習の一つひとつが、あなたという「システム」の状態をアップデートしています。

4つの持ち帰り時間メンタルモデル

  1. 3つの層を区別する——アルゴリズム時間はスケールを管理し、壁時計時間は体験を管理し、主観的時間は意味を管理する。システムを最適化するとき、どの層を最適化しているのかを明確にする。

  2. 不可逆性を尊重する——時間の矢は一方向です。過去に戻る幻想よりも、良い「セーブの仕組み」を構築する:バージョン管理、日記、定期的な振り返り。

  3. 連続する時間を守る——メモリを守るように注意力を守る。コンテキストスイッチを減らし、フロー状態を維持する。断片化された時間には深い価値がほとんどありません。

  4. 圧縮不能性を受け入れる——ゆっくり起こるべきこともある。成長、信頼、理解——これらは「高速化」オプションに対応していません。


おわりに

あの午前3時のデプロイに戻りましょう。

4分間の壁時計時間。数十億回のCPUクロック。そして不安に引き伸ばされ、ほぼ永遠と化した主観的体験。

3種類の時間が同時に流れ、それぞれが真実です。

プログラマーとして、あなたは固有の時間リテラシーを持っています。レイテンシーの分析方法を知り、パフォーマンスの最適化方法を知り、非同期の世界で待機を管理する方法を知っています。

しかし最も大切なリテラシーは、いつ最適化をやめるべきかを知ることかもしれません。

すべての時間が圧縮され、埋め尽くされ、最大限に活用される必要はありません。

ときには、最良の時間の使い方は、ただ時間を流れるに任せることです。

急がず。追わず。最適化せず。

締め切りのないサイドプロジェクトのように、純粋に好奇心から存在するもののように。

その時間こそが、本当にあなたのものです。


次回予告

ポインタとメモリ:個人のアイデンティティの連続性

引っ越し、転職、価値観の根本的な転換。それでもあなたは「あなた」なのか?

  • 完全にコピーされたら——二人の同一の「あなた」のうち、どちらが本物?
  • シャローコピーとディープコピーの違いは、魂と肉体の哲学的議論にどう対応するか?
  • 忘却はバグかフィーチャーか?ガベージコレクションは人の「実行可能性」をどう維持するのか?
  • AIがあなたの口調と記憶を再現できるとき、「あなた」の境界はどこにあるのか?

次回は、ポインタ、参照、メモリ管理を使って、二千年来最も厄介な哲学の問い——個人のアイデンティティ——を分解します。


参考資料

  • Aristotle. Physics, Book IV. (変化の数としての時間の論述)
  • Augustine. Confessions, Book XI. (時間の主観性に関する古典的省察)
  • Bergson, Henri. Time and Free Will. George Allen & Unwin, 1910. (持続と空間化された時間の区別)
  • Heidegger, Martin. Being and Time. SCM Press, 1962. (現存在の時間性)
  • Newton, Isaac. Philosophiae Naturalis Principia Mathematica, 1687. (絶対的時間観)
  • Leibniz, G.W. & Clarke, Samuel. The Leibniz-Clarke Correspondence, 1715-1716. (関係的時間観)
  • Cormen, Thomas H., et al. Introduction to Algorithms. MIT Press, 2009. (Big-Oと時間計算量)
  • Mark, Gloria, et al. “The Cost of Interrupted Work.” Proceeding of CHI, 2008. (注意力切り替えの研究)
  • 道元『正法眼蔵 有時』(存在と時間の不可分性)


類似投稿

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です