「ソフトウェアテスト気になる!でも全然わからん!」から「ちょっとわかる!楽しい!!!」になった2年弱を振り返る

おばんです、最近LoLばっかやってる田中です。リサンドラmidにハマってます。

今回はなんとなく、テストとの付き合いについて振り返りたくなったので振り返ります。 自分とテストの付き合いはだいたい2年弱が経とうとしています。 「全然わからん!」→「テスト楽しい!!!」までの2年弱の道のりです。

こんなことを書いていきます。

  • 前はどうだったか
  • 今どうなってるか
  • 今に到るまでなにをやってきたか
  • 特に印象的だったポイント
  • これから

前はこうだったよ

ここでする話は、もうズブズブの素人思考満載のはずかしトピックですが、同じように悩んだり考えてる人は多くいるのではと思います。 「わかるー」ってところがあったら「わかるー」って言ってくれるとエモです。

テスト全然わからん!

  • だいたい2年くらい前の頃の話です。
  • その頃は「とにかく実装するんだ!!!」という気持ちばかりでした。
  • 「まあ大丈夫!軽くデバッグした!動く!僕の書いたコードは最高!」という謎の自信もありました。
  • (自動)テストは大事だよとかよく言われてますが、無くても意外とどうにかなっていた。

厳しいデグレ、デバッグ、手動テスト

  • でもそれは、ただ自動テストが無くても意外となんとかなる規模の開発をやっていたに過ぎませんでした。
  • ちょっと大きな開発だと、たまに厳しいデグレが起きたりしました。
  • デバッグや手動テストがしんどいこともありました。
  • でも期限は決まっているので、なんとかメジャーケースは非効率な手動テストをこなすことでクリアしていました。
  • 開発終盤の、コードを書く時間 <<<<< 手動テストの時間には苦痛を感じていました。

ぼんやりした設計に対する考え

  • 大きな規模の開発では、テストよりもアーキテクチャパターンに対する興味が先行しました。
  • CleanArchitecture -> MVP -> etc...という感じで学び進めて、なんとなくの理解を得ていました。
  • しかしテストに対する理解は少なく、その効能は半減。
  • 「秩序が生まれてコードが読みやすくなる」程度の、少しぼんやりした理解でした。

プラットフォームを問わず幅広く活用できるスキルへの憧れ

  • これまでの項目より少し話が逸れますが、ずっとプラットフォームを問わず幅広く活用できるスキルへの憧れが強くありました。
  • アーキテクチャパターンについて学び、まとめ、発表していくことで、その力がつく実感がありました。楽しかった。
  • アーキテクチャパターンについて学んでいくことで、地続きの話として「テスト」があることに気づいて、次の幅広スキルはコレ!と思うように。

今こうなってるよ

苦しい恥ずかしい状況から、テストについて学ぶことで次のようなパワーアップを果たしました。

設計に対する指針が出来た

  • 設計の主な目的はメンテナンスしやすさだと思ってます。
  • 可読性と、変更のしやすさと、そんな感じです。
  • アーキテクチャパターンを学んでいるだけだと「可読性が上がる」のみで、変更のしやすさ=壊していないかどうかに対しては弱くて、片手落ちです。
  • 壊していないかどうかはテストによって担保していく領域で、設計のスキルとは相互補助の関係にあります。
  • どっちもやることで、「「「力」」」がつきました。

開発が早くなった?

  • コンパイラで推し進める書き換えと、テストで推し進める書き換えの使い分けができるようになりました。
  • インターフェースの修正はコンパイラによって検査されて、実装の修正はテストによって検査されます。
  • 今自分が行なっている作業がどっちなのか理解することで、どういう検査をしなければいけないかはっきりさせることができました。
  • インターフェースの修正をしただけなら、ビルドするだけで正確さが確認できます。
  • テストのある箇所に対して実装の修正をしただけなら、テストを走らせることで(だいたいの)正確さが確認できます。
  • この使い分けはTDDを学ぶことで違いに気づけました。仮実装・明確な実装・三角測量、コンパイラ・テストの使い分けという感じです。
  • 気持ちよく、テンポよく開発を進められるようになって楽しくなりました。
  • ただし取り組む開発の規模や課題も難しくなったため、単純な比較が難しくなりました...。なので、「たぶん」早くなったという認識です。

本が書けた

  • 技術書典4に参加するために、ちょうどハマっていたテストやTDDについてまとめて書く機会を得ました。
  • 『Swiftで書いておぼえるTDD』という本を書きました。SwiftでTDDを解説していく本です。
  • これは同人誌として出しましたが、商業誌化もしました。今ちょうどKindle版がセールやってます。気になればポチ!
  • 「商業誌デビュー」という実績を解除しつつ、同人誌版をBOOTHというサービスで出したことをきっかけに転職もしました。
  • とんとん拍子すぎて、「テストを学ぶことで、こんなに成功しました!」という、雑誌の最後の怪しい広告みたいになってる。ウケる。

今に至るまでこんなことしてきたよ

いろんな良いことにつながりましたが、ここに至るまで色々なことがこの2年弱でありました。 どれも楽しいことでした。

イベントへの参加

  • そもそもテストを「学ばなければいけないきっかけ」を登壇駆動で作りました。iOS Test Night #2での登壇です。
  • 最初は教科書写したみたいなすごく恥ずかしい発表内容でした。
  • 「やろうやろう」と思ってやり始められない時は強制的に締め切りを作るライフハックです。登壇駆動学習。
  • これをきっかけに学び始めた、ユニットテストの書き方、Test Double、サービス開発におけるバランスはエンジニアとしての成長に凄まじく影響を与えました。

『はじめて学ぶソフトウェアのテスト技法』

  • 「単体テストの書き方」みたいな話はネットでざっくり読んでやっていましたが、ソフトウェアテスト一般に関する話や項目の洗い出しについてなどはわかっていませんでした。
  • そういうのは体系的に本を読むのがよくて、この本はわかりやすくてよかったです。
  • 前職の本棚に置いてあるのを読みつつ、@tarappoさんに転職祝いとしてプレゼントしてもらいました。今でもたまに読んでいます。

@t_wadaさんのハンズオンや講演への参加

  • 国内のテスト駆動推進者である@t_wadaさんの講演や、TDDBCへは以前から何度か参加していました。
  • 実体験を重ねつつ、プロダクトで実践するための経験値が得られました。
  • 実は5年くらい前、学生時代にはすでにTDDBCに参加していましたが、その頃はプログラミングもしょぼしょぼだし、テストのありがたさもわかっていませんでした。
  • 実務経験がないと理解できない、規模がそれなりの開発でないとありがたみを体感できないというのはあると思いました。

『テスト駆動開発』との出会い

  • イベントに参加したりあれこれしているうちに、バイブルが発刊されました。
  • あまりに面白くて、なんども読み返して、触発されて本を書いてしまうほどのものでした。
  • この本はJavaで書かれていますが、自分はJavaScriptとSwiftで書きました。
  • 言語によって歩幅の差があったり、環境の違いがあることに気付いて、Swiftプログラマにとっての敷居を下げるために、Swiftで解説した本を書きました。
  • TDDは言語によっての向く場面、向かない場面の差があったりするということが良い気付きでした。
  • この話を一般化して、向く場面、向かない場面というのはいろんな物事にあって、設計においても、プロダクト開発においても、ツールの使い分けの判断ができることは「強さ」に繋がるということに気付けたのも、エンジニアライフ的にはかなりのインパクトでした。

WACATEへの参加

  • WACATEという、テストエンジニアのためのイベントにも参加しました。
  • これまではコードを書くプログラマの視点の大きなものでした。
  • 一方でQAやテストエンジニアといった、テスト自体に重きを置いて開発に携わる人々がいて、そんな人々と接点を得られたのがWACATEでした。
  • カリキュラムももちろん良いもので、「テストとは!」も勉強になりましたが、それよりも普段接しない人と話をする機会が得られたことの方が大きかったです。
  • 目線が全然違くて、同じものに向き合っているのは確かだけれど、言葉のチャンネルや意識のチャンネルが違うことが面白かった。
  • たぶんプログラムを書く人との間には専門領域の違いがあって、隔たりもあるのだけれど、向いてる方向は同じ感覚だったので、気持ちが良かった。
  • もし開発で関わる機会があれば、言葉や考えを相互に理解すると圧倒的「「「力」」」を得られそうだと思いました。

本の執筆

  • 本を書く熱意が生まれたのは、『テスト駆動開発』を読んだからでした。
  • すごく良いことが書かれていたというのが大きな理由で、それが自分が得意とするiOS/Swiftという領域ではあまり知見が無さそうだったので、ちょうどタイミングがマッチしました。
  • ちょうど技術書典が盛り上がってたので、波に乗れて良かった。
  • 本を書くのはとてつもない重労働です。。。
  • 文字を書くということではこれまでブログを数多く書いていましたが、ターゲットや正確性などのスコープが全然違うので、少しスキルが違かった。
  • ここで本書きを経験することで、『iOSアプリ設計パターン入門』の執筆にもつながりました。
  • こちらは1300人を超える人が買ってくれて、すごい、すごい気持ちです。
  • 技術書でこの売れ行きはすごいらしい。

ターニングポイント

多分ここ2年弱を形作って、次に繋げているのは以下のきっかけ。 人間動くとそこに道ができる。 いただけている機会には感謝しかない。。。

これから

最近転職して、サービス開発をしていますが、まだまだ悩みや苦しみはつきません。 これまでは「動かないマトに当てること」の練習をしてきました。 サービス開発は生き物で、機能開発・リファクタリング・テストのバランスはとても難しいです。 これからは「動くマトに当てること」を練習していく必要があります。 まだまだ試せていない自動化やUIテストの実施なんかがあったりします、絶対楽しいのでやっていきたい。

正直手が足りてないことも一因なので、僕と一緒に働いてみたいとか、興味あるという嬉しいことを思ってくれる人がいれば、お声がけください!!!

さいごに

そう、テストは楽しいんです。 だって特定のプラットフォームに限定した考えじゃないし、うまくすれば実際の生活にも役立てられる幅広いスキルだからです。 しんどい開発はラクにして、気持ちの良い開発を、もっと長く気持ちよくさせるためのスキルです。 この記事でテストを好きになる人が増えたらいいなって思うます。