contents memorandum はてな

目次とメモを置いとく場

『チーム開発実践入門――共同作業を円滑に行うツール・メソッド』(池田尚史,藤倉和明,井上史彰 技術評論社 2014)

著者:池田 尚史
著者:藤倉 和明
著者:井上 史彰
シリーズ:WEB+DB PRESS plus
NDC:007.61 情報科学 >> データ処理.情報処理 >> システム分析.システム設計


チーム開発実践入門──共同作業を円滑に行うツール・メソッド:書籍案内|技術評論社

 本書はサービスやアプリケーションを開発する企業において,複数の人たちでチームを組んで開発を進めていく際に必要な考え方や使用するツール,またそれらをうまく使いこなすためのノウハウをまとめています。本書の最初でうまく物事が進んでいない開発現場の一例を示し,その理由と対策についてまとめています。次にその対策に必要なツールである,バージョン管理,チケット管理,CI(継続的インテグレーション),デプロイ,リグレッションテストの章を設け,その使い方と上手な運用ノウハウなどについて現場での経験が豊富な著者が解説しています。


【目次】
はじめに(著者を代表して 2014年3月 池田尚史) [iii-iv]
目次 [v-xvi]


第1章 チーム開発とは
1.1 1人だけでも開発はできる 002

1.2 チーム開発で直面する課題 003

1.3 どのように課題に立ち向かうか 004

1.4 本書の構成 005
  第2章:ケーススタディ
  第3~5章:基礎的なプラクティス
  第6~7章:継続的デリバリーとリグレッションテスト

1.5 本書を読む前の注意点 007
  最適なプラクティスはケースバイケース
  どのツールを使うかに正解はない


第2章 チーム開発で起きる問題
2.1 ケーススタディの前提 010
  プロジェクトの前提条件

2.2 ケーススタディ(1日目) 011
  問題1:重要なメールが多すぎて優先順位を決められない
  問題2:検証用環境がない
  問題3:別名フォルダでブランチを管理している
  問題4:データベースの再作成が困難

2.3 ケーススタディ(1日目)における問題点 016
  問題1:重要なメールが多すぎて優先順位を決められない
    メールの件数が多いために重要なメールが埋もれてしまう
    ステータス管理ができない
    一覧性,検索性が弱い
    メールでプロジェクトを管理することの課題
  問題2:検証用環境がない
  問題3:別名フォルダでブランチを管理する
  問題4:データベースの再作成が困難

2.4 ケーススタディ(2日目) 022
  問題5:起動するまで壊れていることに気づかない
  問題6:他メンバーの修正を上書きして消してしまう
  問題7:自信を持ってリファクタリングできない
  問題8:バグの修正時期がわからず,デグレードも追跡できない
  問題9:ブランチ・タグを活用できていない
  問題10:テスト環境や本番環境では動かない
  問題11:リリースが複雑で手順書が必要となる

2.5 ケーススタディ(2日目)における問題点 031
  問題5:起動するまで壊れていることに気づかない
  問題6:他メンバーの修正を上書きして消してしまう
  問題7:自信を持ってリファクタリングできない
  問題8:バグの修正時期がわからず,デグレードも追跡できない
  問題9:ブランチ・タグを活用できていない
  問題10:テスト環境や本番環境では動かない
  問題11:リリースが複雑で手順書が必要となる

2.6 理想的なプロジェクトとは 039
  チケット管理システムに課題などが集約されている
  できる限りバージョン管理システムを利用する
  繰り返し再検証可能なCIシステムを用意する
  環境の影響を最小限にとどめ,常にリリース可能にしておく
  すべてを記録して追跡可能にする

2.7 本章のまとめ 042


第3章 バージョン管理
3.1 バージョン管理システム 044
  バージョン管理システムとは
  バージョン管理システムを使うとなぜ便利なのか
    変更内容という最も基本的な記録が残る
    バージョン間の差分を簡単に確認できる
    間違って他人の変更を上書きしないで済むしくみがある
Column ロックモデルとマージモデル
    任意の時点まで巻き戻すことができる
  ファイルベースとチェンジセットベース
Column 複数の派生を作ることができる,ある時点での断面を保存できる

3.2 バージョン管理システムの移り変わり 053
  バージョン管理システムがない時代(1970年代以前)
  RCSの時代(1980年代)
  CVSの登場(1990年代)
  VSS,Perforceなど商用ツールの登場(1990年代)
  Subversionの登場(2000年代)
  分散バージョン管理システムの登場(2005年以降)
  番外編:GitHubの登場
  バージョン管理システムの導入状況

3.3 分散バージョン管理システム 062
    分散バージョン管理システムを使うべき5つの理由
    リポジトリの完全なコピーをローカルマシンに持つことができる
    動作が速い
    一時的な作業の履歴管理が容易である
    ブランチ,マージが手軽にできる
    場所を選ばないコラボレーションが可能
  分散バージョン管理システムのデメリット
    真の意味では最新バージョンはシステム上存在しない
    真の意味ではリビジョン番号はない
    ワークフローが柔軟に設定でき過ぎるため混乱しやすい
    考え方に慣れるのに時間がかかる

3.4 バージョン管理システムをどう使うべきか 065
  前提
  バージョン管理システムで管理すべきもの
    ソースコード
    要件書,設計書などのドキュメント
    データベーススキーマ・データ
    設定ファイル
    ライブラリなど依存関係定義

3.5 Gitを使ったスムーズな並行開発 069
  ブランチの使い方
    ブランチとは
    リリースブランチとは
    クローンとブランチの作成
    コミットとコミットログ
    ブランチの切り替え
    バグ修正後のコミット
    masterへのマージ
    masterへのPush
    ブランチの使い方のまとめ
  タグの使い方
    タグとは
    タグの作成
    タグの確認
    タグの取得
Column タグ名とブランチ名を同一にするのを避ける
    タグの使い方のまとめ
Column Detached HEADとは

3.6 Gitを使った開発フロー 081
  Gitを使ったワークフローのパターン
    中央集権型ワークフロー
    GitHub型ワークフロー
  ブランチ戦略のパターン
    git-flow
    github-flow
    筆者の事例(折衷案)
  最適なフローとブランチ戦略は現場によって異なる

3.7 データベーススキーマとデータの管理 090
  データベーススキーマを管理する必要がある理由
    データベース管理者の変更管理を任せた場合
    共有データベースでスキーマを変更する場合
  データベーススキーマをどのように管理すればよいか
    バージョン管理に必要な要件
    データベースマイグレーションとは
    データベースマイグレーションの機能
  データベースマイグレーションツール
    Migration(Ruby on Rails
south(Django
    Migrations Plugin(CakePHP
    Evolution(Play Framework)
  具体的な使い方(Evolution)
    規約
    SQLファイルの適用
    開発者間でのスキーマの同期
    不整合の管理
  データベースマイグレーションの注意点

3.8 設定ファイルの管理 102

3.9 依存関係の管理 103
  依存関係解決システム
    JVM系言語
    スクリプト系言語
    依存関係を管理するメリット

3.10 本章のまとめ 106


第4章 チケット管理
4.1 チケット管理システム 108
  プロジェクトがうまく回らない理由
  紙やメール,Excelでタスク管理をすることの問題点
  チケット管理システムの導入メリット
    タスク管理をするための基本機能がある
    一覧性,検索性が高い
    情報の一元管理と共有が可能である
    レポーティングに利用できる
    他システムとの連携が可能,拡張性がある
  チケット駆動開発とは
    チケット駆動開発の具体的手順
Column チケット駆動開発を徹底する場合

4.2 主なチケット管理システム 114
  OSS製品
    Trac
    Redmine
    Bugzilla
    Mantis
  商用製品
    JIRA
    YouTRACK
    Pivotal Tracker
    Backlog
    GitHub
  ツール選定のポイント
Column チケット管理システムの応用事例

4.3 チケット管理システムとバージョン管理システムの連携 124
  連携によって実現する機能
    コミットからチケットへのリンク
    チケットからコミットへのリンク
    コミットと同時にチケットのステータスを変更する
  連携の設定方法
  GitHub
    GitHubのissue
    Service Hooks
    GitHubとPivotal Trackerの連携
    GitHubとJIRAとの連携
  Trac/Redmine
  Backlog
    BacklogのGitとの連携
    BacklogとGitHubの連携
  Git自身の用意するHookを使う方法

4.4 新機能の開発,バグの修正時のワークフロー 134
  ワークフロー
    ①チケットの起票
    ②担当者のアサイ
    ③開発
    ④コミット
    ⑤リポジトリにプッシュ

4.5 「あのバグいつ直ったの」という問い合わせに答える 137
  Pivotal Trackerの例
    記憶に残っている文字列で検索
    検索
    チケットからソースコードの変更を探す
  Backlogの例
    検索

4.6 「なぜこんな変更が入ったんだろう」という疑問を解決する 142

4.7 本章のまとめ 143
  チケット管理とバグ管理,要求管理について


第5章 CI(継続的インテグレーション
5.1 CI(継続的インテグレーション) 148
  CI(継続的インテグレーション)とは
    インテグレーション
    インテグレーションを継続的に行うのがCI
  開発をアジャイル化する
    ウォーターフォール開発の開発フェーズ
    アジャイル開発の開発フェーズ
  なぜCIのようなプラクティスが求められるか
    コストメリット
    市場の変化のスピード
    スピードと品質を両立させるには
  CIに必要なもの
    バージョン管理システム
    ビルドツール
    テストコード
    CIツール
  テストを書くためのフレームワーク
    テスト駆動開発(TDD)系フレームワーク
    振る舞い駆動開発(BDD)系フレームワーク
  主なCIツール
    Jenkins
    TravisCI

5.2 ビルドツールの使い方 164
  新規にプロジェクトを始める場合
    プロジェクトのひな型作成
    依存関係の定義
    テストの実行
    Eclipseへのインポート
  既存プロジェクトを自動ビルド可能にする場合
  ビルドツールのまとめ

5.3 テストコードの書き方 172
  CIの対象となるテストの種類
    テストをいつ書くのか
    新規にプロジェクトを始める場合
    既存プロジェクトにテストがない場合
    バグ修正または新機能を追加した場合
  厄介なテストをどう書くか
    外部とのやりとりがあるテスト
    モッキングフレームワークを使ってテストする
    インメモリデータベースを使ってテストする
    データベース変更管理や設定ファイル管理のテスト
    UIを伴うテスト
    厄介なテストは工数とのトレードオフ

5.4 Jenkinsを使ったCIの実行 180
  Jenkinsのセットアップ
    ネイティブパッケージを使ったセットアップ
  Jenkinsで何ができるのか
  ジョブの新規作成
  ソースコードをチェックアウトする
  自動でビルドおよびテストを実行する
    定期実行
    バージョン管理システムをポーリング
    バージョン管理システムからプッシュする
    ビルドの記述
  結果を集計してレポーティング
  カバレッジを計測する
    JUnitXML形式でレポートを出力するのが効率的
    カバレッジ計測ツール
    Maven Coberturaプラグインのインストール
    Java系ライブラリの探し方
    Jenkinsプラグインの設定
  静的解析をする
  通知の設定をする

5.5 CIの運用 197
  ビルドが壊れたらどうするか
    Subversionなど中央集権型バージョン管理システムの場合
    Gitなど分散バージョン管理システムの場合
    ビルドを壊したときの罰ゲーム
    テストしてからマージする
  トレーサビリティの担保
    ビルドとコミットを関連づける
    チケット管理と連携する

5.6 本章のまとめ―― CIによって得られるもの 208


第6章 デプロイの自動化(継続的デリバリー)
6.1 デプロイとはどうあるべきか 210
  デプロイの自動化における恩恵
    細かくたくさんリリースできればリスクをコントロールしやすくなる
    フィードバックを早く得られるようになる
    組織がスケールする

6.2 デプロイの自動化 212
  デプロイの自動化における共通認識
  デプロイメントパイプライン
    自動化によりデプロイの速度を加速させる
    誰でもデプロイが行えるようにすることが重要
  プロビジョニングツールチェーン

6.3 ブートストラッピング(Bootstrapping) 216
  Kickstart
    Kickstartの利用方法
    利用する際の注意点
    Kickstartの設定例
  Vagrant
    開発者ごとに実機を用意することは難しい
    仮想環境を利用する際の懸念点
    Vagrantとは
    Vagrantのインストールと実行方法

6.4 コンフィグレーション(Configuration) 222
  自動化を行わない場合の問題点
  Chef
    Chefの構成
    ディレクトリ構成とファイル配置
    node.json
    setup.json
    solo.rb
    default.rb
    virtualhost.conf.erb
    Chefの実行方法と実行結果
    Chefを利用するメリット
    Chefを利用する際の注意点
    Chefを利用するタイミング
  serverspec
    serverspecとは
    serverspecのインストール
    テストファイルの記述方法
    httpd_spec.rb
    git_spec.rb
    serverspecの実行方法と実行結果
    serverspecのメリット
  ベストプラクティス(その1)
    Vagrantfile
    default.rb
  ベストプラクティス(その2)
  物理サーバがサービス投入可能になるまでの流れを自動化する例
  リリース作業についてのアンチパターン

6.5 オーケストレーション(Orchestration) 239
  Capistrano
    Capistranoのシステム構成
    Capistranoのインストール
    deploy.rb
    Capistranoの実行方法
  Fabric
    Fabric(直列実行)の場合
    Capistrano(並列実行)の場合
    ローカルサーバとリモートサーバの操作の違いを理解する
    Fabricの実行方法
  Jenkins
    マスタノードとスレーブノードの連携
    スレーブノードの追加
    ジョブの追加
    ジョブの実行
  ベストプラクティス
    JenkinsとFabricを組み合わせる
  セキュリティについて考慮する
Column 手作業でデプロイするケース

6.6 運用について考慮する 256
  サービスを止めないデプロイ方法
  ブルーグリーンデプロイメント
  クラウド時代のブルーグリーンデプロイメント
  ロールバックについての考察
    退路は常に用意する
    データベーススキーマのバージョン管理
    ロールバックの検証
    ソース更新のみのリリース時のロールバック
    データベーススキーマ更新時のロールバック

6.7 本章のまとめ 265
  PaaSを利用する手段


第7章 リグレッションテスト
7.1 リグレッションテスト 270
  リグレッションテストとは
  テスト種別の整理
    チームを支援する技術面のテスト(第1象限)
    チームを支援するビジネス面のテスト(第2象限)
    製品を批評するビジネス面のテスト(第3象限)
    技術面のテストを使った製品の批評(第4象限)
  リグレッションテストの必要性
    デグレードの発生
    テストを自動化すべき理由
  リグレッションテストの自動化で目指すこと
7.2 Selenium 277
  Seleniumとは
  Seleniumの利点
    自動化テストケース作成が簡単
    多くのブラウザやOSをサポート
  Seleniumコンポーネント
    Selenium IDE
    Selenium Remote Control(Selenium RC)
    Selenium WebDriver
  テストケースの作成と実行
    Selenium IDEのインストールと実行
    Seleniumのテストケース
    良いテストケースとは
    Selenium Serverを使ったテスト実行
  Seleniumの実践活用
    画面が変更されていないかをテストする
    Seleniumテストを安定させるためには
7.3 JenkinsとSeleniumの連携 294
  JenkinsとSeleniumの連携手順
7.4 Seleniumテストの高速化 299
  Jenkinsの分散ビルドでテストの並列実行
    Jenkinsの分散ビルドの構成
    分散ビルドの設定
  Seleniumテスト並列化の難しさ
7.5 複数のアプリケーションバージョンでのテスト 306
  アプリケーションのデプロイ
  テストケースをバージョン管理システムからチェックアウト
  Seleniumでのテスト
7.6 本章のまとめ 309


参考文献・参考URL [310-311]
索引 [312-318]
著者プロフィール [319]