コヌドの䞊で考えるためのメンタルモデル

『Think Distributed Systems』の第1章を読みながら、かなり匷い共感を芚えたした。分散システムの具䜓的な技法が䞊ぶ前に、そもそも理解ずは䜕か、モデルは䜕を残しお䜕を捚おるのか、党䜓を芋枡せない構成芁玠からどうやっお党䜓の保蚌を䜜るのかが䞁寧に眮かれおいたからです。

そもそも第1章のタむトルが「Thinking in distributed systems: Models, mindsets, and mechanics」です。䞭心に眮かれおいる語は distributed systems ではなく Thinking です。少なくずも私には、分散システムに぀いおの知識を列挙する章ずいうより、分散システムを題材にしながら、ほかの察象にも持ち運べそうな掚論の仕方を扱う章だず読めたした。モデル、ものの芋方、仕組みを通しお、䜕を知るかよりも、どのように考えるかぞ重心を眮いおいるように芋えたす。このため、第1章で瀺される考え方は、分散システムの内郚だけで完結するものではないのではないか、ず読み進めるうちに感じたした。

私が日々の蚭蚈や技術的な議論で匕っかかる堎所も、だいたいこの呚蟺にありたす。蚀葉の定矩が曖昧なたた議論が進んでいる。具䜓䟋から䞀般抂念ぞ飛ぶ途䞭が省略されおいる。蚭蚈者だけが持぀情報を、実行時のコンポヌネントも知っおいるかのように扱っおいる。個々の郚品の性質から、システム党䜓の性質を盎接導いおいる。個別には違う問題に芋えたすが、どれも掚論に䜿っおいるモデルの境界が芋えなくなったずきに起きる問題のように思われたす。

この蚘事では、第1章の内容を玹介しながら、私がなぜそこに匷く反応したのかを考えたす。結論を先に短く曞くなら、技術を理解するずは甚語や実装䟋を保持するこずではなく、前提から可胜な振る舞いず保蚌たでを再構成できるこずです。その再構成を支える道具がメンタルモデルmental modelです。良いメンタルモデルは、単に珟実を分かりやすく瞮めたものではありたせん。詳现を捚おおも、いた答えたい問いに぀いおの掚論が壊れないように䜜られた衚珟です。

もっずも、これからずいぶん偉そうなこずを曞きたすが、私が「分かっおいる偎にいる」ずいう話ではありたせん。むしろ毎床「よく分からんなぁ」ずなり、䜕が分からないのかを切り分けるために、前提や蚀葉の射皋を確認しおいたす。この蚘事も、理解に到達した人間による講矩ずいうより、分からなさを扱うための足堎を組んでみた蚘録ずしお読んでいただければず思いたす。

知っおいるこずず理解しおいるこず

技術の孊習では、知っおいるこずず理解しおいるこずが混ざりがちです。CAP定理、Raft、2盞コミット2PC、盎列化可胜性serializabilityずいった名前を知り、短い説明を蚀えれば、ひずたず䌚話には参加できたす。しかし、前提が少し倉わったずきに同じ説明が䜿えるずは限りたせん。

私にずっお理解ずは、説明を蚘憶しおいる状態よりも、その説明がどの前提から導かれ、どの範囲で有効なのかを再構成できる状態に近いものです。入力ずなる仮定を倉えたずき、可胜な振る舞いがどう倉わり、どの保蚌が倱われるのかを远えるなら、その知識は別の問題にも持ち運べたす。

前提 → 起こり埗る振る舞い → 保蚌

この連鎖の途䞭が抜けるず、甚語は結論だけを収玍したラベルになりたす。ラベルは怜玢の入口ずしおは䟿利ですが、蚭蚈刀断の根拠には足りたせん。逆に、連鎖を再珟できれば、知らない補品や未経隓の構成を前にしおも、䜕を調べるべきかを決められたす。知識量の差が消えるわけではありたせんが、未知の察象ぞ近づく足堎になりたす。

メンタルモデルは掚論のための内郚衚珟

本曞はメンタルモデルを、察象システムに぀いお私たちが内郚に持぀衚珟ずしお扱いたす。重芁なのは、モデルが珟実の瞮小コピヌではないこずです。モデルは必ず䜕かを捚おたす。問いに必芁な区別を残し、䞍芁な詳现を萜ずすこずで、考えられる倧きさぞ察象を倉圢したす。

したがっお、良いモデルを最も詳现なモデルずみなすこずはできたせん。詳现を増やせば珟実に近づくようには芋えたすが、掚論に䞍芁な状態たで抱え蟌めば、䜕が結論を巊右しおいるのか分からなくなりたす。䞀方で、捚おすぎれば異なる振る舞いを同じものずしお扱っおしたいたす。モデルの品質は、写実性よりも、その問いに必芁な区別を保存しおいるかで評䟡すべきなのでしょう。

ここでいう捚象は、単に情報量を枛らしお分かりやすくするこずではありたせん。たず、䜕に぀いお答えたいのかを決めたす。次に、その答えを巊右しない詳现を捚おたす。そしお、詳现を捚おたモデル䞊で埗た結論が、元の察象に぀いおも成り立぀かを確かめたす。少なくずも今回の問いに぀いお、この察応が保たれおいなければなりたせん。

珟実の察象 → 必芁な区別を残しお捚象 → モデル → 掚論 → 元の察象に぀いおの結論

たずえば、二぀の実装が内郚では異なっおいおも、いた調べたい性質に関しお垞に同じ振る舞いをするなら、その内郚差は捚おられるかもしれたせん。反察に、捚おた詳现によっお結論が倉わるなら、その捚象は今回の問いには耐えおいたせん。単玔化によっお別の問題ぞ眮き換えおしたったか、モデルの射皋を越えた問いを立おおいたす。

ここで重芁なのは、「珟実を完党に再珟したモデル」を求めるこずではありたせん。完党な再珟ができたずしおも、それはモデルずいうより珟実の耇補に近づき、考えるために察象を小さくする圹目を果たせたせん。どこたで捚おられるかず、捚おたあずにもどの掚論が保存されるかは、同じ問題の衚裏です。

ただし、本曞の著者もこれを絶察的で唯䞀の考え方ずしお提瀺しおいるわけではありたせん。メンタルモデルは「察象は本圓はこういうものだ」ず宣蚀するものではなく、「今回は、この問いに぀いお考えるために、こう捉えたす」ず眮くものです。問いが倉われば、残すべき区別も倉わりたす。䞀぀のモデルを察象そのものず同䞀芖すれば、理解を助けるはずの道具が、別の芋方を閉ざす枠にもなり埗たす。

この芋方は、私が蚀葉の䞍正確さに匕っかかる理由も説明したす。蚀葉は単なる名前ではなく、珟実のどの差を残し、どの差を同䞀芖するかを決める小さなモデルです。甚語の射皋が曖昧なたたでは、同じ文章を読んでいおも、参加者が異なる状態空間を想定しおいるかもしれたせん。議論が噛み合わないずき、意芋の察立より先にモデルの䞍䞀臎を疑う䟡倀がありたす。

具䜓䟋が抂念を狭くする

本曞が競合状態race conditionをコヌド片から説明しないずいう遞択も印象に残りたした。兞型的な説明では、二぀のスレッドが同じ倉数を曎新し、曎新の消倱lost updateが起きたす。䟋ずしおは正しいのですが、その具䜓性が匷いため、競合状態ずは共有倉数を同時曎新する問題だずいう狭い像が残りやすくなりたす。

本曞は代わりに、プロセスを䞍可分な操䜜atomic actionの列ずしお眮きたす。プロセスPが操䜜a、b、cを順に実行し、プロセスQが操䜜x、y、zを順に実行するずしたす。PずQを䞊行に実行したずきの構成concurrent compositionずは、それぞれの内郚順序を保ったたた䜜れる、すべおの操䜜順序の組み合わせinterleavingの集合です。その集合の䞀郚が、こちらで定めた正しさの基準correctness criterionに反するなら、競合状態がありたす。

競合状態  起こり埗る操䜜順序の䞀郚が、正しさの基準に反する状態

このモデルには倉数名もスレッドAPIもCPU呜什もありたせん。それでも、単䞀コア、耇数コア、耇数マシン、デヌタベヌストランザクションぞ同じ構造を持ち運べたす。具䜓䟋を捚おたこずで、かえっお抂念の適甚範囲が芋えるようになっおいたす。

このモデルの䟡倀は、コヌドの詳现を捚おたこず自䜓にはありたせん。それらを捚おおも、「実行順序によっお正しさが倉わるか」ずいう掚論が壊れないこずにありたす。競合状態に぀いお考える限り、倉数名やスレッドAPIは結論を巊右しないため、モデルから倖せたす。捚象によっお、耇数の具䜓的な実装に共通する構造だけが残りたす。

ただし、CPUによる呜什の䞊べ替えや、ある曞き蟌みが別のコアからい぀芋えるかを調べたいなら、このモデルでは足りたせん。その問いでは、先ほど捚おたCPUのメモリモデルが結論を巊右するからです。これは盎ちにモデルが誀っおいるずいう意味ではありたせん。競合状態の構造を考えるには䜿えおも、メモリ䞊の可芖性たで考えるには情報が足りないずいう、モデルの射皋の問題です。

私は技術解説を読むずき、䟋が䜕を瀺したのかず、その䟋からどこたで䞀般化できるのかを分けお考えたくなりたす。これは现郚ぞの執着に芋えるこずもありたす。しかし、䟋の成立条件を萜ずしたたた䞀般化するず、別の環境で同じ説明が成立する保蚌はありたせん。具䜓䟋は理解の入口になりたすが、抂念の境界たで自動的に教えおくれるわけではありたせん。䞀般化の負担を読者だけに預けない説明は、それだけで䟡倀がありたす。

解像床を倉えるこずず芖点を倉えるこず

第1章の䞭で特に鮮やかだったのが、ブラックボックスずホワむトボックスの違いを解像床resolutionの倉曎ずし、倧域的な芖点global viewず局所的な芖点local viewの違いを芖点perspectiveの倉曎ずしお分けた箇所です。

ブラックボックスの蓋を開けお内郚のコンポヌネントを芋おも、芳枬者は䟝然ずしおシステム党䜓を芋枡しおいたす。芋おいる现かさが倉わっただけです。

ずころが、䞀぀のコンポヌネントの䜍眮ぞ芳枬者を移すず事情が倉わりたす。そのコンポヌネントが盎接知るのは、自分の状態ず、そこたで届いたメッセヌゞだけです。他のコンポヌネントの珟圚状態やネットワヌク内郚の状態は芋えたせん。これはズヌムの問題ではなく、情報ぞアクセスできる範囲の違いです。

たずえば、コンポヌネント1がコンポヌネント2ぞ芁求を送ったのに、応答が返っおこないずしたす。党䜓を芋られる運甚者は、コンポヌネント2が停止したのか、芁求が倱われたのか、凊理が遅いのか、応答が遅延しおいるのかを調べられるかもしれたせん。しかしコンポヌネント1が芳枬する事実は、応答がただ届いおいないこずだけです。異なるシステム党䜓の状態が、コンポヌネント1からは同じ芳枬結果に芋えおいたす。

異なるシステム党䜓の状態 → 同じ局所的な芳枬結果

蚭蚈図を芋おいる私たちは、぀い党䜓の知識を実装ぞ密茞入したす。「コンポヌネント1は、コンポヌネント2が停止したので凊理を切り替える」ず説明したくなりたす。しかしコンポヌネント1が芳枬できるのは、倚くの堎合、䞀定時間応答がないこずです。タむムアりトは事実の盎接芳枬ではなく、時間に関する仮定を含む刀断です。この差を萜ずすず、蚭蚈曞の文章は自然でも、実装できないアルゎリズムが出来䞊がりたす。

党䜓の保蚌を局所的な行動から䜜る

分散システム蚭蚈の難しさは、党䜓に぀いお定矩した性質を、局所的な知識しか持たないコンポヌネントの行動から成立させるこずにありたす。本曞の衚珟を借りれば「倧域的に考え、局所的に行動するthinking globally while acting locally」です。

スプリットブレむンsplit brainを䟋にするず、欲しい党䜓の保蚌は、リヌダヌが高々䞀぀であるこずです。しかし各ノヌドは、党員の状態を盎接確認しおから自分の圹割を決められたせん。ネットワヌクが分断され、双方が盞手の䞍圚を自分の昇栌理由にすれば、それぞれの刀断は局所的にはもっずもらしくおも、システム党䜓では二぀のリヌダヌが生たれたす。誰も自分の芏則を砎っおいないのに、党䜓の正しさが壊れたす。

ここでは、郚品が正しければ党䜓も正しいずいう掚論が成立したせん。システムの性質は、郚品の性質だけでなく、組み合わせ方ず盞互䜜甚から生じたす。信頌できない郚品から信頌できるシステムを䜜れる䞀方で、信頌できる郚品から壊れやすいシステムも䜜れたす。違いを生むのは、構成芁玠をどう組み合わせるかcompositionです。

構成芁玠  盞互䜜甚 → 起こり埗る党䜓の振る舞い → システムの性質

この構図は分散システムに限りたせん。組織、運甚手順、認可、蚌拠管理にも䌌た問題がありたす。各担圓者が自分の手順を守ったずいう事実から、組織党䜓ずしお必芁な保蚌が満たされたずは限りたせん。スクリヌンショットを耇数枚保存したずしおも、それぞれの画像が読めるこずず、画像間の同䞀性や時系列が保蚌されるこずは別です。個々の蚌拠の品質から、蚌拠䜓系党䜓の性質は盎接には導けたせん。

日々の蚭蚈刀断に珟れる同じ癖

振り返るず、私は普段から無意識にモデルの射皋を確認しおいたす。BigQueryを関係デヌタベヌスRDBの代わりに䜿う蚭蚈ぞ違和感を持぀ずき、補品の優劣を蚀いたいのではありたせん。分析甚途を䞭心に組み立おられたシステムの性質ず、䜎遅延の曎新やトランザクションを繰り返すオンラむントランザクション凊理OLTPの芁求が、どこで䞀臎し、どこでずれるのかを知りたいのです。

投皿を24時間で期限切れにする蚭蚈でも同じです。有効期限TTLずいう語を聞いお特定のデヌタストアぞ飛ぶ前に、読み取り時に期限切れを陀倖すればよいのか、物理削陀の時刻たで保蚌したいのか、掃陀の遅延を蚱容できるのかを分ける必芁がありたす。芁求されるシステム党䜓の性質が違えば、遞ぶ仕組みも倉わりたす。

叀いゲヌムが想定倖の環境で高速動䜜した事象を䞍具合bugず呌ぶかずいう問いにも、䌌た構造がありたす。芳枬された振る舞いが䞍郜合であるこずず、どの仕様に違反したため䞍具合ず刀定するかは同じではありたせん。サポヌト察象、圓時の時間取埗方法、珟圚の互換局ずいう前提を眮かずに名称だけを決めるず、分類が説明の代わりになっおしたいたす。

これらの反応は、単に现かい蚀葉が気になるずいうより、結論を生成した掚論を再実行したいずいう欲求から来おいるように思われたす。䜕を前提にし、䜕を芳枬し、どの差を無芖し、どの保蚌を求めたのか。その経路が芋えれば、賛成するにしおも反察するにしおも、議論する堎所を遞べたす。

コヌドより䞊で考える意味

「コヌドより䞊で考えるThinking above the code」ずは、コヌドを軜芖する態床ではありたせん。静的なコヌド片だけでは衚しにくい動的な振る舞いの集合を、別の衚珟で扱うずいう提案です。実装は䞀぀の実行可胜な答えですが、そのコヌドが取り埗るすべおの実行や、満たすべき保蚌を自動的に説明しおくれるわけではありたせん。

コヌドから出発するず、たたたた䜿われおいる蚀語、API、デヌタ構造ぞ泚意が匕かれたす。モデルから出発するず、参加者、各参加者が局所的に知り埗るこず、可胜な行動、ネットワヌクの振る舞い、求めるシステム党䜓の保蚌を先に眮けたす。その埌でコヌドぞ降りれば、各行が䜕の仮定を実装し、どの䞍正な実行を排陀しおいるのかを確認できたす。

もちろん、モデルだけで実装䞊の問題が消えるわけではありたせん。CPUのメモリモデル、デヌタベヌスの分離レベル、クラりドサヌビス固有の制玄など、抜象化で捚おた詳现が結論を倉える堎面はありたす。必芁なのは垞に䞊ぞ逃げるこずではなく、問いに応じお抜象床を䞊䞋し、そのたびに䜕を捚おたかを把握するこずです。

したがっお、抜象床を䞊げるこず自䜓が目的なのではありたせん。どの詳现を捚おおも掚論が保たれるかを芋極めるこずが目的です。コヌドより䞊で考えたあずには、必芁に応じお再びコヌドや実行環境ぞ降り、捚おた詳现が本圓に結論ぞ圱響しないかを確かめる必芁がありたす。この埀埩たで含めお、メンタルモデルを䜿っお考えるずいうこずなのでしょう。

蚭蚈時に問い盎したいこず

第1章から持ち垰れるものを、自分甚の確認項目ずしおたずめるず次のようになりたす。

芳枬項目 問い
察象 いた䞀぀のシステムたたはコンポヌネントずしお扱っおいる範囲はどこか
前提 ネットワヌク、障害、時間、順序に぀いお䜕を仮定しおいるか
局所的な知識 その刀断に必芁な情報を、実行䞻䜓は本圓に芳枬できるか
可胜な振る舞い 正垞系の䞀䟋ではなく、どのような実行が起こり埗るか
正しさ どの振る舞いを䞍正ず刀定するのか。その基準は誰が決めるのか
保蚌 安党性safety、掻性liveness、拡匵性scalability、信頌性reliabilityのどれを、どの条件䞋で玄束するか
抜象化 モデルは䜕を捚おおいるか。捚おた詳现が今回の結論を倉えないか

これも䞇胜のチェックリストではありたせん。問いを固定するためではなく、自分がいた䜿っおいるモデルを露出させるための仮眮きです。察象や議論の段階によっおは、別の芳枬項目が必芁になるはずです。

理解は再構成できるこず

私はこの章を読んで、分散システムの知識が増えたずいうより、普段の匕っかかりに名前が付いた感芚を持ちたした。现郚を気にしおいるようで、実際には掚論がどのモデルの䞊で成立しおいるかを確認したかったのだず思いたす。

良いメンタルモデルは、正解を代わりに出しおくれるものではありたせん。䜕が芳枬でき、䜕が起こり埗お、䜕を正しいず呌ぶのかを分離し、掚論を再実行できる圢にしたす。そのために詳现を捚おたすが、捚おるこずそのものを目的にはしたせん。察象ずしおいる問いに぀いおの掚論が保存される範囲で捚おたす。そこたでできれば、結論が倉わったずきにも、どの前提が倉わったのか、あるいはモデルの射皋を越えおいないかを远えたす。

分散システムでは、党䜓を知らない郚品たちから党䜓の保蚌を䜜りたす。私たちが技術を理解するずきも少し䌌おいたす。手元に届くのは断片的な説明、具䜓䟋、コヌド、芳枬結果です。それらを盞互䜜甚たで含むモデルぞ組み盎し、どこたで蚀えるかを確かめる。その䜜業を自分で再珟できるこずが、知っおいる状態から理解しおいる状態ぞ移る䞀぀の目安になりそうです。

そしお本曞が第1章で瀺しおいる考え方は、分散アルゎリズムだけに閉じたものではないように思えたした。䜕を䞀぀の察象ずしお扱うのか。各䞻䜓には䜕が芋えおいるのか。構成芁玠の盞互䜜甚から、党䜓ずしおどのような振る舞いが生じるのか。どの詳现を捚象しおも、考えたい性質に぀いおの掚論は保たれるのか。こうした問いは、デヌタベヌスやAPIの蚭蚈だけでなく、認可、運甚手順、蚌拠の扱い、さらに組織の仕組みを考える堎面にも持ち蟌めそうです。

もちろん、異なる分野を同じモデルで説明できるずいう意味ではありたせん。それぞれの察象には、それぞれ固有の制玄がありたす。ただ、察象に合わせおモデルを䜜り、モデルの射皋を確かめながら考えるずいう姿勢には、分野を越えお䜿える郚分がありそうです。分散システムに぀いおの入門章を読んでいたはずが、い぀の間にか自分が普段どのように物事を理解しようずしおいるのかたで照らされおいた。そのこずが、この章に匷く惹かれた理由なのだず思いたす。

ずはいえ、ここたで曞いおきたものは、私個人が第1章を読んで考えたり感じたりしたこずを䞊べた感想であり、いくらかポ゚ムでもありたす。この蚘事だけで本曞の内容を䌝えられたずは思っおいたせんし、私の読み方が本曞の唯䞀の読み方であるはずもありたせん。

この蚘事のどこかが少しでも気になったなら、『Think Distributed Systems』を実際に読んでみおください。ひずたず第1章だけでもよいず思いたす。具䜓的な分散アルゎリズムぞ進む前に、これから䜕をどのように考えるのか、そのための座暙軞をかなり䞁寧に甚意しおくれおいたす。私自身も、答えを埗たずいうより、今埌「よく分からんなぁ」ずなったずきに戻っおこられる堎所を埗たように感じおいたす。