チームの「過剰な推進力」が引き起こす組織の不整合と、そのデバッグ
チームの推進力、適切にコントロールできていますか。
推進力がないチームは物事が進まないので論外ですが、推進力がありすぎるのも、実は非常に厄介なバグを組織に埋め込む原因になります。推進力があると、関係者の足並みが揃うのを待たずにどんどんと物事を進めてしまうからです。
アンチパターン:当事者不在の「破壊的変更」
ここで最も警戒すべきアンチパターンは、関係部署があるにもかかわらず、その部署の当事者が不在の状態で話がまとまってしまうケースです。当事者はすべてが決まった状態で、結果だけを聞かされることになります。
これは控えめに言っても最悪のアプローチです。 APIの開発元が、クライアント側への事前協議やDeprecationの周知を一切行わずに破壊的変更をマージし、「仕様を変えておいたから」と事後報告してくるようなものです。そんなことをされて、利用側がいい気持ちになるわけがありませんよね。
たとえ決定したアーキテクチャや仕様が「物事として正解」であったとしても、人としては、当事者である自分を進行プロセスに加えてほしいと思うのが自然です。
オーナーシップを奪う「DBの直接参照」
また、自分たちの領域に対して他部署から過剰に介入されると、「自分たちを受託や下請けとみているのではないか」という不信感を生みます。
これは、別のチームが管理しているマイクロサービスの内部データベースに、外から勝手に直接クエリを発行してデータを書き換えるような振る舞いです。ドメインの境界を越えてカプセル化を破壊する行為は、相手のオーナーシップを根本から否定しています。
こういった部分は、本当に気をつけていかなければならないんです。
時期尚早な「横断チーム」というオーバーエンジニアリング
過剰な推進力に関連してよくあるのが、「横断チーム」の存在です。
大規模な組織であれば、システム全体の整合性を保つために致し方ない部分もありますが、小さな組織でいきなり立ち上がると、現場としては「何が起きたのか」と違和感しか感じません。
これはまさに、シンプルなモノリシックアーキテクチャで十分高速に開発できる規模なのに、いきなり重厚な「全社共通のデプロイ基盤」を強制導入し、ちょっとしたリリースにも別チームの承認待ちを発生させるようなものです。完全にYAGNI(You Aren’t Gonna Need It)原則を無視したオーバーエンジニアリングです。
小規模な組織に無理やり横断チームという「共通基盤層」を差し込むと、無駄な通信オーバーヘッド(コミュニケーションコスト)が発生します。しかも、この横断チームが無駄に高い推進力を持って各チームの領域に介入してくると、現場はさらに混乱します。本来なら各チーム内で完結すべき処理に、いちいち横断チームの承認という不要な同期処理が挟まるようなもので、明確なアンチパターンです。
横断チームは「フレームワーク」ではなく「ライブラリ」であるべき
もし小さな組織で横断チームをうまく機能させたいのであれば、原則として「相談役」という立ち位置を絶対に脱しないことです。
これは、横断チームは「フレームワーク」ではなく「ライブラリ」として振る舞うべき、と言い換えることができます。 フレームワークは制御の反転(IoC)を起こし、アプリケーション全体の主導権を握って各機能の実行に強制的に介入してきます。これを組織でやってしまうと、各チームの自律性と開発スピードが失われます。
一方でライブラリは、各チームが必要なときにだけ任意で呼び出す(相談する)ものです。制御権はあくまで各チーム側にあります。 横断チームは、デプロイパイプラインを止めるような強制力を持つバリデーターとして割り込むのではなく、あくまでオプトインで利用できる便利なモジュールや、Linterの「Warning」レベルのアドバイザーに徹するべきです。
人間というステートフルな存在と、非同期処理の罠
コードはステートレスに実行できても、仕事をしているのは人間です。人間は過去の経緯や感情という状態を保持する、極めてステートフルな存在です。
決定したい内容や、情報を共有するタイミング。これらを少しでも間違うことは、非同期処理において必要な await をかけ忘れ、関係者のステート(合意や認識)が確定する前に後続の処理を走らせて、システムをクラッシュさせるのと同じです。
システム上の正解だけで強引にプロセスを進行させ、共有のタイミングを誤れば、最終的に組織という巨大なシステムはデータ不整合を起こし、崩壊する恐れが高くなります。



