Quantcast
Channel: Ryuzee.com
Viewing all 197 articles
Browse latest View live

ふりかえりの実施状況に関する調査結果 (Annual Agile Retrospective Report)

$
0
0

みなさんこんにちは。@ryuzeeです。

アジャイル開発に関する調査レポートはVersion OneによるAnnual State of Agile Surveyなどをはじめとしていくつかあります。

今回retriumという会社が、Retrospective(ふりかえり)に特化した調査を行った資料を公開したので、簡単に紹介します。 なお、レポートはこちらから無料でダウンロードできます。

調査の概要

回答者は277人で、そのうち44%は米国在住者です。 回答者の分布は33%がスクラムマスター、16%が内部コーチ、13%が外部コーチ、12%がリーダーやマネージャーとなっています。

調査結果の紹介

前述のとおり項目数が多いので、その中からいくつか特筆すべき項目について見ていくことにしましょう。 なお数字はレポートからの引用、文章はその数字に対する私のコメントです。

Retrospectiveで難しい点はなにか

なかなか厳しい結果が並んでいますが、多くはファシリテーターがあんまり上手でないことに起因していそうです。 心理的安全性は効果的なRetrospectiveを行うために非常に重要です。アジャイルレトロスペクティブズの書籍でも最初に場の設定をする重要性が説明されています。

状況割合
議論した内容をチーム単体で解決するのが困難48%
安心して話せないことがある44%
チームが分散している36%
いつも特定の人ばかりがしゃべる32%
ネガティブなことばかりにフォーカスする27%
トピックの選択が良くなかったりアクションに合意しない25%
チームがやりたがらない23%
組織やマネージャーがRetrospectiveの価値を分かってくれない20%

どのくらいの時間をかけているか

どのくらいの時間を使うのかはスプリントの長さに依存します。 一方で、Retrospectiveには仕事を強制的に止めるという意味もあるので、あまりに短すぎるのは考えものです。 また、逆に半日かけても同時にたくさんのアクションアイテムをこなすことは難しいので、ムダになってしまう可能性があります。

状況割合
30分〜1時間55%
〜2時間31%
30分未満13%
半日1%

どんなやり方で通常おこなっているか

上位2つは、いずれもスプリント中のアクティビティに注目するものになっていて、思ったよりも他のやり方をしているところが少ない印象です。

状況割合
うまくいったこと/いかなかったこと46%
KPT19%
感情分析10%
Lean Coffee5%
特にテクニックは使っていない3%
タイムライン2%
感謝の表明1%

違うやり方をする頻度は?

いつも同じやり方でやるとマンネリ化しやすいですが、多くは違うやり方を取り入れているようです。

状況割合
不定期28%
毎回22%
違う観点が必要なとき21%
いつも同じやり方をしている17%
交互10%

どれくらいのアクションアイテムを出すか

思った以上にアクションアイテムの数を絞り込んでいるところが多いという印象です。 実際のところ、たくさんのアクションアイテムを出すことが偉いわけではなく、決めたアクションを終わらせることが重要です。 多くのアクションを出しているところほど、具体的でないアクションとなっていて、やったかやってないかがハッキリしない傾向にあると感じます。

状況割合
1〜5個78%
6〜10個16%
11〜153%
何も出さない3%

どんな道具を使っているか

全員同席であれば、やはり物理的な付箋やホワイトボードが効率的で、それを示しています。

状況割合
付箋紙58%
ホワイトボード55%
Confluence20%
オンラインボード13%
Google Docs11%
Google Spreadsheet6%

アクションアイテムのトラッキング方法

アクションアイテムがなし崩しにならないようにトラッキングするのが重要なのは言うまでもありません。 アジャイル用のツールに入れる、というのはプロダクトバックログ項目化するということでしょう。すべてのアクションアイテムをプロダクトバックログ項目にできるとは限らないのでそこは工夫が必要に見えます。 物理のタスクボードは、常に全員が見えるので、やったかやってないかがハッキリし、確実に終わらせようとする力が働きやすくなります。

状況割合
Agile用のツール36%
物理のタスクボード31%
ドキュメント28%
スプレッドシート14%

以上、ご参考まで。


スクラムマスターの仕事にはどんなものがあるか

$
0
0

みなさんこんにちは。@ryuzeeです。

スクラムのトレーニングをしている中でよく質問を受ける項目の1つに、スクラムマスターはどんなことをすればよいのか?というものがあります。 答えを一言で表すなら、「スクラムがうまく回るようにする」なのですが、実際にどんな仕事をするのか簡単にご紹介したいと思います。

なお雑多なリストなので網羅性はありません。

スクラムマスターの仕事の一例

  • スクラムのフレームワークをうまく回せるように支援する
  • スクラムチームにスクラムの価値やフレームワークを理解してもらう
  • ステークホルダーにスクラムの価値やフレームワークを理解してもらう
  • スクラムチームが持続可能なペースで進められるように支援する
  • スクラムチームが集中を維持できるように支援する
  • スクラムチームが透明性を維持できるように支援する
  • スクラムチームが規律を守れるように支援する
  • スクラムチーム内外のお互いの協力を促す
  • スクラムチーム内外のコミュニケーションを促す
  • スクラムチームの自己組織化を促す
  • スクラムチームが心理的に幸福であるように支援する
  • スクラムチームが自律・自立できるように支援する
  • スクラムイベントを時間通りに開始する習慣をつけさせる
  • スクラムイベントをファシリテートする
  • スクラムチームの学習を支援する
  • スクラムチームの気づきを促す
  • スクラムチームの改善を助ける
  • スクラムチームが無駄を減らせるように支援する
  • スクラムチームをとりまく問題を明らかにするのを支援する
  • スクラムチームが必要とする環境やツールの準備を支援する
  • スクラムチームが生産的な環境を維持できるように支援する
  • スクラムチームの整理整頓を促す
  • スクラムチームの要請に基いて手助けする
  • プロダクトオーナーから開発チームへの圧力解消を支援する
  • プロダクトオーナーと開発チームの対立解消を支援する
  • ステークホルダーとスクラムチームの対立解消を支援する
  • 開発チームやプロダクトオーナー単独で解決できない問題の解決を支援する
  • スクラムチームの外からの割り込みを止める
  • プロダクトビジョンの作成を支援する
  • プロダクトのマイルストーン作成を支援する
  • プロダクトバックログの作成を支援する
  • プロダクトバックログの並べ替えを支援する
  • 完成の定義の作成を支援する
  • メトリクスの収集を支援する
  • 見える化を支援する
  • スクラムチームやステークホルダーを観察する
  • スクラムチームやステークホルダーの相談に乗る
  • スクラムチームにフィードバックする
  • スクラムチームに対して指示をしない
  • 体調の悪い人を帰らせる(指示をしないの例外)
  • 開発チームの中にいる開発チームを破壊する人を取り除く(指示をしないの例外)
  • スクラムチームにとって自分が必要なくなったら自分を首にする

それでは。

スクラムガイド2017での変更点の紹介

$
0
0

みなさんこんにちは。@ryuzeeです。

2017年11月7日(現地時間)にスクラムのルールブックであるスクラムガイドが更新されましたので、Webinarの資料をもとに変更点をご紹介します。

なお、スクラムガイド自体はこちらからダウンロード可能です。日本語訳はさまざまな書籍の翻訳で有名な角征典さんです。以下の紹介に際して、スクラムガイド日本語版の記述を引用しています。

実践に際して、大きな影響はあまりないと思いますが、とくに以下の2点が注目だと思います。

  • デイリースクラムで3つの質問を使うかどうかはチーム次第となった。大事なのはスプリントゴールが完成しそうかどうかを毎日検査して適応すること
  • レトロスペクティブ(ふりかえり)で出た項目を、次のスプリントのスプリントバックログに含めること

以下、詳細です。

更新内容


  • スクラムの用途について
  • スクラムマスターの役割の定義を洗練させた
  • デイリースクラムはスプリントゴールの達成に向けた検査と適応の用途であること明確化
  • タイムボックスとは最大の長さであることを明記した
    • タイムボックス化とは、行動や活動に関して厳密な時間枠を置く行為を指す
  • スプリントバックログは、スプリントレトロスペクティブでのフィードバックを含める

▶スクラムの用途


スクラムは世界中で以下の用途で使われてきている。

  • 有望な市場・技術・プロダクトの研究および特定
  • プロダクトや追加機能の開発
  • プロダクトや追加機能のリリース(1 日に何度もリリースされる)
  • プロダクトが使用するクラウド(オンライン、セキュア、オンデマンド)やその他運用環境の開発と保守
  • プロダクトの保守や刷新

▶スクラムマスターの役割


スクラムマスターは、スクラムガイドで定義されたスクラムの促進と支援に責任を持つ。そのためにスクラムマスターーは、スクラムの理論・プラクティス・ルール・価値基準を全員に理解してもらえるように支援する。

できる限り組織文化やスクラムマスターの組織的・政治的なスキルを踏まえて、これを忍耐強く行う。

▶デイリースクラム


デイリースクラムはスプリントゴールの達成に向けた検査と適応のためにある。開発チームはデイリースクラムを使って、スプリントゴールとスプリントバックログの進捗を検査する。デイリースクラムは、開発チームがスプリントゴールを達成する可能性を最適化する。開発チームは、自己組織化チームとしてスプリントゴールを達成し、スプリント終了までに期待されるインクリメントを作成できるかを毎日把握しなければいけない。デイリースクラムの構成は、開発チームが設定する。スプリントゴールを目指している限り、他のやり方で行なっても構わない。質問を使うチームもあれば、議論ベースで進めるチームもある。

▶タイムボックスは最大の長さのことである


「最大」という言葉を追加して、イベントを時間どおりに行なう必要があるのかという疑問を解消し、許容される最大の時間であることを明確にした。タイムボックス化とは、行動や活動に関して厳密な時間枠を置く行為を指す

▶チームの働き方の継続的改善


スプリントバックログによって、開発チームがスプリントゴールを達成するのに必要な作業がすべて見える化されている。継続的改善を確実なものとするために、前回のレトロスペクティブで特定した優先順位の高いプロセスの改善策を少なくとも1つは含めておく。

よくある誤解について

▶スクラムはソフトウェアにしか関係がないのか?


私たちは役にたつプロダクトを作る。ソフトウェアはその例に過ぎない。どれだけ頻繁にチームがリリースするか、プロダクトがどのようにサポートされるのか、顧客がどれくらい新しい機能を受け入れられるかにも差がある。たとえば、自動運転の車では、たくさんの機能を頻繁にリリースするよりも、安全であることが求められる。プロダクト開発では以下のような観点がプロダクトバックログに含まれる。

  • 開発
  • バグ修正や技術的負債の削減
  • 運用環境の開発
  • 運用環境の準備
  • マーケティング
  • サポートの準備、トレーニングやレディネスの確認
  • ヘルプやサポート用のファイルの準備とテスト
  • パイロットマーケットへの早期リリース
  • その他価値を実現するのに必要なものすべて。たとえばパートナーシップなど

▶スプリントが終わる前にリリースしてもよいか?


  • プロダクトオーナーが選択し、スクラムチームにとって可能なのであれば、いつでもリリースしてよい
    • 負債より価値が上回っていることを確認する
  • 必要なのは、スプリントの最後に完成したインクリメントがあること、実際にそれをリリースするかどうかに関係なく、利用可能なものであることである
  • 継続的デリバリーのプラクティスはスクラムと併用が可能

▶DevOpsについてはどうなの?


  • 開発チームは、最初の数スプリントのうちにプロダクトが実現可能で価値を生み出すことを証明しなければいけない
  • そうするためには、運用環境やサービスレベルアグリーメントを満たすような初期アーキテクチャが必要になる
  • スクラムチームが権限をもっていて、組織が協力的であれば、結果的に、なんらの危機に遭遇することなく組織的な変化が実現される
  • スクラムプロジェクトでは、先に進める前に、新しい能力を実際に使ってテストしておく必要があることが多い
    • リスクを早期に最小化する

それでは!

Azure Cloud Shellを活用してスライド公開環境を30分で作る方法

$
0
0

みなさんこんにちは。@ryuzeeです。

Slideshareがスライドの差し替え機能を停止したり、日本語フォントがおかしくなったりして悶絶するのを避けるために、自作のスライド公開用プラットフォームを運用しています(レポジトリはこちらです)。

このプラットフォームはAzureもしくはAWSのオブジェクトストレージやキューを使った構成になっていて、アプリケーション本体はDockerコンテナに格納しています。 今日はこの環境を、Azure上に手作業なしで作ってみたいと思います。

概要

自動でAzure上のリソースを作る方法はいろいろあります。例えばTerraformでも可能ですし、公開されている各言語用のSDKを使うこともできます。 個人的な好みは公式で提供されているコマンドラインインタフェース(CLI)を使う方法です。これであれば新サービスの登場とほぼ同時にすぐに使えます。

このスライド公開用プラットフォームを動かすのに今回は以下のサービスを利用します。

  • Blob Storage
  • Queue Storage
  • SQL Database
  • App Service

これらの作成や設定を全部CLIを使って進めます。 またコマンドの実行はAzure Portal上のAzure Cloud Shellから行います(メニューの「>_」をクリックします)。ポータル上で実行するために認証のことを考える必要もなく、常に最新のCLIが使える点がメリットです。

実行内容

実行の内容は以下のような感じになります。 何回実行しても名前の競合が起こらないように、冒頭で変数を定義し、コマンドの引数にはその値を渡すようにします (たとえば、SQL DatabaseのサーバURLやストレージアカウントのURLは重複が許されません)。 値については適宜書き換えてください。

なお、複数のサブスクリプションを持っている場合は、az account set -s サブスクリプションIDとして、どのサブスクリプションを使うか指定してから作業を開始します。

# ランダムな数値を生成しておいて各種リソース名にはそれを付与する
export rand=$RANDOM
# リソースグループ名
export resourcegroup=slide-$rand
# リージョン名
export region='Japan West'
# ストレージアカウント名
export storageaccount=slidestorage$rand
# SQL Database Serverのエンドポイント
export dbserver=slide-sqlserver-$rand
# データベース名
export dbname=slidehub
# データベースの管理者ユーザー名
export dbuser=slideadmin
# 【要変更】データベースの管理者用パスワード(適宜変更すること)
export dbpassword=YourPassW0rd
# App Serviceのサービスプラン
export appservice_plan=appserviceplan$rand
# App Serviceの名前(URLの一部になる)
export appservice_name=slidehub-$rand
# 利用するDockerイメージ
export container_image=ryuzee/slidehub:latest
# 【要変更】アプリケーションで使うシークレットキー(類推されない長い文字列)
export secretkey=03659dccb3fab0cd064b2d265257e657f21d0f060853bf5fa2dd70359a23

#=================================================================
# ここからリソースの作成処理
#=================================================================

# リソースグループを作成する
# これから作るリソースは全てこのグループに所属させることでまとめて削除できるようにする
az group create --name "$resourcegroup" --location "$region"

# ストレージアカウントを作る
az storage account create --name "$storageaccount" --resource-group "$resourcegroup" --location "$region"

# ストレージのアクセスキーを取得する
key=`az storage account keys list --account-name "$storageaccount" --resource-group "$resourcegroup" | jq -r '.[0].value'`

# Blobストレージのコンテナ(格納場所。S3でいうところのバケット)を作る
az storage container create --name "slide-files-$rand" --account-name "$storageaccount" --public-access off
az storage container create --name "slide-images-$rand" --account-name "$storageaccount" --public-access blob

# Blobストレージに対するアクセスポリシーを設定する。外部からのワンタイムでのアクセスを許すための設定
az storage cors add --methods PUT GET HEAD POST OPTIONS --origins "*" --exposed-headers "*" --allowed-headers "*" --account-name "$storageaccount" --services b

# Blob Queueを作る
az storage queue create --name "slide-queue-$rand" --account-name "$storageaccount"

# SQL Databaseのサーバを作る
az sql server create --name "$dbserver" --resource-group "$resourcegroup" --location "$region" --admin-user "$dbuser" --admin-password "$dbpassword"

# SQL Databaseのファイヤウォールポリシーを更新する。以下の例ではAzureサービス内からは全て接続を許可
az sql server firewall-rule create --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0 --name "$dbserver-rule" --resource-group "$resourcegroup" --server "$dbserver"

# データベース自体を作る
az sql db create --resource-group "$resourcegroup" --server "$dbserver" --name "$dbname"

# App Serviceのサービスプランを作成する。ここでインスタンスの大きさも指定する
az appservice plan create --name "$appservice_plan" --resource-group "$resourcegroup" --sku S2 --is-linux

# App Serviceのアプリケーションを作成する。ここでは指定したDockerイメージを使うこととしている
# また起動時にコンテナ内のスクリプトを動かし、テーブル作成やデータ作成を行う
az webapp create --resource-group "$resourcegroup" --plan "$appservice_plan" --name "$appservice_name" --deployment-container-image-name "$container_image" --startup-file /opt/application/current/script/override_startup_production.sh

# App ServiceでDockerに引き渡す環境変数を設定する
az webapp config appsettings set --resource-group "$resourcegroup" --name "$appservice_name" --settings \
OSS_AZURE_CONTAINER_NAME="slide-files-$rand" \
OSS_AZURE_IMAGE_CONTAINER_NAME="slide-images-$rand" \
OSS_AZURE_QUEUE_NAME="slide-queue-$rand" \
OSS_AZURE_STORAGE_ACCESS_KEY=$key \
OSS_AZURE_STORAGE_ACCOUNT_NAME="$storageaccount" \
OSS_DB_ENGINE=sqlserver \
OSS_DB_NAME="$dbname" \
OSS_DB_PASSWORD="$dbpassword" \
OSS_DB_PORT=1433 \
OSS_DB_URL="$dbserver.database.windows.net" \
OSS_DB_USE_AZURE=true \
OSS_DB_USERNAME="$dbuser" \
OSS_SECRET_KEY_BASE="$secretkey" \
OSS_USE_AZURE=1 \
PORT=3000

あとは20〜30分くらい待っていれば自動でスライド公開環境ができあがります。なお、当然ながらAzureのリソースの料金がかかります。 初期のアカウントは、ユーザー名がadmin@example.comで、パスワードがpassw0rdなので適宜変更してから遊んでみると良いでしょう。

ログインして管理画面上でカスタマイズするとこんな感じにできます。

環境の削除

すべて同じリソースグループの中に入れているので、削除自体も簡単です。同じようにAzure Cloud Shellなどで以下を実行します。

az group delete --name リソースグループ名 --no-wait --yes

まとめ

CLI最高マネージド最高

アジャイル開発やスクラムのトレーニングでよく聞かれる質問とその答え (1)

$
0
0

みなさんこんにちは。@ryuzeeです。

弊社ではアジャイル開発、スクラムのトレーニングを提供しているのですが、トレーニング中には多くの質問をいただきます。 今日はよくある質問とその答えについていくつかご紹介したいと思います。 好評そうだったら続編も書く予定です。

■アジャイル開発において、ドキュメント作成の一般的な指針を教えてください

どのようなドキュメントがいつ、どの粒度で必要なのかはプロダクトやプロジェクトに依存します。 プロダクトやプロジェクトにはそれぞれ固有の品質基準があり、それはアジャイルやウォーターフォールといった方法論の違いによって変わるものでもありません。 従ってプロジェクト冒頭でプロダクトオーナーやステークホルダー(品質管理部門や顧客など)と「なんのために」「どのようなドキュメントが」「どのような記述レベルで」「いつまでに必要なのか」を決定してください。 誰も使う予定のないドキュメントはムダなので作成は不要です。

また、チーム内の議論のためのドキュメントであればWikiなどを活用して、ドキュメント作成やメンテナンスの負荷を下げる必要があります。 メンテナンスされていないドキュメントは事故を起こす可能性があるため、機能の実装や更新とあわせて変更しないといけませんが、このときドキュメントが多すぎると必ず不整合を起こすため、数を減らす・一箇所に集める・自動生成するといったことを検討してください。

■アジャイル開発を適用するにあたって、顧客や上司、社内の関係部門がウォーターフォール型の報告を求めるのですがどうすればよいですか

アジャイル開発をきちんと理解できていないと、結果的に従来と同じようにスコープ、期日、費用を全て固定して達成しようとしがちですし、その観点で全体を見ようとしてしまいます。 また、関係者のプロジェクトへの継続的な関与が不十分になることもあります。 従って関係者がアジャイル開発の概念を理解していない場合は、考え方を説明するセッションやトレーニングを事前に実施します。 後から散発的に説明するとどうしても時間が余計にかかるので、先に理解してもらってから始めるということになります。 それでも報告が従来の形に近いものが求められることはありますが、それぞれの数値からどんなことが知りたいのか把握できれば、アジャイル開発の工程の中でも他のメトリクスを使って説明することもできるはずです。 プロジェクトの立ち上げフェーズで報告の仕方についても議論し決定しておくとよいでしょう。

なお、精緻なデータを集めたりレポートを作る作業を開発チームにさせてしまうと、価値のあるプロダクトを作るのに使える時間が減ります。 スクラムマスターやプロダクトオーナーが良きに計らって報告する形がベストだと思います。 もちろん開発チームは常に透明性のある状態でなければいけないことに変わりはありません。

■プロダクトバックログの上位の項目は見積もりができるくらい詳細化されている必要がありますが、この詳細化の作業をスプリント外で他のチームがやってもよいですか

要求を詳細化する(少なくとも開発できるぐらいに具体的にする)作業をバックロググルーミングもしくはバックログリファインメントと呼びます。 このイベントは次のスプリントを始める上で重要な活動なので、前のスプリントの中で開発チームやプロダクトオーナーが自分たちの時間を使って実施します。 つまりスプリントで開発に使える時間はその分減るということです。 一般的にはスプリントの時間の10%程度はこのバックログリファインメントに使います。

要求が具体的になっていない状態でスプリントに投入して開発をはじめてしまうと大きな手戻りが発生したり、プロダクトオーナーとのかなり頻繁なコミュニケーションが必要となってしまい成果の予測ができなくなります。 開発チームとして作れるかどうかの判断をしないといけないので、別チームが要求を詳細化するのではなく、実際に開発を行う人たちを中心として詳細化を行います。 もちろん規模が大きい場合には、アナリストなどの職種の人が詳細化に参加することはありますが、アナリスト単独で詳細化することはないと考えてください。

■アジャイル開発の経験者を採用したいのですが、面接でどんな質問をすればよいですか

これを聞けば絶対という唯一解はないのですが、一例としていくつか紹介します。

  • プロセス全体をホワイトボードに書いて説明してもらう
  • 過去にどのようなふりかえりの方法をとったことがあるか、それぞれの手法のメリットはどのようなものかを聞いてみる
  • どのような計画の立て方をしていたのか説明してもらう
  • プロダクトバックログにどのようなことを書いていたのか説明してもらう
  • 実際にアジャイル開発をしてうまくいったこと・いかなかったことを説明してもらう
  • アジャイル開発におけるエンジニアリングのポイントを説明してもらう

■各スプリントで回帰テストをしていると大変なのですが、どうすればよいですか。スプリントを経るごとにテストの負荷が増えていくのですが

完成の定義という品質基準をスプリント開始前に定めて、スプリントではその品質を満たすようにしないといけません。 そもそもその基準を満たしていないものは、リリース判断の対象にすらならず、プロダクトバックログ項目も完成とはなりません。 従ってテストは自動化し、コードの変更を行うたびに全てのテストを毎回自動で実行しリグレッションがないことを検証するといった活動が必要です。 スクラムでは自動化自体は定義されていませんが、毎スプリントでリリース判断可能なものをつくるためには事実上はテスト自動化が必須です。

なお、実際のリリースに際して必要なすべての品質をスプリント中に満たせるのであれば、スプリント中でもいつでもリリース可能となります。 一方でプロダクトの性質によっては数か月単位でのリリースに決まっていたり、リリースするには外部のセキュリティベンダーによるペネトレーション試験が必要だったりすることもあります。 こういったケースでは、リリース前に「リリーススプリント」と呼ばれるテスト期間をとることもあります。 ただし、スプリントで担保している内容と、実際のリリースで担保しなければいけない内容に差が多ければ多いほど、急な変化に対応したりはできなくなりますし、大きな品質問題が最後に見つかる可能性もあります。

■SCRUMとXPを組み合わせる場合、リファクタリングはプロダクトバックログやスプリントのタスクに入れた方がよいですか。それとも各自が定常的に実施すればよいですか

アジャイル開発の場合、インクリメントの考え方のとおり、動作している(役にたっている)プロダクトに機能を追加していく形になります。 したがって、一度書いてテストしたコードは「壊さないために触らない」ということはなく、スプリントを重ねるごとに変更が入ることがあります。 つまり常時変更が入る前提でコードをクリーンな状態に保つことが必要です。

リファクタリングの習慣が開発チームにまだないような状態であれば、明示的にプロダクトバックログを用意したり、スプリントのタスクとしてこなすようにします。 ただし、時間をかけて、リファクタリングを続けるのが開発チームの習慣になるようにしていきます。 なお、前述のとおり、完成の定義(品質の基準)を満たしていないコードは例え動作したとしても、出荷可能ではありません。 つまり完成の定義の中で「コードレビュー」や「コードの複雑度」や「コーディング規約遵守」などを決めていた場合は、スプリントの中でそれらを満たさないといけません。 後になってから問題のある箇所をまとめて直すような形にしてしまうと、それが終わらない場合出荷ができなくなるので、定常的にやる方がリスクが少なくなります。

■1つのプロダクトバックログ項目が大きくて1スプリントでは作れません。複数スプリントにまたいで開発してよいですか

1つの機能が大きい場合、その機能には多くのサブ機能が含まれていることが多々あります。 例えば、「ホテルの予約をキャンセルできる」というプロダクトバックログ項目は、

  • プレミアムメンバーであれば24時間前までキャンセルできる
  • 一般メンバーであればN日前までキャンセルできる
  • キャンセルした場合はメールで通知する

という3つに分けられるかもしれません。 このような形で、1スプリントに入るサイズにプロダクトバックログ項目を分割してください。 なお、コンポーネント単位では分割してはいけません。 あくまで意味ある機能単位で分割してください。 また、そもそも1スプリントで1つのプロダクトバックログ項目だけを作るというのも、サイズが大きすぎます。こうしてしまうと成果(ベロシティ)が0のスプリントが頻繁に発生する可能性もあります。 スプリント期間の半分程度で終わるサイズになっていると、スプリントでの成果の量が安定しやすくなります。

別の観点として、その機能の設計や調査も含めて時間がかかる、といった場合は、その機能はまだスプリントで着手する準備ができていない状態の可能性もあります。 スプリントに入る前に事前に「機能として何ができていれば完了なのか」「それはどうやってテストできるのか」等が合意できているものだけを着手してください。 準備ができていないもののうち実装の優先順位の高いものは、次のスプリントに入る前に「バックログリファインメント」のイベントなどで準備完了状態にする活動をします。

アジャイル開発やスクラムのトレーニングでよく聞かれる質問とその答え (2)

$
0
0

みなさんこんにちは。@ryuzeeです。

先日、弊社がアジャイル開発やスクラムのトレーニングの際によく質問いただく項目とそれへの回答を一部紹介しました。 参考になると言ってくださった方も多かったようなので、第二弾を公開します。

■請負契約でアジャイル開発を進めるコツを教えてください

悪いことは言わないので、請負契約は避けた方が良いです。 最初にスコープを全て洗い出して固定し、そこから期日と費用を見積もって請負契約したのであれば、完成責任と納入責任を負わざるを得ません。 一方でアジャイル開発は「スコープが変化する」「全てのことを事前に予測することはできない」という考えを中心においています。 ですので完了する責任をもって契約するのではなく、「変化に最大限対応すること」「最善をつくすこと」を約束します。 必ず完了させなければならない契約に対してアジャイル開発を適用してしまうと、「変化」の要求は受け手側にとってはコスト増大・期間延長のリスクにしかなりません(定額時間無制限食べ放題みたいなものです)。 準委任型の契約にしましょう。 それでも顧客が請負契約を求める場合があるかもしれませんが、その場合は顧客がそもそもアジャイル開発を理解していない可能性があるので、考え方を説明して理解してもらう活動が必要です。

■スクラムの開発チームメンバーはクロスファンクショナルでいろいろなことができると思いますが、そんな優秀な人たちがいるならウォーターフォールでもうまくいくのではないですか

誤解のないようにいっておくと、個人としてインフラやアプリを始めとするさまざまな領域の設計や実装を全部できないといけないわけではありません。 開発チーム全体を見た時に必要なスキルを網羅していることがだいじです。 外部のチームへの受渡しや依存が増えれば増えるほどリードタイムは長くなり、計画作りも難しくなります。 また、いま複数のスキルがなくても開発チーム一体で開発を進めていけばいろいろなスキルが身に付きますし、開発チーム全体の能力もどんどんあがります (もちろん最初のうち特定のスキルが特定の人に依存する場合もあります。その場合はその人がボトルネックになるためクリティカルな領域であるほどなるべく早く単一障害点の解消が必要です)。

なお、「うまくいく」の基準はウォーターフォールとアジャイルでかなり違います。 ウォーターフォールは事前にたてた計画を守れれば成功、アジャイル開発はプロダクトによってビジネスの成果が出せれば成功です。 その点を抜きにして、開発チームの生産性や効率だけを議論することに意味はありません。

■スプリントの長さは固定ですが、祝祭日があって営業日が減る場合はどうしたらよいですか

スプリントプランニングやスプリントレビューは定期的に実施することにメリットがあるので、基本的に曜日を固定することをお勧めします。 つまり祝祭日があった場合は、その分スプリントの稼働日数は減ります。 開発チームが使える時間も減るので、計画ではそれを考慮して取り組むプロダクトバックログの項目を減らすのが一般的です。 また研修などでの不在や休暇も考慮に入れるとよいでしょう。 スプリントの総稼働可能時間から不在の時間や各種イベントの時間を抜いたものが開発チームのキャパシティになります。 キャパシティを超えたタスクに取り組もうとしても終わらないので、スプリントプランニングでタスク量とキャパシティを比較し、タスク量が多すぎる場合は末尾のプロダクトバックログから順番にスコープから外していきます。 キャパシティについてはあらかじめ20〜30%程度のバッファを取っておくと安心です(間違っても1日8時間全部が開発に使えるとは決して思わないようにしてください)。

なお、日本は月曜日に休日が多いので、スプリント開始日を月曜日にしない方が運用しやすいと思います。

■プロダクトバックログの見積りについて、規模や工数を算出する時にどんな方法を使えばよいですか

プロダクトバックログの項目の見積りは継続的に実施する活動なのでタイミングごとに説明します。

まずプロジェクト初期に全体で必要そうな工数や期間などを算出します。 算出の仕方はスクラムでは規定はありませんので好きなやり方を使ってください。 例えばファンクションポイントも使えますし、見積りのノウハウが蓄積されていればそれを使っても構いません。 大事なのは初期のプロダクトバックログ項目のすべての開発を「約束」するわけではないので、この見積りは開発チームのサイズや期間の算出に使うだけであるというのを意識することです。 ここで開発チームのサイズと期間が決まれば、プロジェクトにかかる費用は算定が可能です。 もちろん先に予算確保や投資可能額が決っているのであれば、それを前提にしても構いません。

次に個々のプロダクトバックログ項目の見積り方法ですが、これ自体もスクラムでは細かい決まりはありません。 決っているのは「プロダクトバックログ項目を見積もっておけ」という点です。 人日や人月で見積もっても構いませんが、細かく見積もることにあまり意味はないので、相対的なサイズを1,2,3,5,8,13,20…などのフィボナッチ数列を使って表したりTシャツサイズと呼ばれるS/M/L/XL/XXLなどで表したりします。 最初の何回かのスプリントを実施すると開発チームがどれくらいの量を1スプリントで完了できるかが分かってプロジェクトの着地点の予測精度が向上していきます。

なお、個々のプロダクトバックログ項目の見積りはスプリントが進んで色々なものができあがったり開発チームの能力が向上することによっても変わっていきますので、バックログリファインメントのイベントを活用して上位のプロダクトバックログ項目は定期的に見積りしなおしてください。

■スプリントプランニングやレトロスペクティブで、スクラムチーム内の議論についていけないメンバーがいた場合、どうしたらいいでしょうか

基本的にはスクラムチーム内で解決方法を考えてください。 例えば新人であれば話が分からなくてついてこれないのは当然ですが、ずっとそのままにしておくといつまでたってもチームの総合力が上がらないので、優先順位の高い課題として対処しないといけません(例えばペアで作業したり説明の時間をとるなど)。 一方で本人の資質やマインドセットに問題があって、チームとして出来る限りはやってみたということであれば、スクラムマスターやラインマネージャーがその人をチームから除外するという判断をした方がよい場合もあります。 ただしいずれにせよ、まずはチームで全力で解決しにいってください。

なお、似たようなケースでスクラムチーム内で決めた規律を守らない人がいる場合もあります。 たとえばイベントごとに来ない、完成の定義を守らない、着手すべき順番に着手しないで好きなものばかりをやるといったものです。 このような状況を放置すると、スクラムチーム全体の規律が失われていきます。 技術的に優秀かどうかに関係なく対処をしなければいけません。

【資料公開】Scrumプロジェクト開始のベストプラクティス

$
0
0

みなさんこんにちは。@ryuzeeです。

2018年1月11日から13日まで開催されているRegional Scrum Gathering Tokyo 2018で登壇いたしましたので、資料を公開します。

今回は、実際にスプリント1を開始する前にどのような準備をしておけばよいかがテーマです。

スクラムでは、プロダクトバックログが用意されていて、それを元にスクラムチームでスプリントプランニングを実施し、スプリント期間中毎日デイリースクラムを行い、最後にスプリントレビューとレトロスペクティブを実施することになっています。またスプリント中の次以降のスプリントの準備としてプロダクトバックログのリファインメントを実施します。 つまりプロダクトバックとスクラムチームが存在するところがスタート地点になっています。 では、これらはどこから出てくるのか、どのように作っていけば良いのか、という話になります。

資料では汎用的な立て付けになっていますが、実際のところ、スプリント1を開始するために行っておくべき事前準備はプロダクトやプロジェクトによって大きく変わってきます。 自分たちのコンテキストにあわせて考えるのを忘れてはいけません。 資料が参考になれば幸いです。

スクラムにおける技術的スパイクの進め方

$
0
0

みなさんこんにちは。@ryuzeeです。

スクラムでは、スプリントに投入するプロダクトバックログ項目はReady(準備ができている)である必要があります (Readyとはどんな状態なのかについては以前に詳しく説明したので、そちらを参照してください)。 Readyにしておくことによって、成果の量が安定しプロダクトオーナーやステークホルダーにとっては予測精度が向上していきます。

Readyにする活動は単に受け入れ基準を用意したり、プロダクトバックログの内容を精緻化したり、並べ替えたりするだけではありません。 スプリント内でプロダクトバックログ項目が完成する可能性を上げるために必要な活動すべてが含まれます。 そしてその中の1つが技術的な調査です。 スプリントでプロダクトバックログ項目に着手してから実現方法を調べたり、技術的な制約によって大幅な方針転換したりするのでは遅い上に予測性が低いので、先に技術調査をするわけです。 このことをスパイクと呼びます。

今回はスプリントを実際に開始したあとで、スプリントを回しながらどのようにスパイクをしていけばよいか見ていきましょう(スプリント0の立ち上げ期間中にもスパイクを実施しますが、今回はスプリントでの活動にフォーカスします)。

1. スパイクの定義

まずは、AgileDictionaryというアジャイル用語解説サイトの定義でスパイクの定義を確認しましょう。 そこでは以下のようになっています(拙訳。一部改変)。

スパイク

リリース可能なプロダクトを作るのではなく、質問に答えたり情報を収集したりすることを目的とした作業。 開発チームが技術的な質問や設計上の問題を解決するための実際の作業を行うまで、見積りができないようなプロダクトバックログ項目が出てくることがあります。 解決策は、「スパイク」を行うことです。 目的は、質問に対する回答やソリューションを見つけることです。

語源

スパイクという用語は、エクストリームプログラミング(XP)に由来します。 そこでは、「スパイクとは、非常に簡素なプログラムのことで、ソリューション候補を探求するのに使われる」とされています。 ウォード・カニンガムは、c2.comというwikiでこの用語がどのようにできたかを述べています。 「ベック、自分たちが正しい方向に進んでいると確信できる、もっとも簡単なことは何だろう?」 手に余りそうなものを小さくして進めることで、単純で説得力のある解決策につながりました。 ケント・ベックはこれをスパイクと名づけました。 私は大きなフレームワークの保守をしているときでも、このプラクティスが特に役立つことを発見しました。

2. スパイクの目的

つまり、スパイクの目的は以下のように整理できます。

  • 質問や疑問に答えるための情報を集める
  • より良い実現方法を探索する
  • 見積り精度を上げる
  • リスクを明らかにする

3. スパイクの進め方

スクラムではスプリントごとに「リリース判断可能なインクリメント」を作ると決められています。 それぞれのスプリントで、スプリントゴールを満たすように進めていかないといけません。 したがって、スプリントの時間をスパイクで埋め尽くしてはいけません。 以下の手順で進めていくとよいでしょう。

基本の流れ

  • まずはプロダクトバックログリファインメントなどを活用して、直近数スプリント内に着手する可能性のあるプロダクトバックログ項目をウォークスルーして、技術的な課題がないかどうかを確認する
  • 例えば技術的な観点で以下のように分類してみます
    • 環境や前提条件などを決めて測定してみないと分からないもの
    • 誰もやったことがなく、ノウハウや情報の入手も難しいもの
    • 誰もやったことはないが、ネット上などにさまざまな情報がありそうなもの
    • 開発チーム内のごく少数だけは経験があるもの
    • 開発チーム内の多くの人が分かるもの
  • 分類した上で、特に上記の1点目〜3点目に該当するような技術的な課題があった場合は、それらがどの程度大きな問題になりそうなのかを開発チームで判断する
  • 開発チームとして大きな問題にならないと自信をもてる場合は特にアクションは必要ない
  • そうでない場合は、開発チームとして、それらの課題がどのような状態になったら解決となるかを合意する
  • 複数のスパイク項目がある場合は、通常のプロダクトバックログと同じように並べ替える
  • その上で、スパイクに使う時間の上限を設定する(終わるまでやろうとすると時間が延びるので、タイムボックスを定める)
  • 状況に応じて、プロダクトバックログ化するか、開発チームのバッファの中で行うか判断する
  • スパイクを実施する。必要なことが判明したり、タイムボックスの上限に達したりしたら、スパイクの結果を共有する
  • その上でさらに追加でスパイクが必要かどうかの判断をする

4. スパイクを進める上での注意点

スパイクを進める上ではいくつか注意点があります。例を挙げておきましょう。

  • 目的や課題の認識抜きでやらない
  • スプリント1を開始する前の初期フェーズで、全てを検証しようとしない
  • 直近数スプリント程度を対象とし、重要な箇所にフォーカスする
  • プロダクトバックログ項目の着手の仕方と同じように、なるべく開発チーム内で1つづつ終わらせる。すなわちスパイクの担当者を固定しすぎない
  • やりすぎない。目的はプロダクトバックログ項目の精度をあげることなので、それができる最低限で構わない。全てを網羅しようとしない
  • スパイクはあくまでスパイクなので、スパイクの成果のコードをいきなりプロダクトコードに統合しない
  • タイムボックスを設定し、その枠で収まらない場合は状況を確認した上で再計画する。時には諦める判断をすることもある
    • タイムボックスをどの程度にするかの決まりはないが、スプリントの長さの20%程度までの時間が現実的。もちろん開発チームの能力に強く依存する
  • スパイクの結果はプロダクトバックログ項目の中身(見積りや受け入れ条件など)に反映する

5. スパイクをプロダクトバックログに入れるか、それともバッファのなかで行うか

スパイクをプロダクトバックログに入れるか、スプリントのバッファで行うかは悩ましいポイントです。 考え方としては、以下のようにしておくと良いと思います。

バッファで対応する

  • スパイクの所要時間の見込みが短い場合
  • 万一ほかのプロダクトバックログ項目の実装に時間がかかってバッファが減り十分なスパイクができなくても、即時大きな問題にはならない場合

プロダクトバックログ項目に入れる

  • 次以降のスプリントで進捗を阻害する重大な問題になると考えられる場合
  • スパイクが必要なプロダクトバックログ項目が、他のプロダクトバックログ項目と依存関係を形成している場合
  • 検証に時間がかかる場合(開発チームのバッファを超える時間が必要な場合)

なお、プロダクトバックログの並び順の最終決定権限はプロダクトオーナーにあります。 したがって、スパイクのプロダクトバックログ項目の重要性を開発チームとしてプロダクトオーナーに伝えて、スプリントへの投入を決定してもらう必要があります。

6. まとめ

繰り返しになりますが、準備のできていない(Readyでない)プロダクトバックログ項目、完成できる自信のないプロダクトバックログ項目をスプリントに投入するのは避けるようにするべきです。 そして、プロダクトバックログ項目は着手前に、要求の観点だけでなく技術の観点なども含めて完成できそうかを確認しておく必要があります。 そして、技術の観点ではスパイクは有効な手立てになります。 どの程度のスパイクが必要なのかは、開発チームの扱っている技術や経験に大きく左右されますが、重要な問題にフォーカスしタイムボックスを設定して取り組むと良いでしょう。

それでは。


アジャイルコーチはなぜ1週間スプリントを勧めるのか

$
0
0

みなさんこんにちは。@ryuzeeです。

職業柄スクラムを始めたばかりのチームを支援することがよくあります。 そのような状況で、ロールの明確化や初期のプロダクトバックログの準備とあわせて話題にのぼることが多いのが、スプリントの期間をどうするかです。 そして、多くの場合、1週間スプリントを提案しています。 今回はなぜ1週間スプリントが良いのか見ていきましょう。

1週間スプリントがよい理由

1週間スプリントがよい理由を列挙すると以下のようなものがあります。

  1. レトロスペクティブ(ふりかえり)が頻繁にあるので改善が進む
  2. 計画の精度が高くなる
  3. 例え失敗しても一週間で済むので実験しやすい
  4. ベロシティの数字がすぐ出るのでやる気になる
  5. 中だるみする余裕がない・リズムがよい
  6. 一週間で収まるサイズのプロダクトバックログ項目にするので明確な完成を定義しやすい。従ってプロダクトオーナーの受け入れを取りやすい
  7. スパイクが必要なプロダクトバックログ項目が明確になる
  8. プロダクトオーナーが変更を我慢しやすい
  9. ごまかしが効かない

順番に見ていきましょう。

レトロスペクティブ(ふりかえり)が頻繁にあるので改善が進む

大きな理由の1つがレトロスペクティブの回数です。 たとえば、スプリントに使える期間が3か月だとすると、4週間スプリントはスプリントが3回、2週間スプリントで6回、1週間スプリントで12回となります。 改善の基本的な考えとして、うまくいったかどうかを判断しうまくいかない場合は元に戻す、一度にたくさんのことを変えないという点が挙げられます。 つまり毎回劇的な変化を加えるのではなく緩やかに変化していくことになります。 このとき改善の機会が少なければ少ないほど、試行錯誤して改善する機会が減ってしまい、最初と最後での変化は少なくなってしまいます (言い換えると上手くなる前に期限が来てしまいます)。 したがって、慣れていないうちほど、改善の機会をたくさん用意した方がよく、短いスプリントの方がその機会は多くなります。

計画の精度が高くなる

計画づくりは難しいです。もちろん見積りも難しいです。 そしてこれらは規模が大きければ大きいほど難易度が上がります。 また、始めたばかりの段階だと、スクラムチーム全体がやり方に慣れていない、過去にどれくらいの速度で開発できていたのかというデータがないといった要因も、影響を与えます。 したがって、特に慣れるまでは、なるべく小さい単位で計画をたてて、計画と実際の差がどのくらいなのかを見ながら微調整していくことが重要になります。 1週間の計画を立てられないのに4週間の計画を立てられるということはないので、まずは短い範囲でいいので確度の高い計画を立てられるようにしてください。 そうすることで、プロダクトオーナーはプロダクトの今後の見込みや予測をしやすくなります。 予測がしやすければしやすいほど、ビジネス面での計画も立てやすくなります。

例え失敗しても一週間で済むので実験しやすい

計画の精度が高くなる、というのと多少相反しますが、万が一そのスプリントが何らかの理由でうまくいかなかったり、成果が少なかった場合でも、スプリントの期間が短ければ短いほど影響は少なくなります。 あるプロダクトバックログ項目でいろいろハマってしまい、想定の時間以上をかけても完成しなかった場合のことを考えてみましょう。 この場合、スプリント期間が長いと延々とハマってしまい、長いタイムボックスを使いきってしまうリスクもあります。 一方で、1週間スプリントの場合は、すぐにスプリントが終了します。 そして着手中だろうがあとすこしで終わりそうだろうが強制的に当該プロダクトバックログの作業は停止されます。 仕掛中のプロダクトバックログ項目については、次のスプリントで継続して取り組むのか、それとも先送りにするのか、もうやめるのかを判断する機会もあります。 そう考えると短いスプリントの方がリスクが少ないことが分かります。

また、同様の理由で、プロダクトオーナー側の観点としても、挑戦的なプロダクトバックログ項目をスプリントに投入しやすくなります。

ベロシティの数字がすぐ出るのでやる気になる

これは大した理由ではないのですが、スプリントが短いとベロシティの数値がすぐに見える化されます。 過去のベロシティとすぐに比較できるので、成長を実感したり停滞に気づいたりするのが簡単になります。

中だるみする余裕がない・リズムがよい

1週間スプリントでは、例えば以下のような週間スケジュールになります。

  • 水曜日午後にスプリントプランニングを2時間のタイムボックスで実施し、完了後に夕方からスプリント開始
  • 金曜日か月曜日くらいにプロダクトバックログリファインメントを実施して次のスプリントを準備
  • 火曜日の夕方に翌日の準備をして、水曜日の午前中にスプリントレビューを1時間、スプリントレトロスペクティブを1〜2時間実施

毎週同じ曜日の同じ時間にイベントが行われることになるので、スケジュールを考えたり調整したりする必要がなく、リズムが出やすくなります。 イベントをオープンスペースでできないような場合でも、単純に毎週繰り返しで会議室予約をしておけばよいだけです。 何曜日の何時くらいにどういう状態だったら、マズイとか大丈夫そうだ、というのも分かりやすくなります。 スプリント期間が長くなると、スプリントプランニングのあとや翌日などはペースダウンしがちです。 またスプリントの後半に向けて追い上げ型にもなりがちです。 ところが、1週間の場合は後半も何も、そもそも時間が短いので追い上げが効かず、いつも同じペースで着実にこなしていくことになります。

一週間で収まるサイズのプロダクトバックログ項目にするので明確な完成を定義しやすい。従ってプロダクトオーナーの受け入れを取りやすい

スクラムでは、スプリント単位で、完成の定義と受け入れ基準にしたがってプロダクトバックログ項目を完成させなければいけません。 プロダクトバックログ項目が大きいので、複数スプリントにまたがって1つのプロダクトバックログ項目に着手しようとしてはいけないのです。 つまり、スプリント期間が短ければ短いほど、プロダクトバックログ項目のサイズは小さくなるのが普通です (1つのスプリントに投入するプロダクトバックログ項目が1つということはなく、大きくてもスプリント期間の半分以下で終わるようなサイズの項目を複数個投入するのが一般的です)。 時間が短くプロダクトバックログ項目が小さいということは必然的に中身が明確であることにつながります。

スプリントに投入したプロダクトバックログに関してスプリント開始後にたくさん不明点が出てくるような状況だと、そのプロダクトバックログ項目は完成しない確率が高くなります。 長いスプリント期間であれば、とはいえ、なんとか頑張って吸収するということができるかもしれませんが、それは本来やるべき事前準備不足を隠してしまうことにもなります。 一方で、1週間スプリントだと、もし不明点がでてその時すぐにプロダクトオーナーと会話ができないような待ちが発生するとどうにもならなくなります。 したがって、プロダクトバックログリファインメントで事前に次以降のスプリントに投入される可能性のあるプロダクトバックログ項目が本当にReadyなのかを精査するようにもなります。 そして1週間の半分くらいの規模のプロダクトバックログ項目であれば、「なにができれば完成なのか」の認識は比較的容易に合わせられるはずです。 認識があっていれば、プロダクトオーナーの受け入れ確認も容易になります。

スパイクが必要なプロダクトバックログ項目が明確になる

上の項目に関連して、スプリント期間が長いほど、あるプロダクトバックログ項目を実装するのにあたって、調査系のタスクも一緒に含めてしまいがちです。 完成とは何なのかは合意できていても、それをどうやるのかはスプリントに入ってから調査して進めていってしまうのです。 一方で、1週間スプリントのような短い期間では、特定のプロダクトバックログに関する調査をスプリントに入ってからやっていたのでは、プロダクトバックログ項目が完成しないリスクが高くなります。 つまり事前に調査まで終わらせておいて、開発チームが自信をもって作れる状態までもっていくような力が働きます。 プロダクトバックログリファインメントなどで、調査が必要なプロダクトバックログ項目を明らかにして、バッファを使って事前調査したり、場合によってはプロトタイプなどを作るプロダクトバックログ(タイムボックス上限を定める)を事前にこなすようになっていきます。 こうすることで、プロダクトバックログ項目がスプリント期間中に完成する確率が上がっていきます。

プロダクトオーナーが変更を我慢しやすい

プロダクトオーナーはステークホルダーと協働し、開発チームのパフォーマンスを踏まえて、プロダクトをどうしていくかシビアな判断が必要になります。 そして、ビジネスの状況は刻一刻と変化します。 長いスプリントになればなるほど、ステークホルダーからの要求やビジネスの状況との乖離の影響を受けて、プロダクトバックログ項目を入れ替えたいという欲求が強まります。 一方で、スプリント期間中のプロダクトバックログ項目の入れ替えは、プロダクトオーナーと開発チーム間の調整が必要です。 単に追加のプロダクトバックログ項目を依頼したり、着手中のプロダクトバックログ項目の受け入れ条件を変更したり、といったことは開発チームの合意なしではできません。 一方で、プロダクトオーナーとしては変更したい理由があるのに、それが受け入れられないのを我慢しなければいけないことにもなります。

ここでスプリント期間が短ければ、現状は受け入れた上で、次のスプリントで軌道修正をかければよいと割り切ることができます。 その割り切りによって開発チームは割り込みを受けること無く集中して作業を進められます。

なお、プロダクトオーナーにはスプリントをキャンセルする権限が認められているので、どうしてもという場合はスプリント期間に関わらずスプリントを途中中止して構いません。 ただし、いつもそれをやっているとプロダクトは何もできず、開発チームのモチベーションにも影響があるので、数か月に1度といった頻度までが限界です。 プロダクトオーナーとしての準備を怠ったが故のキャンセルは許されません。

ごまかしが効かない

最後になりますが、ここまで見てきた内容全体によって、スプリント自体のごまかしが効きにくくなります。 事前準備をきちんと行い、ムダなく着実に進めていかないと、成果がでない状況になります。 つまり、長いスプリントではなんとか吸収しきれていた問題は、短いスプリントだと大きな問題として露見していくことになります。 長いスプリントによって隠れていた本当の問題が露見すれば、それを改善することで、より成果が出やすくなります。

短いスプリントの弊害

1週間スプリントの利点ばかり説明してきましたが、いくつかの弊害や考慮ポイントがあります。 最後にそれを説明しておきます。

複数開発チームがある状況では、結合が間に合わない

それなりの規模の開発で、開発チームが複数ある場合、1週間のスプリントではそれぞれの開発チームの成果物の結合が間に合わない可能性があります(Nexusなどでも毎スプリントの結合が求められています)。 複数開発チームが存在する場合、コミュニケーションのオーバーヘッドがどうしても避けられず、またどこか一箇所の問題が全体に影響を与えやすくなります。 したがって、バッチサイズを多少大きくして確実に結合していく必要がでてくるかもしれません。

いつも追い立てられている気がする・ゆっくり考える時間がない気がする

1週間という短い期間に区切ると、どうしても残り日数や時間を意識する回数が増えます。 したがって人によっては、いつも追い立てられていると感じることもあります。 持続可能なペースで働くことが重要なので、その場合は、バッファの比率を見直すのも1つの手です。 また、プロダクトの状況次第では、祝祭日の絡む週のスプリントをときどきスキップする、という選択もできるかもしれません(あまりお勧めはしませんが)。 別の要因として、外部からプレッシャーがかかっていることもあります。 持続不能なペースで働くこと、決めたことを全て達成することを約束しているわけではないので、組織内で別のよくない力学が働いていないかどうかを確認し、それを改善していくとよいでしょう。

それでは。

リリーススプリントとはなにか

$
0
0

みなさんこんにちは。@ryuzeeです。

実際のプロジェクトやプロダクトでスクラムを利用している場合、リリースの前に「リリーススプリント」と呼ばれる期間を設けて、残作業を行うことがあります。 これが何なのかについて見ていきたいと思います。

なお、リリーススプリントは、スクラムガイドなどで定められているスクラムの要素ではありません。 あくまで、現実世界でリリースをしようとした場合に行うことがある、というくらいに理解してください(ベストプラクティスではありません)。

基本的な考え方

まずは基本的な考え方を整理しておきましょう。

  • スクラムでは毎スプリントごとに「リリース判断可能」な成果物を作ります
  • リリース判断可能とは、必ずしもリリース可能であるとは限りません
  • ただしリリース可能になっていれば、ビジネスの要請に応じていつでも状況に対応できるようになります
  • つまり「リリース判断可能」な基準と「リリース可能」な基準の差分はなるべく少ない方が好ましいと言えます
  • 差分が大きく後回しにすればするほど、実際のリリースをしようとした場合に「大きな問題」が起こって速やかにはリリースできない可能性が高くなります

なお、「リリース可能」の定義はプロダクトのジャンル、特性、顧客数、法律などの影響を受けます。 医療用ソフトウェアとキャンペーンのウェブサイトでは「リリース可能」の基準は大きく異なります。 そして、リリース可能の基準は「開発手法」には左右されません。 したがって、リリーススプリントをするかどうかに関係なく、最初のスプリントを開始するまでに非機能要件の洗い出しや完成の定義の設定などが必要になります。

現実

とはいえ実際のところ、必ずしも全てのスプリントで「リリース可能」にできるとは限りません。 技術的には可能でもコスト面や開発チームの能力面からすべてを行うことが現実的でないこともあります。

例えば以下のようなタスクは全てをスプリントで実施するのは難しいこともあります。 このようなタスクはリリーススプリントと呼ばれる「リリース判断可能」と「リリース可能」の差分を埋めるスプリントでまとめて対応せざるを得ません。

  • 法務、特許、規制対応
  • システム単体での追加の試験や回帰テスト
  • パフォーマンステスト、負荷テスト(ただしその時点で問題があることがわかると手のうちようがないので、早期から継続的な実施が必要)
  • 他システムとの結合試験や総合試験
  • セキュリティアセスメント
  • 本番環境へのデプロイ
  • 運用手順書、仕様書、マニュアルなどのドキュメント作成
  • 社内承認プロセス
  • ユーザーのトレーニング

なお、リリーススプリントは「差分を埋める」ためのものであって、新規の機能追加や先送りしたバグの一括修正を行うものではありません。

繰り返しにはなりますが、なんでもかんでもリリーススプリントに先送りすると、そこで大きな問題が見つかってリリースできない可能性が高まります。 プロダクトやプロジェクトごとにリリースの頻度や初回リリースまでの時間も違います。 こういった要素を考慮に入れた上で、進め方を考える必要があるということになります。

リリース時対応とする項目の扱い方

実際にどのようにリリーススプリントに向けて準備するかを以下で説明します。

  • 依存関係の影響を受けて日程が固定になるプロダクトバックログ項目の並び順を後ろにおいておく
  • スプリント単位では実施できないが「実際にリリース」するのに必要な作業をプロダクトバックログに入れておく
  • 事前に定常的にプロダクトバックログの見積りをしておき、見積りの精度が向上するようにしておく
  • リリース前に必要なプロダクトバックログ項目の総量と、開発チームの速度によって必要な期間が決まる
  • もしくはリリーススプリントの長さを固定した場合、リリース作業関連のプロダクトバックログ項目は上位から準備実施し、キャパシティに入らないものは実施されなくなる
  • したがって、リリース前に実施することを検討しているプロダクトバックログ項目が必須なのか、やっておいた方がよいというレベルなのかの切り分けが必要
  • 必須の項目が多い場合は、ベロシティと照らし合わせて早めにリリーススプリントに移行する
  • つまり、リリーススプリントに入ってから、プロダクトバックログの項目を洗い出しているようでは遅い(入らないリスクがある)

それでは。

スクラムの概要を1分で理解できるイラスト【2018版】

$
0
0

みなさんこんにちは。@ryuzeeです。

アジャイル開発のコーチングやトレーニングでスクラムの全体像を1枚の絵を使って説明することが多いのですが、以前作成したものを最新化したので公開します。

スクラムの本質的な価値やスクラム以外でも日々のプロセスに組み込んだほうが良いこと(テスト自動化や継続的インテグレーション)は含めていません。 あくまでスクラムの概要のみを書いています。

PDF版はこちらにおいておきます。

※改変なしで引用元併記の上であれば自由に使っていただいて結構です。著作権自体は私に留保します。

内容の誤りや足りない事などがありましたらTwitterなどでお知らせください。

自分のスライドに入れて使うためのパワーポイント版はこちらになります。 著作権表示なしでご利用いただけます(ただしこのファイルを含んだパワーポイントの再配布および販売はできません)。

それでは。

プロダクトオーナーのアンチパターン

$
0
0

みなさんこんにちは。@ryuzeeです。

スクラムにおいてプロダクトオーナーは非常に重要な役割を果たしますが、一方でうまくやるのが難しい役割でもあります。 たとえばプロダクトオーナーには、ビジネス価値を最大化する、プロダクトのビジョンを周りに示して理解させる、プロダクトバックログを管理する、ステークホルダーをマネージする、開発チームの成果物の受け入れ可否を判定するといった多岐に渡る責任があり、限られた時間の中でバランスを取りながらやっていかなければいけません。

今回は、こういうのは避けようというアンチパターンを紹介します。

そもそも…

  • 多忙すぎるプロダクトオーナー
  • 不在のプロダクトオーナー
  • スクラムイベントに参加しないプロダクトオーナー
  • 単にマネージャーやリーダーという理由だけのプロダクトオーナー
  • そもそも複数人で意思決定権限が分散されたプロダクトオーナー
  • プロダクトオーナーとスクラムマスターを兼任する
  • スクラムマスターと対話できない、スクラムマスターからのフィードバックを受け入れない

開発チームやスクラムマスターとの関わり方

  • 開発チームとプロダクトオーナーという対立軸で理解しておりスクラムチームの一員という自覚がない
  • 開発チームのやり方(How)に口を出す、指示する
  • 開発チームの見積もりに疑問を投げかける
  • 開発チームが技術的負債に取り組むことを許可しない
  • 開発チームのメンバーがステークホルダーと直接話すことを許可しない
  • 開発チームとのコミュニケーションをメールや電子ツールに頼りすぎて、対面でのコミュニケーションが不足
  • 開発チームからの質問に回答したがらない、回答しない
  • 開発チームの話を聞かない
  • 開発チームに何をする必要があるか指示し、マネージャーとして行動する
  • 開発チームの行動や進捗やタスクの状況を監視する
  • 開発チームとプロダクトオーナーの関係性に受発注の図式を投影している

ステークホルダーとの関わり

  • ステークホルダーに「No」を言わず、プロダクトバックログがどんどん肥大化する
  • ステークホルダーなどに惑わされて頻繁にプロダクトバックログの並び順を変更する
  • ステークホルダーをスプリントレビューに招待しない
  • ステークホルダーや顧客のニーズや意見を聞きにいかない
  • ビジネスのKGIやKPIにコミットしていない

プロダクト

  • アイデアを実装する前にアイデアを検証しない
  • 開発中のプロダクトに対するビジョンの欠如
  • 役に立つ機能よりも、多くの機能を提供することに価値をおいている
  • 品質に重点を置かない

プロダクトバックログ

  • なぜそのプロダクトバックログ項目が必要なのか理由を明らかにしない
  • 大きすぎるプロダクトバックログを分割していない
  • 細かすぎるプロダクトバックログを用意してしまう(交渉の余地がなくなってしまう)
  • ビジネス関連のプロダクトバックログに焦点を当てるのではなく、技術の観点でバックログを表現する
  • プロダクトバックログ項目に明確な受け入れ基準を用意していない
  • 開発チームにプロダクトバックログ項目の作成を丸投げして、成果だけ確認する
  • Readyでないプロダクトバックログ項目を開発するよう押し付ける
  • プロダクトバックログ項目の優先順位付けをしない
  • 明確な優先順位付けの考え方がない

スプリントでの活動

  • 見積りを締め切りとみなす
  • スプリントプランニングで決めたプロダクトバックログ項目すべてを完成させるために、開発チームに残業を求める
  • スプリント中に優先順位を変更する
  • スプリント中に要件を変更する
  • 受け入れ確認が恣意的だったり、追加要求を出す
  • 部分的にしか完成していないプロダクトバックログ項目を受け入れてしまう

それでは。

【資料公開】Effective DevOps

$
0
0

みなさんこんにちは。@ryuzeeです。

2018年4月24-25日に実施されたDevOpsDays Tokyo 2018の登壇資料を公開します。 内容自体は、3月に発売になった同名の書籍をベースにしたものになります。ご興味がある方はぜひ書籍をご覧ください。

DevOpsという単語自体は見かけない日がないほど出回っていますが、一方でよくわからないものの代名詞のようなバズワードとも言えます。 DevOpsなるものを導入すれば、組織の課題や問題が全て解決するわけでは決してなく、本当に解決すべきものを自分たちで見つけて、それに取り組まなければいけません。 取り組む上では、チームが機能していることが必須で、そのあたりのことを説明しています。


それでは。

ふりかえりの実施状況に関する調査結果 (Annual Agile Retrospective Report)

$
0
0

みなさんこんにちは。@ryuzeeです。

アジャイル開発に関する調査レポートはVersion OneによるAnnual State of Agile Surveyなどをはじめとしていくつかあります。

今回retriumという会社が、Retrospective(ふりかえり)に特化した調査を行った資料を公開したので、簡単に紹介します。 なお、レポートはこちらから無料でダウンロードできます。

調査の概要

回答者は277人で、そのうち44%は米国在住者です。 回答者の分布は33%がスクラムマスター、16%が内部コーチ、13%が外部コーチ、12%がリーダーやマネージャーとなっています。

調査結果の紹介

前述のとおり項目数が多いので、その中からいくつか特筆すべき項目について見ていくことにしましょう。 なお数字はレポートからの引用、文章はその数字に対する私のコメントです。

Retrospectiveで難しい点はなにか

なかなか厳しい結果が並んでいますが、多くはファシリテーターがあんまり上手でないことに起因していそうです。 心理的安全性は効果的なRetrospectiveを行うために非常に重要です。アジャイルレトロスペクティブズの書籍でも最初に場の設定をする重要性が説明されています。

状況割合
議論した内容をチーム単体で解決するのが困難48%
安心して話せないことがある44%
チームが分散している36%
いつも特定の人ばかりがしゃべる32%
ネガティブなことばかりにフォーカスする27%
トピックの選択が良くなかったりアクションに合意しない25%
チームがやりたがらない23%
組織やマネージャーがRetrospectiveの価値を分かってくれない20%

どのくらいの時間をかけているか

どのくらいの時間を使うのかはスプリントの長さに依存します。 一方で、Retrospectiveには仕事を強制的に止めるという意味もあるので、あまりに短すぎるのは考えものです。 また、逆に半日かけても同時にたくさんのアクションアイテムをこなすことは難しいので、ムダになってしまう可能性があります。

状況割合
30分〜1時間55%
〜2時間31%
30分未満13%
半日1%

どんなやり方で通常おこなっているか

上位2つは、いずれもスプリント中のアクティビティに注目するものになっていて、思ったよりも他のやり方をしているところが少ない印象です。

状況割合
うまくいったこと/いかなかったこと46%
KPT19%
感情分析10%
Lean Coffee5%
特にテクニックは使っていない3%
タイムライン2%
感謝の表明1%

違うやり方をする頻度は?

いつも同じやり方でやるとマンネリ化しやすいですが、多くは違うやり方を取り入れているようです。

状況割合
不定期28%
毎回22%
違う観点が必要なとき21%
いつも同じやり方をしている17%
交互10%

どれくらいのアクションアイテムを出すか

思った以上にアクションアイテムの数を絞り込んでいるところが多いという印象です。 実際のところ、たくさんのアクションアイテムを出すことが偉いわけではなく、決めたアクションを終わらせることが重要です。 多くのアクションを出しているところほど、具体的でないアクションとなっていて、やったかやってないかがハッキリしない傾向にあると感じます。

状況割合
1〜5個78%
6〜10個16%
11〜153%
何も出さない3%

どんな道具を使っているか

全員同席であれば、やはり物理的な付箋やホワイトボードが効率的で、それを示しています。

状況割合
付箋紙58%
ホワイトボード55%
Confluence20%
オンラインボード13%
Google Docs11%
Google Spreadsheet6%

アクションアイテムのトラッキング方法

アクションアイテムがなし崩しにならないようにトラッキングするのが重要なのは言うまでもありません。 アジャイル用のツールに入れる、というのはプロダクトバックログ項目化するということでしょう。すべてのアクションアイテムをプロダクトバックログ項目にできるとは限らないのでそこは工夫が必要に見えます。 物理のタスクボードは、常に全員が見えるので、やったかやってないかがハッキリし、確実に終わらせようとする力が働きやすくなります。

状況割合
Agile用のツール36%
物理のタスクボード31%
ドキュメント28%
スプレッドシート14%

以上、ご参考まで。

スクラムマスターの仕事にはどんなものがあるか

$
0
0

みなさんこんにちは。@ryuzeeです。

スクラムのトレーニングをしている中でよく質問を受ける項目の1つに、スクラムマスターはどんなことをすればよいのか?というものがあります。 答えを一言で表すなら、「スクラムがうまく回るようにする」なのですが、実際にどんな仕事をするのか簡単にご紹介したいと思います。

なお雑多なリストなので網羅性はありません。

スクラムマスターの仕事の一例

  • スクラムのフレームワークをうまく回せるように支援する
  • スクラムチームにスクラムの価値やフレームワークを理解してもらう
  • ステークホルダーにスクラムの価値やフレームワークを理解してもらう
  • スクラムチームが持続可能なペースで進められるように支援する
  • スクラムチームが集中を維持できるように支援する
  • スクラムチームが透明性を維持できるように支援する
  • スクラムチームが規律を守れるように支援する
  • スクラムチーム内外のお互いの協力を促す
  • スクラムチーム内外のコミュニケーションを促す
  • スクラムチームの自己組織化を促す
  • スクラムチームが心理的に幸福であるように支援する
  • スクラムチームが自律・自立できるように支援する
  • スクラムイベントを時間通りに開始する習慣をつけさせる
  • スクラムイベントをファシリテートする
  • スクラムチームの学習を支援する
  • スクラムチームの気づきを促す
  • スクラムチームの改善を助ける
  • スクラムチームが無駄を減らせるように支援する
  • スクラムチームをとりまく問題を明らかにするのを支援する
  • スクラムチームが必要とする環境やツールの準備を支援する
  • スクラムチームが生産的な環境を維持できるように支援する
  • スクラムチームの整理整頓を促す
  • スクラムチームの要請に基いて手助けする
  • プロダクトオーナーから開発チームへの圧力解消を支援する
  • プロダクトオーナーと開発チームの対立解消を支援する
  • ステークホルダーとスクラムチームの対立解消を支援する
  • 開発チームやプロダクトオーナー単独で解決できない問題の解決を支援する
  • スクラムチームの外からの割り込みを止める
  • プロダクトビジョンの作成を支援する
  • プロダクトのマイルストーン作成を支援する
  • プロダクトバックログの作成を支援する
  • プロダクトバックログの並べ替えを支援する
  • 完成の定義の作成を支援する
  • メトリクスの収集を支援する
  • 見える化を支援する
  • スクラムチームやステークホルダーを観察する
  • スクラムチームやステークホルダーの相談に乗る
  • スクラムチームにフィードバックする
  • スクラムチームに対して指示をしない
  • 体調の悪い人を帰らせる(指示をしないの例外)
  • 開発チームの中にいる開発チームを破壊する人を取り除く(指示をしないの例外)
  • スクラムチームにとって自分が必要なくなったら自分を首にする

それでは。


スクラムガイド2017での変更点の紹介

$
0
0

みなさんこんにちは。@ryuzeeです。

2017年11月7日(現地時間)にスクラムのルールブックであるスクラムガイドが更新されましたので、Webinarの資料をもとに変更点をご紹介します。

なお、スクラムガイド自体はこちらからダウンロード可能です。日本語訳はさまざまな書籍の翻訳で有名な角征典さんです。以下の紹介に際して、スクラムガイド日本語版の記述を引用しています。

実践に際して、大きな影響はあまりないと思いますが、とくに以下の2点が注目だと思います。

  • デイリースクラムで3つの質問を使うかどうかはチーム次第となった。大事なのはスプリントゴールが完成しそうかどうかを毎日検査して適応すること
  • レトロスペクティブ(ふりかえり)で出た項目を、次のスプリントのスプリントバックログに含めること

以下、詳細です。

更新内容


  • スクラムの用途について
  • スクラムマスターの役割の定義を洗練させた
  • デイリースクラムはスプリントゴールの達成に向けた検査と適応の用途であること明確化
  • タイムボックスとは最大の長さであることを明記した
    • タイムボックス化とは、行動や活動に関して厳密な時間枠を置く行為を指す
  • スプリントバックログは、スプリントレトロスペクティブでのフィードバックを含める

▶スクラムの用途


スクラムは世界中で以下の用途で使われてきている。

  • 有望な市場・技術・プロダクトの研究および特定
  • プロダクトや追加機能の開発
  • プロダクトや追加機能のリリース(1 日に何度もリリースされる)
  • プロダクトが使用するクラウド(オンライン、セキュア、オンデマンド)やその他運用環境の開発と保守
  • プロダクトの保守や刷新

▶スクラムマスターの役割


スクラムマスターは、スクラムガイドで定義されたスクラムの促進と支援に責任を持つ。そのためにスクラムマスターーは、スクラムの理論・プラクティス・ルール・価値基準を全員に理解してもらえるように支援する。

できる限り組織文化やスクラムマスターの組織的・政治的なスキルを踏まえて、これを忍耐強く行う。

▶デイリースクラム


デイリースクラムはスプリントゴールの達成に向けた検査と適応のためにある。開発チームはデイリースクラムを使って、スプリントゴールとスプリントバックログの進捗を検査する。デイリースクラムは、開発チームがスプリントゴールを達成する可能性を最適化する。開発チームは、自己組織化チームとしてスプリントゴールを達成し、スプリント終了までに期待されるインクリメントを作成できるかを毎日把握しなければいけない。デイリースクラムの構成は、開発チームが設定する。スプリントゴールを目指している限り、他のやり方で行なっても構わない。質問を使うチームもあれば、議論ベースで進めるチームもある。

▶タイムボックスは最大の長さのことである


「最大」という言葉を追加して、イベントを時間どおりに行なう必要があるのかという疑問を解消し、許容される最大の時間であることを明確にした。タイムボックス化とは、行動や活動に関して厳密な時間枠を置く行為を指す

▶チームの働き方の継続的改善


スプリントバックログによって、開発チームがスプリントゴールを達成するのに必要な作業がすべて見える化されている。継続的改善を確実なものとするために、前回のレトロスペクティブで特定した優先順位の高いプロセスの改善策を少なくとも1つは含めておく。

よくある誤解について

▶スクラムはソフトウェアにしか関係がないのか?


私たちは役にたつプロダクトを作る。ソフトウェアはその例に過ぎない。どれだけ頻繁にチームがリリースするか、プロダクトがどのようにサポートされるのか、顧客がどれくらい新しい機能を受け入れられるかにも差がある。たとえば、自動運転の車では、たくさんの機能を頻繁にリリースするよりも、安全であることが求められる。プロダクト開発では以下のような観点がプロダクトバックログに含まれる。

  • 開発
  • バグ修正や技術的負債の削減
  • 運用環境の開発
  • 運用環境の準備
  • マーケティング
  • サポートの準備、トレーニングやレディネスの確認
  • ヘルプやサポート用のファイルの準備とテスト
  • パイロットマーケットへの早期リリース
  • その他価値を実現するのに必要なものすべて。たとえばパートナーシップなど

▶スプリントが終わる前にリリースしてもよいか?


  • プロダクトオーナーが選択し、スクラムチームにとって可能なのであれば、いつでもリリースしてよい
    • 負債より価値が上回っていることを確認する
  • 必要なのは、スプリントの最後に完成したインクリメントがあること、実際にそれをリリースするかどうかに関係なく、利用可能なものであることである
  • 継続的デリバリーのプラクティスはスクラムと併用が可能

▶DevOpsについてはどうなの?


  • 開発チームは、最初の数スプリントのうちにプロダクトが実現可能で価値を生み出すことを証明しなければいけない
  • そうするためには、運用環境やサービスレベルアグリーメントを満たすような初期アーキテクチャが必要になる
  • スクラムチームが権限をもっていて、組織が協力的であれば、結果的に、なんらの危機に遭遇することなく組織的な変化が実現される
  • スクラムプロジェクトでは、先に進める前に、新しい能力を実際に使ってテストしておく必要があることが多い
    • リスクを早期に最小化する

それでは!

Azure Cloud Shellを活用してスライド公開環境を30分で作る方法

$
0
0

みなさんこんにちは。@ryuzeeです。

Slideshareがスライドの差し替え機能を停止したり、日本語フォントがおかしくなったりして悶絶するのを避けるために、自作のスライド公開用プラットフォームを運用しています(レポジトリはこちらです)。

このプラットフォームはAzureもしくはAWSのオブジェクトストレージやキューを使った構成になっていて、アプリケーション本体はDockerコンテナに格納しています。 今日はこの環境を、Azure上に手作業なしで作ってみたいと思います。

概要

自動でAzure上のリソースを作る方法はいろいろあります。例えばTerraformでも可能ですし、公開されている各言語用のSDKを使うこともできます。 個人的な好みは公式で提供されているコマンドラインインタフェース(CLI)を使う方法です。これであれば新サービスの登場とほぼ同時にすぐに使えます。

このスライド公開用プラットフォームを動かすのに今回は以下のサービスを利用します。

  • Blob Storage
  • Queue Storage
  • SQL Database
  • App Service

これらの作成や設定を全部CLIを使って進めます。 またコマンドの実行はAzure Portal上のAzure Cloud Shellから行います(メニューの「>_」をクリックします)。ポータル上で実行するために認証のことを考える必要もなく、常に最新のCLIが使える点がメリットです。

実行内容

実行の内容は以下のような感じになります。 何回実行しても名前の競合が起こらないように、冒頭で変数を定義し、コマンドの引数にはその値を渡すようにします (たとえば、SQL DatabaseのサーバURLやストレージアカウントのURLは重複が許されません)。 値については適宜書き換えてください。

なお、複数のサブスクリプションを持っている場合は、az account set -s サブスクリプションIDとして、どのサブスクリプションを使うか指定してから作業を開始します。

# ランダムな数値を生成しておいて各種リソース名にはそれを付与する
export rand=$RANDOM
# リソースグループ名
export resourcegroup=slide-$rand
# リージョン名
export region='Japan West'# ストレージアカウント名
export storageaccount=slidestorage$rand
# SQL Database Serverのエンドポイント
export dbserver=slide-sqlserver-$rand
# データベース名
export dbname=slidehub
# データベースの管理者ユーザー名
export dbuser=slideadmin
# 【要変更】データベースの管理者用パスワード(適宜変更すること)
export dbpassword=YourPassW0rd
# App Serviceのサービスプラン
export appservice_plan=appserviceplan$rand
# App Serviceの名前(URLの一部になる)
export appservice_name=slidehub-$rand
# 利用するDockerイメージ
export container_image=ryuzee/slidehub:latest
# 【要変更】アプリケーションで使うシークレットキー(類推されない長い文字列)
export secretkey=03659dccb3fab0cd064b2d265257e657f21d0f060853bf5fa2dd70359a23

#=================================================================
# ここからリソースの作成処理
#=================================================================
# リソースグループを作成する
# これから作るリソースは全てこのグループに所属させることでまとめて削除できるようにする
az group create --name "$resourcegroup" --location "$region"# ストレージアカウントを作る
az storage account create --name "$storageaccount" --resource-group "$resourcegroup" --location "$region"# ストレージのアクセスキーを取得する
key=`az storage account keys list --account-name "$storageaccount" --resource-group "$resourcegroup" | jq -r '.[0].value'`# Blobストレージのコンテナ(格納場所。S3でいうところのバケット)を作る
az storage container create --name "slide-files-$rand" --account-name "$storageaccount" --public-access off
az storage container create --name "slide-images-$rand" --account-name "$storageaccount" --public-access blob

# Blobストレージに対するアクセスポリシーを設定する。外部からのワンタイムでのアクセスを許すための設定
az storage cors add --methods PUT GET HEAD POST OPTIONS --origins "*" --exposed-headers "*" --allowed-headers "*" --account-name "$storageaccount" --services b

# Blob Queueを作る
az storage queue create --name "slide-queue-$rand" --account-name "$storageaccount"# SQL Databaseのサーバを作る
az sql server create --name "$dbserver" --resource-group "$resourcegroup" --location "$region" --admin-user "$dbuser" --admin-password "$dbpassword"# SQL Databaseのファイヤウォールポリシーを更新する。以下の例ではAzureサービス内からは全て接続を許可
az sql server firewall-rule create --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0 --name "$dbserver-rule" --resource-group "$resourcegroup" --server "$dbserver"# データベース自体を作る
az sql db create --resource-group "$resourcegroup" --server "$dbserver" --name "$dbname"# App Serviceのサービスプランを作成する。ここでインスタンスの大きさも指定する
az appservice plan create --name "$appservice_plan" --resource-group "$resourcegroup" --sku S2 --is-linux

# App Serviceのアプリケーションを作成する。ここでは指定したDockerイメージを使うこととしている
# また起動時にコンテナ内のスクリプトを動かし、テーブル作成やデータ作成を行う
az webapp create --resource-group "$resourcegroup" --plan "$appservice_plan" --name "$appservice_name" --deployment-container-image-name "$container_image" --startup-file /opt/application/current/script/override_startup_production.sh

# App ServiceでDockerに引き渡す環境変数を設定する
az webapp config appsettings set --resource-group "$resourcegroup" --name "$appservice_name" --settings \
OSS_AZURE_CONTAINER_NAME="slide-files-$rand"\
OSS_AZURE_IMAGE_CONTAINER_NAME="slide-images-$rand"\
OSS_AZURE_QUEUE_NAME="slide-queue-$rand"\
OSS_AZURE_STORAGE_ACCESS_KEY=$key \
OSS_AZURE_STORAGE_ACCOUNT_NAME="$storageaccount"\
OSS_DB_ENGINE=sqlserver \
OSS_DB_NAME="$dbname"\
OSS_DB_PASSWORD="$dbpassword"\
OSS_DB_PORT=1433\
OSS_DB_URL="$dbserver.database.windows.net"\
OSS_DB_USE_AZURE=true \
OSS_DB_USERNAME="$dbuser"\
OSS_SECRET_KEY_BASE="$secretkey"\
OSS_USE_AZURE=1\
PORT=3000

あとは20〜30分くらい待っていれば自動でスライド公開環境ができあがります。なお、当然ながらAzureのリソースの料金がかかります。 初期のアカウントは、ユーザー名がadmin@example.comで、パスワードがpassw0rdなので適宜変更してから遊んでみると良いでしょう。

ログインして管理画面上でカスタマイズするとこんな感じにできます。

環境の削除

すべて同じリソースグループの中に入れているので、削除自体も簡単です。同じようにAzure Cloud Shellなどで以下を実行します。

az group delete --name リソースグループ名 --no-wait --yes

まとめ

CLI最高マネージド最高

アジャイル開発やスクラムのトレーニングでよく聞かれる質問とその答え (1)

$
0
0

みなさんこんにちは。@ryuzeeです。

弊社ではアジャイル開発、スクラムのトレーニングを提供しているのですが、トレーニング中には多くの質問をいただきます。 今日はよくある質問とその答えについていくつかご紹介したいと思います。 好評そうだったら続編も書く予定です。

■アジャイル開発において、ドキュメント作成の一般的な指針を教えてください

どのようなドキュメントがいつ、どの粒度で必要なのかはプロダクトやプロジェクトに依存します。 プロダクトやプロジェクトにはそれぞれ固有の品質基準があり、それはアジャイルやウォーターフォールといった方法論の違いによって変わるものでもありません。 したがってプロジェクト冒頭でプロダクトオーナーやステークホルダー(品質管理部門や顧客など)と「なんのために」「どのようなドキュメントが」「どのような記述レベルで」「いつまでに必要なのか」を決定してください。 誰も使う予定のないドキュメントはムダなので作成は不要です。

また、チーム内の議論のためのドキュメントであればWikiなどを活用して、ドキュメント作成やメンテナンスの負荷を下げる必要があります。 メンテナンスされていないドキュメントは事故を起こす可能性があるため、機能の実装や更新とあわせて変更しないといけませんが、このときドキュメントが多すぎると必ず不整合を起こすため、数を減らす・一箇所に集める・自動生成するといったことを検討してください。

■アジャイル開発を適用するにあたって、顧客や上司、社内の関係部門がウォーターフォール型の報告を求めるのですがどうすればよいですか

アジャイル開発をきちんと理解できていないと、結果的に従来と同じようにスコープ、期日、費用を全て固定して達成しようとしがちですし、その観点で全体を見ようとしてしまいます。 また、関係者のプロジェクトへの継続的な関与が不十分になることもあります。 したがって関係者がアジャイル開発の概念を理解していない場合は、考え方を説明するセッションやトレーニングを事前に実施します。 後から散発的に説明するとどうしても時間が余計にかかるので、先に理解してもらってから始めるということになります。 それでも報告が従来の形に近いものが求められることはありますが、それぞれの数値からどんなことが知りたいのか把握できれば、アジャイル開発の工程の中でも他のメトリクスを使って説明することもできるはずです。 プロジェクトの立ち上げフェーズで報告の仕方についても議論し決定しておくとよいでしょう。

なお、精緻なデータを集めたりレポートを作る作業を開発チームにさせてしまうと、価値のあるプロダクトを作るのに使える時間が減ります。 スクラムマスターやプロダクトオーナーが良きに計らって報告する形がベストだと思います。 もちろん開発チームは常に透明性のある状態でなければいけないことに変わりはありません。

■プロダクトバックログの上位の項目は見積もりができるくらい詳細化されている必要がありますが、この詳細化の作業をスプリント外で他のチームがやってもよいですか

要求を詳細化する(少なくとも開発できるぐらいに具体的にする)作業をバックロググルーミングもしくはバックログリファインメントと呼びます。 このイベントは次のスプリントを始める上で重要な活動なので、前のスプリントの中で開発チームやプロダクトオーナーが自分たちの時間を使って実施します。 つまりスプリントで開発に使える時間はその分減るということです。 一般的にはスプリントの時間の10%程度はこのバックログリファインメントに使います。

要求が具体的になっていない状態でスプリントに投入して開発をはじめてしまうと大きな手戻りが発生したり、プロダクトオーナーとのかなり頻繁なコミュニケーションが必要となってしまい成果の予測ができなくなります。 開発チームとして作れるかどうかの判断をしないといけないので、別チームが要求を詳細化するのではなく、実際に開発を行う人たちを中心として詳細化を行います。 もちろん規模が大きい場合には、アナリストなどの職種の人が詳細化に参加することはありますが、アナリスト単独で詳細化することはないと考えてください。

■アジャイル開発の経験者を採用したいのですが、面接でどんな質問をすればよいですか

これを聞けば絶対という唯一解はないのですが、一例としていくつか紹介します。

  • プロセス全体をホワイトボードに書いて説明してもらう
  • 過去にどのようなふりかえりの方法をとったことがあるか、それぞれの手法のメリットはどのようなものかを聞いてみる
  • どのような計画の立て方をしていたのか説明してもらう
  • プロダクトバックログにどのようなことを書いていたのか説明してもらう
  • 実際にアジャイル開発をしてうまくいったこと・いかなかったことを説明してもらう
  • アジャイル開発におけるエンジニアリングのポイントを説明してもらう

■各スプリントで回帰テストをしていると大変なのですが、どうすればよいですか。スプリントを経るごとにテストの負荷が増えていくのですが

完成の定義という品質基準をスプリント開始前に定めて、スプリントではその品質を満たすようにしないといけません。 そもそもその基準を満たしていないものは、リリース判断の対象にすらならず、プロダクトバックログ項目も完成とはなりません。 したがってテストは自動化し、コードの変更を行うたびに全てのテストを毎回自動で実行しリグレッションがないことを検証するといった活動が必要です。 スクラムでは自動化自体は定義されていませんが、毎スプリントでリリース判断可能なものをつくるためには事実上はテスト自動化が必須です。

なお、実際のリリースに際して必要なすべての品質をスプリント中に満たせるのであれば、スプリント中でもいつでもリリース可能となります。 一方でプロダクトの性質によっては数か月単位でのリリースに決まっていたり、リリースするには外部のセキュリティベンダーによるペネトレーション試験が必要だったりすることもあります。 こういったケースでは、リリース前に「リリーススプリント」と呼ばれるテスト期間をとることもあります。 ただし、スプリントで担保している内容と、実際のリリースで担保しなければいけない内容に差が多ければ多いほど、急な変化に対応したりはできなくなりますし、大きな品質問題が最後に見つかる可能性もあります。

■SCRUMとXPを組み合わせる場合、リファクタリングはプロダクトバックログやスプリントのタスクに入れた方がよいですか。それとも各自が定常的に実施すればよいですか

アジャイル開発の場合、インクリメントの考え方のとおり、動作している(役にたっている)プロダクトに機能を追加していく形になります。 したがって、一度書いてテストしたコードは「壊さないために触らない」ということはなく、スプリントを重ねるごとに変更が入ることがあります。 つまり常時変更が入る前提でコードをクリーンな状態に保つことが必要です。

リファクタリングの習慣が開発チームにまだないような状態であれば、明示的にプロダクトバックログを用意したり、スプリントのタスクとしてこなすようにします。 ただし、時間をかけて、リファクタリングを続けるのが開発チームの習慣になるようにしていきます。 なお、前述のとおり、完成の定義(品質の基準)を満たしていないコードは例え動作したとしても、出荷可能ではありません。 つまり完成の定義の中で「コードレビュー」や「コードの複雑度」や「コーディング規約遵守」などを決めていた場合は、スプリントの中でそれらを満たさないといけません。 後になってから問題のある箇所をまとめて直すような形にしてしまうと、それが終わらない場合出荷ができなくなるので、定常的にやる方がリスクが少なくなります。

■1つのプロダクトバックログ項目が大きくて1スプリントでは作れません。複数スプリントにまたいで開発してよいですか

1つの機能が大きい場合、その機能には多くのサブ機能が含まれていることが多々あります。 例えば、「ホテルの予約をキャンセルできる」というプロダクトバックログ項目は、

  • プレミアムメンバーであれば24時間前までキャンセルできる
  • 一般メンバーであればN日前までキャンセルできる
  • キャンセルした場合はメールで通知する

という3つに分けられるかもしれません。 このような形で、1スプリントに入るサイズにプロダクトバックログ項目を分割してください。 なお、コンポーネント単位では分割してはいけません。 あくまで意味ある機能単位で分割してください。 また、そもそも1スプリントで1つのプロダクトバックログ項目だけを作るというのも、サイズが大きすぎます。こうしてしまうと成果(ベロシティ)が0のスプリントが頻繁に発生する可能性もあります。 スプリント期間の半分程度で終わるサイズになっていると、スプリントでの成果の量が安定しやすくなります。

別の観点として、その機能の設計や調査も含めて時間がかかる、といった場合は、その機能はまだスプリントで着手する準備ができていない状態の可能性もあります。 スプリントに入る前に事前に「機能として何ができていれば完了なのか」「それはどうやってテストできるのか」等が合意できているものだけを着手してください。 準備ができていないもののうち実装の優先順位の高いものは、次のスプリントに入る前に「バックログリファインメント」のイベントなどで準備完了状態にする活動をします。

それでは。

アジャイル開発やスクラムのトレーニングでよく聞かれる質問とその答え (2)

$
0
0

みなさんこんにちは。@ryuzeeです。

先日、弊社がアジャイル開発やスクラムのトレーニングの際によく質問いただく項目とそれへの回答を一部紹介しました。 参考になると言ってくださった方も多かったようなので、第二弾を公開します。

■請負契約でアジャイル開発を進めるコツを教えてください

悪いことは言わないので、請負契約は避けた方が良いです。 最初にスコープを全て洗い出して固定し、そこから期日と費用を見積もって請負契約したのであれば、完成責任と納入責任を負わざるを得ません。 一方でアジャイル開発は「スコープが変化する」「全てのことを事前に予測することはできない」という考えを中心においています。 ですので完了する責任をもって契約するのではなく、「変化に最大限対応すること」「最善をつくすこと」を約束します。 必ず完了させなければならない契約に対してアジャイル開発を適用してしまうと、「変化」の要求は受け手側にとってはコスト増大・期間延長のリスクにしかなりません(定額時間無制限食べ放題みたいなものです)。 準委任型の契約にしましょう。 それでも顧客が請負契約を求める場合があるかもしれませんが、その場合は顧客がそもそもアジャイル開発を理解していない可能性があるので、考え方を説明して理解してもらう活動が必要です。

■スクラムの開発チームメンバーはクロスファンクショナルでいろいろなことができると思いますが、そんな優秀な人たちがいるならウォーターフォールでもうまくいくのではないですか

誤解のないようにいっておくと、個人としてインフラやアプリを始めとするさまざまな領域の設計や実装を全部できないといけないわけではありません。 開発チーム全体を見た時に必要なスキルを網羅していることがだいじです。 外部のチームへの受渡しや依存が増えれば増えるほどリードタイムは長くなり、計画作りも難しくなります。 また、いま複数のスキルがなくても開発チーム一体で開発を進めていけばいろいろなスキルが身に付きますし、開発チーム全体の能力もどんどんあがります (もちろん最初のうち特定のスキルが特定の人に依存する場合もあります。その場合はその人がボトルネックになるためクリティカルな領域であるほどなるべく早く単一障害点の解消が必要です)。

なお、「うまくいく」の基準はウォーターフォールとアジャイルでかなり違います。 ウォーターフォールは事前にたてた計画を守れれば成功、アジャイル開発はプロダクトによってビジネスの成果が出せれば成功です。 その点を抜きにして、開発チームの生産性や効率だけを議論することに意味はありません。

■スプリントの長さは固定ですが、祝祭日があって営業日が減る場合はどうしたらよいですか

スプリントプランニングやスプリントレビューは定期的に実施することにメリットがあるので、基本的に曜日を固定することをお勧めします。 つまり祝祭日があった場合は、その分スプリントの稼働日数は減ります。 開発チームが使える時間も減るので、計画ではそれを考慮して取り組むプロダクトバックログの項目を減らすのが一般的です。 また研修などでの不在や休暇も考慮に入れるとよいでしょう。 スプリントの総稼働可能時間から不在の時間や各種イベントの時間を抜いたものが開発チームのキャパシティになります。 キャパシティを超えたタスクに取り組もうとしても終わらないので、スプリントプランニングでタスク量とキャパシティを比較し、タスク量が多すぎる場合は末尾のプロダクトバックログから順番にスコープから外していきます。 キャパシティについてはあらかじめ20〜30%程度のバッファを取っておくと安心です(間違っても1日8時間全部が開発に使えるとは決して思わないようにしてください)。

なお、日本は月曜日に休日が多いので、スプリント開始日を月曜日にしない方が運用しやすいと思います。

■プロダクトバックログの見積りについて、規模や工数を算出する時にどんな方法を使えばよいですか

プロダクトバックログの項目の見積りは継続的に実施する活動なのでタイミングごとに説明します。

まずプロジェクト初期に全体で必要そうな工数や期間などを算出します。 算出の仕方はスクラムでは規定はありませんので好きなやり方を使ってください。 例えばファンクションポイントも使えますし、見積りのノウハウが蓄積されていればそれを使っても構いません。 大事なのは初期のプロダクトバックログ項目のすべての開発を「約束」するわけではないので、この見積りは開発チームのサイズや期間の算出に使うだけであるというのを意識することです。 ここで開発チームのサイズと期間が決まれば、プロジェクトにかかる費用は算定が可能です。 もちろん先に予算確保や投資可能額が決っているのであれば、それを前提にしても構いません。

次に個々のプロダクトバックログ項目の見積り方法ですが、これ自体もスクラムでは細かい決まりはありません。 決っているのは「プロダクトバックログ項目を見積もっておけ」という点です。 人日や人月で見積もっても構いませんが、細かく見積もることにあまり意味はないので、相対的なサイズを1,2,3,5,8,13,20…などのフィボナッチ数列を使って表したりTシャツサイズと呼ばれるS/M/L/XL/XXLなどで表したりします。 最初の何回かのスプリントを実施すると開発チームがどれくらいの量を1スプリントで完了できるかが分かってプロジェクトの着地点の予測精度が向上していきます。

なお、個々のプロダクトバックログ項目の見積りはスプリントが進んで色々なものができあがったり開発チームの能力が向上することによっても変わっていきますので、バックログリファインメントのイベントを活用して上位のプロダクトバックログ項目は定期的に見積りしなおしてください。

■スプリントプランニングやレトロスペクティブで、スクラムチーム内の議論についていけないメンバーがいた場合、どうしたらいいでしょうか

基本的にはスクラムチーム内で解決方法を考えてください。 例えば新人であれば話が分からなくてついてこれないのは当然ですが、ずっとそのままにしておくといつまでたってもチームの総合力が上がらないので、優先順位の高い課題として対処しないといけません(例えばペアで作業したり説明の時間をとるなど)。 一方で本人の資質やマインドセットに問題があって、チームとしてできる限りはやってみたということであれば、スクラムマスターやラインマネージャーがその人をチームから除外するという判断をした方がよい場合もあります。 ただしいずれにせよ、まずはチームで全力で解決しにいってください。

なお、似たようなケースでスクラムチーム内で決めた規律を守らない人がいる場合もあります。 たとえばイベントごとに来ない、完成の定義を守らない、着手すべき順番に着手しないで好きなものばかりをやるといったものです。 このような状況を放置すると、スクラムチーム全体の規律が失われていきます。 技術的に優秀かどうかに関係なく対処をしなければいけません。

それでは。

【資料公開】スクラムプロジェクト開始のベストプラクティス

$
0
0

みなさんこんにちは。@ryuzeeです。

2018年1月11日から13日まで開催されているRegional Scrum Gathering Tokyo 2018で登壇いたしましたので、資料を公開します。

今回は、実際にスプリント1を開始する前にどのような準備をしておけばよいかがテーマです。

スクラムでは、プロダクトバックログが用意されていて、それを元にスクラムチームでスプリントプランニングを実施し、スプリント期間中毎日デイリースクラムを行い、最後にスプリントレビューとレトロスペクティブを実施することになっています。またスプリント中の次以降のスプリントの準備としてプロダクトバックログのリファインメントを実施します。 つまりプロダクトバックとスクラムチームが存在するところがスタート地点になっています。 では、これらはどこから出てくるのか、どのように作っていけば良いのか、という話になります。

資料では汎用的な立て付けになっていますが、実際のところ、スプリント1を開始するために行っておくべき事前準備はプロダクトやプロジェクトによって大きく変わってきます。 自分たちのコンテキストにあわせて考えるのを忘れてはいけません。 資料が参考になれば幸いです。


それでは。

Viewing all 197 articles
Browse latest View live