さくらコードSakura Code
小説/第15話

Novel

第15話 小さなリーダー

第15話 小さなリーダーのイメージイラスト

Script

Cold Open

シーン1 鈴木の名指し

 十二月六日。火曜日。

 窓の外、街路樹は、もう、半分以上、葉を落としている。十二月とはいえ、午前十時前の光は、机の上で、まだ少し、白く、軽い。エアコンの暖風が、天井の角から、低く、流れている。

 朝礼の最後のほう、鈴木が、やわらかい声色のまま、桜子の名前を呼んだ。

「桜子さん、ちょっと、お願いがあって」

「はい」

「次の小リリース束、五件ある。お知らせ枠の文言更新、フォールバック恒久化、未読件数バッジの注釈、それと、外部API状態のRunbook、あと一件レイアウト調整。期間は、二週間。メンバーは、桜子さん、翔太くん、それと外注の早瀬さん」

「はい」

「取りまとめ、桜子さんでお願い。リーダー、って肩書きはまだ付かないけど、この束のなかでは、桜子さんが、一番、業務側を見てきた。だから」

 桜子の心臓が、ことっと、ひとつ落ちた。

 (リーダー)

 言葉として渡されたわけではない。けれど、確かに、自分の名前が、束の上に、置かれた。

「やります。よろしくお願いします」

 鈴木はうなずいて、それで、朝礼は、するっと、解散になった。


Part A

シーン2 ひとりで全部見ようとする

 席に戻った桜子は、まず、五件のリリース束を、自分の手で整理することから始めた。

 ノートPCで、GitHub Issuesを五件、まとめてドラフトする。

#217: 未読件数バッジに「最大10秒、過去のスナップショット」と注記を表示
#218: 外部API失敗時のフォールバックを feature_flags.yaml の常時ONに昇格
#219: 外部依存サービスの状態確認手順を Runbook に追加
#220: お問い合わせ詳細画面のレスポンシブ崩れ修正 (報告 #1872)
#221: ホーム画面のお知らせ枠の文言更新 (営業依頼)

 桜子は、Issue本文のテンプレを、五月の初めてのバグの日の障害報告と、雨の日に書いたRunbookを思い出しながら、自分なりに整えた。

 ただ、見直してみると、#217 には背景と提案だけが、#218 には実装方針だけが、#219 には完全な手順書例が、#220 には不具合の再現手順だけが、#221 には文言案だけが、それぞれ、別の粒度で書かれていた。

 (あとで、揃える)

 そのとき桜子は、頭の中だけでメモした。

 ふだんなら、たぶん、Issueに [ ] AC定義は担当者が追記 と書いて、担当者に投げる手順を、先に決めるはずだった。けれど、今日の桜子は、担当者に書いてもらう の前に、自分の頭で、まず、形を整えてから渡す を、選んでいた。

 (中村くんは速いから、いきなり投げると、わたしが何もしてないみたいに見える)

 (早瀬さんは丁寧だから、ふんわり投げると、長文で質問が来て、結局わたしが書く時間が増える)

 二つの言い訳のような考えが、頭の中で、半ば、自分でも気づかないまま、Issueの本文を、桜子の手元に、引き寄せていた。

 桜子は、自分の手で、五件分の本文を、書き終えた。気づいたら、午前十一時前で、まだ、一度も、Slackで「これ、誰がやる?」を、二人に聞いていなかった。

 依存関係も、自分の頭の中で組んだ。

- #218 と #219 は、外部APIまわり、同時にやる
- #217 は、UIだけだから独立
- #220, #221 もUI、独立
- #218 を本番反映する前に、#219 のRunbookは整えておきたい

 Projectボードには、ただIssue番号が「Todo」「In Progress」「Done」の三列で並ぶだけだった。依存の絵は、まだ、桜子の頭の中にあった。

 午前のうちに、デイリースタンドアップを設定した。十一時から十分。Meet。桜子、翔太、早瀬。


シーン3 早瀬さんの戸惑い

 外注の早瀬陽介から、メールが届いたのは、昼過ぎだった。

 桜子と早瀬は、まだ、対面では会ったことがない。週に二日、リモートで入っている、業務委託のフロントエンドエンジニア。三十代後半。物腰の丁寧な、メールでも言葉を選ぶタイプの人だ。

お疲れさまです、早瀬です。
#217 の Issue、本文を拝見しました。

「最大10秒、過去のスナップショット」と注記、
というのは、バッジの真下にツールチップで出すイメージでしょうか。
それとも、バッジの隣にテキストで常時表示でしょうか。

また、ブラウザ幅が小さいときの表示も、注記なし、と
注記あり、を分けるのか、ご教示いただけますと助かります。

#221 の文言、複数バリエーションのご検討はありますか。

 桜子は、メールを読みながら、

 (ああ、書ききれていなかった)

 と気づいた。

 桜子は、ひとつずつ、丁寧に、長文で答えた。常時テキスト表示、ブラウザ幅小のときは折り返し許容、文言はAB案で営業に確認する、と。返信を打ち終わるまでに、二時間がかかった。

 送信ボタンを押す直前、桜子は、ひと拍、自分の文面を見直した。これ、メールではなく、#217 のIssue本文を直接、書き換えるべきだったかもしれない、と、ほんの少しだけ、思った。けれど、もう、二時間かけて書き終えてしまったメールを、いまから、Issueに移植し直すには、もう一段の集中が、いる気がした。

 桜子は、送信ボタンを、押した。

 夕方には、別の質問メールが来た。#218 の常時ON化のタイミングは、いつ反映するか。#219 のRunbookは、どこまで具体的なURLを書くか。

 桜子は、すべてに、長文で答えた。早瀬の質問の文末は、いつも丁寧で、「ご教示いただけますと助かります」「どうぞ、ご検討ください」と結ばれていた。その丁寧さに、桜子は、ふだんなら気づくはずの、もうひとつの行間が、見えなかった。

 (書ききれていないIssueに、書ききれていないIssueの分だけ、早瀬さんが、気を遣って、聞きに来てくれている)

 その行間に、桜子は、まだ、行き着いていなかった。

 夕方、自分のIDEには、まだ、コードを一行も書いていなかった。


Part B

シーン4 コンフリクトの夜

 翌日の朝、翔太から、Slackでショートメッセージが来た。

@nakamura-shota: 望月さん、#218 のフラグ追加、コンフリクト出てます

 桜子はGitHubを開いた。翔太のPR #223 と、早瀬のPR #222、どちらも featureflags.yaml を触っている。同じ行ではないが、近くの行で、衝突している。

 翔太のブランチでは、fallbackinquiriesdetail: true を追加。

 早瀬のブランチでは、unreadbadgenoteenabled: true を追加、ついでに、ファイルの末尾の改行を整えていた。

 単純なマージで解消できる範囲の衝突。だが、桜子は、はっとした。

 二人とも、桜子の頭の中にあった「#218 を先、#217 を後」という順序を、知らなかった。

 Projectボードを見ると、Issueは「In Progress」列に二件、並んでいるだけ。依存の矢印は、どこにもなかった。

 昼休み、桜子は、コンフリクトを自分の手で解消したPRを上げて、二人にApprove依頼を回した。コードとしては数分。けれど、桜子の頭の中の「全体像」が、誰にも渡っていなかったことが、コーヒーの苦さと一緒に、口の中に残った。

 Slackの翔太のDMに、桜子は、お礼と、軽い詫びを書いた。

@mochizuki-sakurako: 中村くん、コンフリクトの件、すみません。
依存、わたしの頭の中で「#218先、#217後」だったんですけど、
共有できていませんでした。マージ済みです、すみません

 翔太の返事は、短かった。

@nakamura-shota: 了解。
僕、`yaml` 触る時はチャンネルに一言、貼るようにします

 文面は、いつもの翔太の温度だった。けれど、桜子は、了解。 の句点と、改行の位置に、ほんの少しだけ、声には出ない種類の、引っかかりを、感じた。夏の計測タスクのころ、廊下で聞いた「countunread、僕、コード読んでなかった」のときの、半拍の沈黙の、別の種類の、半拍だった。

 翔太は、たぶん、望月さんの頭の中 を当てにして、自分の git push の速度を、設計した。今朝、桜子の頭の中の依存関係が共有されないまま、翔太が featureflags.yaml を触ったのは、翔太の落ち度では、なかった。

 夕方のスタンドアップで、早瀬が、いつもの丁寧な口調で、こう言った。

「望月さん、進行については、お任せでいきます。ただ、お忙しそうなので、Issue本文の更新と、依存の整理を、どこかでまとめていただけると、私も翔太さんも、止まらずに進められると思います」

 桜子は、はい、ありがとうございます、と返した。返しながら、自分の声が、夕方の暖房の送風音に、ちょっとだけ、まぎれた。


シーン5 遥の一言

 二十時前。

 桜子は、自分のディスプレイの前で、五件のIssueを、もう一度、開きっぱなしにしていた。修正したい箇所を、頭の中で、十数か所、並べて、それを一気に書き直そうとして、手が止まっていた。

 遥が、自分の席を立って、桜子の横に来た。

「桜子さん、いま、ちょっと、消耗してるね」

「……はい」

「いっこ、聞いてもいい?」

「はい」

「いま、桜子さんが頭の中で見えてる全体像、誰の画面にも、出てる?」

「……出てない、です」

「うん。じゃあ、桜子さんが、いま、いちばん、やるべきこと、なに」

 桜子は、自分のIssue一覧を見た。#217 から #221。本文がバラバラの粒度のまま、五件、並んでいる。

「Issueの粒度を、揃える、ことです」

「うん。あと、ひとつ」

「依存関係を、Projectボードに、出す」

「うん。それから、ひとつ」

「……、ひとつ?」

 遥は、ふっと、ひとつだけ笑った。

「桜子さんが、自分で全部書きすぎないこと。見出しと、Acceptance Criteria だけ整えて、中身は、翔太くんと早瀬さんに、書いてもらおう。たぶん、二人とも、そっちのほうが、動きやすい」

「はい」

「桜子さん、リーダーは、手を動かす人じゃない。分けて、渡して、聞ける状態にする人」

 桜子は、メモ帳を、開きかけて、止めた。

 遥は、続けた。

「桜子さんが理解してることと、桜子さんが渡せることは、別。桜子さんは、たぶん、五件、ぜんぶ、理解してる。でも、いま、誰にも渡せていない。それが、いまの、消耗の正体」

 桜子は、しばらく、黙った。

 頭の中で、今朝の自分の手の動きを、ひとつずつ、巻き戻していく。担当者に書いてもらう を選ばず、自分で書いた、五件分のIssue本文。早瀬の質問に、Issueを直さずに、長文メールで答えた、二時間。翔太のコンフリクトを、Slackでの一行確認の前に、自分の手で、解消した、数分。

 全部、自分の手元に、引き寄せていた。

 悪意は、なかった。むしろ、丁寧にやろうとしていた。けれど、丁寧さの方向が、誰にも渡らない、自分のディスプレイの中に、向いていた。

 遥は、桜子のメモ帳を、結局、開かなかった。

「桜子さん、ひとつ、聞いていい?」

「はい」

「桜子さんは、リーダーって肩書きが、まだ付いてない、って言われたとき、どう思った?」

「……、肩書きが、まだ付いていない、ぶん、自分でちゃんと回さなきゃ、って、思いました」

「うん。たぶん、そこ」

「そこ、ですか」

「肩書きが付いてないから、自分で全部やる、を選ぶと、肩書きが付いた瞬間に、もっと、抱える。それは、桜子さんが、これから三年、五年で、たぶん、いちばん、痛い目を見る癖になる」

「……はい」

「いまのうちに、抱えない癖を、肩書きの前に、覚えておくほうが、安い」

「明日、リスケしていいですか」

「うん。今夜、一旦、PCを閉じて、明日の朝、整え直そう」


Part C

シーン6 リスケと、Issueの整え直し

 翌朝、桜子は、いつもより一時間早く出社した。

 まず、Issueテンプレを、共通の形に揃えた。

## 背景
(このIssueがなぜ存在するか。利用者・業務・障害履歴のどれか)

## やること
(手段ではなく、変更の輪郭)

## Acceptance Criteria
- [ ] xxx
- [ ] yyy
- [ ] zzz

## 依存
- 先行: #xxx
- 並行: #yyy
- 後続: #zzz

## 担当
- 主: @担当者
- レビュー: @レビュアー

## 想定工数
- xx 時間 (見積もり)

 次に、五件を、このテンプレで書き直した。

#217 未読件数バッジに注記
- 背景: 11/15 千葉HF現場観察 (大滝さん)。新人サポートの学習コスト低減
- やること: バッジ近傍に「最大10秒、過去のスナップショット」と常時表示
- AC:
  - [ ] バッジの右下にテキストとして表示される
  - [ ] スマホ幅 (375px) でも視認可能
  - [ ] 文言はAB案を営業に確認のうえ確定
- 依存: 並行 #221
- 担当: 主 早瀬 / レビュー 望月
- 想定工数: 4h

#218 フォールバックを常時ON
- 背景: 10/13 深夜P2障害の恒久対応
- やること: feature_flags.yaml の fallback_inquiries_detail を常時 true
- AC:
  - [ ] フラグの初期値が true
  - [ ] 監視: 過去30日のフォールバック発火件数のダッシュボードを追加
  - [ ] Runbook (#219) からリンクされている
- 依存: 後続 #219 (Runbookで参照される)
- 担当: 主 翔太 / レビュー 望月、山下
- 想定工数: 6h

#219 外部依存の状態確認 Runbook
- 背景: 10/13 深夜P2障害の再発防止
- やること: docs/runbook/external_apis.md を新規作成
- AC:
  - [ ] 外部APIごとに「公開ステータスURL / SLA / 過去incident頻度」の欄
  - [ ] 確認の手順
  - [ ] 関連: #218
- 依存: 先行 #218 が走り出してから着手
- 担当: 主 望月 / レビュー 山下、鈴木
- 想定工数: 5h

#220 お問い合わせ詳細レスポンシブ崩れ
- 背景: 報告 #1872
- やること: ブラウザ幅 768px 以下のレイアウト崩れ修正
- AC:
  - [ ] 報告に添付のスクショ通りの崩れが解消
  - [ ] 既存テスト全緑
- 依存: なし
- 担当: 主 早瀬 / レビュー 望月
- 想定工数: 3h

#221 お知らせ枠の文言更新
- 背景: 営業依頼
- やること: ホーム画面のお知らせ文言を営業確定版に差し替え
- AC:
  - [ ] 営業確定版の文言が表示
  - [ ] 文言の出典を README に明記
- 依存: 並行 #217 (営業確認のついでに #217 のAB案も)
- 担当: 主 早瀬 / レビュー 望月
- 想定工数: 1h

 Projectボードを開いて、Issueの並びを「#218 → #219」「#221 → #217」「#220」の三系統に、上から順に並べ直した。各Issueの上のラベルに「先行/並行/後続」を貼る。

 デイリースタンドアップは、十分のMeetから、書面に切り替えた。毎朝十時、Slackの専用チャンネルに、各自が三行を書く。

- 昨日: ...
- 今日: ...
- ブロッカー: ...

 文章を書ける時間が長い早瀬と、テンポが早い翔太の、両方の働き方に合うはずだった。

 お昼過ぎ、桜子は、自分の整えた一式を、Slackに投稿した。

@mochizuki-sakurako: みなさん、お疲れさまです。
昨日までの進行で、わたしの渡し方に、抜けが多かったです。すみません。
Issue本文・依存・担当を、共通テンプレで書き直しました。
スタンドアップは書面に切り替えます。
本文の中身については、担当が一番見えていると思うので、
追記・上書き、自由でお願いします

 翔太から、

@nakamura-shota: 了解。AC、僕、自分で書く方が動きやすい。助かります

 早瀬から、

@hayase-yousuke: 望月さん、ありがとうございます。
依存の矢印が見えると、私の方も、遠慮なく動けます。
#220 と #221 から取り掛かります

 桜子は、その二つの返信を、しばらく、見つめていた。


Ending

シーン7 ホワイトボードと、湿った夜風

夜の小会議室で、五件のIssueを矢印でつないだホワイトボードの図を、桜子がスマートフォンで撮影している

 二十時すぎ。

 桜子は、退勤前に、空いていた小会議室に入って、小さなホワイトボードに、五件のIssueを、矢印でつなぎ直した。

 #218 → #219。#221 → #217。#220 は単独。担当者の名前を、各箱の右下に書く。先行・並行・後続を、矢印の太さで描き分ける。

 書き終えてから、桜子は、その絵を、スマホのカメラで撮った。

 ディスプレイの中だけにあった「全体像」が、ようやく、ホワイトボード上に、誰でも見える絵として、外に出てきた。

 桜子は、その写真を、Projectボードのトップに、ピン留めした。

 メモ帳を開く。

2022/12/08 新人日記

- リーダーは、手を動かす人じゃない
  分けて、渡して、聞ける状態にする人
- 「桜子さんが理解してることと、桜子さんが渡せることは、別」
- Issueテンプレ(背景 / やること / AC / 依存 / 担当 / 想定工数)
- スタンドアップは書面に切り替える選択肢もある
- 全体像は、頭の中ではなく、絵にして外に出す

反省:
- 私が一番見ているはず、を、初日に手放せばよかった
- 質問は、長文で答えるより、Issueの本文を直したほうが、
  みんなが何度でも参照できる

 ペンを置いて、桜子は、窓の外を見た。

 夜の街灯の下、冷たい風が、街路樹の枝先を、ゆっくりと、揺らしている。葉のほとんど落ちた枝が、街灯の光の中で、線画のように、浮かんでいた。

 千葉の現場で見た、コールセンターの大滝さんと、高木さんの顔が、頭の片隅で、もう一度だけ、薄く、浮かんだ。

 (あの人たちに届くはずのリリース束を、わたしは、自分で、止めかけてた)

 桜子は、もう一度、メモを開いて、最後に、こう書いた。

- 一番、伝わってほしい人のために、一番、伝わる形で、渡す

 ノートを閉じる前に、桜子は、もう一行だけ、書き足した。

- 「桜子さんが理解してることと、桜子さんが渡せることは、別」
  これ、肩書きが付く前のうちに、覚える

 明日の朝、書面のスタンドアップに、何が並ぶか、まだ分からない。けれど、絵は、外にある。Issueは、揃っている。担当は、それぞれの動きやすい形で、前に出始めている。

 桜子は、ホワイトボードの絵を、消さずに、そのままにして、退勤した。