プランニングポーカーシステムのススメ

最近のDXブーム(DXバブル？)で「アジャイル開発」が再度クローズアップされてきています。
その背景として、DXの導入は競合に先駆けて早期にシステムの導入が求められることも多く、往々にしてトップダウンで指示が下りてくることもあるため、必然的にウォーターフォール型ではなく、生産性重視のアジャイル開発という手法を選択することになるのだと思います。

私自身、本業の製品開発の傍らで、DX向けのアジャイル開発の講師も務めており、私の研修の中では「プランニングポーカー」を使った見積方法の演習を実施しているので、今回はそれに関連した話をしようと思います。

システム開発において見積を誤ると即デスマーチ・・・ということは実際に起こり得るため、見積作業は慎重におこなう必要があるものの、

・企業や人によって見積手法がバラバラ
・見積を担当する人の主観で全てが決められてしまう
・第三者が見積値の妥当性を判断するのが難しい

等といった問題をよく聞きます。

「プランニングポーカー」はメンバー全員でトランプのようなカードを机上に一斉に出し合ってゲームのようにワイガヤで見積を進めていくスタイル(見た目)の部分ばかりがクローズアップされがちですが、開発メンバー全員(新入社員含む)が見積作業に参加して民主主義的に見積値を決定し、また同時にメンバー全員から見積値に対するコミットメントも得られるため、上記の問題が解決できますし、その場で自分と他の人の見積方法の違いを認識するきっかけとなり、特に若い人には人材育成的な観点でも効果が高いといえます。
![planning_poker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91440/668adbed-d1fa-8599-8d8d-0acaad022a76.png)
ここからが、本題になりますが、「プランニングポーカーカード」はAmazon等でも取り扱っており1,2年前に比べて入手が容易になっているのですが、現在のコロナ禍において在宅勤務が増え、チーム全員で対面形式での「プランニングポーカー」を気軽に実施することが難しくなってきています。
そのため、私の方ではWebブラウザで簡単に「プランニングポーカー」が実施できる「プランニングポーカーシステム」を使うことをお勧めしています。

[Hatjitsu](https://hatjitsu.toolforge.org/)
[Firepoker](https://firepoker.io/)

大変ありがたいことに上記のサイトでは開発者(有志？)が無料で使えるシステムを公開してくれています。

「プランニングポーカーシステム」を使うことにより、「プランニングポーカー」をオンライン(Web会議)で参加者全員が気軽に実施できますし、全員分の「プランニングポーカーカード」を準備する必要も無く、システムによっては「フィボナッチ数列」「マウンテンゴート」等、カードの種類も選べたりするのでとても便利です。
使い方もとても簡単で、実際に私の研修を受講されるIT技術者の方々に使ってもらったところ、特に説明しなくても数分で使い方を理解して直ぐに「プランニングポーカー」を使った見積作業に入れるぐらいですので、使い方に迷うこともほとんど無いと思います。

尚、無料の公開サイトはあくまでお試し環境という位置づけだと思いますので、実際のプロジェクトでは自前で準備したサーバ(クラウドサーバ等)上に「プランニングポーカーシステム」構築することをお勧めします。

[Hatjitsuのソースコード](https://github.com/richarcher/Hatjitsu)
[Firepokerのソースコード](https://github.com/Wizehive/firepoker)

さらにありがたいことに「Hatjitsu」「Firepker」どちらもGitHubでOSSとしてソースを公開してくれており、今回は私が研修で使っている「Hatjitsu」の構築手順をまとめましたので、参考にしてみてください。
また、私は使ったことが無いのですが、上記とは別の有償サービスもあるようなので、「構築や管理が面倒くさい」ということであればそちらの利用を検討しても良いかと思います。

「Hatjitsu」のREADMEにはLinuxで構築する方法とDockerで構築する2種類が記載されており、以下それぞれの手順について記載します。

## Linuxでの構築方法

以下のようにGitHubからソースをダウンロードしてnpmをインストールしてください。

```bash:/bin/bash
$ useradd -s /bin/bash -m hatjitsu
$ su - hatjitsu
$ git clone https://github.com/richarcher/Hatjitsu
$ cd Hatjitsu
$ npm install -d
```

手順通り起動しても、アーキテクチャが少々古く使用しているNode.jsのExpressが古いバージョンであるため、以下のようにエラーが発生し、うまく動かないようです。

```bash:/bin/bash
$ node server
/home/hatjitsu/Hatjitsu/server.js:12
var app = module.exports = express.createServer();
                                   ^

TypeError: express.createServer is not a function
    at Object.<anonymous> (/home/hatjitsu/Hatjitsu/server.js:12:36)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    at internal/main/run_main_module.js:17:47
```

この対応策として、以下の手順でexpressを2.xを再インストールして再度サーバプロセスを起動してみてください。

```bash:/bin/bash
$ npm uninstall express
$ npm install express@2
$ node server
```

サーバプロセス起動後、Webブラウザで以下にアクセスして画面が表示されれば構築成功です。

```http:Webブラウザ
https://localhost:5000
```

尚、Windows Subsystem for Linux (WSL)のUbuntu 18 LTSでも問題なく動作しました。

## Dockerでの構築方法

上記と同様でexpressのバージョン問題が発生してしまいますが、Dockerfileのnpm実行部分を以下のように書き換えたらうまくいきました。(やや強引)

```docker:Dockerfile
#RUN npm install -d
RUN npm install -d && npm uninstall express && npm install express@2
```

docker-composeで起動します。

```bash:/bin/bash
$ docker-compose up -d
```

Dockerのプロセス起動後、Webブラウザで以下にアクセスして画面が表示されれば構築成功です。

```http:Webブラウザ
https://localhost:5000
```

尚、Docker Desktop for Windowでも問題なく動作しました。

## プランニングポーカーの実施方法

![hatjitsu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91440/16672bff-b769-4cf6-9b5b-cd24a90650d4.png)

「プランニングポーカー」についてネット等で調べると、ポイントを使った相対値で見積ることが推奨されている等、ルールが細かく規定されているかと思います。

全員が正しくルールを理解してきちんと運用できるようになるにはそれなりに時間もかかってしまうため、あまり形式に拘り過ぎるのも生産的とは言えないと思います。

例えば、参加者が「人日」での計算する方がイメージしやすいようであれば、まず「人日」を使って始める方が、他のメンバーにも受け入れられやすいと思いますので、最初はあまり堅苦しく考えず、「習うよりも慣れよ」の精神で実践してみて、段階的にチームの中で適切な(妥当な)ルールを決めていく方がアジャイルらしい進め方になると思います。