はじめに
技術部プラットフォームグループでSREをしているchiroruです。
ペパボでは、2023年に引き続き今年も日本のTest-Driven Development(TDD) の第一人者である@t_wadaさんをお招きしてTDDワークショップを開催しました。今回は総勢9名で丸っと1日ワークショップに参加してきました。その参加パートナーから開催レポートをお届けします。
昨年のワークショップについては『twadaさんによる2023年度版TDDワークショップを開催しました』をご覧ください。また、なぜTDDワークショップを開催しているのかについては、過去の記事『ふつうの開発と TDD ワークショップ』で詳しく説明しております。
ワークショップの内容
概要
ワークショップは事前に基調講演/ライブコーディングの動画でTDDの流れを学び、自分が一番親しみのあるプログラミング言語で環境構築を行なった上で参加します。当日はテストに関する座学、整数の閉区間をテーマとしたTDD実装課題とコードレビュー、最後には実装について共有しあう全体レビュー会を行いました。
スケジュール
- 10:00 - 12:00 講義 + 質疑応答
- 12:00 - 13:00 昼休み
- 13:00 - 16:30 ワークショップ + 1on1コードレビュー x nセット
- 16:30 - 17:00 全体レビュー + 質疑応答 + クロージング
講義・座学
SUZURI事業部でモバイルエンジニアをしている@dokozon0です。生徒に「学ぶのおもろいぞ〜!」というのを伝えるためにプログラミングを学び始め、気づいたら教員からエンジニアになっていました。
まずはワークショップまでの事前準備と、当日の講義部分を紹介します!
事前準備
事前に@t_wadaさんがライブコーディングをしながら、TDDについて紹介している動画を視聴し、TDDの基本的な考え方、コーディングの仕方を学習しました。
動画を視聴するまでは、「TDD?テストから書くやつだよね?」くらいの理解でしたが、予習動画を見ながら実際に手を動かしてコードを書くことで、どのような手順で開発すると良さそうかということを理解することができました。
自動テストについての講義
研修当日は、自動テストについての講義から始まりました。講義では自動テストの目的である「信頼性の高い実行結果に短い時間で到達する状態を保つことで、開発者に根拠ある自信を与え、ソフトウェアの成長を持続可能にすること」を少しずつ分解して紹介していただきました。
特に「信頼性の高い」「状態を保つ」という文脈で触れられていたflaky testは印象的でした。コードを変更していないのに、実行のたびにテストが成功したり、失敗したりするもののことをflaky testと呼びます。flaky testが1%付近になると、エンジニアが失敗に対して反応することをやめ、テストの価値が失い始められるそうです。この割合を抑えるために、テストの履歴から、成功・失敗が安定しないテストにはタグをつけるなどして対応を進めると良いそうです。
講義中の雰囲気もとても良く、みんなでSlackのチャットでわいわい盛り上がりながら講義に参加することができました。また、@t_wadaさんにわからないことを聞いた時も「良い質問ですね〜!」と声をかけていただいたことで、とても質問がしやすい雰囲気でした。
ワークショップ・1on1コードレビュー
今年の4月から新卒入社したどすこいです!TDDなぞ露も知らず、雰囲気コーディングをしてた学生時代でした!
ワークショップの内容とTDD実践のアドバイス
午前でインプットしたものを、実際にアウトプットするワークショップです。
お題は整数の閉区間に関する実装で、短めな問題文と長めな問題がありました。また、TODOリストに既に分解されているバージョンと、自分で分解して進めるバージョンがそれぞれに用意されており、2*2=4種類の問題がありました。
TDDを意識するために、以下のようなアドバイスがありました。
- リファクタリングは飛ばさない
- 進捗が遅くてもいいし、完成しなくてもいい
- 問題をすすめていく途中で、お題の難易度を変えても良い
- 講義の内容を思い出しながら進めていく
また、各自の進捗のスレッドをSlackで立てて、適宜やっていることを書きながら進めていきました。
実際に手を動かしてみると、
- 最初にする実装の分解すらも難しい
- 当たり前に通るテスト(通称:茶番テスト)が通らない(テスト環境が整ってないから)
- 調子がでてきたら、一度のTDDサイクルで実装するTODOをちょっとずつ広げていく(歩幅を広げていく)ことも大事
ということが実感できました。
1on1コードレビュー
ワークショップでは、@t-wadaさんから課題の取り組みに関するアドバイスを1on1でいただける機会が設けられていました!この1on1は、他の人も聞くことができる中での1on1だったので、他のパートナーの考え方や進め方もみることができました。言語やタスク分解、リファクタリングの進め方や命名など、人それぞれで全く違う実装をしていたのが面白かったです!特に、「入力値の型チェックはどこでするのか」や「どこまでテストを書くべきなのかという線引き」について、いろいろな視点を知ることができたので興味深かったです!
このように、午前のインプットを午後でアウトプットすることで、理論的な知識を実感を伴った知恵に落とし込むことができました。また、他の人の視点を見ることで、多角的にTDDを学ぶことができました。
全体レビュー・質疑応答
minne事業部でWebエンジニアをしているnissyiです。TDDについて理解を深めて、自分の開発プロセスをよりよいものにしたいという思いから研修に参加しました。
全体レビュー
基本的なカリキュラムが終了したあとは、希望者を募って全体レビューを行いました。参加者各位がTDDを進めるにあたって意識したことや、実装したコード、テスト方針などについて発表したあと、発表者以外の全員からレビューをもらう時間でした。この全体レビューに参加したときに、他の参加者と自分の間で「TDDの取り組み方」と「テストの書き方」の違いがあることに気づきました。
TDDの取り組み方という点においては、人によって課題の捉え方が異なっており、開発を始める前のタスク分解にも違いがありました。自分が想像していたものとは異なるアプローチを知ることで、より柔軟な考えを得られて面白かったです。また、自分はRubyとRSpecを用いて研修に参加したのですが、RubyとMinitestを用いた参加者もいれば、GoやSwiftを用いた参加者もいました。TDDの取り組み方以外にも、言語やテストフレームワークの違いを知る面白さも感じられました。
自分が思い描いたTDDを実践したのちに、他のパートナーのTDDについてレビューし合うことで、自分自身の振り返りにも繋げられて、とても有意義な時間でした。
質疑応答
講義終了後、Slack上で質疑応答が行われました。講義で得られたものを踏まえて、各自が課題に思っていることや、カリキュラムの中で取り組んだことについて追加の質問が発生しました。 @t_wadaさんに丁寧にご回答いただき、各自の理解がさらに深まりました。
TDDワークショップに参加した各パートナーの感想
nissyi
以前は、TDDについて「テストを先に書いて失敗を確認したら、テストが通る実装という工程をくりかえす」程度の認識しかありませんでした。しかし、今回のワークショップを受講することで、自分の勉強不足さやTDDの素晴らしさを知れました。また、テストの分類、テストに関する用語、開発生産性にもたらす効果についても教えていただいたり、チーム内で課題に感じたことを直接質問して、解決へのヒントをいただいたりと、とてもためになる時間を過ごせました。
しゅんはむ
以前、テストが書かれていないコントローラーに機能追加した際に、0からテストを書くことができなかった…という挫折があり、参加することを決意しました!事前課題として動画視聴をしたのですが、じつは数年前に視聴済みでした(なのに身についていなかった)
改めて拝見すると、実務経験を多少積んだからか、「このやり方なら、テストを書きながら実装を行うことで要件に的確に合わせながら進められるぞ!」という感想に抱くまでにレベルアップしていました…!!!
ワークショップでは、@t_wadaさんからレビューをいただきながらモブプロする時間があり、取り組んでいく中で、「テスト容易性を高くするにはかなり細かく要件を噛み砕く必要があるぞ?」という今後テスト書く上での重要な気づきを得ることができました!
TDD最高!!!!!!
yoshio
事前課題の動画視聴や当日の@t_wadaさんの講義で、テスト駆動開発についての定義や理想的なテストについて話して頂きました!また実際のワークショップにて、お互いのコードレビューから、ぶつかりがちな課題などテストについて幅広く学べたと思います。
個人的には、ワークショップを体験する中で、「レッド」「グリーン」「リファクタリング」というステップを繰り返すことで、動くきれいなコードを実装する経験できて、すごく嬉しかったです!!!
また開発生産性やテスト戦略にも触れており、自分がさらにレベルアップした後に、もう一度受けたくなるような研修でした。
とても貴重な時間となりました!ありがとうございました!
てつを
TDDという存在は知っていたものの、実際にTDDで開発した経験はありませんでした。今回の講義で、TDDで意識することや0からテストを書く方法を知ることができました。テストは「自分が分かればいい」ではなく、「10年後も、周りの人も理解できるように書くことが大切だ」と感じ、そのためにもTDDがあるんだ、と思いました。今回で「テスト0から書けない人間」を卒業することができ、自分のエンジニア人生においてとても貴重な時間となりました。
はるおつ
これまで「テスト駆動開発(TDD)はいいぞ」ということは多方面から聞いていたものの、明確な手順や技術を意識せずに雰囲気でテストを書いていました。今回の講義を受けて、TDDの流れや意識すべきことを講義形式で説明していただき、その後実践課題を進めることで、現場で使えるTDDのスキルが身につきました。複数回の1on1では、テストにすべき内容の分解方法から実装のアドバイスまでしていただき、テストとして意味のあるテストを書けるようになりましたし、なにより開発速度が向上しました。今回学んだ、TDDを普段の開発で今すぐ使いたくなる研修でした!
どすこい
TDDってテストを先に書けばいいんでしょ位の理解度から、予習の録画を見て世界が変わって、今回の講義で人生が変わりました!(変わる予定)
最初に印象に残ったのは、「茶番のテスト」でした。自分が陥りがちな「そもそもテスト自体が動かない」状態をテストしているということが、とても印象的でした。また、テストサイズの概念を導入することで、テストを種分けすることや、「重要かつ簡単なテスト」を多くして「非重要かつ難しいテスト」を少なく(なんなら無視)する手法が、「え?トレードオフじゃなくて良いとこどりできるんだ!」と感動しました!
chiroru
これまでTDDの概念は聞いたことがありましたが、実際に体験するのは初めてでした。今までは実装を担保する意識でテストを書いていましたが、テストから始めることで要件を担保する意識が強まりました。
質疑応答では、「要件を担保できていることを担保するにはどうしたらよいか?」という質問をさせていただきました。@t_wadaさんからは、「テスト実行結果のツリー構造のレビューを複数人で行っている。そのためには日常的にペアプロやモブプロを取り入れるなど、チーム全員が要件を(それなりには)把握している状態を保てるようにすることが大事だ」という回答をいただき、とても興味深かったです。
普段はSREとしてインフラ周りを触ることが多いですが、折りに触れて実務でもTDDを活用していきたいです。
ryu-ch
初めてのことが多く慣れていない中で、TDDのワークショップを1on1で複数回相談できたのは助かりました。
事前学習として 見てわかるテスト駆動開発 を見るという課題がありました。
この動画内では 普通のプログラマーが自信を持って着実に動作する綺麗なコードへ向かっていくためのテクニック
というふうにTDDのことを紹介していました。
動画ではこの意味がよくわからなかったですが、実践してみると悩まずにとにかく手を止めず前へ進めることができて感動しました。 TDDでは初めから完璧なToDoリストを書き出さずにコーディングとリファクタリングを経て都度ToDoリストを修正する、設計し続けるという手法を取ります。 それで気づいたらプロダクトコードとテストコードもできていて、なんならテストコードとToDoリストの構造まで一致しているというのはTDDという手法がいかに優れているか納得できる点でした。 保守の観点から見ても優秀ですし、とにかく手を止めないというのは開発者のモチベーションの面でもとても有用です。 是非ともこれからはTDDで開発していきたいと考えてます!!
dokozon0
TDDという言葉はよく聞くけど、実際にTDDを用いて開発した経験はありませんでした。TDDと聞くと「いかに上手くテストを書いていくか」みたいなイメージがありましたが、実際にTDDを実践する中で「コードの利用者側に立ってプロダクトコードを考えられる」という大きなメリットがあることも学びました。少しずつTDDを実務でも実践できるようにしていきたいです!ありがとうございました!
終わりに
TDDワークショップ開催に伴い、社内では全エンジニアを対象に参加者の公募が行われました。その結果、2024年の新卒パートナーをはじめ、Webエンジニア、モバイルエンジニア、SREなど、様々な部署のパートナーがワークショップに参加することになりました。
そのため、翌日から日常業務でTDDを積極的に活用していくことのできるパートナーもいれば、今後の業務に役立てるために新しい知識を習得しようと参加するパートナーもおりました。
ペパボでは「いるだけで成長できる環境」を掲げており、このように、学びたいという意欲のあるどんな人にも等しく学習の機会が開かれていることは、まさにカルチャーの体現であると感じます。