More Related Content Similar to 「チーム開発実践入門」勉強会 Similar to 「チーム開発実践入門」勉強会 (20) More from Yu Ishikawa (10) 「チーム開発実践入門」勉強会8. + デスマーチになっている Web アプリ開発
プロジェクトに途中でアサインされた A
さんの話
+ プロジェクトの前提
– システム
Web アプリケーション
DB
– 開発のみならずリリース後のバージョンアッ
プや運用なども継続的に行う
18. + メールでのタスク管理
– タスクの優先順位がわからないため,どれから対応すべきかが
わからない
– タスクのステータス管理ができないため,いちいち問い合わせ
に対応しないといけない
– ほかのメールと交じるため一覧性が悪い
– 途中から加わったメンバーが過去の状況を確認できないなど検
索性が悪い
+ 検証環境(ステージング環境)がない
– 報告されたバグを速やかに検証する環境がないため,ことある
ごとに手元に環境を構築する必要がある
+ メンバーそれぞれがバラバラに環境を構築している
– 統一した環境を構築する仕組みが無いために,お互いの環境を
都度揃えるためのコストがかかる
19. + ソースコードがバージョン管理されていない
– 互いの変更を上書きしてしまう
– お互いの差分が衝突したときの解決ができない
– 過去のバグ修正の履歴が負えない
+ DBの再生成が困難
– アプリを起動するために必要な DDL やデータがきちんと管理さ
れていないため,都度本番のデータをダンプして持ってくるな
どの無駄が発生
+ 自動テストがないためデグレーションを検知できない
– 既存の昨日に影響を与えていないかなどのチェックを手作業でやったりしてい
ると,抜け漏れが発生するし,コストが高い
22. + タスクの管理は,タスク管理用ツールを活用されている
– バグ報告者はタスクのステータスを確認することで問い合わせコストがなくな
るなど
+ ナレッジは wiki にまとまっている
– 新しいメンバーも簡単に検索することができて,スムーズにプロ
ジェクトに必要な知識を身につけられる
– ひとの時間を奪わない
+ 検証環境が用意されている
– 報告されたバグをすみやかに再現できる
+ 確認作業,テストがすべて自動化されている
+ 各自の環境を自動的に整える仕組みがある
– 各自の環境が異なっているために起きる問題がない
+ ソースコードは適切にバージョン管理されている
– 過去の履歴を追跡できる
– 互いに上書きするリスクを抑えられる
+ 自動的にリリースする仕組みがある
– 間違えたり忘れたり,また属人性を排除するために手作業はなくす
28. + 「管理できるものはすべて VCS で管理すべき」
– ソースコード
– テストコード
– 要件書,設計書などのドキュメント
– データベーススキーマ,システムを構築するのに必要な
データ
– ミドルウェアなどの設定ファイル
– ライブラリなどの依存関係の定義
+ 注意:VCS 管理者によっては Excel などの
バイナリファイルはコミットされたくない人
もいるのでルールに合わせる
32. + データベースの変更を管理するツール
+ ツールの発想
– SQL の適用順とどこまで適用したかを管理
– スキーマ定義編集の衝突を管理
– ロールバックの仕組みを用意
– データのロードもできる
+ 具体的なツール例
– Migration: Ruby on Rails
– south: Django
– Migrations Plugin: CakePHP
– Evollution
– Play Framework
34. + 構築された DB は本当に正しいでしょう
か?
+ 正しいかどうかを自分で手作業で確認し
ますか?
+ NO:DB 整合性チェクは自動で行えます
36. + 「管理できるものはすべて VCS で管理すべき」
+ 使うなら SVN じゃなくて Git
– Git の運用方法に興味ある人は本読んで下さい
– Github を試してみてください
+ 自動化のためのツールを活用
– DB のバージョンごとの管理には,データベースマイ
グレーションツールがある
– 依存関係解決システムで,プロジェクトに必要なラ
イブラリを管理
– サーバ構築やプロビジョニングの話は後ほど
41. + タスクを管理するための基本機能がある
– 「なにをしなければいけないのか」というタスクの定義
– 「誰がするのか」という担当者のアサイン
– 「いつまでにするのか」という期限の管理
– 「いまどうなっているのか」というステータスの管理
+ 一覧性,検索性が高い
+ 情報の一元管理と共有が可能
– 過去のやりとりやそこから得られた知見,プログラムの仕様
– タスク管理だけでなく,ナレッジデータベースとしての側面も持てる
+ レポーティングに利用できる
– バーンダウンチャートなどのレポーティング機能
+ ほかのシステムとの連携が可能であり,拡張性を高める
– バージョン管理システムや Continuous Integration システムとの連携を深めることで,
問題の発生からコードの修正内容やテスト結果,リリース状況まですべてを関連付け
て管理することができる
+ 追跡可能性が高まる
– 例:「昔のバグ修正ってどういう経緯だったけ?」
– 例:チケットIDとバージョン管理の関連付け
43. + OSS
– Trac
– Redmine
– Bugzilla
+ 商用
– JIRA
個人のプライベートタスクにも便利
クラウド版は 10 Users $10/month
– Backlog
– Github
+ ツール選定のポイント
– 拡張性の高さと容易さがどこまで提供されているか
– エンジニア以外のステークホルダーも触れるので,業務フロー
に合わせて柔軟に拡張できるかが重要
52. + ウォーターフォール
– インテグレーションは開発作業がすべて完了したあとのテスト
フェースに入って初めて行う
– テストフェーズになって,ライブラリの漏れやコンパイルができな
いなどの問題が発生
– コード量が増えれば増えるほど,修正が困難になる
– プロジェクト終盤になってすべてやり直しになるリスクがある
+ Scrum(アジャイル開発)
– スプリントという2週間程度の短いサイクルで設計開発と単体テス
ト,結合テスト,ユーザ受け入れテストを複数回実施
– スプリントごとに成果物を出し,スプリントレビューというプロセ
スで成果物をレビュー,フィードバックし,つぎのスプリントに反
映するということを繰り返す
– 要件の変更への柔軟な対応やズレをできるだけ早く検出して調整す
る回数を増やしていこうというアプローチ
54. + ソースコード
+ テストコード
+ バージョン管理システム
– Git
+ ビルドツール
– Maven
– Sbt
– Gradle
+ CI ツール
– Jenkins
CIツールのデファクトスタンダード
– TravisCI
Github のプロジェクトのみ利用可能
60. + 失敗する機能要件のテストを書く
public class User {
}
@RunWith(JUnit4.class)
public class UserTest {
@Test
public void testCreateInstance() {
User bob = new User(“Bob”);
}
}
ソースコード テストコード
61. + テストをクリアするコードを書く
public class User {
private String name;
public User(String name) {
this.name = name;
}
}
@RunWith(JUnit4.class)
public class UserTest {
@Test
public void testCreateInstance() {
User bob = new User(“Bob”);
}
}
ソースコード テストコード
62. + 失敗する機能要件のテストを書く
public class User {
private String name;
public User(String name) {
this.name = name;
}
}
@RunWith(JUnit4.class)
public class UserTest {
@Test
public void testCreateInstance() {
User bob = new User(“Bob”);
}
@Test
public void testGetName() {
User bob = new User(“Bob”);
assertEquals(“Bob”,bob.getName() );
}
}
ソースコード テストコード
63. + テストをクリアするコードを書く
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
@RunWith(JUnit4.class)
public class UserTest {
@Test
public void testCreateInstance() {
User bob = new User(“Bob”);
}
@Test
public void testGetName() {
User bob = new User(“Bob”);
assertEquals(“Bob”,bob.getName() );
}
}
ソースコード テストコード
69. + プロビジョニング
– 利用可能なサーバに、適切なOS, ミドルウェア,アプリケー
ションをロードし、システムを適切に設定したり、サーバ固有
の設定(IPアドレスなど)をしたり、といった作業
+ プロビジョニングツールチェーン
– ブートストラッピング
サーバの OS 設定や仮想マシンによるサーバ立ち上げの自動化ツール
– コンフィギュレーション
サーバやミドルウェアの設定の自動化ツール
– オーケストレーション
ソースコードのデプロイやリリースに関わるサーバの操作の自動化ツール
70. + Vagrant
– 仮想マシン作成やその環境設定などを自動化するツール
+ Chef
– 物理、仮想、クラウドといったさまざまな大きさのインフラに対して、
サーバやアプリケーションの展開を容易にするための自動化フレーム
ワーク
– 自動でミドルウェアをインストールするためのツール
+ Serverspec
– サーバの状態をテストするためのフレームワーク
+ サーバ構築要件
– CentOS 6.5
– MySQL 5.1, Apache 2.3
– Port は 80 を開ける
76. + タスクの管理は,タスク管理用ツールを活用されている
– バグ報告者はタスクのステータスを確認することで問い合わせコストがなくな
るなど
+ ナレッジは wiki にまとまっている
– 新しいメンバーも簡単に検索することができて,スムーズにプロ
ジェクトに必要な知識を身につけられる
– ひとの時間を奪わない
+ 検証環境が用意されている
– 報告されたバグをすみやかに再現できる
+ 確認作業,テストがすべて自動化されている
+ 各自の環境を自動的に整える仕組みがある
– 各自の環境が異なっているために起きる問題がない
+ ソースコードは適切にバージョン管理されている
– 過去の履歴を追跡できる
– 互いに上書きするリスクを抑えられる
+ 自動的にリリースする仕組みがある
– 間違えたり忘れたり,また属人性を排除するために手作業はなくす