見出し画像

ミイダス社内勉強会レポート【講師:和田卓人(t-wada)さん】質とスピード

こんにちは。ミイダス Tech Officeです。先日、特別講師として和田卓人(t-wada)さんに「質とスピード」について講演をいただく社内勉強会を開催しました。今回はその勉強会の様子をご紹介いたします。


今回はオンライン講演ということで総勢93名のメンバーがzoomに集まりました。和田さんは冒頭で次のように述べられました。
「私はオンラインでの社内講演を行う際、実況中継のSlackを非常に重視しています。オンライン講演は静かで盛り上がりに欠けることがありますが、私のオンラインの社内講演では、皆さんが同じ時間に同じ講演を聞いている実感を持つことを重要視します。自分が感じていることを他の同僚がリアルタイムで共有していることを目撃することで、単なる動画視聴ではなく、みんなで共有している実際の講演であるという感覚を養うことが大切です。今日はSlackで活発に交流し、過去最大の盛り上がりを目指していただきたいと思います。」
アイスブレイクで何を食べたか問われると、実況中継Slackは一気に大きな盛り上がりを見せました。

最大流速を見せるミイダス社内実況中継Slack

質とスピード

和田卓人(t-wada)さんによる講演「質とスピード」では、ソフトウェア開発における質とスピードの関係について深掘りされました。質とスピードがトレードオフの関係にあるという典型的な誤解を解き明かし、両者が共存可能であることを示します。この講演は和田さんの一番人気の講演であり、過去発表された資料や動画が公開されているのでぜひご覧ください。

これまでに繰り返し講演された中での最新版であり(2024年1月時点)、ミイダスの実況チャンネルの会話の中で講演内容をカスタマイズしていただいています。

今回の講演内容については本記事では言及せず、メインコンテンツである実況中継のSlackの様子や質疑応答の一部をご紹介させていただきます。

実況中継 Slackの様子

与えられた時間に対してやるべきことが多すぎる場合、どうすべきか?

問いに対してスタンプを使って意見を集計するシーンも。

品質とは?

品質の定義。ひとりひとり違うのが面白いですね。

蘇るトラウマ

ひとりひとり経験したトラウマを思い出してSlackが盛り上がる。

和田さんへの質疑応答タイム

Q. テストがない、または少ないプロジェクトのにおいて、品質を上げるためにテストを追加する場合は、どこから手を入れていくべきでしょうか。まずテストを書けるコードにするか、無理やりでもまず今のコードに対してテストを書くか、メソッド単位のユニットテストから書くか教えて下さい。

非常に良い質問です。また、よくある質問でもあります。この点に関しては状況によりますが、まず参考文献として挙げるならば「レガシーコード改善ガイド 」という書籍をお勧めします。これはベストセラーの中でも特に人気のある書籍です。本書で言及されているレガシーコードとは、テストコードがないコードのことを指します。

レガシーコードには特有のジレンマがあります。テストが書かれていなかったコードは、後からテストを書くことが難しい構造になっていることが多いのです。そのため、テストを書くためには構造を変更しなければならないのですが、構造を安全に変更するためにはテストが必要です。このように、コードを変更するためにテストを書きたいが、テストを書くためにはコードを変更しなければならないというデッドロックが発生します。これがレガシーコードのジレンマです。この問題を解決するには、テストを書きにくいことを承知の上で、大胆にテストを追加するか、あるいはテストが書けるようになるまで比較的安全と思われる技術を用いて構造に手を加えるかのいずれかが必要です。

これは排他的な方法ではなく、2つのアプローチを組み合わせて行うことが一般的です。つまり、エンドツーエンドテストなどで外側から大まかにカバーしつつ、設計の可動域を広げ、内部に手を加えてテストが書きやすいポイントを作り出し、テストピラミッドの形に近づけていくという方法です。既存の構造に対してユニットテストを書いても、コストパフォーマンスが良くないことが多いです。なぜなら、既存の構造はすでに最適な状態ではないことが多いからです。そのため、細部の構造は変更が前提となります。外側から包み込み、ある程度安定してテストを実行できる粒度でカバーすることが重要です。

Webシステムの場合、リクエストとレスポンスの部分が安定しており、カバー範囲も広いため、このレベルのテストで包み込み、内部を整理しながらリファクタリングを進めるという方法が有効です。この点に関しては、最近行った講演を紹介させていただきます。実際にテストコードがないプロダクトコードを引き継ぎ、どのように改善したかについての実例を紹介した「実録レガシーコード改善」という講演を行いました。是非社内で講演のアーカイブの上映会を開催していただき、議論していただければと思います。

Q. トレードオフになっているものの一つに育成教育がありましたが、育成に投資してから投資回収する前に育成対象が転職するリスクなどとのバランスに関して、お考えがあればお伺いしたいです。

これにはリスクが伴いますが、リスクがあるからといって教育を行わないわけにはいきません。教育というものは、待遇の向上とセットで考えるべきものです。つまり、どこに出しても恥ずかしくないレベルの教育を施し、どこにも出ていきたくないと思わせるほどの待遇を提供することが理想的なのです。したがって、教育を適切に行い、教育を受けた人々が残りたいと思うような組織と待遇を整えることが重要です。これは非常に直接的な話ですが、結論としてはそういうことになります。
教育を与えないことで、組織としては結果的に行き詰まってしまうということです。他の会社に行って戻ってくるということも重要なので、エンジニアたちに対して門戸を開き、大切にすることが重要です。リスクとのバランスを取るというよりも、教育を行い、文化を良くし、待遇を高めるということがワンセットとなっています。

Q. ボブおじさんなど講演内容に賛成派の登場人物が多くいらっしゃいましたが、反対派の意見はあるのでしょうか。質を上げてもスピードは上がらないよなどの反対意見です。

ボブおじさんは特に過激派の急先鋒であるため、異なる意見を持つ人々ももちろん存在します。有名な例として、「A Philosophy of Software Design」という書籍があります。この書籍の著者であるJohn Ousterhout氏は、ボブおじさんの主張が部分的には正しいものの、完全には正しくないと主張しています。この書籍は翻訳される可能性は低いものの、比較的読みやすい英語で書かれており、名著とされているためお勧めします。また、私は「fukabori.fm」というポッドキャストでこの書籍について語っていますので、そちらも是非お聞きいただければと思います。(100. A Philosophy of Software Design (1/3) w/ twada

さらに、バートランド・メイヤー氏はプログラミング言語Eiffelの開発者であり、「デザインバイコントラクト契約による設計」という書籍を通じて設計の考え方を示しています。彼は「アジャイルイントロダクション」という書籍も執筆しており、この中でソフトウェアエンジニアリングの観点からアジャイルソフトウェア開発の良い点と悪い点を率直に述べています。これら2冊の書籍は、アジャイルに関する良い点と悪い点を明確に述べているため、バランスの取れた理解を得るために読むことをお勧めします。

Q. 今ミイダスでは、ユニットテストを書くかどうかは任意になってます。これはまさにスピードを優先した結果なんですが、今回の講演でユニットテストを書くメンバーが増えるんじゃないかと期待してます。スピード保守性を高めるために次に取り組んだ方がいいことや、それに関する良書などありましたら教えていただきたいです。

ユニットテストを書くことを推奨します。また、ユニットテストを書くことで開発速度が向上すると考えられます。これは本日の講演で皆様に理解していただけたと思います。しかし、ユニットテストにも巧拙があり、逆に効率が悪くなってしまう場合があります。例えば、リファクタリングによって頻繁に変更されるような部分に対して、テストが過度に詳細になると、かえって開発の妨げとなることがあります。この点に関して優れた書籍として、最近出版された「単体テストの考え方/使い方」という書籍があります。こちらは非常に良書のため、読書会などで取り上げるのも良いでしょう。細部については異論がある場合もありますが、基本的には賛同できる内容のため、この書籍を押さえておくことを強くお勧めします。

Slackでの議論のように、ユニットテストにおいてモックを過度に使用すると、実装と密結合してしまいがちであるため、これは推奨されません。モックやスタブをなるべく使用せずにユニットテストを記述することが、開発の変更容易性を支える方法です。このアプローチを古典派と呼びます。古典派のテストの書き方についてお勧めの書籍としては、「単体テストの考え方/使い方」と「Googleのソフトウェアエンジニアリング」という書籍があります。特に後者の書籍にはテストの書き方に関する章が含まれており、これも非常にお勧めです。

まとめ

和田さんの講演「質とスピード」は、ソフトウェア開発における質とスピードの関係を深掘りし、新たな開発の視点を与えてくれる素晴らしい勉強会となりました。実況Slackチャンネルを活用することで、オンラインでありながら参加者がリアルタイムで共有し、講演の盛り上がりを肌で感じることができました。講演の最後の質疑応答では、開発現場での選択肢や品質に関する考え方、テストの重要性などについても触れられました。和田さん、素晴らしい講演をありがとうございました!

今後もミイダス社内での技術向上とコミュニケーションの活性化を目指し、社内勉強会を継続していきたいと思います。

ミイダス Techについて

ミイダスでは、様々な技術イベントを開催しています。connpassやYouTubeチャンネルでミイダスグループのメンバーになった方には、最新の開催情報やアーカイブの公開情報が届きますのでぜひご登録をお願いいたします。

イベントページ:https://miidas-tech.connpass.com/
Twitter:https://twitter.com/miidas_tech

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