見出し画像

技術的負債解消への取り組み|レガシーコード改善t-wadaさんワークショップを開催!

こんにちは。Developer Relations (技術広報)担当の波多野です。

弊社では、約1,200法人グループへの導入実績を持ち、月間400万人以上の給与計算を回している大手法人および公共・公益法人向け統合人事システム「COMPANY」を開発しています。

2023年12月4日、日本のテスト駆動開発の第一人者である和田卓人さん(以下t-wadaさん)をお招きし、実際の「COMPANY」製品ソースコードを利用したレガシーコード改善ワークショップの第2回を開催いただきました!


ワークショップ開催の背景

WHIが抱える技術的負債について

長期にわたるサービス提供のためには技術的負債への取り組みが重要です。20年以上サービスを提供してきた我々の製品「COMPANY」も技術的負債に直面しており、サポート対象のソースコードの複雑化や開発の課題が見えています。これらの課題への取り組みとして開発文化を少しずつ丁寧に変革する「開発力向上プロジェクト」を立ち上げ、自動テスト拡充や開発者育成を行っています。この取り組みの一環として、和田卓人さん(以下、t-wadaさん)にご協力いただき、開発者向けの講演やワークショップを開催しました。

第2回ワークショップを開催した理由

今回のワークショップは、昨年6月に開催されたワークショップの第2回です。(第1回のワークショップについては、こちらのnoteで公開しています)ワークショップを体験した開発者を増やすため、前回とは参加者を変えて実施しました。参加者が開発している製品も異なるため、対象のソースコードも一から選定し直しています。

第1回ワークショップと異なる点について

前回は「仕様化テストを書く」ワークショップを実施しました。しかし、技術的負債への取り組みでは、テストを書くことだけがゴールではありません。その先にある「複雑化・肥大化したソースコードの改善」まで挑戦していくことが必要です。

そのため、今回のワークショップでは、前回から一歩進んで、仕様化テストで保護した範囲に対して、コードの複雑性を解消するためのリファクタリングを行うところに踏み込みました。それにより、技術的負債の解消を楽しいと感じ、自信を持ち、学んだ内容を担当する製品コードでも取り入れたいと思える状態を目指しました。

ワークショップについて

講師:t-wadaさんのご紹介

t-wadaさんは、テスト駆動開発の第一人者として活躍されており、執筆活動や講演、ハンズオンイベントなどを通じてテスト駆動開発を広めるためにご活躍されています。

ワークショップの概要

前半(午前)
ライブコーディング t-wadaさんとのペアプログラミングを社内配信
後半(午後)
冒頭に t-wadaさんよりテストに関する講義をいただき、その後モブプログラミング・ペアプログラミング(以下モブプロ・ペアプロ)を実施。それぞれ以下の時間配分で行いました。

120分:各チームでコーディング 
20分  :中間発表(2チーム×10分)
120分:各チームでコーディング 
20分  :最終発表(2チーム×10分) 

ワークショップ前半(ライブコーディング)

ライブコーディングは、以下の2点を目的に実施しました。

視聴者が
・DB(データベース)接続を伴うレガシーコードのテストの書き方が分かること
・単体テストで何をテストすべきかが分かること

第1回ワークショップの事後アンケートでは「DBアクセスを伴うレガシーコードのテストの書き方を知りたい」という感想が複数ありました。現状のテストコードでは、カバレッジ率を上げることだけが目的になっており、「何をテストしているか第三者がわからない」「ドメイン知識がない状態でテストする」「とりあえずMock(モック)を使う」という状態になっていることが多いことが課題でした。このため、カバレッジを網羅するという観点だけではなく、システム的に何をテストをすべきかにピンを留めました。

当日の様子

まず初めに、t-wadaさんから今回のライブコーディングの目的の説明をしていただきました。ライブコーディングでは、t-wadaさんにSlackでの反応を見ながらナビゲートしていただき、作問チームがドライバーを務めました。また、t-wadaさんと作問チームでSlack上の質問を所々返していったり、t-wadaさんの解説も織り交ぜながら進めていきました。


配信側の様子

ライブコーディングの後半では、予期せぬハプニングが発生しました。今回のテスト対象メソッドでは、日時のデータを扱っていました。しかし、先月時点では正常動作していたテストコードが、月が変わったライブコーディング当日になると動作せず、シナリオ作成時点では発生しなかったエラーが出てしまいました。予期せぬエラーでしたが、エラーメッセージから仮説を立てて解消し、臨場感のあるライブコーディングになりました。

ドライバーを務めたのは、2022年新卒入社の新谷奈々さん。約300人が視聴する中、入社2年目とは思えない落ち着きで、ドライバーを務めてくれました!

ドライバーの新谷さんとt-wadaさん

<ドライバー新谷さんのコメント>
エラーが発生した時は、まずエラーログを見て、デバッグして、仮説を立てて検証するという流れを作問段階で何度も経験していたおかげで当日も特に滞ることなく進めることができました!

ライブコーディングの満足度
セッション後は、視聴していた社員へアンケートも実施しました。

▼自動テストを書く必要性についての納得度はどの程度ですか。

約96%の方に「納得できた」と回答いただけました。(前回約97%)

本講演のどういった情報が納得に繋がりましたか

▼これから「自動テスト」をどの部分からどのように実装していくかイメージできましたか。

約86%の方に「イメージできた」と回答いただけました。(前回約84%)
前回に引き続き、満足度の高いライブコーディングとなりました!

ワークショップ後半(ペアプログラミング)

後半は、オンサイトでペアプログラミングを実施。前半のライブコーディングで扱ったメソッドについて、2〜3人のチームに分かれて修正方針を決定しリファクタリングを行いました。

中間発表と最終発表の時間では、代表のチームに修正方針や修正内容を発表し、t-wadaさんからコメントをいただきました。事前に用意していた模範解答では、次のような流れを準備していました。

1.DB接続を伴い、分岐を網羅する形でJUnitテストを作成
2.テストの保守性を保つのが難しく実行速度が遅くなるDB接続を伴う箇所と、DBから取得したデータを操作する箇所をリファクタリングで完全に分離
3.DBから取得したデータを操作するロジックに対してJUnitテストを書く
4.DB接続を伴う箇所へのJunitテストのテストケースを最小限にしてテストコードも保守性の高いものへと変更する

しかし、実際はDBから取得した情報を格納する値オブジェクトを作成し、Builderパターンを採用することで可読性向上とインスタンス生成時の確実性向上の工夫がされたチームや、ポリモーフィズムを用いるアプローチで一気に可読性を上げていくアプローチをとるチームがあったり、作問チームで用意していた模範解答とは異なる様々な方法で修正し、議論をしていて、とても学びになる時間でした。

今後の技術的負債への取り組みについて

今回のワークショップ運営の中心であり、Technical Executive として開発力向上プロジェクトで開発者育成を務める山本隼也さんに、今後の技術的負債の取り組みへの想いを聞きました。

これからも、技術的負債の解消に挑戦していく風土を作っていきたいです。そのためには、技術的負債の解消を楽しいと感じ、自信を持ち、担当する製品のコードでもやりたいと思えることが重要です。開発者自身が「楽しい」と感じることができれば、指示されなくても自らやりますから。そして、挑戦した事例を社内で蓄積・共有していき、周囲のチームが参考にしたり、真似できるような環境を整えていこうと考えています。

記事は以上となります。
和田卓人さん、貴重な機会をいただき本当にありがとうございました。
ここまでお読みいただきありがとうございます。


t-wadaさん(写真中央)と作問チームの皆さん

\エンジニア積極採用中です!WHIの採用情報はこちら


この記事が気に入ったらサポートをしてみませんか?