No Ticket, No Commitの効果
No Ticket, No Commitの効果について考えたことをメモ。
【元ネタ】
チケット駆動開発 … ITpro Challenge のライトニングトーク (4) - まちゅダイアリー(2007-09-07)
明日からできる!バージョン管理システムへのコミット粒度を最適化するトレーニング方法 - 刺身☆ブーメランのはてなダイアリー
Twitter / @yusuke_kokubo: @akipii コミットの粒度とコミットメッセージあたりですね。
まちゅさんのスライドにもあるように、チケット駆動開発の最も基本的な運用ルールは「チケット無しのコミットは禁止」。
この運用ルールは、結合テストやシステムテスト、受入テスト、本番運用などでバグ修正した時に、必ず障害報告票とリンクづけて、修正理由を明確にするのが本来の目的だった。
何故なら、テスト工程では、どのバグ修正がどのバージョンのモジュールに含まれているか、きちんと管理しなければすぐにデグレが発生するし、せっかく直したバグが検証されなかったりするからだ。
また、ソース修正とバグの変更理由が紐づいていれば、コードレビューもやりやすい。
つまり、バグの変更管理が本来の目的だった。
チケット駆動開発では、No Ticket, No Commitをバグ修正の追跡だけでなく、プロジェクトで発生する成果物一般の追跡に使う。
つまり、SCMリポジトリに格納されているソースだけでなく、Excelの設計書、Wordの議事録、ビルドスクリプト、環境構築の初期データやDDL、共通ライブラリのコンポーネントなどの成果物を変更する場合は、チケットに紐付けるようにする。
この運用によって、何故こんな汚いパッチに変わったのか、とか、何故この要件がこんな複雑な仕様へ変わったのか、をチケット経由で追跡できる仕組みが出来上がる。
また、No Ticket, No Commitの副次的効果も幾つかある。
一つ目は、ソースに書かれた無駄なコメントはチケットに集約されるので、ソースがきれいになること。
CobolやVBなどの過去のソースは、「20yy/9/ddに障害管理No.XXで直した」などの無駄なコメントがとても多く、修正が入る度にガラクタのコメントアウトが増えて見苦しい。
修正履歴のようなコメントは、SCMやBTSの機能が貧弱だった時代には必要だったかもしれないが、今の時代は不要だと思う。
レガシープログラマかどうかを判断する基準: プログラマの思索
No Ticket, No Commit! #tidd: プログラマの思索
二つ目は、コミットに明確な理由がつくので、コミットの粒度が分かりやすくなること。
新人プログラマのソースを見ると、Javaのmainメソッドに1000行も書いて、まともに動かないのにコミットしている場面を見た時がある。
バージョン管理は単なるソースのバックアップではない。
特にtrunkへcommitする時は、コンパイルエラーがないのはもちろん、TDDで単体テストもクリアして、コードレビューも完了しなければコミットできない。
そうでなければ、trunkは常時リリース可能なコードラインにならないからだ。
実際にプログラムを書いている時、チケットや仕様は頭の片隅に追いやって、ひたすらプログラムを綺麗に書いて動かすことに専念する。
そして、コミットログにチケット番号を付ける時に、今の自分はこの理由で修正したんだよな、と思い出す。
つまり、詳細な情報はチケットに書いておけば、それを忘れてプログラミングに専念できる環境がある。
また、XPJUG関西の山根英司さんは以前、駄目なプログラムはソース修正の意図が見えない、と言っておられた。
駄目なプログラマは、リファクタリングと機能追加を一緒に混ぜ込んでコミットするから、後で問題発覚した時にロールバックできない。
No Ticket, No Commitを意識すると、今はリファクタリング、次は機能の追加、次はバグの修正、などのように、意図を明確にしてcommitするようになる。
平鍋さんのプロペラ帽子のように、今はリファクタリングの帽子、次は機能追加の帽子のように、頭を切り替えて作業する単位でコミットしていけばいい。
三つ目は、新人プログラマに良い習慣を身に付けてもらえること。
プログラムを書くというのは、単にコンパイルエラーがないだけではない。
TDDのように仕様を満たすように書くことも大事だし、バグ管理やコードレビューで他人の指摘を反映していく作業も大事。
SVN・Git・Mercurialのようなバージョン管理ツールで修正履歴を残していくのも重要。
特に、バージョン管理で修正履歴を残す時、意味ある単位でコミットしていって欲しい。
その時に、No Ticket, No Commitでチケットにソース修正履歴を残しながら、自分が今書いているソースはどんな理由で書いているのか、を意識して欲しい。
単体テストしていないソース、ビルドが通らないソース、コードレビューしていないソースは、コンパイルエラーのソースと同レベルなのだと認識して欲しい。
実際、顧客に価値あるシステムを納品するというAgile開発の理念から考えれば、テストせずにまともに動かないソースは、顧客から見ればコンパイルエラーのソースと同じだ。
そうすれば、リファクタリングのテクニック、TDDのテクニックも自然に身に付くと思う。
下記でも書いた。
チケット駆動開発は仕事をさばく仕組み #agileto2010 #tidd: プログラマの思索
No Ticket, No CommitのようにBTSに由来した運用ルールは、ソフトウェア開発の作業を効率化するために長年蓄えられたノウハウ。
TiDDはBTSの機能をAgile開発に流用した経緯もあり、BTSのベストプラクティスもそのまま流用すればいい。
【追記】
No Ticket, No Commitの運用ルールを早とちりして、1コミット=1チケットと思う人がいますが、そんなことはない。
ITSチケットとSCMリビジョンの関係は多対多が普通だ。
実際、1個の仕様変更のチケットに対して、複数回のコミットはあるし、コミットの意図には機能追加もあればリファクタリングもあるだろう。
あるいは、2件のバグのチケットは同類バグでバグの原因が同じならば、1回又は複数回のコミットで一括修正してもいい。
よくある状況は、長年の運用保守でプログラムが複雑になって、新規機能の追加が難しい時だ。
仕様変更に対応するにはまずリファクタリングで綺麗にしないと対応すらできない場合、リファクタリングのチケットと仕様変更のチケットを分ける。
僕の経験では、リファクタリングが1人日もかかるならば別チケット化して、開発者が作業しやすい単位でチケットを分けている。
Redmineを使って気づいたことpart3~チケット分割のタイミング: プログラマの思索
つまり、状況(コンテキスト)に応じて、チケットとコミットの関係は異なる。
| 固定リンク
「ソフトウェア工学」カテゴリの記事
- アーキテクチャ設計はベストプラクティスを参照するプロセスに過ぎないのか?~Software Processes are Software, Too(ソフトウェアプロセスもまたソフトウェアである)(2024.09.22)
- 「システムアーキテクチャ構築の原理」の感想part2~非機能要件がシステムのアーキテクチャに影響を与える観点をプロセス化する(2024.05.06)
- 「システムアーキテクチャ構築の原理」の感想(2024.05.06)
- ソフトウェア工学の根本問題から最近のソフトウェア設計を考えてみる(2024.03.03)
- マイクロサービス設計は従来のアーキテクチャ設計と何が違うのか(2024.01.02)
「廃止Mercurial」カテゴリの記事
- GitHubはオープンソースのプロセスを標準化した(2015.06.11)
- 「反復型ソフトウェア開発」はソフトウェア工学の良書(2013.02.09)
- Mercurialに取り込まれたコミュニティ由来の機能一覧(2013.01.12)
- WordやExcelから直接Mercurialへコミットできるアドオンmsofficehg(2012.12.07)
- RedmineでSubversion リポジトリ表示を高速化する方法(2012.11.23)
「構成管理・Git」カテゴリの記事
- 「GitLabに学ぶ 世界最先端のリモート組織のつくりかた」の感想(2023.12.10)
- パッケージ設計の原則の意義は変化しているのか(2023.09.30)
- 小説活動にプルリクエスト駆動が必要になってきた(2022.05.08)
- 【資料公開】チケット駆動開発の解説~タスク管理からプロセス改善へ #redmine(2022.01.14)
- プログラミングしてる時はでっかいピタゴラ装置を作ってるみたいな感じ(2022.01.09)
「チケット駆動開発」カテゴリの記事
- 第26回redmine.tokyo勉強会の感想~多様性はコミュニティが成功する重要な要因の一つ #redmineT(2024.06.15)
- チケットはデータでとプロセスの二面性を持つ #redmine(2023.12.24)
- 小説活動にプルリクエスト駆動が必要になってきた(2022.05.08)
- 知識は経験よりも大切か、経験は知識よりも勝るのか、SECIモデルは相互作用を語る(2022.04.26)
- プロジェクト管理の基本はテーラリング、Redmineはプロセスをテーラリングするツール(2022.04.21)
「Agile」カテゴリの記事
- 「システムアーキテクチャ構築の原理」の感想part2~非機能要件がシステムのアーキテクチャに影響を与える観点をプロセス化する(2024.05.06)
- 「スクラムの拡張による組織づくり」のScrum@Scaleの感想(2024.03.31)
- ソフトウェア工学の根本問題から最近のソフトウェア設計を考えてみる(2024.03.03)
- 「GitLabに学ぶ 世界最先端のリモート組織のつくりかた」の感想(2023.12.10)
- 概念モデリングや設計原則は進化しているのか(2023.10.21)
コメント