42Tokyo向けに開催していただいた、Yahooのペアプロセミナーに参加しました

42Tokyo向けに開催していただいた、Yahooのペアプロセミナーに参加しました



TL;DR

  • Yahooのクローズトイベントに参加した
  • LeanでXPな開発をペアプロでTDDで実践した → すごい、やりたい
  • 42 Tokyo にいると、単に課題をこなすだけでなく、不定期で楽しいイベントに参加できるよ!


以下覚書的にまとめてます。不足や雑な記載もありますが、イベントでは丁寧に説明いただいていましたので念のため!


知識の習得 (1)

  • Lean開発
    • 顧客に価値のあることをやる
    • それ以外を捨てる
  • XP(エクストリームプログラミング

    • 開発方法論
    • 古い習慣を捨て効果のある新しい習慣を選ぶこと
    • ペアプロも含まれる
    • ソフトウェア開発で人間としての欲求を満たすこと
    • ソーシャルチェンジ
    • コミュニケーション、シンプル、フィードバック、勇気、尊重:この5つの価値を最大化
    • 15個ある価値のうち、ストーリー、ペアプロテスト駆動開発ヤフオクアプリ開発でもっとも効果が高かった
  • ペアプログラミングペアプロ

    • 2人1組でペアプロを実施、各ペアプロチームが1機能を実装する
    • 翌日ペアの片方が移動、他方の人は同じ機能に残り、新しく来た人に機能の説明などを伝授
      • これにより、仕様書を減らして会話で知識を維持できる
    • メリット:実装方法、トラブルシュートなどで技術力が向上
    • おススメ環境:マウス、キーボードでGUIをさわる環境がいい(相手の環境を操作しやすい)
    • とても疲れるので、こまめに休憩をはさむこと
  • ストーリー

    • 受け入れテストができる最小単位
    • AS(ペルソナ),GIVEN(何をしているか),WHEN,AND,THENの項目+メモで構成される

ストーリーの例:

◆ストーリー概要
Aは検索ボックスを見ることができる

◆ストーリー詳細
AS Aさん
GIVEN 私は検索トップ画面にいる
WHEN トップ画面を見た
THEN ページ一番上に検索ボックスを見ることができるはずだ

NOTE:
・プレースホルダーには「検索ワードを入力してください」と表示されること
・デザイン不問
・APIはコールしない



実際にやってみた (1) じゃんけんアプリ

じゃんけんを行うプログラムをペアプログラミングで実践してみました。

開発はテスト駆動開発で行い、一方がテストを記述、その後他方がそのテストに合うコードを実装していくという流れで行いました。

また、上記のLean開発の考えのもと、テストに対して必要な機能のみを実装するようにしました。


初期プロジェクト作成

  • npm init
    • 初期パッケージ作成
    • package.jsonが作成されるとOK
  • npm i jest
  • メインとなるrps.jsファイルを作る
    • 処理を記述するファイル
  • ros.spec.jsファイルを作る
    • テストを記述するファイル(同じ名前のrps.jsと対になっていると認識される)
    • describeという単位でテストを区切って記述する
  • サンプル:https://github.com/satoshikeda/rps


テスト駆動開発

以下のようなテストコードを書く

describe('Rps', () => {
    let result
    const rps = new Rps()
    describe('play()', () => {
        describe('When paper vs rock', () => {
            beforeEach(() => {
                result = rps.play('paper', 'rock')
            });
            it('returns A wins', () => {
                expect(result).toBe('A wins')
            });
        });
    });
});    


その後、もう一人の人がテストに合わせたコードを書く。

npx jestでテストを実行し、すべてPassedすればOK。

今度は交代して行う。


テスト駆動開発のポイント

  • コードを書いている人は、何をしているか説明しながら書く(相手に理解してもらう)
  • コードやテストは交互に書く(一方的な開発にしない)


テスト駆動開発でのメリット

  • 技術的な、またはプログラムの仕様の理解が相互に進む
    • いい知識はどんどん広まる
    • 皆が仕様を頭の中に入れているので、仕様書が減る、会話がスムーズになる
  • お互いを尊敬してみることができるようになる


知識の習得 (2)

  • 4レベルによる見積もり
    • チームの皆で、各ストーリーがどの程度の難易度かを見極める
      • 0:単体テストに影響のない実装
      • 1:影響ある(単体テストをやらないといけない)が、実装簡単
      • 2:影響あるが、実装面倒
      • 3:方針が分からず調査が必要
    • お互いに理解不足、または難易度の認識に差があった場合は会話する
      • 各々の理解度や認識の差を埋められる


  • 開発のサイクル
    1. PM→エンジニアにストーリーを渡す
    2. 見積もりを行う
    3. 実装
    4. 受入れテスト→PM

1日だけでも30通りとか消化することもある


実際にやってみた (2) 電子書籍開発

残念ながら時間がなくできませんでしたが、流れだけご参考までに記載しています。


セットアップコマンド

git clone https://github.com/vuejs/vue-test-utils-typescript-example

npm ci

npm run serve


編集するファイル

  • HelloWorld.vue
  • HelloWorld.spec.ts


テスト実行コマンド

jest


テストコード

実際にやってみた(1)と同じく、jestのコードを書いていきます。以下は抜粋。

it('displays search input', () => {
  expect((wrapper.find('input').exists()).toBeTruthy()
})


実装例

https://github.com/satoshikeda/sample-search-books


知識の習得 (3)

レトロスペクティブ

  • 振り返りの時間
  • 週1回程度やっているらしい
  • お酒飲みながらやったり
  • Good、Discuss、Improve(だったかな?)の3つのカテゴリごとに、ざっくばらんに意見を交わす


結局のところ、LeanでXPの価値って何?

  • コミュニケーション
  • シンプル
  • フィードバック
  • 勇気
  • 尊重


所感

  • しっかりとコミュニケーションをとり、お互いを尊重しながらXPを行うことが、チーム全体の開発をよりよいものにするし、自分の開発者としての価値や知識レベルも上げていく良い方法だと感じた
  • ペアプロはお互いの開発しているときの考え方を知れるとても良い方法だと感じた
    • 相手の考え方も知れるし、自分の考えを言語化するよい機会となる