マイクロサービスの神話

今回は『人月の神話』の「第2章 人月の神話」のパロディです。原文を比較しながら読むとより楽しめます


システムのリプレイス案件があった場合、自然(特に最近では)な対応としてマイクロサービスを採用することがある。

火に油を注ぐがごとく、この対応は事態を悪化、それもかなりひどくする。

火が大きくなればガソリンをもっと欲するように、悪循環はこうして始まり、結局大失敗に終わる。

マイクロサービスはアイデアとして、時間と人の制約を受けずに、設計者の頭の中で完成した形で生まれる。実現されるとき、時間と人の制約を受ける。

私たちのアイデアの不完全さや不整合性は、実現段階になって初めて明白になる。

多くのシステムにおいて運用は扱いにくいものだ。

運用の物理的制約(や法的制約)が、表現できるアイデアを束縛し、実現段階での予期せぬ困難を作り出す。

プログラマは純粋な思考から、マイクロサービスとそれについての非常に柔軟な表現を組み立てていく。

実現も難しいことはほとんどないと考えるようになって、そこから楽観主義が広まる。

しかし、私たちのアイデアに考慮漏れはつきものであり、思ってもいなかったコストが生じる。

単一のサービスにおいては、まさに計画どおり事が運ぶかもしれない。

しかし、マイクロサービスは複数のサービスから構成されており、そのほとんどが複雑に絡み合っている。

この場合、すべてのサービスがスムーズに連携できる確率となると、限りなくゼロに近くなるほど小さい。

システムの運用においてマイクロサービスは、疑うべき危険な神話なのだ。

サービスの数と可用性が交換可能になるのは各サービス間でコミュニケーション(意思疎通)を図らなくても、仕事が分担できる場合だけである。

人が少なくてサービス担当を分担できない場合、サービスを増やすという対策は運用上、何の効果も生まない。

分担はできるがサービス間でのコミュニケーションが必要な仕事においては、コミュニケーションに図る労力を、こなすべき仕事量に追加しなければならない。

したがって、サービスを分割してもお粗末な結果しか得られないだろう。

サービスを分割することで増える負担は、純粋な作業量増加および相互コミュニケーションの2つの部分からなる。

各サービスは、技術スタック、インフラ、運用手順、ドメイン知識それぞれについて絶えず一つのシステムとしての独立性が求められる。

これらの実態は分断されてしまうから、負担の増加分はサービス数に合わせて線形に変化する。

相互連携となるとさらにひどい。

仕様の各部分がサービス間ごとに調整されなければならないから、そのための労力は、サービスがn個あれば、n(n - 1)/2に比例する。サービスが3つなら、それぞれの相互連携が2つのときの3倍、4つなら6倍必要になる。

さらに、もしその分割された各サービスが共同で問題解決にあたるための仕様策定が必要になると、自体は一層ひどくなる。

連携を図るために追加される労力は、一つのサービスの場合と違い、より困難な状況をもたらす。

ソフトウェア構築は、本来システム的な作業──複雑な相互関係における作業の遂行──であり、コミュニケーションを図るための労力は大きく、分担によってもたらされた各サービスの疎結合性はすぐエントロピーの餌食となってしまう。

だから、サービスを分割することが、システムのレガシー化を加速させることはあっても、減速させることはないのである。

Tags: プログラミング,

コンウェイの法則とマイクロサービス

システム開発においてはコンウェイの法則が稀によく観測されます。

コンウェイの法則とは「システム設計は、組織構造を反映したものになる」法則のことです。

社内の開発体制とシステムアーキテクチャは密接な関係になり、社内のコミュニケーションパターンがDevOpsに影響を与えます。

ところで昨今、開発プロジェクトに関わるごとにマイクロサービスを採用したい人をよく見かけるようになりました。

Wikiの内容をそのまま引用しますが、マイクロサービスは

1つのアプリケーションを、ビジネス機能に沿った複数の小さいサービスの疎に結合された集合体として構成するサービス指向アーキテクチャ

です。

一つの膨大なシステムを開発運用するより、システム全体を小さく分割された複数のサービスにしておけば、各担当者はそれぞれ単体のサービスにフォーカスを絞って開発運用ができるようになります。

全体をまとめて管理するより運用コストを下げることができます。

また、サービスがモジュール化(疎結合化)しているのでシステムが冗長化しやすかったり、改修にかかるスコープが限定的で済んだり、継続的デリバリーとも相性がいいです。

すごくいい事だらけなような気がします。

しかし、この世に銀の弾丸はありません。

マイクロサービスを採用しようとしている現場のほとんどはベンチャー企業やスタートアップだったりします。

全員集まっても数人、多くても数十人ぐらいの規模感です。

そもそもチームを分割できるほど頭数がいません。

マイクロサービスは基本1チーム1サービスです。

しかし現実は1チーム複数サービスになっており、結局は全体をまとめて管理運用することになっています。

一つのシステムだと一つのサービスの運用管理で済みますが、複数のサービスに分割されていると、サービスの数だけ運用管理の手間がかかります。

分割した分、一つの状態のときより分量は増えますし、各サービス間のI/Fや連携に携わる手間も追加で発生します。

また、開発時にそれぞれのサービスを別々の開発チームにお願いしていたりすると、DDDにおけるドメインモデルの振れやユビキタス言語の差異が発生し、システム全体の統一性を保つことができなくなり、仕様の面から技術的負債が膨れ上がることになります。

ここで最初に話したコンウェイの法則が牙を向きます。

多チーム多サービスはコンウェイの法則を満たします。

しかし、1チーム多サービスはコンウェイの法則により1チーム1サービスに収斂していきます。

いくら口でマイクロサービスと喚いたところで、最後に蓋を開けてみれば、そこに存在するのはキレイに疎結合化されたサービス群ではなく、なんだかよく分からない十把一絡げになったシステム的なサムシングになるのがオチです。

そもそもベンチャーやスタートアップはビジネスモデルも確立できていないし、人の入れ替わりも激しい業界です。

朝令暮改やピボットが当たり前の世界です。

システムに期待される要件はカオスにさらされ、少人数でPDCAを高速で回す分、システムの実態は密結合にならざるを得ないでしょう。

ビジネスが不安定であり、組織が密結合なのですから疎結合のアーキテクチャであるマイクロサービスを採用すること自体、コンウェイの法則的に無理があるのです。

組織が密結合であるにも関わらずマイクロサービスを採用するものの、コンウェイの法則によりシステムは密結合に収斂していく、これがマイクロサービスがうまく機能しない理由です。

システムの所有者が大手大企業であり、その子会社がサブシステムを持っている、ぐらいの規模感がないとマイクロサービスは実現できないのです。

Tag: プログラミング

コンテキスト消費社会

サブカル全盛の昨今、世の中には大量のコンテンツが溢れています。

エンターテイメントや趣味にとどまらず、コンテンツマーケティングに代表されるようにビジネスにおいてもコンテンツが重要なファクターになっています。

コンテンツとは直訳すると「内容」です。

今読んでいる文章も「コンテンツ」です。

そして当サイトにはこの文章以外にもたくさんの文章をストックしています。

当サイトにある自分が書いた一連の「コンテンツ」のまとまりは「ブログ」という単位で扱われています。

ちなみに、ブログは「メディア」で、メディアとは情報伝達媒体のことです。

メディアとはコンテンツ(商品)と読み手(消費者)を結びつける窓口のような概念です。

コンテンツがあっても、それが消費者まで届かなければなんの価値にもなりません。

誰の目にも止まらないコンテンツは存在していないと同義です。

そこでTVやラジオ、DVD、雑誌、新聞など様々なメディア媒体を駆使してコンテンツを消費者まで届けようとしているのです。

そして、ここ十数年でインターネットという圧倒的なメディアインフラが誕生しました。

一般ピーポーである一個人の自分がコンテンツを配信できているのもインターネットの力のおかげです。

メディアの種類が増えた分、昔に比べて大量のコンテンツを現代人は消費するようになりました。

現代を生きる我々は生活のかなりの時間、SNSを中心としたコンテンツのシャワーを浴び続けています。

ここまでの話でメディアの進化によりコンテンツが大量に生産されるようになり、かつそれが人々に届きやすい世界になっていることが分かりました。

その結果、世に溢れる様々なコンテンツは人々の生活様式や思想、行動に多大な影響を与えるようになってきていると考えられます。

21世紀頭の前後あたりから情報過多社会とよく揶揄されるようにもなりました。

みなさんも一度は「現代人は情報を過剰摂取している」といった内容の論説を聞いたり読んだりしたことがあると思います。

ここからが本エントリの本題なのですが、我々は本当に世に溢れる大量のコンテンツを消費して生活しているのでしょうか?

とある本を読んでいたら「それはちょっと違うんじゃないか?」という疑念がわいてきました。

日常の雑談やちょっとしたやり取りであれば、コンテンツの消費は物語の価値として働き、日常のコミュニケーションを多彩なものにしてくれます。

しかし、物語の価値にはプラスの側面だけでなく負の側面もあるようです。

物語自体はコンテンツですが、物語から派生した知識や情報はコンテキストとして作用するようになります。

コンテキストとは文脈のことです。

文脈とは文(センテンス)を解釈するための前提条件となる知識や情報のことです。

スターウォーズを知らない人が「Aくんは暗黒面に落ちた」と聞いてもチンプンカンプンですが、知っている人が聞けば「Aくんは悪者になってしまったんだな」と理解できます。

コンテンツが溢れる世の中であるということはコンテキストも溢れる世の中であるとも言えます。

コンテンツを味わって食すためにはコンテキストという調味料が必要な場合が多くあります。

コンテンツの消費の仕方にも、純粋に楽しむためのコンテンツ消費とコンテキストを仕入れるためのコンテンツ消費の2パターンがあるわけです。

最新作のスターウォーズを観るために過去作を全部観ることが後者で、最新作を観るのが前者の消費の仕方になります。

ですが、全てのコンテンツにコンテキストが必要というわけでもありません。

コンテキストを仕入れなくとも楽しめるコンテンツもいっぱいあります。

むしろそちらのほうが多いはずです。

『天気の子』を観るために『君の名は。』を見ておく必要はありません。

しかし、純粋に『天気の子』だけを観るのと『君の名は。』も鑑賞してから観に行くのと、新海誠監督について色々予習してから観に行くのとでは、それぞれ楽しみ方や映画を見たあとの感想が変わってくると思います。

コンテンツは一つですがそこに合わせるコンテキストは無限大にあります。

それこそ一人ひとりがそれぞれ歩んできた人生や価値観、その時の気持ちなどもコンテキストとして作用します。

そうなってくるとコンテンツの解釈は千差万別となります。

これがコミュニケーションを困難なものとしている要因ともなっています。

強固な共同幻想の上に成り立つコンテキスト(お金や国という概念など)であれば人の違いによる解釈違いは起きにくいでしょう。

しかし、コンテンツもコンテキストも巷に溢れかえっている現代では、コンテンツも多種多様でありコンテキストも多種多様で、2つをかけ合わせるとコンテンツの消費のされ方は人の数だけ存在することになります。

コンテンツの価値はコンテンツ自身だけの問題のように思われがちですが、コンテンツを人がどのように解釈するかは消費する側の持つコンテキストに依存する部分が大きかったりします。

コンテンツがご飯(お米)だとするとコンテキストはおかずです。

料理を味わう時はおかずが主役であり、ご飯は主食とは呼ばれるものの、食事の主役は常におかずなのです。

外食する時はご飯ではなくお肉を目的に食べに行きますし、ラーメンの味の本質はスープです。

そう考えるとコンテンツよりもコンテキストのほうが重要だと思えてこないでしょうか。

ここまで書いてきてやっとタイトルに言及できるようになりました。

我々がコンテンツを消費していると思いこんでいることは、実はコンテキストの消費なのではないか。

先程のスターウォーズの例であげたように、文章があったとしてもそれを解釈するための文脈を知らないとうまく文を消化することができません。

そういった意味で文脈は内容よりも大事な要素となります。

人や場面によっては「暗黒面に落ちた」を「悪者になった」という意味以外で「強大な力を手に入れた」や「心を閉ざした」「裏切った」という意味で捉えるケースもあるでしょう。

言葉はどこまでいってもただの言葉でしかないのです。

表現された言葉だけですべてがそのまま伝わると思ったら大間違いです。

自分の思考が正確に相手に伝わるためには…

  • 1. 表現したいことが言語に存在するか
  • 2. 表現したいことをちゃんと言語化できるか
  • 3. 言語化したことが自分の実際の感覚と一致しているか
  • 4. 受け手が自分と同じ意味で言葉を解釈してくれるか

これらすべてのステップを達成しなければなりません。

1は人類全体の問題で、2と3は自分の問題です。

4は相手の問題になります。

2のときにコンテキストが自分の表現する言葉に影響を与え、4のときにコンテキストが相手の解釈に影響を与えます。

このように伝達までのステップを分解して眺めると内容そのものより文脈のほうが伝達において重要な要素を占めていることがわかると思います。

さらに文脈は個々人が前提として持っているものだけではありません。

会話のやり取りの中で醸造されたり、文章全体の雰囲気や記事のタイトル、世間のイデオロギーなども大いにコンテキストとして作用します。

いわゆる「空気感」と呼ばれるようなものたちです。

ここまでコンテキストの影響が多くなると、やはりご飯(コンテンツ)をきっかけにしておかず(コンテキスト)を消費していると考えたほうがしっくりきます。

さらに、コンテンツの消化はコンテキストの認知を強化している側面もあります。

先程例にあげた、映画の最新作を観るために過去作を観る、といったように。

日々目にする情報が偏れば、偏った内容のコンテキストを植え付けることができます。

ワイドショーが環境問題を取り上げると「地球がヤバい」となり、政治問題を取り上げると「政治がヤバい」となり、経済問題を取り上げると「経済がヤバい」となり、途上国問題を取り上げると「中東とアフリカがヤバい」となり、軍事問題を取り上げると「核がヤバい」となり、感染症問題を取り上げると「ウイルスがヤバい」となります。

みんなが認識していないだけで、地球上のどこかには何かしらの「ヤバい」は常に存在しています。

そして、それらの「ヤバい」は自分の生活に対してどこまで影響を及ぼすかまでは深く考えないでしょう。

普段目にする情報がコンテキストとして作用して、その問題こそがすべての核心だと思いこんでしまい、その前提で情報(コンテンツ)を消費することになります。

コンテキストとして作用している知識や情報がコンテンツを消費する際に常に正しく生かされているかはとても疑わしいところです。

レジ袋有料化はマイクロプラスチック問題に対して本当に現実的に成果をあげることができるのでしょうか?

それを判断して効果の是非を判定するのは現在の科学で本当に可能なのでしょうか?

そもそも何を持ってして解決したとするのでしょうか?

判断基準があったとしてそれがほんとに正しいと言えるのでしょうか?

コンテキストの持つ一番の恐ろしさは、この「疑わしい」という感情を芽生えさせないところです。

コンテキストとコンテンツが自分の中でスマートに融合されてしまえば、コンテキストで味付けされた味であるにも関わらず、なんの疑いもなしにコンテンツをコンテキストの味と認識して消化してしまうのです。

コンテンツの味を吟味することなくコンテキストの味で食事を済ませてしまうことが「わかったつもり」です。

コンテンツをつつがなく消化できてしまえば、その時点でコンテンツの解釈は打ち止めになってしまいます。

「わかったつもり」を得られればコンテンツの詳細を把握しなくとも、間違った定義のまま理解してしまったとしても、コンテンツを消化したことになります。

しかしこれはコンテンツをちゃんと消化したと言えるのでしょうか。

コンテンツをきっかけにして自身の持つコンテキストを強化しているだけになっていないでしょうか。

賛成派の人は賛成になるような情報の読み取り方しかしませんし、反対派も言わずもがなです。

「一ヶ月前に比べて感染者が2倍に増えた」という情報があったとしましょう。

感染悲観派は「2倍に増えたヤバい」といい、感染楽観派の人は「分母が増えただけで比率は変わってないよ」と自分が持つ文脈で情報を解釈するでしょう。

同じコンテンツでも解釈のされ方は人それぞれの持つ文脈で180度変わります。

やはり人々が消費しているのはコンテンツではなくコンテキストということになります。

そして「そもそも感染の定義とは?」や「インフルと同じ検査方法じゃなくてなぜPCRなの?」という疑問が湧いてきてはじめて人はコンテキストの呪縛から逃れて「わかったつもり」から「わかった」に踏み出せるのです。

Tags: コミュニケーション,

More entries ...