和田さんにテスト駆動開発ワークショップをやっていただきました
@t_wadaこと和田さんをご招待して、テスト駆動開発ワークショップを実施しました。
テクノロジーコラム
- 2021年10月28日公開
NTTテクノクロスの山本です。こんにちは。
現在、NTTテクノクロスでは新規ソリューションのビジネスを拡大するために、内製でソリューションを開発し、スピーディーにサービス化できる人材の育成を進めています。先日この施策の一環として、和田さんに「質とスピード」の社内講演を実施していただきましたが、今回はテスト駆動開発ワークショップを開催していただきました。
実は2009年、合併してNTTテクノクロスになる前のNTTソフトウェア時代に、社内勉強会の特別回として和田さんにワークショップを開催していただいたことがありました。なんと今回は12年ぶりテスト駆動開発ワークショップの開催となりました!
ということで、社内から参加者が12名、TAが5名の総勢17名で実施した、テスト駆動開発ワークショップの様子をご紹介します。
事前準備
テスト駆動開発ワークショップをオンライン開催する場合、ペアプログラミングや全体コードレビューが難しいため、人数を絞って1on1でコードレビューという形でやられているというお話だったのですが、社内でペアプロ/モブプロを推進していることもあり、今回リモート開催だったのですがペアプロ/モブプロでワークショップを開催させていただきました。
オンライン開催のワークショップでペアプロ/モブプロが難しい理由に環境の問題があります。オンサイトでやる場合はPC1台あれば簡単にペアプロができますが、オンラインの場合はそうもいかずツールなどのセットアップが必要です。ワークショップ当日にこのセットアップをやると、時間もかかりますし、接続トラブルなどが発生した場合にワークショップ自体が成り立たなくなるというリスクがあります。
そこで今回は、TDD Boot Campでの進め方なども参考にさせてもらい、事前に準備会を実施する形にしました。ペアプロ/モブプロを実施するツールとしては、Live ShareとCode With Meを使ったのですが、これらのセットアップ手順を用意しておき、参加者の使用希望言語をもとに決めたペアプロ/モブプロの各チームごとに、事前に使用するツールを決めて準備会までにセットアップしてきてもらうことにしました。準備会ではツールの接続確認をしておき、ワークショップ当日に、チームですぐにペアプロ/モブプロを開始できる状態にしました。
また、社内からチームで使用する各言語のプロフェッショナルたちにTAとして参加してもらい、万全の体制を整えました。
当日のタイムテーブル
当日のワークショップは以下のタイムテーブルで進みました。
10:00 - 12:00 講演 + ライブコーディングによるデモ + 質疑応答
12:00 - 13:00 昼休み
13:00 - 16:30 モブプロ + 和田さんレビュー x N回
16:30 - 17:00 全体レビュー + 質疑応答 + クロージング
午前の部
参加者には事前にTDD Boot Camp 2020 Online 基調講演の動画を視聴してもらっていました。午前の部は、この基調講演のライブコーディングが完了した時点からスタートしました。
この動画の最後はテストコードの構造化とリファクタリングが完了した状態でした。この時点でのテストコードは、開発を促進するために書いたテストです。品質保証の観点で見ると、まだまだテストが足りていません。そのため、仕様を満たしているか境界値などを意識しながら、現在のテストコードを品質保証のためのテストコードに変えていく流れをライブコーディングで説明していただきました。
次は、テストコードがドキュメントとして機能するために、どのようにテストコードを構造化していくのかというお話でした。最近ではテストコードを書くのは当たり前になりましたが、その先に待っていたのはテストコードのメンテナンスでした。
テストコードがドキュメントとして機能していない場合、後からコードを引き継いだメンバーは、何が正しい状態であるかはわかりません。そのため、例えば重複したテストコードが存在していても、重複していると判断できず、そのテストコードを削除できません。
このような状態になると、テストコードのメンテナンスコストが高くなり、本来セーフティネットとして機能するはずのテストが不良資産となってしまいます。こうした事態を避けるために、テストコードが仕様のドキュメントとして機能するように、テストコードをどの構造化していくのかをデモしていただきました。
午後の部
午後の部は、12名の参加者が5チームに別れて、ペアプロ/モブプロでテスト駆動開発を体験しました。各チームと使用したツールの組み合わせは以下でした。
- PythonチームA: Live Share
- PythonチームB: Live Share
- Goチーム: Code with Me
- JavaScriptチーム: Live Share
- Javaチーム: Live Share
お題は、整数の閉区間を示すクラス(あるいは構造体)を作るというものでした。
整数の閉区間を示すクラス(あるいは構造体)をつくりたい。整数閉区間オブジェクトは下端点と上端点を持ち、文字列表現も返せる(例: 下端点 3, 上端点 8 の整数閉区間の文字列表記は "[3,8]")。ただし、上端点より下端点が大きい閉区間を作ることはできない。整数の閉区間は指定した整数を含むかどうかを判定できる。また、別の閉区間と等価かどうかや、完全に含まれるかどうかも判定できる。
参加者の中には、まだテストを書くことに不慣れなメンバーもいたため、お題の難易度設定には少し不安もありましたが、今回のワークショップをペアプロ/モブプロで実施したおかげで、チーム内でうまくフォローし合いながら進めてもらえたので、結果的にちょうど良い難易度になりました。
午後の部の最後には各チームで書いたテストコードを紹介してもらい、全体レビューを実施しました。驚くべきは、全チーム 4-Phased Test を意識したテストコードを書けていた所です!各チーム素晴らしい結果でした。
おわりに
ワークショップ後に実施したアンケートでは、参加者から以下のような声も届き、多くの参加者に学びのあるワークショップとなったのではないかと思います。
- 「最高でした。予習動画・和田さんのライブコーディング・モブセッションともに大変ためになりました。」
- 「数年後にそのテストを見ても仕様が理解できるテストケースを作る重要性やユニットテストを充実させることの重要性を再認識しました。」
- 「実際にハンズオンしてテスト駆動開発の意図やその目的を体感でき、考えをアップデートできた。」
- 「ペアプログラミングが思ったよりも良かった。これまでは効率とかどうなんだろうと思っていたが、お互いのちょっとした一言がヒントになったりするため、悩んで止まる時間が減るように思う。何よりその場にいたメンバー全員が書いたコードを確実に理解している状態になるというのが良い。」
- 「今回のワークショップは目から鱗の部分が多く、とてもためになりました。」
今後も内製開発ができる人材を育成していくために、様々な施策を実施していく予定です。ということで、次回のレポートもお楽しみに!
テックリードという立場で、社内の現場で様々な技術支援をしています。開発現場に直接入り込んで、モダンな開発手法を普及展開しつつ、技術的な側面からビジネスを支える活動をしています。
最近コーヒー豆の焙煎をはじめました。家が煙と臭いでやばいです。