組織を関数として実装せよ
組織を構成するユニット(部署やチーム)とは何か。
私はこれを、Functionであると定義している。ここで言うFunctionとは、単なる機能や役割という意味ではない。プログラミングにおける関数、すなわち『特定の処理を行い、値を返す仕組み』としてのFunctionだ。
エンジニアリングのバックグラウンドを持つ私にとって、これは無意識に行ってきた思考プロセスだった。だが、組織が拡大し、スケーラビリティが求められる今だからこそ、あえてこれを言語化したい。組織をコードとして捉え直すことで、我々が直面する組織のバグの正体が見えてくるからだ。
経営層が見るべきはインターフェースのみ
経営層や上位レイヤー、あるいは他部署などの呼び出し元にとって、各チームの内部で行われている詳細な処理は、ブラックボックスでいい。誤解を恐れずに言えば、中身を見る必要がない状態こそが健全なのだ。
機能を利用する側が知るべきは、その関数のインターフェースだけである。
どのようなインプット(リソース、課題、権限)を渡せばよいのか
どのようなアウトプット(成果、解決、価値)が返ってくるのか
この入出力の契約さえ守られていれば、内部でどのようなアルゴリズム(業務プロセス、工夫、チーム内コミュニケーション)が動いているかは、そのチームの責任者に委譲されるべきだ。
これをソフトウェア設計の言葉で責務のカプセル化と呼ぶ。内部の実装詳細を隠蔽することで、呼び出し元は複雑さから解放される。経営層が現場のマイクロマネジメント(内部実装への干渉)を始めた瞬間、このカプセル化は破壊され、組織のパフォーマンスは低下する。
純粋関数と予測可能性
理想的な組織ユニットは、純粋関数に近づくべきだ。
純粋関数には2つの特徴がある。
同じ引数(インプット)に対しては、常に同じ戻り値(アウトプット)を返す
副作用(サイドエフェクト)がない
組織において「あの人に頼むと、気分次第で結果が変わる」では困る。それは再現性がないということだ。ビジネスにおいて、再現性は生命線である。特定の個人の調子や運に左右されず、いつ、誰が実行しても、入力に対して予測可能な出力が返ってくること。この高い予測可能性、再現性こそが、他部署からの信頼の源泉となる。
副作用という名の組織的バグ
最も警戒すべきは、2つ目の特徴である副作用だ。プログラミングにおいて、関数が自身のスコープ外にある変数を書き換えたり、予期せぬ外部状態に依存したりすることは、バグの温床となる。
組織における副作用は、さらに複雑で、悪意なく行われることが多い。
1. インターフェースを無視した不正な書き込み
これは上位者に限った話ではない。隣のチーム、あるいは現場同士であっても起こり得る。ここで重要なのは、情報の共有(Read)と意思決定(Write)を明確に区別することだ。
情報をオープンにすること、状況を共有することは、単なる参照アクセスであり、多くの場合問題ない。むしろ推奨されるべきだ。
だが、責任者や合意形成プロセスを飛ばして意思決定を行うことは、オブジェクトの内部状態を勝手に書き換える行為に等しい。
上位者がマネージャーを飛ばして、メンバーのタスク(優先度変数)を直接書き換える
現場同士が、全体アーキテクチャを管理するチームを通さずに、仕様(グローバル定数)を変更する
これらはすべて、システムの整合性を破壊する。状態が変わったことを、その領域(スコープ)の管理者が検知できないからだ。結果、リソースの競合や、矛盾した状態が発生し、組織はパニックに陥る。
2. 現場レベルの密約
「正式な依頼フローを通すと遅いから」と、個人的な繋がりだけで仕様変更やデータ修正を行うこと。これは、ドキュメントに残らないアドホックなパッチ当てだ。その場では問題が解決するかもしれない。だが、これは組織全体で見れば密結合を極限まで高める行為だ。
公式なインターフェースを無視したバックドアが増えれば増えるほど、システムは複雑化し、ある日突然、無関係な変更が原因で全体が停止する。誰もその依存関係を把握していないからだ。
3. 観測不能な政治
会議室の外、あるいはチャットツールのDMなどの見えない場所で行われる意思決定。これはコード上に現れない隠れた依存関係そのものである。
コード(議事録や公式な場)にはAと書いてあるのに、実行(実際の業務)するとBという挙動をする。なぜそうなるのか、誰もロジックを追えない。デバッグ不可能な状態だ。
観測不能なロジックで動くシステムほど、恐ろしいものはない。信頼性が地に落ちるからだ。
スケーラビリティのための疎結合、そして制御
なぜ、我々は組織を関数化し、カプセル化し、副作用を排除しなければならないのか。
その答えはスケーラビリティにある。
組織が30人の壁、50人の壁、100人の壁を越えて成長していく時、すべてが密結合したモノリスな組織構造では、コミュニケーションコストが指数関数的に増大し、いずれ破綻する。
各チームが独立した関数として定義され、互いに疎結合であること。
これこそが、組織規模が拡大しても、個々のチームが自律的に動き、高速にデプロイ(行動)し続けるための条件だ。
だが、ここで誤解してはならない。単に組織をバラバラに分割すれば良いというわけではない。マイクロサービス・アーキテクチャには分散システムの複雑性という代償が伴うからだ。各サービスが勝手に動き回れば、データの不整合や通信のオーバーヘッドが発生し、組織はカオスと化す。
マネージャーはオーケストレーターであれ
ここで重要になるのが、それらをコントロールする仕組みとマネージャーの存在だ。組織におけるマネージャーの仕事は、部下のコード(業務の詳細)を一行一行レビューすることではない。それは関数の内部実装への干渉だ。
そうではなく、マネージャーは オーケストレーターでなければならない。
APIゲートウェイの役割
外部からの要求を適切にルーティングし、負荷を分散させる。サービスメッシュの役割
チーム間の通信(コミュニケーション)が健全に行われるよう、プロトコルやルールを整備する。サーキットブレイカーの役割
特定のチームが過負荷でダウンしそうな時、全体への波及を防ぐために遮断・保護する。
組織設計という終わりのないリファクタリング
自律したプロフェッショナルなチームを作り上げること。そして、それらが全体として一つの巨大なシステムとして調和して動くよう、間をデザインすること。
疎結合な組織において、マネジメントの難易度は下がるのではない。むしろ、より高度な分散システムの設計能力が問われることになる。
組織のマネジメントとは、詰まるところアーキテクチャ設計とリファクタリングの連続なのである。
