Blogaomu

WEBアプリケーション開発とその周辺のメモをゆるふわに書いていきます。

技術職として歩んできた私がチーム運営を考える上で出会った2冊の本

この記事は ZOZO Advent Calendar 2025 シリーズ 7の5日目の記事です。

突然ですが、この夏に私の所属するチーム(計測プラットフォーム開発本部 SRE)ではメンバー構成が変わる節目を迎えました。特に長く在籍したチームリーダーが他のチームへ異動したことはじわじわとチームに影響を及ぼし、チームとして少し不安定な状況となりました。そんな中、チームとしてどうやって良い状態にしていくかを考えていたときに出会った本について簡単に紹介します。

背景を少しだけ

チーム事情はここでは詳しく話しませんが、メンバー構成が変わった後は上位組織のマネージャーがチームリーダーを兼任するようになったこと、既存メンバーは経験がある人(私含め2名) + 若くて優秀な人(1名)という構成ということもあり、権限の不要なリーダーの仕事やチーム運営についてはメンバーみんなで分担しながらやってみることになりました。なお、SREとしての通常業務も引き続き実行しています。

目下の悩みはチーム目標を立てることでした。半期に一度、チーム目標を立ててそれを仕事のベースとしています。今まではチームリーダーが叩きを用意して、メンバーを含めそれについて議論して目標を決めるプロセスでした。しかし、チームリーダーがいなくなることで「叩き」の部分は誰が作るのか、そもそもこのプロセスが適しているのかという問いが出てきました。これに対する答えを出そうにも私はマネジメント経験がこれまであまりなかったため、まずはインプットを試みました。

そこで、参考にした本から得たことや実際にやってみて気づいたことをこの記事で紹介します。注意点としては、これから紹介する本を読んで全てが上手くいきました、ということではなく、現在進行形で読んだことを試しながら模索している状況であることをお伝えしておきます。

アジャイルチームによる目標づくりガイドブック

www.shoeisha.co.jp

SCRUM BOOT CAMP THE BOOK【増補改訂版】 スクラムチームではじめるアジャイル開発 電子書籍|翔泳社の本』と同じシリーズ(?)の本で取っ付きやすそうと思い手にしました。この本のタイトルは目標づくりガイドブックとなっていますが、目標を作るのがメインではなく、目標を作った後の話の方がメインかと思うぐらいの構成になっています。この時点で私自身が「目標を作る」ことにフォーカスしていたことに気付きました。目標を作って、これをいかに達成するか、定期的に現在地を見て困難を取り除いたり、軌道修正したりということも含めて考えるべきだし、それはなかなか骨の折れることだなとも同時に思いました。

とはいえ、目標を決めないことには次に進めないのでメンバー間でどうやって決めるか話し合いました。その中で、チームとしてどこに向かっているのか分からないという意見が出ました。これはチームにとって重要なことで、採用するにもどのような人が入ってきてほしいかに関係するし、他のチームとの関係性にも関係してきます。

このため、目標を決める前にチームのミッションを決めることにしました。ミッションは以前作成したものの、なかなか意識する機会が少なくチーム内のメンバー構成も変わったタイミングだったので、思い切って再定義することにしました。

本の第1章に出てくるインセプションデッキを参考にして、「われわれはなぜここにいるのか」という問いに答えてミッションを作成することにしました。以下の記事を参考に準備を進め、各メンバーの考えを共有して自分たちのチームの存在理由を一つの言葉に表すことができました。

note.com

最低限ここが固まったことで、上位組織の目標達成に繋がるチーム目標やミッションから派生した取り組むべき目標の作成に取り掛かれました。

目標ができてようやくスタートラインに立てたところで、定期的なふりかえりと期末のふりかえりはやりましょうということに決めました。どうしても期末が迫らないとチーム目標が意識されず、結果として達成に近づけなかったということもあったので、ふりかえりの導入はみな賛成していました。実践に移していきたいと思います。

目標に向かっていけるチームの作り方

この本の興味深いところは、目標を作った後のことに多くのページを割いていることです。いくつかの章に分かれていますがその中でも、学びを活かす、メンバーとの関係性を良くする(互いを知ることも含まれる)というのは以前からできていますが、その上で目標に向き合いゴールに向かって積み上げていくこともチームとして考えながらやっていくことがさらに求められる部分だなと考えています。

また、チーム開発で起き得るシチュエーションに対してこういうことが背景に潜んでいるからこういう考え方やプラクティスをやってみるといいんじゃない?というのがいくつも紹介されています。逆引き的にこんなふりかえり方法があるんだなとか、考え方のフレームワークがあるんだなと参考にできそうです。

一例を挙げると、メンバー間で協働関係を作っていくためのきっかけとして「好き嫌い表」というものが紹介されています。ざっくり説明すると、得意・不得意、好き・嫌いの4象限に各メンバーがタスクを分類し、それぞれの象限に応じて得意を活かしてもらう、今は苦手だけどやってみたいことをサポートを得ながら進める、今すぐ手放して他のメンバーに替わってもらう、というようなアクションに繋げるもののようです。好き嫌い表の作成は機会があったら試してみたいです。

エンジニアリングマネージャーのしごと

チームの変動を受けて、そもそもリーダー、ないしはエンジニアリングマネージャーと呼ばれる役割はどんなものなのかあまり分かってないなと思い『エンジニアリングマネージャーのしごと』を読んでみることにしました。

www.oreilly.co.jp

目次を見るだけでも自分自身の管理から始まり、人間との関わり、評価・採用・解雇、影響力の発揮、プロジェクト管理、社内政治、キャリア開発、など向き合う領域は多岐に渡っています。メンバーとして携わる日々の業務──システム設計、開発、運用、各種自動化・コード化、技術調査、プロジェクト管理(これはやることもあるでしょう)、など比べてみると向き合う領域は重なる部分もありますが、重ならない部分の方が多いのではないかと考えられますね。この中でも印象に残った点を紹介します。

仕事の満足感を得るには日々の活動を4つに分類して考える

この本ではマネジメントの活動を、情報収集、意思決定、ナッジング、ロールモデルという4つの分類を紹介しています。情報収集はアクションの元になり、必ずしも定型的な仕事ではないということです。つまり、偶発的な同僚との会話やチーム外のメンバーとの会話などからも情報が得られるわけです。意思決定はエンジニアリングマネージャーがやることのイメージ通りです。ナッジングとは「議論に対して自身の観点を提供することで、決定に影響を与えること」です。この言葉は初めて聞きましたが、場面としてはイメージできるものです。コードレビューはナッジングの要素を持っていると言えそうですね。ロールモデルは昔からよく言われる「背中で見せる」ということです。

この4つの活動分類を考えるといずれも最終的にはチームの活動やチームメンバー、他のチームに何らかの影響を及ぼすことにつながります。社内で等級が上がるにつれて影響力を高めようとか範囲を広げようという風に言われてあまりピンと来ていませんでしたが、これらの活動と結びつけると考えやすくなると気付きました。

私自身においてはメンバーとして経験を積むにつれて自分でコードを書くことが少なくなり、設計やコードのレビュー、システムや仕組みの設計、何かしらの判断、メンバー間の調整、といった活動が増える印象があります。このため私は仕事の満足感(別の表現に置き換えると、今日も1日仕事頑張ったぞ〜、やりきったぞ〜という感覚)を得にくくなっていました。しかし、この4つの活動分類に近しい活動もしているな、と考えてみた方が日々の達成感・満足感に繋がりヘルシーに働けそうだなと思っています。

委譲にはグラデーションがある

簡単な説明として「タスクの責任を自分から部下へ移動させること」と書かれています。さらに委譲における両極端な例として、タスクを自分で全部やってしまうことと、丸投げが紹介されています。委譲のポイントはタスクの説明責任と実行責任です。以下は本からの引用です。

  • タスクに説明責任があるとは、タスクを求められる品質で完了させる責任を持つということです
  • タスクに実行責任があるとは、タスクを実際に自分で行うということです

つまり、タスクを自分で全部やる場合は説明責任も実行責任も持ってる状態で、丸投げの場合は説明責任も実行責任も相手に渡した状態ということです。説明責任は持ったままで、実行責任を相手に渡すのが委譲であるという説明がとてもしっくり来ました。タスクの実行を全てお任せできれば完全な委譲になりますし、相手にはやってもらうけど様子をチェックしますとか、自分がやり方を示しながら相手にやってもらうとかのパターンも自分で全て実行するのと完全な委譲の間に位置しています。

タスクをやってもらう相手に応じてどのレベルで委譲するかを意識すると、相手の学習に好影響を与えたりパフォーマンスを十分に発揮してもらえたりする機会になるんだなと思いました。

採用版鉄の三角形

プロジェクトマネジメントにおける3つの制約(いわゆる鉄の三角形)を元に採用におけるジレンマが紹介されています。

support.microsoft.com

  • 納期 + 品質 -> コストが低くない
  • コスト + 納期 -> 品質が高くない
  • 品質 + コスト -> 納期が早くない

ここで言う「納期」は採用までの早さ、「品質」は求める経験(鉄の三角形でいうスコープ)、「コスト」は予算をそれぞれ表します。今まではどのような経験・スキルを持った人を採用したいかにあたる「品質」だけを考える機会はありましたが、「コスト」「納期」に関しては見えないものとして個人的には意識の外にあったように思います。しかし、中途採用に本格的に携わるようになり、3つの制約を実感し始めました。一定期間で採用したい、このくらいの経験を求めたい、予算はこれくらいまで、という条件を全て満たすのは不可能に近く、プロジェクトと同様に優先順位を決めて採用していくしかないんだなあという印象です。本当に難しいですね。

おわりに

今回はチーム運営を考える上で最近出会った2冊の本について紹介しました。チームの運営やマネジメントのようなものは正解が示されている訳でもないし、体系的に学ぶ機会もないので、インプットしてやってみて学んで...の繰り返しでなんとかやってくことになるんだろうなあと思っています。もし、このポストを読んでくれた人でおすすめの本があればXなどで教えていただけると嬉しいです。

そして、まだまだ発展途上のチームではありますが一緒に働いてくれる方を募集しております。もしご興味があれば以下の採用ページへ、またはカジュアル面談も可能ですのでXにてお知らせください。

hrmos.co

Kanazawa.rb meetup #156 に参加しました #kzrb

2025年8月16日に開催されたKanazawa.rb meetup #156に参加しました。ブログで書くのは数年ぶりです。皆さんお久しぶりです。

今回は石川県立図書館の研修室をお借りしての開催でした。写真を取り忘れたので様子は以下リンクからご覧ください。

30d.jp

さて、meetupは13周年を迎えたということでLT大会が行われました。いつにも増して様々なジャンルのトークが繰り広げられ、その中でもLLMや生成AIの話が多めでした。また、困りごとベースで作ったgemについての話もいくつかあり興味深かったです。制作意図が聞けるのは面白い。

興味深かったLT

私が興味深く感じたのはwtnabeさんのRuby de Railway Oriented ProgrammingというLT。Railway Oriented Programmingという概念を知らなかったのですが、関数型プログラミングにおけるエラーハンドリングをきれいに行う方法論のようです。詳しく知りたい方は以下をご覧ください。

fsharpforfunandprofit.com

例えば、APIの処理で、バリデーション、外部API呼び出し、DB更新などの処理をそれぞれ Either[CustomError, T] 的な値を返す関数にして、それを結合して一つのユースケースを表す関数とする。最終的にレスポンスを整える関数を用意して、成功およびエラーはここで適切なレスポンスに変換する、というような構造にするのはどうですか〜というお話。

wtnabeさんの発表を勝手にまとめるとだいたい以下になります。

  • エラーハンドリングにおいて「例外を処理の分岐や情報の伝播に使いたくない」
  • Railway Oriented Programmingを適用すると良さそう
  • dry-operation gemを使ってRubyでも実践できる & モナドの知識が無くても利用できる
  • ハッピーパスにフォーカスできるので嬉しい

私は仕事でScalaを使う機会が多いゆえエラーを値として扱うのに慣れているというのもあり、これには共感しました。この関数・メソッドは例外を返すかもしれない、というのを考えながら全体を組み立てるのは脳の負荷が高いですし、なによりハッピーパスに集中できることで業務の流れとプログラムが一致しやすくなるのが良いです。

もちろん例外を返す関数やメソッドは普通にあります。大事なのは、これを利用する関数のスコープ内でハンドリングしてエラー値に変換する(例えばDB処理における接続エラーはDAO等でハンドリングした上でエラー値として返す)ことで、これによりスコープを跨ぐ例外の取り扱いを限りなく減らせますね。

私のLT

話は変わって、私は今回「Claude Codeと共に構成図を作る」というお題でLTをしました。頭の中にシステム構成を思い浮かべている状態から同僚に共有するためにある程度整った図を起こしたい、という場面を想定してClaude Code + VSCode + Draw.ioでいい感じにやれないか試してみた話です。発表資料はこちらです。

speakerdeck.com

このLTでのまとめとしては以下の用途ならまあ悪くない、としていました。

  • 脳内イメージを元にした、ある程度整った図の出力
  • 構成を考える上での壁打ち

発表後に、参加者から「フリーハンドで描いた図を写真に撮って、これをClaudeに読み込ませるとどうか?」というフィードバックをもらいました。確かにそうだなと思い後日試してみました。

元ネタはこちら。擦れている部分含めてどう解釈されるのか。

以下のように指示しました。

このやりとりで出力されたファイルをDraw.ioにインポートしたものが以下の図です。

それっぽくも見えますが、コンポーネントが表すものとそれぞれの関係性が異なる部分も見られたのでさらに指示しました。

このやりとりで出力されたファイルをDraw.ioにインポートしたものが以下の図です。

コンポーネントとしては意図したものになりました。AWSというコンテキストが加わり、各コンポーネントが指定された色で塗り分けられるようになりました。ここからもう少し指示を出してAWSアイコンセットを使うこともできましたが、ここでは省略。

以上2つのパターンで図を作成しましたが、当初のユースケース「頭の中にシステム構成を思い浮かべている状態から同僚に共有するためにある程度整った図を起こしたい」においては、私にとってあまり適していないと感じました。その理由として、頭の中のイメージを一度言葉に変換して、それをClaudeなどの生成AIに具現化してもらい成果物を何かしらのツールにインポートする流れが冗長に感じたためです。それならば、最初から自分がDraw.ioなりMiroなりのツールで四角形やふせんのオブジェクトを矢印で繋いだものを作って、同僚には言葉で補足しながら共有する方が速くて楽です。これには同僚の文脈を読み取る能力や、一緒に図を見ながら「これ」「あれ」などの指示代名詞が使えることが影響すると考えられます。ある意味で私の不完全な言語化を同僚が補ってくれているのかもしれません。

一方「構成を考える上での壁打ち」相手としては適しているかもしれません。ただ、これも図だけでは拾いきれない要件や制約があるのでこれらを含めたドキュメントを読み込ませてアドバイスをもらうのが良さそうです。または、要件を先に書き出してそこからコードや図を生成してもらうというやり方の方が生成AIと一緒に進めるときには適しているのかもしれません。

おわりに

LT大会から興味深かったものと私の発表それぞれを振り返りました。今回は生成AIに関してのお話でしたが、今後も興味の赴くままに何か共有できればいいなと思います。

開発本部内有志で「自動テストのお悩み解決タイム」を実施した話

この記事は ZOZO Advent Calendar 2024 シリーズ 6の9日目の記事です。

私の所属する計測プラットフォーム開発本部(以下、開発本部)内の有志で「自動テストのお悩み解決タイム」を実施しました。私はこの会でGitHub Actionsに関してSREチームで実践していることをメンバーに共有しました。この記事ではメンバーに共有するに当たって考えたことや工夫したことを紹介します。

会の背景

開発本部内でCIとして単体テストやlinterを実施することを強化する動きが出てきており、各チームのCIに対する知見や悩みを共有することになりました。その中でSREチームが実践していることを演習してほしい声が上がり、SREチームに所属する私に白羽の矢が立ったという訳です。この話を持ちかけたメンバーからは、スケジュールを抑えるので内容はお任せする、と伝えられたので自分なりに内容を考えることにしました。

会のゴールと方針

さて、今回時間を設けるに当たって「SREチームの実例を紹介し、参加メンバーに悩みを解決するヒントを得てもらう」というゴールを自分自身に設定しました。このゴールを踏まえて方針を2つ決めました。1つ目はある程度具体性がありつつも汎用的なトピックを扱うこと、2つ目は座学要素と演習要素(今回はデモ)を取り入れることです。1つ目に関しては、参加メンバーはそれぞれ担当する領域が異なる(例:フロントエンド、バックエンド、SRE、iOSAndroid)ため領域固有の話というよりかはどの領域でも起こり得るだろう話の方が頭に入りやすいためです。また、寄せられた悩み自体も汎用的なものだったので自然とこの方針になりました。2つ目に関しては、SREチームの事例紹介だけだとそのまま適用できないこともあるため、座学で基礎を押さえつつ演習でイメージを膨らませて各メンバーが所属するチームで応用できることを狙いとしました。

このように会の目的と方針を決めましたが、しっかりやろうとすると準備だけで大変なのでタイムボックスを切りながらできるところまで準備するように心がけました。

会の中身をざっくり紹介

ここからは私がGitHub Actionsに関して共有した内容をざっくり紹介します。方針に従って分かりやすさ重視で内容を考えました。

悩みポイント

  • 1) 複数のリポジトリで同じようなGitHub Actionsの設定をしている
    • 単体テストや静的解析、ビルドの処理などを使い回すことが多い
  • 2) 新しいワークフローを追加するにあたり、PR出して、マージして、検証してのループが辛い
    • 修正作業時やレビュー前にワークフローを実行して確認したいが、マージしないと確認しづらいこともある

GitHub Actionsの概念整理

  • 上記悩みを解消する際に知っておくと捗りそうな概念を説明する
    • 釈迦に説法かもしれないが、共通理解を作るためにおさらいしておく
  • GitHub Actions を理解する - GitHub Docs
    • こちらの内容を理解しておけばOK
    • 後から紹介する概念はこれを応用したものになる

実例紹介

  • 悩み1に対して、複合アクションや再利用可能なワークフローの導入
    • 重複の回避 - GitHub Docs
    • 複合アクションと再利用可能なワークフローは似ている部分もあるので図を用いて概念を説明する
    • SREが管理するリポジトリ内での利用箇所を示す
  • 悩み2に対して、sandboxリポジトリを利用した動作検証
    • 自由に操作できるプライベートリポジトリを用意している
    • ブランチルールは意図的に設定していないものがある
      • 例えば、レビュー無しでPRマージ可、mainブランチに直接push可

デモ

  • お題の設定
    • mainブランチにpushされたらトリガーされるワークフローの作成
    • 単体テスト、成果物のアップロード、別ブランチへのPR作成
      • デモ用にGoでシンプルなプログラムを用意し、上記の処理をワークフローで扱うことにした
      • テストとビルドを伴うものかつ実行コマンドが他のチームメンバーから見ても分かりやすいと考えた

感想

最後に「自動テストのお悩み解決タイム」を実施してみてのいくつかの感想を書こうと思います。まず、参加メンバーから応用的な質問をもらえたことで今回共有した話がある程度理解されていると認識できました。具体的には、複合アクションや再利用可能なワークフローを同じエンタープライズの別組織から呼べるか、という質問でした。その場では答えられませんでしたが後で調査して設定可能な旨を回答しました。*1

また、参加メンバーからはチームに持ち帰るものを得られたというコメントをもらえたので、実施して良かったですし設定していたゴールに近づけたと思います。今回共有した内容は基礎的なものでしたが、GitHub Actionsを始めとしたCI/CDは処理の共通化や高速化など改善できる余地がある領域だと思います。私の経験ではそれぞれのチームで同じ課題を持っていたり、あるチームでは上手く解決していたりするケースが生まれがちなので、今後もこのような機会で知見や情報を共有できると良いなと考えています。

EnvoyのイメージをDistrolessベースに替えたときの失敗談

この記事はZOZO Advent Calendar 2023 シリーズ9の7日目の記事です。

私たちの管理するWebシステムではリバースプロキシとしてEnvoyを利用しています。以前はAlpineベースのイメージを利用していましたが、こちらが廃止となったためEnvoyのバージョンアップと同時にDistrolessベースのイメージに切り替えました。この際の失敗についてアドベントカレンダーの記事として供養しておきます。

続きを読む

Renovateの自動マージを試す

この記事はZOZO Advent Calendar 2023 シリーズ6の6日目の記事です。

以前ZOZOのテックブログでこちらの記事を書きました。

techblog.zozo.com

今回はその後の話の一つとしてRenovateの自動マージを試してみたことについて書いていきます。

Renovateをチームが管理する複数のリポジトリに導入したものの、バージョン更新のプルリクエストの滞留が次第に増えていき課題に感じていました。そこで、自動マージを導入することでプルリクエストの滞留を解消したいと考えました。

続きを読む

JAWS-UG金沢 #94 & Kanazawa.rb 『Ruby on Rails on App Runner ハンズオン』に参加しました

2023-11-18に開催されたJAWS-UG金沢 #94 & Kanazawa.rb 『Ruby on Rails on App Runner ハンズオン』に参加しました。久しぶりの参加記というかメモみたいなものを書き残しておきます。

jawsug-kanazawa.doorkeeper.jp

フルマネージド型のコンテナアプリケーションサービスであるApp RunnerでRuby on Rails製のWebアプリケーションを動かすという内容です。App Runnerについては以下のリンクでどのようなものかが説明されています。

aws.amazon.com

内容を掻い摘むとこんなところでしょうか。

  • インフラに関してそれほど経験なくても良い感じの基盤で動かしてくれる
  • オートスケーリングも良い感じにやってくれる
  • なのでアプリ開発に集中できるよ
  • 他のAWSサービスとも組み合わせられる
続きを読む

『Scala関数型デザイン&プログラミング』第6章のメモ

Scala関数型デザイン&プログラミング』(初版)の第6章を読んで初見ではいまいち理解できなかった部分について自分なりに理解を試みたメモです。第6章の中でも特に最後の自動販売機の問題(EXERCISE 6.11)については解答を見ても何をやっているか、どのような意図があるのか理解できませんでした。他にこんな考え方や解釈もあるというご意見があればコメントで教えていただきたいです。

State

第6章では State データ型が紹介されています。このデータ型は S => (A, S) という関数が本質で、ある状態(S)を元に何かを行いその結果(A)および新しい状態(S)を返すことを表現しています。書籍では乱数の例で説明されていますが、このような関数を連結したり値を変換したりして最終的な結果や状態を取得するような用途に向いていると理解しました。その際に状態を次の関数に引き渡すことが煩わしくなります。 State はこの煩わしさを閉じこめているので利用者にとって扱いやすいコードが書けるようになっています。

続きを読む