yigarashiのブログ

学んだことや考えていることを書きます

「職能横断チーム」の実践におけるアンチパターンと対策

近年のアジャイルムーブメントにおいて「職能横断チーム」は当たり前の概念になっています。ユーザーに価値を届けるのに必要なあらゆる機能をチームが備え自律的にコントロールすることで、リードタイムを短縮するとともに、イノベーションが起こりやすい環境を作ることができます。しかしながら、7〜8人を超える大きめの集団になってくると、開発の効率を著しく下げるアンチパターンを踏んでしまうことがあります。

「職能横断チーム」の実践におけるアンチパターン

そのアンチパターンとは「いつも全員一緒」です。バックエンドエンジニアだろうとアプリエンジニアだろうと、デザイナーだろうとプランナーだろうと関係なくとにかく全員です。サイロ化のカウンターとしての「職能横断チーム」に囚われ過ぎてしまって、チーム内に部分集合を作ることを極端に避けてしまっている状態です。その結果、10人もいる会を開いて細かい相談で時間が伸びたり、そもそも深い相談の場を持てなかったり、ひとつのカンバンに全員の情報が載ってわけがわからなくなったり、というトラブルをよく目にします。

特にミーティングの観点では、リモート化によって会が有効に機能する人数の上限が下がっている印象があり、このアンチパターンの被害は拡大していると感じます。僕の同僚も「雪見だいふく2袋ルール」(つまり4人)というのを提唱していて強く同意します。

普通に考えると、2、3人しか関係ない話に全員を拘束するのはどう考えても非効率なのですが、このアンチパターンでは職能横断という言葉が逆に呪いとなってチームを硬直させます。アジャイルを実践するという善意から生まれた状況なので、おかしいと思っても反論しづらい側面があります。うまくやらないと、職能横断チームを否定するんですか?アジャイルがんばるんじゃないんですか?と衝突が起こってしまいます。

望ましいマインド

こうした極端な考え方に陥ってしまったときは大元の目的に立ち戻るのが有効でしょう。我々が一番達成したいことはなんでしょうか。それはバリューストリームを最適化することだと考えます。チームが幸福で、ユーザーに早く多く価値が届くことが何よりも重要です。「職能横断チーム」はそのための有力な手段のひとつに過ぎませんし、適用する塩梅はチームに合わせてうまくカスタマイズしていく必要があります。一歩引いた目線で、「いつも全員一緒」が本当にバリューストリームを最適にしているかを考えてみると良いでしょう。

そうして実際にバリューストリームを分析していくと、一部のメンバーに特化したパートが必ずと言って良いほど現れることでしょう。例えば、リファインメント(ないし設計)の場が充実していれば、エンジニアとPO・プランナーが常に一緒である必要はないかもしれません。それよりも、エンジニアリングに特化したカンバンや相談の場があったほうが、バリューストリームはスムーズに流れるかもしれません。こういう分析をしていくと、全員が一緒にいなければいけない場面が思いのほか少ないとわかってくるはずです。というか、もしそれで本当に全員いつも一緒にいる必要があるとわかったら別の課題があるように思います。逆にもっと深く関わるべきだったコミュニケーションパスもたくさん見つかるはずです。

「いつも全員一緒」はソフトウェアで言えばmain関数に全ての処理を書いている状態で、もっとチームやコミュニケーションの構造を掘り下げる余地があると思います。いま1チームだと思っている集団の中で、どんな部分集合が価値を生み出しているか、その部分集合同士がどのように通信をするのかを、色々な絵を描いて掘り下げてみると面白い知見が得られるはずです。

FAQ

最後に、こういう話をするときの想定FAQをまとめて変化の助けとします。

Q. とはいえ全員に共有したい話題もあります

  1. 全員が集まる場を無くせと言っているのではありません。必要ならやったら良いです。わたしのチームでも、毎日15分は全員(15人ほど)が集まって同期を取る時間があります。ただ、それに引っ張られて全てのアジェンダを全員で消化するのは違うと思います。全員が集まる場ではそこでしか解決できない話題に限るべきだと思います。

Q. 開発の状況が見えづらくなって不安です

  1. まずは本当に細かく状況を知るべきか検討しましょう。たとえばスクラムでは、リファインメントによって今後の計画を、スプリントレビューで開発の成果を知ることができます。それ以上の解像度で恒常的に開発状況を把握する必要があるとしたら、それは別の課題のサインかもしれません。また、同期的な共有をしないまでも、ひと目で開発の状況を把握できるようなカンバンを運用できていれば十分かもしれません。リリース間近のような特殊な状況では専用のミーティングを用意するのも良いでしょう。

Q. 情報格差が生まれるのが心配です

  1. 大規模チームでリーダーだけの会などを開くようになると生まれる懸念だと思います。これに関しては話すべきことを話せないよりはマシなので諦めましょう。議事録を透明化したり、別途サマリーを共有する場を設けたりすると良いと思います。

Q. イノベーションが阻害されませんか

  1. これは難しい話題ですが、それにしても全員で一堂に会するのは筋の悪い解決策であると思います。リモート会議なら尚更ですが、全員いたところで発話できるのは数人なのでアイディアは集まりませんし広がりません。もし全く新しいものを生み出したいなら、デザインスプリントのような仕組みを利用して、各職種から人をピックアップしてタスクフォースを組んだりするほうが効果が高いと思います。日常的なちょっとした創意工夫を期待しているなら、プロセスを整理した後も職種横断のコミュニケーションは続くはずなので心配はないように思います。

Q. チーム内の部分集合がうまく見つかりません

  1. 基本的には、職種やフィーチャーなど、バリューストリームの中の主要なパートに着目すると見つかるはずなので頑張って探してくださいとしか言えません。たまに同じ役割のエンジニアが10人も20人も横並びになっていて困っているケースがあり、それは難しい問題です。どうしてそんなことになるまで放っておいたんだ!!というのが正直な感想ですが、そうなってしまったものは仕方ありません。まずは能力が均等になるように小グループに分けるだけでもマシになるのではないでしょうか(わたし自身も解決の経験がなく当て勘で言っています)。長期的には、チームトポロジーで議論されているようなやり方でチームとアーキテクチャを分割したり、大規模スクラムを導入したりといったことを検討するのが正道になるでしょうか。

Q. たまーに話題があるコミュニケーションパスはどうしたらよいですか

  1. 話題があるときだけ自由に参加できる形にしたり、ワンショットで会話の場を設定したら良いと思います。コミュニケーション設計は、いつも集まるか集まらないかの二元論ではありません。

以上!バリューストリームを最適化してハイパフォーマンスな職能横断チームを作っていきましょう。

チームのベロシティを上げる vs. 安定させる

タイトルの議論はよく見られるもので、スクラムコーチの間ですら(一見すると)意見が分かれることがあるようです。自分は「安定させる」派だったのですが、CSPO研修を受講したチームのPOが「上げる」派のコーチングを受けてきて、改めてチームとしてどういうスタンスを取るか考える機会を得ました。結論から言ってしまうと、そもそもこれは二項対立ではなく、「上げる」派の人も「(安定させた上で)上げる」と言っているだけで、単に目指している高さが違うだけだろうと解釈しました。その上で、チームの現状に合わせて適切な目標設定をすれば良いと考えました。以下でもう少し掘り下げてみます。

大前提

まずソフトウェア開発の大前提として、開発チームには常にベロシティを下げる方向に様々な力がかかっています。これは「変化」と呼ばれて恐れられ、プロダクトや開発チームに次々と襲い掛かります。例えば以下のようなものです。

  • 市場が求めるものが変わる
  • ミドルウェアやライブラリのインターフェースが変わる
  • システムに適した言語や設計が変わる
  • トラフィック量や傾向が変わる
  • システムのリソース使用の傾向が変わる
  • メンバーが変わる
  • 普段とシステムの触るところが変わる

こうした具合に、日々その場に立っていることすらままらない激流が開発チームを襲います。この力をあの手この手で受け流しプロダクトを成長させることこそ、「変化への適応」というキーワードで語られるアジャイルムーブメントの重要な価値観のひとつでしょう。

ベロシティを安定させる

上の前提に立ったとき、ベロシティを安定させることは決して容易な目標ではありません。この目標を達成するには、計画やふりかえり、障害物の排除が高いレベルで機能している必要があります。それらの成熟度が低いと、見積りを大外しして計画がめちゃくちゃになったり、差し込みや障害に忙殺されたりして、少なからず重要な仕事をうまく達成できないタイミングが出てくることでしょう。

ベロシティが安定しているのは、字面から受ける保守的なイメージよりもかなり価値が高い状態です。アジャイル宣言の背後にある原則の中でも「アジャイル・プロセスは持続可能な開発を促進します。一定のペースを継続的に維持できるようにしなければなりません。」と述べられており、非常に普遍的な価値であることがわかります。毎スプリント終わると言ったことが確実に終わり、その予想を積み重ねて大きな計画を精度高く予測できることは、POやステークホルダから見て非常に嬉しいことです。またベロシティが安定しているということは、開発チームが変化に押し潰されていないということで、ある程度の達成感や自己効力感を継続的に得られることが期待されます。

こうした議論から、多くの現場にとってベロシティを安定させることは十分に高い目標であり、最初に目指すのに適した目標だと言えるでしょう。スクラムコーチの中でベロシティを「安定させる」ほうを積極的に提示する人は、こうした堅実な考え方をしているのではないかと予想します。

ベロシティを上げる

当然、価値のデリバリーは早いに越したことはないので、ベロシティだって上がるのなら上げたいものです。ベロシティを上げることを考えるとき、ふたつ重要なポイントがあると考えます。ひとつはベロシティをハックしないこと。見積りをいじったり、完了条件を緩めたりしてベロシティを上げても意味がありません。もうひとつのポイントは持続可能であること。開発チームが無理な残業をしたり、その場しのぎの実装ばかりしていては、上がったベロシティも長続きはしません。

こうしたポイントを開発チームで守っていくことを考えたとき、ベロシティを「安定させる」という前提は非常に都合が良いと感じます。見積もりや完了条件といったバックログアイテムの取り回しに関することを一貫して行い、一定のペースで働き、システムを健全な状態に保つ……こうした望ましい行動が自然と導かれます。自分が又聞きした研修でも、「幸福度や品質を毀損しない前提で」といった前置きがあったようで、かなり近いことが言われているように思います。

こうした議論から、ベロシティを「上げる」のは、ベロシティを「安定させる」レベルをクリアしたチームが目指す次の目標であり、二者は対立するものではないと考えます。ベロシティを「上げる」ほうを積極的に提示するスクラムコーチは、レベルの高い現場に精通し、高い目標を設定することを好んでいるのではないでしょうか。多くの普通の現場においても、短期的な目標として「安定させる」ことを置き、長期的なストレッチ目標として「上げる」ことを置くと、だいぶ筋が通るように思います。

チームが重要な目標にリソースを使えているか可視化する

リソースを集中させるのは難しい

プロダクト作りにおいては、一番効果が高いところにリソースを集中しリードタイムを縮めるのが良いとされています。スクラムをやっているなら、ただひとつのプロダクトゴールが掲げられていて、そのためのプロダクトバックログアイテムに取り組む割合が高いほどゴールに早く辿り着くことが期待できます。しかしこれを実践するのは非常に難しいです。ステークホルダからの依頼、並行プロジェクト、障害対応などなど、チームが重要な目標に向かうのを阻む障害物が無数にあります。プロダクトバックログ Deep Dive | Ryuzee.comにおいても、「スプリントゴール直結のプロダクトバックログアイテムとそれ以外(上述)のプロダクトバックログアイテムの比率を7:3程度にすることも多い」と述べられていて、集中しきれないのは避けられないことではあると思います。

少しでも集中するために

こうした難しい状況のなかで、まずは「自分たちがどれだけリソースを集中できていないか」を知ることは非常に重要です。状況を透明化しなければ検査も適応もできません。ということで、自分のチームでは以下のようなバーンアップチャートで実績を可視化してみることにしました。

f:id:yigarashi:20220403113757p:plain

青と赤の線が、プロダクトゴールに紐づく施策に関する通常のバーンアップチャートです。青がポイントの全量で、赤が実際に消化したポイントです。今回重要なのは黄色の線で、これはチームのベロシティを積み上げたものです。赤と黄色の線の差分が、プロダクトゴールに紐づかないバックログアイテムに吸い込まれてしまった工数を表しています。このグラフでは残念ながら50%を超えてしまっていますね。もし100%のリソースを投入できていたなら、この施策はチャートの範囲で既にリリースできていたかもしれません。

このチャートはPOの思考を研ぎ澄まします。プロダクトバックログアイテムの優先度は本当に正しいのか、正しいならどこに問題があるのか、例えばリソースが足りてないのか、組織設計に問題があるのかといった推論が進んでいきます。ちなみに今回の件では、優先度設定には問題なく、実際その都度どうしても先送りにできなかったり、明らかに価値が高いとわかるアイテムだけが上位に上がってきていることを確認しました。つまりボトルネックは別のところにあるということです。リソースの使い方を可視化したことで、課題を正しく捉えて建設的に議論が進んだのが面白いポイントです。

この活動の位置付け

この活動はスクラムにおける「透明性」を獲得するものだと考えられます。そして透明性を獲得したことで検査と適応が進み始めました。課題に感じることがあるなら、まずは定量的に可視化すると話が進むかもしれません。ちなみにこうしたリソースの使い方やチームのキャパシティを知るには、チームが取り組むすべてのアイテムに見積もりが入っていることが前提になっています。先日YAPC 2022で発表したスクラムで作る頼もしく生き生きとしたチームでも、見積もりによってチームが成長した話をしていて、見積もりにだいぶ助けられているなと思います。見積もりをしていない世界で全アイテムの見積もりを始めるのは結構勇気がいるのですが、一度始めると見積もりしないのはありえないと感じます。あまりにも良いことが多すぎるので。みんなも見積もりしましょう。

がんばりすぎないふりかえりのススメ

がんばりすぎてふりかえりを嫌いになった

自分たちのやりかたを検査して改善するふりかえり。巷には様々な思想やフレークワークが出回っています。チームからうまく情報を引き出したり、教訓に昇華したり、SMARTなアクションを設定することも大事です。そういう情報がどんどん襲ってきて、しっかり会を設計してバリューの高いふりかえりをやらなければという気になってきます。

それで工夫して上手くいくなら良いですが、自分にとってはあまり良い道標として機能しませんでした。会を頑張って設計しても、そもそも参加者が喋ってくれなかったり、ファシリテーターと1対1の会話が起こるだけになったりして、手応えを得られないことが多くありました。それでもちゃんとバリューを出さなければと焦って、なんとかアクションをまとめたり、無理やり教訓ということにしてチームのドキュメントに追記したりしていました。そういうぎこちない会を回すのはとにかく疲れるもので、1時間もファシリテーションをしようものならぐったりしてしまって、ふりかえりをどんどん嫌いになりました。

がんばるのをやめたら何故かうまくいった

ところが最近、こうした経緯で高まった「ふりかえりなんてどうでもいい」気持ちと、「エラスティックリーダーシップ」でソフトウェア開発をうまくリードする方法を考える - yigarashiのブログなどを通して醸成された「メンバーの活動をじっと見守る」気持ちが結びついて、予想外に良い方向に転がりました。具体的には、いつも通り出来事を書き出して思い出すパートが終わったら、みんながそれを眺めて雑談するだけで良いことにしたのです

そういう適当な気持ちなので、書かれた項目を上から見ていって「いやーこれ大変だったねー」とか「これめっちゃ早く終わったね」とか、休憩にでも入ったような雰囲気で喋り始めました。すると不思議なことに、その後の会話がいつもより自然に続きました。「これはこういう問題があって難しかったです」「こうやったら簡単に終わりそうだけどそれはダメだったの?」って感じです。なんだか教科書で見たことがあるような活発なふりかえりに似ています。そうやってひと通り盛り上がった議事録を見返すと、やたら教訓めいた発言や今すぐ直したいポイントが見つかったので、それをふりかえりのアウトプットということにして会を終えました。

かつてないほどラクだし、楽しいし、バリューもあるふりかえりでした。

何が良かったのか

自分なりに分析してみると、好きに話してよい場をうまく作り出せたことで、情報の流量とコミュニケーションパスが増えたのがポイントではないかと思いました。これまでは会の形式や情報の種類を整えることでふりかえりがうまくいくと思っていましたが、そこから始めてしまったことでチームが硬直してまったのかもしれません。問題解決において、チームのコミュニケーションから生まれる創造的なアイディアに勝るものはなかなかありません。それを信じているからこそスクラムを始めとしたチームファーストなやり方を取っているわけです。

つまりなにより大事なのはみんながいっぱい喋ることです。まずはそこをクリアすることが大事だと思います。そして、一般にファシリテーションの技術で想像されるような問いかけや情報の整理、ふりかえりのさまざまな手法は、情報が増えたあとで真価を発揮するものが多いように思います。もちろん情報を引き出しやすくする手法もあるのでそれはうまく使ったら良いでしょう。タイトルの「がんばりすぎない」は実は建設的なことを言っていて、ふりかえりを改善するための課題をうまく捉えて順番にクリアしようということです。

高すぎる認知負荷が生むサービスの袋小路とエンジニアリングマネージャーの役割

最近流行りの「チームトポロジー」では、フローが改善するようにチームの認知負荷をコントロールすることが述べられています。そのためには組織とアーキテクチャをうまく変化させていく必要があり、いくつか主要な考え方やパターンが紹介されています。詳しく知りたい方は以下の資料を読むと良いです。

【資料公開】30分で分かった気になるチームトポロジー | Ryuzee.com

この資料は2022年3月16日の「チームトポロジーを成功させる実践方法の探求」というイベントの発表資料です。このイベントでは、上記の解説に加えて、イベント共催企業で実際にチームトポロジーを適用した様子も紹介されました。それが以下です。

チームトポロジーを成功させる実践方法の探求 - Team Topologies Study、登壇資料

課題の言語化が上手く、しかも実際に素早く変化しており、「とても敵わないな」というのが率直な感想でした。ただこの無力感をそのままにしておくのは勿体無いと思い、どうしてそんなに距離を感じるのか考えた結果、以下のように言語化されました。

高すぎる認知負荷が生むサービスの袋小路

いわゆる「服を買いに行く服がない」というやつです。一度システムが複雑化して組織や事業がそれに追いつかない状態になってしまうと、あらゆるアクションが高コストになります。チームトポロジーではドメインの節理面を見つけて組織とプロダクトを分割せよと言うのですが、真面目に分割しようとすると2年も3年もかかってしまうとか。自動化やドキュメンテーションによって認知負荷を軽減しようにも、対象のコンポーネントが多すぎてペイしないとか。そしてそんなことを言ってまごまごしているうちに普通は事業も停滞するので組織を拡大することもできない。見事な袋小路の完成です。

手堅い処置としては、プロダクトの仕様を整理してそもそもの複雑度を下げていくことが考えられます。袋小路を戻るイメージが近いかもしれません。飛び道具としては、上位レベルの判断によって大量の人を投入するとか、低コストでとんでもなく成長する施策をぶち当てるといったことが考えられます。しかしどれも難しかったり不確実性が高かったり、こんなこと考えずに済むならそれが一番だという気になってきます。

エンジニアリングマネージャーの役割

どうやったらこの袋小路に入らずに済むのか考えた時に、僕はエンジニアリングマネージャーの役割を再認識することになりました。上では袋小路の原因を、事業、組織、システムのバランスが崩れていることだと分析しました。逆にそれらの足並みが揃っていれば、システムを現実的なスピードで進化させられるし、そこに合わせて組織も変化・拡大できるし、フローが改善して事業も成長するし、とポジティブなループを期待できます。

こうしたマネジメントは、エンジニアリングマネージャーを目指す若者の戦略 - yigarashiのブログで整理した、エンジニアリングマネージャーの4領域であるテクノロジー・プロダクト・デリバリー・ピープルにまたがる大仕事になります。いわゆる"強いEM"の視座を持って取り組むことになるのでしょう。これは誰かがやらないといけない(というよりは誰かがやるともっと上手くいく余地がある)仕事であると思います。あぁ、だからエンジニアリングマネージャーが必要なのかと腹落ちしました。事業を成長させたいと思った時に、システムと開発組織を一緒に変化させる視点を持っている人がいることで、「成長し続ける事業」への道が開けるのではないかとか、そんなことを考えました。

僕はいまのところ新米の"弱いEM"で、まだここまでをコントロールできる胆力はないなーと感じます。個別にボトムアップでやれることを探したり"強いEM"と連携したり、地道に袋小路から抜け出す手を打っていこうと思います。