ミクシルでは、過去に「Unity Engine Challange」「git challenge」「Bug Shooting Challenge」と、学生に向けた技術イベントの数々を紹介してきました。今回は”チャレンジ”シリーズの一環である「TDD challenge」の模様をお届けします。
TDD(Test Driven Development=テスト駆動開発)は、実装前にテストコードを書き、そのテストで最低限の動作を確認した後にリファクタリングを重ね、コードを洗練化させていく開発手法のひとつ。
例年開催しているイベントではありますが、今年はオンラインでの開催ということもあり、過去とすこし違う手応えのイベントになったのだとか。
「TDD challenge」がどのような様子だったのか、担当エンジニアと岩名と丸尾に話を聞いてみました。
━━今年のTDDチャレンジは、どのような内容だったのでしょうか?
丸尾 今年は大きく三部構成にしていて、まずはTDDにまつわる概要の説明と当日のプログラムの案内、次に実際の問題を解いてもらう演習の時間、そして懇親会、という構成でだいたい13時くらいから19時にかけて、半日のプログラムとして実施しました。
━━半日!結構しっかりと学ぶ一日なのですね。
丸尾 そうですね。実際に考えて問題を解いてもらう時間もあるので、みっちり頭を使う時間ではあるかもしれないです(笑)。
━━演習の時間はどのような問題が準備されていたのでしょうか?
岩名 大きく難易度を三段階に分けて、問題を進めるにつれて難易度をあげていきました。最も簡単なものは、「税率の計算」。こちらで用意したある値に対して、5%・8%と異なる税率をかけて表示するテストコードを書く問題です。二つ目は「元号の問題」。西暦と元号(和暦)の表をインプットして、西暦20XX年と入力すると令和◯◯年、といった風に打ち返してくれるもの。最も難易度が高いものは「メールアドレスの検証」の問題で、入力したメールアドレスに”使用不可能な文字列が含まれていないか””メールアドレスの形式に則っているか”を検証するものでした。
これらの問題を、それぞれの進捗具合を見ながら順番に進め、一問終わったら解説…という流れで進めていきました。
━━なるほど。その問題は、学生だと結構苦労するものでしょうか?
岩名 そうですね。そもそも学生だと、コードを書いたことがあったり簡単なゲームを作ったりすることはあっても、その後にテストコードを書くなんてことがほとんどないので…もちろん、僕もそうでしたし(笑)。学生の皆さんも、結構苦労して取り組んでくださっていたと思います。
丸尾 テストコードって、実際にプログラムを実装し終えた後に、そのプログラムが正常に動作するか、どの状況なら動作しなくなるかを検証するもの、保守性や安定性を担保するためのものなので、趣味で開発をしている場合だと、やってみることはあまりないものなんですよ。
━━じゃあ皆ほとんど同じスタートラインでイベントに挑むんですね。
丸尾 そうですね。テストコードを書くことについては、参加者ほぼ全員が未経験者なのではないでしょうか。
━━参加に必須なスキルなどもあったのでしょうか?
岩名 特にありませんが、今回はRubyでテストコードを書きます、と告知していたので、JavaScriptやPythonなどの動的型付け言語を学んでいる方々が参加してくれました。
━━Rubyを触ったことがない人もいたと?
岩名 ですね。ただ、動的型付け言語を一回触ったことのある人であれば、ある程度考え方や癖のようなものの感覚は掴めていると思うので、全くわからない!ということにはなりませんでした。
━━なるほど。オンラインでの開催でしたが、どのように行ったのですか?
丸尾 「Remo」というオンラインビデオツールを使って、二人一組になってもらい、いわゆるペアプログラミングで挑んでもらいました。チューターは2,3組を掛け持って学生をサポートするようなかたちでしたね、
岩名 このサービスを簡単に説明すると、座席表を俯瞰したようなホーム画面があり、そこに二人一組で座った各テーブルが並んでいて、テーブルをクリックすると、そこに配置されている人とボイスチャットが出来るようになっています。チューターは各チームのテーブルを見回りながら、学生のサポートを行っていました。
━━やっぱり対面の方がやりやすかったですか…?
岩名 実際にイベントを実施する前は、私たちもそう思っていたのですが、当日を迎えてみると、オンラインの方が勝手のいいことがとても多かったです。
丸尾 そうですね。思った以上にやりやすかったです。
━━それはどういった点でしょうか?
岩名 ひとつは、関係を築けることですね。例年だと大部屋に集まってもらって、そこを数人のチューターがぐるぐると見回りながらサポートをしていくのですが、学生からすれば質問を投げかける相手やアドバイスをもらう相手が都度変わるわけです。そのため、なかなかそこで関係を築くのは難しかったのですが…。
丸尾 今回のようなやり方だと、基本的に半日同じチューターとやりとりをするので、ある程度学生の方も緊張がほぐれて質問がしやすくなったり、中には、部屋に入った時に嬉しそうに歌を歌ってる学生もいたくらいでした。
岩名 いましたね(笑)。関係を築けるとチューター側もコメントをしやすくなるので、そういったメリットもありました。
あとは、書いているコードを覗き込むよりも画面を共有してもらう方がこちらも見やすく、なにか説明をする時もこちらの画面を共有すればよいので見てもらいやすく、とお互いにとってやりやすい部分もあったと思います。
━━ちょっと意外ですが、技術イベントならではのメリットですね。
━━ミクシィでは新卒のエンジニア研修にもTDDのプログラムがありますが、率直なところ、TDDのメリットってどのようなものですか?
丸尾 大きく分けて3つあります。ひとつは、プログラムの実装前に動作を確認できる「安心感」。2つめは、何度もリファクタリングを繰り返すことによる「引き継ぎのしやすさ」。テストコードはひとつひとつ順を追って書いていくことになるので、たとえ担当者が変わったとしても、コードリーディングにかける時間がぐっと減るんです。
岩名 動作のシナリオに合わせて書いていくうえに、その例外まで記述できるので、テストコードを見ればどのような挙動をしているかが一目瞭然になるんですよね。
丸尾 3つめは、「バグを早期発見できる」ことです。テストコードは複雑な状況を再現しやすいので、QAだと最後の方に確認するような部分も、あらかじめ実装前に気付ける。異常系を想像して書きやすくなる、というメリットがあります。
━━慎重に開発を進めていけるものだと。それが出来るようになると、なにが嬉しいのでしょうか?
丸尾 個人で簡単なゲームやプロダクトを開発している人には、あまり影響のない話なのですが、プロダクトやサービスの保守性、安全性に大きく繋がりますし、実装を進めていく中でバグを見つけてロールバックして…という行き戻りの時間が削減できるので、実装全体で見た時には工数の削減にもなります。
岩名 あとは、何度もリファクタリングを繰り返すので、綺麗な設計、コードが書けるようになる利点もありますね。
━━おぉ…! かなり実戦向けのスキルなわけですね。
━━では実際に、今回のオンラインでの開催は学生も喜んでくれた?
丸尾 …だと思います(笑)。先に話したように、同じチームで半日過ごせたことで関係を築けた部分も大きいですし、学生にとってもあまり触れたことのない技術に触れられたいい機会なのではないでしょうか。
岩名 イベント後にとったアンケートでも、5段階中の満足度が4,5が9割以上を占めていた*ので、ある程度有意義なイベントだったと思ってくれているのではないでしょうか。
▲*実際のアンケートの満足度の割合
・テストコードは、あまり書いて来なかったので、今回のワークショップをきっかけに色々書いてみようと思いました!テスト以外にも、Rubyの基礎知識を学ぶことが出来て良かったです!
・Rubyは未経験でなかなかプログラムをスムーズに書けないこともあったのですが、ペアプログラミングで長濱さんにプログラムの書き方などを教わったり、たくさんのことを学べたと思います
・テストは普段から書いていますが、きちんとTDDで開発したことはあまりなかったので面白かったです。オンラインのペアプロもはじめてだったので色々学ぶことがありました。
▲アンケートで寄せられた当日の感想(一部抜粋)
━━それはいいことですね。次の開催もオンラインになるのでしょうか?
岩名 まだはっきりとは決まっていないのですが、今回のオンラインで、ペアになった学生に担当チューターがつく方がやりやすいということは分かったので、対面でイベントを行う際も同じようなかたちにするとか、最も適したかたちを見据えながら開催の方向を決めていきたいと思ってます。
丸尾 そうですね。この「TDD challenge」のように半日でTDDについてある程度理解できるようなプログラムは他にないと思うので、よりアップデートしながら続けていくと思います。
━━なるほど。最後に、次回参加したい!という学生に向けて一言いただけますか?
岩名 TDDは、マストで求められる開発手法ではありませんが、いざ何か大きな開発の動き出しをする時の手のひとつとして知っておくことが、とても重要だと思います。こつこつと検証を進めていくので、すごく派手な技術ではないですが(笑)。逆に、そうしたこつこつとした作業を楽しく続けられる方にはマッチするのかなと思います。このイベントは特に前提知識があまり必要ないので、臆することなく参加してもらえると嬉しいですね。
丸尾 自分自身、新卒でTDDの研修を受けた時にRubyを触った経験がなかったので心配だったのですが、Pythonを触った経験があったことでスッと理解することができました。なので、同じ動的型付け言語にチャレンジしておいてもらえると理解が早いかなと思います。また、友人とペアで参加してもらうことで友人とひとつの問題に協働して挑むことが出来ますし、一人で参加してもらう場合でも、そこでコミュニティが広がる可能性がある。私も学生ならぜひ参加してみたかったと思うようなイベントなので、ぜひイベントでお会いできることを楽しみにしています。
半日という、長いようで短い時間の中で、ほぼ触ったことのない開発手法と向き合ってくれた学生の皆さん。未体験なことはもちろん、そこで四苦八苦して問題を解くからこそ身についた知識や気付きもたくさんあったのでは、と思います。
ミクシィグループでは、引き続きエンジニアの学生向けに様々な技術イベントを開催予定です。直近で開催予定は以下の2つ。下記をチェックして、ぜひ自身のスキルを伸ばすきっかけにしてみてはいかがでしょうか。
Unity Engine Challenge by mixi GROUP #2 ONLINE
日時:2020年12月12日(土) 13:00〜20:00 予定
応募〆切:11月29日(日)23:59まで
実施:オンライン
Bug Shooting Challenge #5 ONLINE(不具合調査ワークショップ)
日時:2020年12月19日(土)11:00〜19:30 予定
応募〆切:12月6日(日)23:59まで
実施:オンライン