スクラムマスダーの日記

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

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

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日でした!