スクラムマスダーの日記

アジャイル、スクラムに関連した内容が多めです。

「モブプログラミングを実践してみよう!! 〜アジャイルモンスターのモブプロ入門〜」が楽しすぎました!

DevLOVE関西さん主催のモブプログラミングを実践してみよう!! 〜アジャイルモンスターのモブプロ入門〜に参加してきました。

個人的にもモブプロは一押しの働き方だと考えており、勤務先でも色々な方面で実践しています。
またモブプロ自体も楽しいのですが、及部 敬雄さんに会えることもあり、「コレは参加するべし!」と参加しました。

当日の流れ

及部さんからのモブプロ講話

モブプロの第一人者でもある及部さんからモブプロについて説明がありました。
及部さんの説明は、元気で、僕達に勇気を与えてくれる感じがしています。そのために、「お、僕達も、ちょっと出来るかもしれない!」と思わせてくれるのです。
僕も色々な方に対して説明したり発表したりする機会があるので、及部さんの発表スタイルを参考に頑張りたいです。

当日の資料は、アップされていないようですが、モブプログラミングを実践してみよう!! 〜アジャイルモンスターのモブプロ入門〜の前日に開催されたhttps://koberb.doorkeeper.jp/events/70770の資料を発見したので、リンク貼り付けておきます。

speakerdeck.com

資料にもありますが、モブプロの一番詳しい説明は、及部さんが書かれたWEB+DB PRESS Vol.102がよいと思います。

WEB+DB PRESS Vol.102

WEB+DB PRESS Vol.102

ただし、当日、及部さんも説明されていたましたが、モブプロを真に理解するには実践するしかないです。形式知化できないなにかがあります。それは、どのような仕事においてもあると、個人的には思います。モブプロに興味を持っていただいた方は、実践あるのみです。

自販機を開発するぞ!①

開発テーマは、自販機でした。
今回は、3チームに分かれて、チームごとに言語を選択して、開発を実践しました。

言語は、Pythonが2チーム、PHPが2チームです。僕は、PHPチームで、モブプロを開始しました。

ちなみに、僕は、PHPを全くやったことが、ありませんでした。チーム内で、JavaRubyPHPPythonあたりから選ぼうとなりましたが、どれも未経験!
ただ、個人的に「LL言語を触ってみたいなぁ」と思っていました。良い機会だったので、「PHPやりましょう!やったことないですけどw」と提案させていただいて、PHPに決まりました!

僕たちのチームは、どんどん機能を実装するスタイルで、ガシガシコードを書いてみました。書いたコードは以下の感じです。
(本ブログへのコードの公開は、DevLOVE関西主催の方に確認させていただいた上で、実施しております。)

class VendingMachine {

  public $inputMoney;
  public $stock;

  public function __construct() {
    $this->inputMoney = 0;
    // 在庫リスト
    $this->stock = [
      'Oshiruko' => 2,
      'OrangeJuice' => 2,
      'Cola' => 5,
      'Coffee' => 5
    ];
    // priceリスト
    $this->price = [
      'Oshiruko' => 300,
      'OrangeJuice' => 100,
      'Cola' => 150,
      'Coffee' => 200
    ];
    // あったかいかリスト
    $this->nukumoriList = [
      'Oshiruko' => true,
      'OrangeJuice' => false,
      'Cola' => false,
      'Coffee' => true
    ];
  }
  
  // クジ
  public function Kuji($juiceName) {
    // 在庫が1個以下はfalse
    if ($this->stock[$juiceName] < 1) {
      return false;
    }
    
    // ランダムにあたりを判定する
    return rand(1, 999) == 1;
  }
  
  public function supply($juiceObj) {
    $this->stock[$juiceObj->name]++;
    echo $juiceObj->name . "在庫は" . $this->stock[$juiceObj->name] . "です\n";
  }
  
  //ボタンを押す
  public function BuyJuice($juiceName) {
    // 在庫の有無のチェック
    if ($this->stock[$juiceName] <= 0) {
      return "在庫切れ!!";
    }

    // 名前から飲み物を取る
    $juicePrice = $this->price[$juiceName];
    // 金額が足りているか判定
    if ($this->inputMoney < $juicePrice) {
      return "お金が足りません";
    }
    
    // お金を減らす
    $this->inputMoney -= $juicePrice;
    echo "残りの金額" . $this->inputMoney . "\n";
    
    // 在庫を減らす
    $this->stock[$juiceName]--;
    echo "在庫数: " . $this->stock[$juiceName] . "\n";
    
    // 当たりかどうか判定する
    if ($this->Kuji($juiceName)) {
      echo "あたったー!!" . "\n";
    }
    
    return $juiceName;
  }
  
  public function EnterMoney($money) {
    $pattern = [10, 50, 100, 500];
    if (in_array($money, $pattern) === false) {
      echo $money."円は使えません\n";
      return $money;
    }
    
    $this->inputMoney += $money;
    echo $money . "円投入されました\n";
    
    return 0;
  }

  public function returnMoney(){
    $returnMoney = $this->inputMoney;
    $this->inputMoney = 0;
    return $returnMoney;
  }
}

class Juice {
  public $name;
  public $isCold;
  public $isHot;
}

class Coffee extends Juice {
  public function __construct(){
    $this->name="Coffee";
    $this->isCold=true;
    $this->isHot=true;
  }
} 

class Cola extends Juice {
  public function __construct(){
    $this->name="Cola";
    $this->isCold=true;
    $this->isHot=false;
  }
}

class OrangeJuice extends Juice {
  public function __construct(){
    $this->name="OrangeJuice";
    $this->isCold=true;
    $this->isHot=false;
  }
} 
class Oshiruko extends Juice {
  public function __construct(){
    $this->name="Oshiruko";
    $this->isCold=false;
    $this->isHot=true;
  }
} 

$vendingMachine = new VendingMachine;

//おっちゃんのターン
$vendingMachine->supply(new OrangeJuice);

// 一般人のターン
// お金を入れる
$vendingMachine->EnterMoney(500);
$vendingMachine->EnterMoney(2);
// ボタンを押す
echo $vendingMachine->BuyJuice("OrangeJuice") ."\n";
echo $vendingMachine->BuyJuice("OrangeJuice") ."\n";

//$juice = new OrangeJuice();

// ジュースをもらう
// お釣りをもらう
echo "お釣りは" . $vendingMachine->returnMoney() ."円です\n";

※1:このコードは、あくまでモブプロを実践するという目的の勉強会で書いたコードですので、仕事で書くコードとは異なることにはご注意ください。 ※2:後述しますが、僕は、途中でチーム移動したこともあり、まったくコーディングに携わっていない部分もあります。

ふりかえりタイム

ふりかえった結果は、上記の通りでした。どんどん機能を追加して、神クラスが出来つつあったので、テストコードとか書いて、品質あげたいねーと話していたのですが…。

ふりかえりの後は、近くの自動販売機を観察しに、出かけました。
「あったかい」と「つめたい」があったり、同じ商品が並んでいたりと、「そういえば・・・」ということを思い出しました。

自販機を開発するぞ!②

及部さんからチーム替えの司令があったので、ぼくはPHPチームからPythonチームに移動しました。

最初に思ったのが、進め方が全然違う…。

オンライン実行環境もサイバーDojoとテストコードがバッチリ書ける環境でした。

cyber-dojo.org

Pythonチームは、ガッツリTDDでコーディングしていました。
TDDだと、どんなことをやりたいのかをテストケースを眺めれば分かるのがよいですね。あと、コードが圧倒的にきれい!

TDDすごいな!って思いました。

テスト駆動開発は買ったはいいものの、まだ全部読み切れていないので、早く読まないと!という感じです。

テスト駆動開発

テスト駆動開発

おわりに

モブプログラミングって、やっぱり最高だな!って感じでした。
勉強会中に、及部さんらもおっしゃっていましたが、モブプログラミングという働き方は、プログラミングだけに限ったものではないですよね。
個人的には「モブワーク」って言うようにはしています。 仕様作成、テスト実施、資料作成なども、モブワークで進めれば、よいこともたくさんあるからです。
もちろん常にモブワークが、よいとは言いません。やり方には、マッチしている場面があるからです。モブワークがマッチしている場面では積極的に使いたいなと、再認識した1日でした!

「関西の地で現場を前進させんとする者達の話」で発表してきました!

DevLOVE関西さんのイベント「関西の地で現場を前進させんとする者達の話」で発表させていただきました。

devlove-kansai.doorkeeper.jp

最近、個人的にも仕事的にも、忙しく、発表報告ブログを書くのも、遅くなりました…。
個人Trelloも、上手く活用できていないので、ダメなサイクル回り始めている気がしてます…。

愚痴っぽいのは、ココまでにして、イベントの内容です。

大規模で技術的に多様な開発に真正面から取り組む

speakerdeck.com

Nexusやモブワークについて、発表しました。
Nexusは、周りでも取り組まれている事例が、全然なくて、今でも、手探り感満載です。
※資料に書いている通り、Nexusをやっているわけではないです。Nexusの一部のプラクティスに取り組んでいるだけです。

そもそも、大規模アジャイル開発と呼ばれる類の事例が、少ないというのもありますね。
※あくまで、ぼくの観測範囲内の話です

そして、人数が多いプロジェクトって、やっぱり難しいです。ただ、出来ることも、数多くあると思います。
そのため、「ぼくと同じようなことで困っている方の助けになれば、いいなぁ。」という思いで、発表させていただきました。

発表後のダイアログや、イベント後の時間にも、色々と参加者の方とお話させていただき、少しでも、参加者の方々の課題解決につながれば、個人的には嬉しく思います。

イベント感想

「限界をつくるな」を精神論で終えないために僕らは何ができるのか

speakerdeck.com

やんしんさんの発表は、TOCfEについて、発表されていました。
選択と集中」、「計れないものは改善できない」など、「やるべきだけど、なかなか出来てないなぁ」と個人的に痛感するモノが多かったです。やはり、本質的に困る部分って、似ているなぁという感じです。

やんしんさんの発表は、いつも、いい意味で生々しいです。現場での泥臭さが分かります。
だからこそ、少しづつでも改善していくことが、伝わっているのだと思います。

心理的安全性を高める活動を組織の当たり前にする方法

森田さんは、社内でLTを実践されている話などをされていました。
発表資料はありませんが、先日のRSGT2018でも、一部の内容を発表されています。

www.slideshare.net

森田さんの発表って、感情的で、聞き入りますよね。
ぼくも、発表のための表現は、改善しないと!と、反省です。

Fearless Change

中村さんが、ぼくの発表に関連して「機会を活かす」で、『Fearless Change アジャイルに効く アイデアを組織に広めるための48のパターン』を紹介されていました。

Fearless Change アジャイルに効く アイデアを組織に広めるための48のパターン

Fearless Change アジャイルに効く アイデアを組織に広めるための48のパターン

ぼくも、前々から読みたいなぁと思っていたのですが、そもそも買ってもいないという…。
とりあえず、Amazon欲しいものリストに入れました。
GWまでには読みたい…。

監訳者の川口さんが、チートシートをブログでも公開されています。

kawaguti.hateblo.jp

組織で困っていることって、やはり似てくると思います。困っている時に、解決するきっかけとして、パターンを知っていることは大事かと思ったりします。

おわりに

今回も、DevLOVE関西さんに発表する機会をいただけました、本当に、ありがとうございます。
次も機会があれば、どこかで、発表したいですね〜。

RSGT2018は、最高のイベントでした! #RSGT2018

2018/01/11から2018/01/13に開催された、Regional Scrum Gathering Tokyo 2018に参加してきました!

2018.scrumgatheringtokyo.org

ぼくは、今回が初参加だったのですが、「最高!」しか思い浮かばないようなイベントでした!

「この思いをブログに書かなければ!」と思ったので、書いてみます。

セッション

セッションは、もちろん色々な学びがありました。

個人的に、一番学びがあったのは吉羽さんの「Scrum プロジェクト開始のベストプラクティス」でした。

www.ryuzee.com

今のプロジェクトで、プロジェクト開始前に、「コレは、やっておくべきだったな…」というものが多く、心に突き刺さりまくりました。

色々なプラクティスは存在しない。しかし、失敗には類似性があるので、インセプションデッキを例にとって、プロジェクト開始前に考えるべき観点を紹介してくださっていました。

特に、「非機能要件はアーキテクチャ、コスト、開発期間などに影響を与える」は、ぐはっ…という感じです。スライドの流れ的にもそうですが、「非機能要件の確定」→「アーキテクチャや開発言語などの選定」なんですよね。
個人的に、「アーキテクチャや開発言語などの選定」→「非機能要件の確定」の流れが多い気がしています。(もちろん、ぼくの短い経験なので、世間一般は、よくわかりませんが…。)
あるべき流れを知らないことこそが、失敗の要因の1つだと思います。

色々と「ああ、こうなんだよなぁ」と感じたところは多いのですが、ぼくのプロジェクトの話は、このブログに書けないので、ココまでにします。
痛感するセッションほど、公開できないのは、つらいですね…。発表していただいた皆様に、本当に申し訳ない気持ちでいっぱいになります。

オープンスペーステクノロジー

3日目は、参加者が、自分で話をしたいテーマを掲げて、参加者同士で集まるオープンスペース形式でした。
「せっかくRSGT来たし、ぼくも、テーマ出そ!」という感じで、「スクラムチームと会社組織の構成」というテーマで、場を設けさせていただきました。
なんだかんだで、人も集まっていただいたので、色々と得ることができました。他の方に役立ったかは、わかりません。
わからないけど、みなさんぼくの話に付き合っていただいたので、本当に感動です。

OpenJam

会場にプロジェクターが置いてあり、自由に発表できるOpenJamのスペースがありました。
通常のセッションの裏で、発表もしていたりと、「知ってたら聞きに行きたかった〜」というものもありました。
このあたりが、もやもやするところなんですけど、このもやもや感が、RSGTの良いところなんだと思います。
「聞けなかったし、じゃあ、話聞きに行こう!」と気軽に思えるのが、RSGTなので。
聞けなければ、話かけにいけば、よいのがRSGT。

個人的に、初参加ということもあり、OpenJamの存在を知らなかったので、「事前にわかっていれば、なにか用意してきたのに〜」と、ちょっと残念でした。
プロポーザルに落ちても、「やっぱりRSGTで、なにか伝えたいのだ!」という方は、事前準備必須です。

参加者との出会い

お昼休憩は1時間以上、短い休憩でも15分と、廊下で様々な方とお会いすることが出来ました。
1日目のセッション終了後には、ネットワーキングパーティー、イベント終了後には、2次会で中華料理を食べに行くなど、色々とお話できたのが良かったです。

書籍や発表スライドだけでお名前を存じ上げていた偉大な先駆者、同じような悩みを抱えて会社で頑張っている同年代、同じ地方ならではの悩みを抱えるコミュニティ運営をされている方などなど様々な方とお話をすることができました。
参加者同士で話をして場を作るというのは、RSGTならでは、と感じました。

いま思い返せば、「あの方とお話しておけば、よかった…」という気もしますが、コレは次回の楽しみにとっておこうと思います。

コーチーズクリニック

スクラムのコーチをされている方と1on1で悩みを相談できる、コーチーズクリニックがありました。
普通に考えて、無料で、スクラムコーチの方にお悩み相談できるとか、贅沢すぎます。
なにか悩みがあれば、間違いなく、利用するべきコンテンツだと思います。

Regional Scrum Gathering Osaka!?の開催発表

Regional Scrum Gathering Osakaを6月に京橋で開催すると、2日目のランチタイムに、川口恭伸さんが発表されていました!
大阪といえば、地元開催です。もう、参加するしかありません。
すでに、ワクワクが止まらない状態です。

 おわりに

RSGTを運営していただいたみなさま、本当にありがとうございます!

今回初参加&東京遠征ということもあり、会場に到着したときには、オロオロしてました。ただ、いつもの関西でお会いしている方々も数多くいらっしゃったので、安心して1日目のKeynoteを聞くことができました。関西のみなさま、本当にありがとうございます。

名刺が、1日目にして、残り1枚になるという事態に陥ったため、名刺交換できなかった方、本当に、ごめんなさい。完全に、名刺を持ってくる枚数を間違えました。次回は、「名刺を箱ごと持ってくる」という改善をします。

今回は、初参加にも関わらず、1日目のランチタイムに「ますだー、FIRST TIMERでは、ないでしょ!」と言われた感じの初参加者でした。
運営の方には、地方からきた初参加者として、少しはフィードバックできたとは思います。地方勢がRSGTに初めて参加しても寂しくない取り組みは、RSGT前から地方でできるので、関西で頑張ろうと思います。

アジャイルラジオ、聞いてますよ〜」と声をかけていただいた皆様ありがとうございます!最近、全然、出演できていませんが、みなさん、今後も聞いてください!

agileradio.github.io

来年も、必ず参加するぞ!

f:id:scrummasudar:20180113210403j:plain