Jenkinsの使い方と狙いについて話す機会があるので、自分の考えをまとめる。 時間節約と内容簡素化のため、CIとJenkinsとを分けて説明するのではなく、開発者なら共感できるであろう表現によってJenkinsとCIの双方を説明することを目指す。なお「品質」の定義について、ここでは明確には定めない。
アジェンダ
- Jenkinsはいろんなことを自動化するサービス
- 人間に「人にしかできないこと」へ注力させるため、機械の執事を雇って自動化する。
- 自動化の恩恵は「省力化」と「コミュニケーション促進」
- 省力化: 人間に「役割」へ注力させるため、Jenkinsは各種「役割」の補佐を行う。コンパイルやテスト、情報収集や統計などルーチン作業を通じて人間が思考し判断することを助ける。ゴールは「人が行うルーチン作業」と「作業完了待ちによる暇」をゼロにすること。
- コミュニケーション促進: 「役割」間の連携を促すため、ハブとしてコミュニケーションを促進する。組織内での作業重複を排し、各「役割」に必要な情報を必要な形で提供する。ゴールはコミュニケーションによって価値を想像すること、そのサイクルを早めること。
省力化
- 「ルーチン処理を」「何度も」「同じように」「速やかに」やることには、高い価値がある。
- 品質を保つには、頻繁に現状を確認する(可視化する)のが近道。
- 1日に1回確認するのと週に1回確認するのでは、問題発見の早さも対応工数も大きく変わってくる。
- 理想は変更があるごとに確認すること。Gitを使っているなら、Pushがあるたびに確認すること。
- これを人にやらせるのは効率が悪いだけでなく、「人にしかできないこと」の邪魔になるので、省力化が必要になる。
- Jenkinsは機械なので、こうしたルーチン処理の実行に向いている。
- 機械なので疲れないし教育コストが安い。指示したとおり、同じ作業を何度も間違いなく行ってくれる。
- 人は増やすと情報を伝え教育する必要があるが、Jenkinsならサーバを追加すればそのまま性能増になる。
- クラウドが普通になった今、サーバを追加するのは非常に簡単で安い。
- 変化が多く資産が積み上がる現場では、そうした手法で能力増強できるのは魅力。
- 機械なので疲れないし教育コストが安い。指示したとおり、同じ作業を何度も間違いなく行ってくれる。
- 「人にしかできないこと」とは「判断」と「成長」と「休息」
- 判断
- 成長
- 成長には問題を細分化すること、仮説をたてること、検証をすること、実行すること、振り返りをすることが必要。
- 検証と振り返りの材料を蓄積するため、「ルーチン処理を」「何度も」「同じように」「速やかに」行う。
- 「実行」の手段としても執事は非常に有能。人に指示するよりも簡単かつ確実、チームを超えた影響も容易。
- 休息
- 帰って寝る
- 時間と心に余裕がないと、新しい挑戦を始められない。
- 人間が「判断」し「対応」するために、機械に課題と問題を「確認」「発見」「通知」させる。
コミュニケーション促進
- チーム間コミュニケーションの目的=チーム開発の欠点をなくすため
- なぜチームが必要か
- 作るものの複雑さと開発速度を両立させるため
- やるべきことを明確化し、役割として分担させる
- チームの欠点とはなにか
- 「知らないこと」が出てくる=担当外の技術・機能・業務を知らないための悪影響
- 全体としての知識獲得スピードは向上しているはずなので、これは至極当然に発生する
- 欠点というより、利点を得るために生じる歪みのようなもの、リスク
- なぜチームが必要か
- 欠点を補うために必要な物はなにか=獲得した知識の伝播と、コミュニケーションによる現状把握
- 獲得した知識の啓蒙・汎用化(「巨人の肩」の形成)
- 他者に対して報告・共有と言った形で知識を伝播させる
- 知らなくても問題ないように、汎用的なインタフェースで包んでしまう
- ビジネスニーズを知らない人でも機能破損に気づけるように、自動テストを書く
- 技術的バックグラウンドを知らない人でも使えるように、モジュールとして提供する
- チェックリストをいちいち確認しないでもいいように、ビルドツールに自動チェックをさせる
- Jenkinsはそういった諸々をサポートできる!
- 情報を満載したサイトの提供
- 自動テストの実施
- モジュール間依存関係の管理、依存先変更によるビルドの実施
- ビルドツールの実行による自動チェック、ならびにチェック結果の管理・表示
- コミュニケーションによる現状把握
- 獲得した知識の啓蒙・汎用化(「巨人の肩」の形成)