はんなりと、ゆるやかに

アジャイル、スクラムが好きが日々から学んだことをアウトプット

Git : shallow clone を使ってcloneを早くしよう

テレワークが始まって家で仕事される方も増えましたね。家のネット環境が弱くてgitのcloneが遅いという声を聞くことがあったのでcloneを早くする方法はないかと調べました。

shallow cloneで取得するコミット数を減らす

git-scm.com

取得するコミット数を減らしてclone する方法はshallow clone と呼ばれます。
取得するコミット数が減るので通信容量も速度も改善されます。

shallow cloneは3種類あります。

  • git clone --depth <コミット数>
  • git clone --shallow-since <日時>
  • git clone --shallow-exclude <リビジョン>

git clone --depth <コミット数>

指定したコミット数分をcloneできるオプションです。最新のコミットだけ必要であれば「 1 」 を指定します。

git clone --depth 1 <リポジトリ> <ディレクトリ>

git clone --shallow-since <日時>

指定した日時以降のコミットがcloneできるオプションです。時間も指定できますが、日にちだけでも指定可能です。

git clone --shallow-since "2020-04-13 12:00:00" <リポジトリ> <ディレクトリ>

git clone --shallow-exclude <リビジョン>

指定したタグより新しいコミットがcloneできるオプションです(タグは含まれない)。
リファレンスドキュメントを読んでも、使い方がなかなか分からなかったコマンドです。リビジョンと書かれていますが、使用できるのはタグ一択だと思いました。

git clone --shallow-since "V1.0" <リポジトリ> <ディレクトリ>

submoduleも shallow clone

submoduleも shallow clone するオプションが shallow-submodules です。
shallow-submodulesオプションは他の設定に関わらずdepth 1 で cloneされます。

git clone --depth 1 --recursive --shallow-submodules <リポジトリ> <ディレクトリ>

shallow clone したあとfetchやpull

shallow clone したあともfetch や pull は可能です。追加でコミットログを取得したい場合はdepthの数を増やすと良いです。

git fetch --depth 2

すべてのコミットログを取得する場合は --unshallow オプションを使います。

git fetch --unshallow

さいごに

  • shallow clone を使用することで必要な部分だけcloneできます
  • shallow clone のあとすべてを取得することもできます

Unity初心者が始めるのにベストなチュートリアル / 玉転がしゲームを作った

Unityの基礎を学ぶためにUnityのチュートリアル「玉転がし」を受講しました。

learn.unity.com

今回受講した「玉転がし」は初心者向けの内容で、「新しいプロジェクトの作り方」から「ボールなどのオブジェクトの作り方」「物理演算の使い方」、「カメラのコントロール」などゲームを作る基礎的なことが学べます。
初心者でもこんなに簡単にゲームが作れるんだ!と感動と驚きが待っています。

チュートリアルは動画による説明なので操作方法に詰まることもなかったです。また、一つの機能について複数のやり方を説明してくれる丁寧な進行!初心者以外の方も新しい発見があると思います。
※動画の音声は英語ですが、字幕を日本語にすれば英語が苦手な僕でも問題ありませんでした。

所要時間
僕は何日かに分けて受講しました。説明を聞きながら実装して2〜3時間ぐらいで終わりました。

作ったゲーム

f:id:iucstscui:20200412132343g:plain

学べること

このチュートリアルで学べることをまとめておきます。知りたいこと、知らないことがあれば受講すると良いかと思います。

  • 新しいプロジェクトの作り方
  • GameObject
  • GameObjectの設定
    • Tag
    • アクティブ、非アクティブ
  • Components
    • Tranceform
    • Material
    • Rigidbody(物理演算)
    • Rigidbodyの設定
      • Is Kinematic
      • use gravity
    • Anchors
  • Prefabs
  • 静的なColliderと動的なCollider
  • エディターの操作方法
  • スクリプトの作り方
  • イベント
    • Start
    • FixedUpdate
    • LateUpdate
    • OnTriggerEnter
  • カメラのコントロール
  • リファレンスドキュメントの見方
  • プロジェクトやヒエラルキーの整理方法
  • ゲームのビルド

各ステップを紹介

チュートリアルは4ステップに分かれています。各ステップごとに特に重要だと感じた部分を中心にまとめていきます。

イントロダクション

learn.unity.com

このステップではどういったゲームを作るのか把握できます。全体を把握してから作ることで今なにをしているのかがわかりやすいですね。
作るゲームは矢印キーでボールを操作し、事前に配置されている箱を取得するゲームを作ります。

ゲーム画面の構成とプレイヤー

learn.unity.com

このステップではゲームをプレイするための土台とボールの操作を実装します。
たとえば、操作するボールはSphereというGameObjectを作成することで実現できます。
以下ようにEditorを操作することで簡単に3Dのボールを作成することが出来ます。
f:id:iucstscui:20200410224239p:plain

このステップでは以下の項目が学べます。

  • 新しいプロジェクトの作り方
  • GameObject
  • Components
    • Tranceform
    • Material
    • Rigidbody(物理演算)
  • スクリプトの作り方
  • イベント
    • Start
    • FixedUpdate
配置するパーツはすべてGameObject、違いはComponents (コンポーネント)

Unity上に配置するボールや壁、地面、箱などはすべてGameObjectと呼ばれるオブジェクトです。
GameObject自体は空の入れ物のイメージで、GameObjectにつけるComponents (コンポーネント)によって形や挙動などが変わります。物理演算もGameObjectにRigidbodyコンポーネントを付けることで物理演算を行うオブジェクトになります。

イベントごとの処理

スクリプトに処理を書くときUnity側から呼ばれるイベントをトリガーにします。このステップではFixedUpdateイベントでキーボード操作を実装します。

イベントの一覧と呼ばれる順は以下のページで説明されています。
docs.unity3d.com

カメラとプレイ領域

learn.unity.com

このステップではカメラがボールを追いかけるように実装します。

このステップでは以下の項目が学べます。

カメラワークもスクリプト

カメラもスクリプトを使って調整します。今回はLateUpdateを使って実装しました。

オブジェクトの収集、スコアの記録、ゲームのビルド

learn.unity.com

このステップではボールが箱に接触したとき、箱を取得するように実装します。合わせて、取得した数をテキストに表示します。

物理演算のコンポーネントが用意されているので接触判定もUnity側で判断でき、スクリプトにOnTriggerEnter関数を用意するだけで接触時の処理が書けます。

このステップでは以下の項目が学べます。

  • GameObject
    • Cube
    • Text
  • GameObjectの設定
    • Tag
    • アクティブ、非アクティブ
    • Anchors
  • Prefabs
  • Rigidbodyの設定
    • Is Kinematic
    • use gravity
  • 静的なコライダーと動的なコライダー
  • イベント
    • OnTriggerEnter
  • ゲームのビルド
静的なColliderと動的なCollider

Collider は物理衝突のためのコンポーネントです。Colliderには静的Colliderと動的Colliderがあり、Rigidbodyコンポーネントが一緒に付いているかどうかで性質が変わります。

  • Colliderのみ=静的Collider
  • Collider+Rigidbody=動的Collider

静的Colliderはゲーム中に動かすとパフォーマンスに影響があります。Unityのマニュアルに以下の説明が書かれてあります。

物理エンジンは静的コライダーは決して移動または変更されないことを前提として,この前提を基に有効な最適化を行うことが出来ます。従って静的コライダーはゲームプレイ中に無効/有効,移動やスケーリングをすべきではありません。もし静的コライダーを変更した場合,物理エンジンの内部処理のパフォーマンスが著しく低下することになります。さらに悪いことに,変更したらコライダーに誤った物理計算をコライダーに与えてしまいかねません。
https://docs.unity3d.com/jp/460/Manual/CollidersOverview.html

そのため目立たせるために動かすオブジェクトは動的Colliderにする必要があります。

まとめ

  • Unity初心者におすすめのチュートリアル
  • 丁寧な解説で玉転がしゲームが作れる
  • ゲームの基礎を学べる

アジャイル開発の基礎となる知識が学べる / レガシーコードからの脱却を読んだ

「ITエンジニア本大賞2020」の技術書部門大賞に選ばれたレガシーコードからの脱却を読みました。

www.danshihack.com

本書はレガシーコードを作らないための9つのプラクティスが紹介されています。紹介されているプラクティスはスクラムとXP(エクストリームプログラミング)から抽出されていて、アジャイルが好きな方々には馴染みのある内容になっています。

プロセスやチーム、設計、テストなど幅広くカバーされていて、幅広い分、本書だけでは物足りなく感じる部分も出てくると思います。まずは本書と自分の開発のDiff(差分)を取って足りない部分や強化したい部分を見つけて、実践し、さらに別の書籍などで深く学んでいくスタイルが良いと思います。

目次

第Ⅰ部 レガシーコード危機

  • 1章 何かが間違っている
  • 2章 CHAOSレポート再考
  • 3章 賢人による新しいアイデア

第Ⅱ部 ソフトウェアの寿命を延ばし価値を高める9つのプラクティス

  • 4章 9つのプラクティス
  • 5章 プラクティス1 やり方より先に目的、理由、誰のためかを伝える
  • 6章 プラクティス2 小さなバッチで作る
  • 7章 プラクティス3 継続的に統合する
  • 8章 プラクティス4 協力しあう
  • 9章 プラクティス5 「CLEAN」コードを作る
  • 10章 プラクティス6 まずテストを書く
  • 11章 プラクティス7 テストでふるまいを明示する
  • 12章 プラクティス8 設計は最後に行う
  • 13章 プラクティス9 レガシーコードをリファクタリングする
  • 14章 レガシーコードからの学び

第Ⅰ部はレガシーコードが生まれる背景とレガシーコードによるリスクやコストについて、そしてそれを解決するために生まれたアジャイルについて紹介されています。

第Ⅱ部はレガシーコードを生まないためのプラクティスが紹介されています。プラクティスは1つずつ紹介されていますが、それぞれに関係性があります。

ラクティス同士の関係性

f:id:iucstscui:20200402013216p:plain
上記の図は僕が本書を読んで読み取ったプラクティス同士の関係性です。協力しあうはチームでの働き方のプラクティスなので開発の土台です。また、継続的に統合するは設計、実装、テストを支えるプラクティスです。
やり方より先に目的、理由、誰のためかを伝える小さなバッチで作るスクラムだとPO(プロダクトオーナー)が中心となるプラクティスです。
それ以外はスクラムの開発チームが中心になるプラクティスです。

テストに関するプラクティスは他のプラクティスと相互関係が多いため、重要なプラクティスだと感じました。

それでは、本書で特に気になった部分を紹介していきます。

「CLEAN」コードを作る

新規で機能を作るときはきれいに書けても仕様変更や機能追加などで徐々に崩れてレガシーコードになってしまいます。僕も何度もそういうコードを書いてしまいました。

CLEANコードのプラクティスはこの問題(修正による修正でレガシーコードになる)を解決する設計を学べます。CLEANは設計する際に有効な5つの原則の頭文字です。

CLEANコード

  • C ohesive(凝集性)
  • L oosely Coupled(疎結合
  • E ncapsulated(カプセル化
  • A ssertive(断定的)
  • N onredundant(非冗長)

オブジェクト指向の設計の原則と言えばSOLIDの原則も有名です。似ている原則もあるので合わせて学ぶと良いですね。
SOLIDの原則

  • S ingle Responsibility Principle(単一責任の原則)
  • O pen/closed principle(オープン/クロースドの原則)
  • L iskov substitution principle(リスコフの置換原則)
  • I nterface segregation principle(インターフェース分離の原則)
  • D ependency inversion principle(依存性逆転の原則)

CLEANコードもSOLIDの原則もクラスの凝縮度を高めて、クラス間の結合度は下げようと紹介しています。そうすることで、変更があっても影響範囲を狭められますし、拡張に強い設計になります。本プラクティスはテストコードを書くためにも必要ですし、他の人が理解しやすいコードを書くためにも必要です。個人的には本書の中でも外せないプラクティスの1つだと思います。

小さなバッチで作る

小さなバッチで作るの章では機能開発の着手から評価までのフィードバックサイクルを早くする方法が学べます。フィードバックサイクルが早くなると手戻り工数が少なくなり開発プロセスの効率が上がります。最小市場化可能機能セット(MMF)の分割ビルドの高速化など多くの手法が紹介されていていました。

フィードバックサイクルを早くする理由は分からないことを減らすためです。そのため、本書で紹介されている「複雑なストーリーを扱う場合には、既知のことと未知のことを分離する」の考えは1つの指標になりますね。

小さなバッチで作り続けるためにはソースコードを何度も修正することになるので、CLEANコードを理解して拡張性の高い設計が必要になります。

設計は最後に行う

目次で一番気になっていたプラクティスです。
実装前に設計しないわけではなく、開発して行く中で分かったことや変わったことをふまえて再設計しましょうという内容です。小さく分割した機能を繰り返し開発していると全体の設計に影響が出始めます。そのときに全体を再設計、リファクタリングして、開発しやすい状態を維持してレガシーコードを防ぐのです。このような設計を創発設計と呼びます。

牛尾さんのブログでもアジャイル開発するうえで進化型設計が重要だと紹介されています。言葉は違いますが、初めに設計を固めるのではなく、少しずつ設計も進化させていきましょうと紹介されています。
simplearchitect.hatenablog.com

本書と牛尾さんのブログに書かれていますが、本プラクティスはテストコードがないと安心して実施できません。プロジェクトが大きくなればなるほど、修正による影響範囲が把握しきれなくなります。テストコードで既存の動作を守った上で再設計に取り掛かりましょう。

まとめ

とりあえずアジャイル開発を始めて有名なスクラムを採用したけど、開発がうまく進まないチームにはとても有用な書籍だと思います。スクラムガイドだけではどうやって作るかは紹介されていません。継続的に開発するには本書で紹介されているプラクティスを実践し、レガシーコードを作らないことが大切です。
本記事の冒頭でも書きましたが、本書でアジャイルを実現する開発手法を知り、より詳しい部分は別の書籍などで学ぶと安定した開発ができると思いました。

関連記事

途中、少しですがスクラムの用語を使いました。スクラムの簡単な説明は以下の記事に書いています。
iucstscui.hatenablog.com

CircleCI Workflowsを使ってビルド→テストを実行する(Windows+C#+NUnit)

はじめに

以前、CircleCIを使ったビルドを試しました。
iucstscui.hatenablog.com

今回はNUnitを使ったテストをWorkflowsを使って触ってみます。

作ったソースコードとCircleCIの設定

github.com

.circleci/config.yml

version: 2.1

orbs:
  win: circleci/windows@2.2.0

jobs:
  build:
    executor: win/default     
    
    steps:
      - checkout
      - run: dotnet build
      - persist_to_workspace:
         root: .
         paths:
           - .

  test: 
    executor: win/default     
    
    steps:
      - attach_workspace: 
          at: .
      - run: dotnet test

workflows:
  version: 2.1

  build-test:
    jobs:
      - build
      - test:
          requires:
            - build

buildとtestでジョブを分けて、workflowsでそれぞれのジョブが順番に実行されるように設定しています。ポイントは2か所です。

  • persist_to_workspace を使ってbuildジョブの結果をtestジョブで使えるようにしている
  • testジョブはbuildジョブの終わりを待つように requires を設定している

buildジョブ

ソースコードをチェックアウト+ビルドした後、データを保存して他のジョブでも使えるようにしています。データを保存する設定がpersist_to_workspaceです。
circleci.com

persist_to_workspaceの部分を抜粋

- persist_to_workspace:
   root: .
   paths:
     - .

persist_to_workspace は各ジョブがアクセスできるワークスペースと呼ばれる場所にデータをコピーする設定です。rootpathsでコピー元を設定します。上記の設定はワーキングディレクトリ以下がすべてコピーされます。
特定のディレクトリのコピーも可能でリファレンスに書かれている以下の設定はworkspace/echo-outputディレクトリがコピーされます。

# 後に続くジョブで利用できるように Workspace に指定のパス(workspace/echo-output)を保存します。
- persist_to_workspace:
    # working_directory からの相対パスか絶対パスを指定します。
    # これは Workspace のルートディレクトリとなるコンテナ内のディレクトリです
    root: workspace
    # root からの相対パスを指定します
    paths:
      - echo-output

testジョブ

buildジョブでワークスペースに保存した結果をダウンロードし、testコマンドを実行しています。データをダウンロードする設定がattach_workspaceです。
circleci.com

attach_workspaceの部分を抜粋

    steps:
      - attach_workspace: 
          at: .
      - run: dotnet test

attach_workspaceはワークスペースにコピーしたデータをダウンロードする設定です。atの設定でダウンロード先を設定します。上記はワーキングディレクトリにダウンロードしています。

dotnet test単体テストを実行するコマンドです。
docs.microsoft.com

workflows

ワークフローはジョブの実行を制御する設定でジョブを並列に実行させたり、順番通りに実行させたり、スケジュールを計画し実行させたり出来ます。
circleci.com

今回はbuildジョブの結果をtestジョブが使います。build→testと順番通りに実行して欲しいためワークフローを使っています。

workflowsの部分を抜粋

  build-test:
    jobs:
      - build
      - test:
          requires:
            - build

testステップでrequiresを指定しています。requires: は記述されたジョブが問題なく完了するまで、処理が待機されるため順番が保証されます。

例えばbuildでエラーになった場合は以下のようにtestは実行されません。
f:id:iucstscui:20200322002633p:plain

まとめ

Workflowsを使うとジョブの実行が柔軟になります。今回はrequiresを使いましたが他の設定も調べてまとめたいと思います。

CircleCI ルートディレクトリと異なるディレクトリでビルドする

はじめに

CircleCIでルートディレクトリと異なるディレクトリでビルドする方法が分からず、調べたのでまとめました。知っていれば簡単です。ビルドステップの設定時に対象ディレクトリを指定するだけでした。
circleci.com

ディレクトリ構成

以下の構成で確認しました。ルートディレクトリの下に「src」ディレクトリ、「src」ディレクトリ内にビルド対象のファイルがあります。
f:id:iucstscui:20200314003805p:plain

エラー発生時のCircleCIの設定

 version: 2.1

 orbs:
  win: circleci/windows@2.2.0

 jobs:
   build:
     executor: win/default     
    
     steps:
       - checkout
       - run: dotnet build

上記の設定ではルートディレクトリでビルドしようとして、以下のエラーが発生します。

MSBUILD : error MSB1003: Specify a project or solution file. The current working directory does not contain a project or solution file.

現在のディレクトリにslnファイルやプロジェクトファイルが見つからなかった旨のエラーです。
解決方法は2種類ありました。

解決1:runステップにworking_directory を設定する

run ステップは実行ディレクトリを指定できます。
circleci.com

# stepsの部分だけ抜粋
     steps:
       - checkout
       - run: 
           working_directory: src
           command: dotnet build 

runステップが実行されるときは「src」ディレクトリで実行されます

解決2:dotnet build コマンドの引数にslnファイルのパスを渡す

dotnet build コマンドは引数にビルドするslnフィルを渡せます。
docs.microsoft.com

# stepsの部分だけ抜粋
     steps:
       - checkout
       - run: dotnet build src\FizzBuzz.sln

runステップが実行されるときはルートディレクトリで実行されますが、dotnet buildは指定されたslnファイルがビルドされます。

さいごに

  • runステップにworking_directoryを設定して実行ディレクトリが変更できます
  • working_directoryの設定はビルドに関わらず応用が利きます

わずか6ステップ!CircleCI 2.1 で手軽にCI環境を構築する(windows+dotnet)

f:id:iucstscui:20200312162147p:plain

はじめに

普段はJenkinsを使っていますが、勉強のためCircleCI 2.1を導入しましたので、手順をまとめておきます。
驚くほど簡単に導入(ビルドまで)できました。

CircleCIとは

circleci.com

継続的インテグレーション(CI) サービスの1つです。
CIとはビルド、テスト、デリバリーというプロセスを自動化して信頼性の高いソフトウェアを開発するための手法で、他にはJenkinsが有名です。

Jenkinsは自前でサーバーを用意する必要がありますが、CircleCIはクラウドサービス*1ですので専用のサーバーを用意しなくても構築できます。
(JenkinsとCircleCIは得意とする部分が違うので両方のメリット・デメリットを把握して開発に合う方を選ぶと良いと思います。)

無料プランもあるので、個人で開発する場合でも手軽に開始することが出来ます。
circleci.com

導入手順

1 対象のGitHubリポジトリを用意

CircleCIはGitHubと連携するサービスです。事前にGitHubのアカウントとリポジトリを用意しましょう。
以下は今回の勉強用に作成したリポジトリです。
github.com

2 GitHubアカウントでログイン

ユーザー登録画面の「GitHubでログイン」をクリックします。
circleci.com

f:id:iucstscui:20200312010615p:plain

3 GitHubとCircleCIの認証を許可

GitHubと連携する認証画面になりますので、Authorize circleci ボタンで認証します。
f:id:iucstscui:20200312011001p:plain

4 チェックするリポジトリを設定

GitHubリポジトリが表示されるので、対象のリポジトリの右にある「Set Up Project」をクリックします。
f:id:iucstscui:20200312011133p:plain

5 CircleCIの設定ファイルを作成

configファイルのテンプレートを選択する画面が表示されます。C#のプロジェクトだったので自動で「.NET」が選択されていました。すごい!!
「Start Building」をクリックします。
f:id:iucstscui:20200312011220p:plain

追加されるブランチとファイルの確認画面で「Add Config」をクリックすると完了です。
f:id:iucstscui:20200312011608p:plain

6 完成

自動でビルドが走り、結果が表示されます。これ以降はGitHubにPushするたびビルドが走ります。とても簡単!
f:id:iucstscui:20200312011814p:plain

問題なければGitHub側で作られたブランチ「circleci-project-setup」をマージしておきましょう。

ビルドエラーになるブランチをプッシュすると正しくエラー検知してくれました。
f:id:iucstscui:20200312155129p:plain

自動で作られるテンプレートの理解

.circleci/config.yml がCircleCIの設定ファイルです。今回は自動で作られたテンプレートを使っていますが、各開発に合わせて設定ファイルを更新していくことになります。
今回は自動で作られたテンプレートを理解したいと思います。

自動で作られたテンプレート

 version: 2.1

 orbs:
  win: circleci/windows@2.2.0

 jobs:
   build:
     executor: win/default     
    
     steps:
       - checkout
       - run: dotnet build

version: 2.1

CircleCIのバージョンです。将来的に古いバージョンに向けて警告を出すために使われます。

orbs

CircleCI Orbs は、ジョブ、コマンド、Executor のような設定要素をまとめた共有可能なパッケージです。 CircleCI 独自の認証済み Orbs のほか、パートナー企業によるサードパーティ製 Orbs を用意しています。
Orbs とは - CircleCI

Orbという単位でCircleCIの設定を共有する仕組みがOrbsですね。記述が多くなったり複雑になりがちな設定をパッケージ化して使いまわすことが出来ます。認証済みのOrbs一覧はこちらで公開されています。
circleci.com

win: circleci/windows@2.2.0

Windows用のorbの指定です。リンク先の設定内容を見ると記述も多いのでorbsがあることで簡単にCircleCIが使えるんだと実感できます。
https://circleci.com/orbs/registry/orb/circleci/windows

jobs

ジョブはステップの集まりです。 ジョブ内のステップはすべて 1単位として実行され、その際にプランから CircleCI コンテナが 1つ消費されます。
Orbs、ジョブ、ステップ、ワークフロー - CircleCI

JenkinsのStageに近いかなと理解しました。最小実行単位のステップをまとめる記述です。

build

Workflows を 使わない 場合は、jobs マップ内に build という名前のジョブを用意します。build ジョブは GitHub など VCS によるプッシュをトリガーとして実行する際のデフォルトのエントリーポイントとなります。
CircleCI を設定する - CircleCI

テンプレートではWorkflowsが使われていないのでbuildジョブが実行されます。
Workflows はジョブの実行を制御する仕組みです。
circleci.com

executor: win/default

Executors は、ジョブのステップが実行される環境を定義します。 win/defaultの内容は前述のorbに書かれています。

steps

ステップの実行順を設定します。ステップはCircleCIの最小実行単位です。

- checkout

GitHubソースコードをチェックアウトするコマンドです。
今回はサブモジュールを使っていませんが、使っている場合はサブモジュール向けに以下の設定を書く必要があります。

- checkout
- run: git submodule sync
- run: git submodule update --init

- run: dotnet build

dotnetのビルドが実行されます

さいごに

CircleCIを使うと簡単にCI環境が構築できます。ビルドするだけであればテンプレートが用意されているので詰まることはないように思います。はじめの結果が出るまでスムーズに進められるのは嬉しいですね。活用するには公式ページなどを参考にコマンドを理解していく必要があります。少しずつ学んでいこうと思います。

*1:オンプレミス版もあるようです

チームが成長するヒントが詰まってる / チーム・ジャーニーを読んだ

前作にあたる「カイゼン・ジャーニー」は心を動かされ、一歩踏み出すきっかけになりました。越境というキーワードをもとに活動の幅がぐんっと広がりました。今回は同著者の市谷さんによる「チーム・ジャーニー」です。いやがうえにも期待が高まります。

本書を読み終えて得た知識はさっそくチームに持ち帰って試しています。本書のように一気に変えようとせず課題と向き合いながら段階的に進んでいこうと思います。

今の現場で楽しみながら悩みながら答えを探し続けたい。そう思える書籍です。

読みやすく、実戦的

「チーム・ジャーニー」は章ごとにストーリー編(問題→解決)→解説編と進んでいきます。ストーリー仕立てなので読みやすく、問題や課題に対応するプラクティスを理解することができます。

僕はよくプラクティスを知ると導入したい病にかかって形から入ってしまうことがあります(今も若干。でも、気をつけてますよ)。
本書はチームの成長を追体験しながらプラクティスを知れるので現実の状況と本書の状況を重ねながら今の課題にあったプラクティスが見つけられます。

チームの成長を段階的に計画

本書は数多くのプラクティスや考え方が解説されています。ゴールデンサークル、コンウェイの法則、スキルマップ、リーダーとリード、ヒトデ型チーム、むきなおり、視座と視野、仮設キャンバス、日常と非日常の場づくり、、、まだまだたくさんです(ほんとに、たくさん)。

それらのプラクティスを活用しながら成長する重要な考え方が「段階」です。

理想と現実のギャップを埋める課題を一度にすべて解決しようとせず、段階的に設定して成長をコントロールしていきましょうという考え方です。Fearless Changeのステップバイステップと通ずる部分がありますね。

理想までの段階(本書では段階をジャーニーと呼びます)を計画して1段1段進めていきます。とうぜん計画通りには進まないので「ふりかえり」や「むきなおり」しながら計画を見直していくのです。

僕は1スプリント内*1で課題や問題を解決しようとしがちでした。しかし、ジャーニーはスプリントと別のリズムでチームの課題解決を計画します。いままでの自分に不足していた考えで、僕はスクラムの枠にとらわれすぎてるなぁと感じました。

枠にとらわれない

一度採用したプラクティスは状況に合わせて止めたり、変えたりしていました。また、チームの枠を超えて協働する場面もありました。

ラクティスの採用も複数チームの境界も一度決めるとその中で工夫しがちだと思います。ただそこにとらわれていると改善の範囲が狭くなります。

ふりかえり、むきなおりを活用しながら高い視点で考えるタイミングも必要ですね。

問い

「それで、あなたは何をしている人なんですか?」

カイゼンジャーニーのこのセリフに心が揺さぶられました。今回はチームが中心ですのでチームに問いがあります。

「私たちは何をする者たちなのか?」

チームに対する問い、個人に対する問い。両方と向き合いながら本書は進んでいきます。

与えられた課題と自分たちで決めた課題があった場合、後者のほうが自律的に自発的に動けると思います。

「問い」の力を感じたとともに、「なぜ?」を考える大切さを改めて認識しました。自分の現場でもチームで考えていきたいと思います。

さいごに

いろんな状況を解決する姿が描かれているので今の自分と重なる部分が見つかると思います。
きっと、今の現場に役立つヒントが見つかりますよ。

*1:1週間など一定の開発期間。スクラムではスプリントを繰り返して開発する