give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

雑に作って、それから作り込んで、最後にテストを書く「テストラスト」開発

(この話は最初Twitterに書こうと思ったけど、長くなるのでブログに書くことにしました)

僕はRSpecやMinitestでテストを書くのは得意ですが、常にテストファースト(TDD)で開発するとは限りません。
今業務でやってるタスクはこんなふうに進めてます。

雑に動くものを作る
  ↓
見た目をきれいにする&機能を作り込む
  ↓
テストを書く
  ↓
リファクタリングする

この順番で開発する理由を以下に述べます。

雑に動くものを最初に作る理由

最初は見た目とか、異常系とか、細かい仕様とかを無視して、正常系が一通り動くものを作ります。

これはこれから作ろうとしているものの認識が合っているかどうかをPO(プロダクトオーナー)に確認するためです。
実際に動く画面を見せると「こんな感じでOK」とか「ここはこういうふうにしたい」というフィードバックをもらうことができます。

また、開発者としてもコードを書きながら「あれっ、こういう場合はどういう仕様にしたらいいんだろう?」という考慮漏れの仕様が見つかったりすることがあります。

Tips: あとで作り込む部分は忘れないように適宜TODOコメントを入れておくと良いです。

その次に見た目をきれいにしたり、機能を作り込んだりする理由

方向性を確認したら、見た目や機能の詳細を作り込んでいきます。

この時点でテストを一緒に書いていくこともありますが、「テストを書くのは時間がかかりそうだな」と思ったら、テストを全く書かずに進めることもありますたとえば、その機能に関連する既存のテストがなく、テストコードをゼロから書かないといけない場合などです。(一方、「これはテストを先に書いた方が、手と目で動作確認を繰り返すより速くなりそうだな」と判断することもあります。よって、書く、書かないはケースバイケースです)。

こうする理由は万一、何らかのトラブルでスケジュールが遅れそうになったときに「テストもないし、コードも汚いけど、最悪この状態でリリースすることは可能」という状態に持っていくためです(あくまで最悪のケースですよ!!)。

「テストをがんばって書いてたら当初のリリーススケジュールをオーバーしてしまった」よりも、「テストはまだ書けてないけど、とりあえずリリースはできた。順番が逆になったけど、リリース後にテストを書こう」の方がビジネス的には望ましいはずです。

補足:テストを書かずにリリース=不具合を残したままリリース、ではない

テストを書かずにリリースするときでも、最低限以下の2点はクリアしておく必要はあります。

  • 追加した機能についてはしかるべき担当者が手と目で動作確認している(=手動テストはクリアしている)
  • 既存の自動テストはすべてパスしている

つまり、「テストを書いていない」というのは「デグレしないことを担保する自動テストがないだけ」の状態です。
決して「手動テストすらやらずに、不具合の可能性を残したままリリースする」という意味ではありません。

もちろん、「テストを書かずにリリース」はあくまで最後の手段であって、やむを得ない理由がない限りやっちゃダメです🙅‍♂️

最後にテストを書いてリファクタリングする理由

一通り実装が終わったらテストを書きます。テストファーストならぬ、「テストラスト」ですね。

一通り実装が終わって「最悪このままでもリリースできる状態」になっているので、精神的な余裕をもってテストを書くことができます。

ちなみに「リファクタリングをしてからテストを書く」のではなく、「テストを書いてからリファクタリングする」というのがポイントです。

リファクタリングは「リファクタリングの前後でプログラムの挙動が変わらないこと」が大前提です。
この「挙動が変わらないこと(リファクタリングが原因でプログラムが壊れたりしないこと)」を担保するためにはテストコードの存在が必須です。

もしテストより先にリファクタリングをやってしまうと、挙動が変わらないことを開発者自身の手と目で担保しなければなりません。
これは非効率ですし、うっかりミスでプログラムを壊してしまう恐れもあります。

参考:コードレビューも分割して良い

作成する機能が大きいときは上記のステップが終わるたびにプルリクエスト(PR)を作成して、コードレビューしてもらいましょう。
すなわち、

雑に動くものを作る
  ↓
PR作成&コードレビュー
  ↓
見た目をきれいにする&機能を作り込む
  ↓
PR作成&コードレビュー
  ↓
テストを書く
  ↓
PR作成&コードレビュー
  ↓
リファクタリングする
  ↓
PR作成&コードレビュー

とするわけです(テストとリファクタリングはまとめてコードレビューでも可)。
あ、もちろんコードレビューが終わってもmainブランチにはまだマージしませんよ。mainブランチにマージするのはリファクタリングが完了してからです。

特に「雑に動くものを作る」段階で一度コードレビューしてもらうことは重要です。
なぜなら、コードレビューを受けることで技術的な方向性の根本的な誤りを指摘してもらえるかもしれないからです。

また、最後にまとめてPRをどーん!!と作成すると、diffが大きくなりすぎてレビュアーが苦労する可能性もあります。
PRはなるべく小口化することを心がけてください。

テストファーストで作ることはないの?

いえ、もちろんテストファーストで作るときもあります。
僕は以下の条件がどちらもYESになったときにテストファーストで開発します。

  • プログラムの仕様が明確である(作りながら「どうしようかな?」と考える部分がない)
  • その仕様を担保するテストコードをすらすら書ける自信がある(=テストを書くコストが低い)

たとえば、「 "alice@example.com" を "a...e@example.com" のように、ユーザー名の最初と最後の1文字だけ残してマスキングするメソッドを作れ」という要件があったりした場合は、上の2つの条件を満たすので次のようなテストコードを先に書いてしまいます。

RSpec.describe User, type: :model do
  describe '#masked_email' do
    context 'ユーザー名が3文字以上' do
      example do
        user = User.new(email: 'ken@example.com')
        expect(user.masked_email).to eq 'k...n@example.com'

        user = User.new(email: 'alice@example.com')
        expect(user.masked_email).to eq 'a...e@example.com'
      end
    end
    context 'ユーザー名が2文字' do
      example do
        user = User.new(email: 'me@example.com')
        expect(user.masked_email).to eq 'm...e@example.com'
      end
    end
    context 'ユーザー名が1文字' do
      example do
        user = User.new(email: 'x@example.com')
        expect(user.masked_email).to eq 'x...x@example.com'
      end
    end
  end
end

上のテストコードは何もドキュメントを見ずに、テストも一切実行せずに、エディタ上でひたすらコードを打ち込んだものです。
あとはmasked_emailメソッドを実装してテストを全部パスさせればいいだけですね。

こういうケースはテストファーストで開発するスタイルが有用です。

不具合修正するときもテストファースト

他にも不具合を修正するときもテストファーストで修正します。
具体的には以下のような流れです。

エラーを再現させるテストコードを書く(この時点ではテストの結果はRED🚨)
  ↓
エラーを修正する(場合によっては修正する前に、デバッガも併用しながらテストを実行してエラーの原因を調査する)
  ↓
テストがパスすることを確認する(テストの結果はGREEN✅)

テストを書いておけば不具合の再発も防止できるので一石二鳥です✌️

あわせて読みたい

そもそもテストコードってなんで必要なんだっけ?という基礎から学びたい方はこちらのスライドをどうぞ。

RSpecを使ってRailsのテストをすらすら書けるようになりたい!という人は、「Everyday Rails - RSpecによるRailsテスト入門」をどうぞ。
leanpub.com

勉強会で「良質な技術記事を量産する秘訣」をお話ししてきました #MeetsPro

2023年2月3日に株式会社N2iさん主催の勉強会、Meets Professionalで「Qiita 1位のアウトプットの達人が語る、良質な技術記事を量産する秘訣」という発表をしてきました。

n2i-engineer.connpass.com

当日使ったスライドはこちらです。

講演の前半は「僕がなぜアウトプットするのか、なぜそれを続けられるのか」について、後半では「アウトプットが苦手なみなさんの背中を押す話」をしました。
また、講演が終わった後は参加者のみなさんからの質問に答えるQ&Aタイムもありました。

YouTubeでダイジェスト動画が公開されているので、当日見逃した方はこちらをどうぞ。

さらにログミーさんにて書き起こし記事も公開されています。
講演の後半に実施したQ&Aタイムの内容も書き起こしされていて、すごい充実度です!

logmi.jp

全部4本あります。第2回以降の記事はこちらをご覧ください。

当日の反応など

Twitterで見かけたこの講演の感想です。(どうもありがとうございます!)

当日のツイートはこちらのtogetterページにまとめてもらっています。

togetter.com

参加者のみなさんにも技術記事を書いてもらいました

僕の講演を聞いて「へ〜、なるほど」で終わってしまうのはもったいないので、参加者のみなさんに「この土日に何かアウトプットするネタを決めて、Twitter上で宣言してください」というお願いをしてみました。

それに加えて、「記事を書いてくれたら僕がリツイートしますよ」というボーナス企画も付けてみました(笑)。

「はたしてどれくらいの人が乗ってくれるんだろうか?」とちょっと心配していましたが、非常にたくさんの方々が実際に記事を書いてくれました😆

記事を書いてくださったみなさん、どうもありがとうございました!

まとめ

というわけで、このエントリでは先日勉強会で登壇した「Qiita 1位のアウトプットの達人が語る、良質な技術記事を量産する秘訣」という発表について書いてみました。

当日の登壇者は僕一人だけだったにもかかわらず、200名以上(!)の方が参加申込みしてくれて、とても嬉しかったです。
参加者のみなさん、N2iのみなさん、モデレーター&CEOの篭橋さん、どうもありがとうございました!

アウトプットしたいけど、なかなかその一歩が踏み出せない、という方はぜひ今回の講演内容を参考にしてみてください😄

あわせて読みたい

登壇者として上手に発表する秘訣はこの記事に書いております。
blog.jnito.com

スライド作成にあたってこちらのKeynote用テーマを利用させてもらいました。どうもありがとうございました。
cocodrips.hateblo.jp

【登壇】アウトプットできなくてお悩みのITエンジニアのみなさんに僕の秘訣を教えます #MeetsPro 2022/2/3 18:30

登壇のお知らせです。

株式会社N2i(エヌツーアイ)さん主催の公開社内イベント・Meets Professionalで「Qiita 1位のアウトプットの達人が語る、良質な技術記事を量産する秘訣」というタイトルの講演をさせてもらいます。

n2i-engineer.connpass.com

講演内容の概要は以下の通りです。

ITエンジニアにとって、アウトプットは大事だと思っている人はたくさんいると思います。ですがそれと同時に、大事だと思っているけど全然アウトプットできていない、と悩んでいる人も同じくらいたくさんいると思います。 その一方で、世の中には良質な技術記事を量産しているエンジニアもいます。思うようにアウトプットできなくて困っているエンジニアから見ると、すごく不思議に思えませんか?

そこで今回の講演ではQiitaでユーザーランキング1位(2023年1月現在)の伊藤淳一さんを講師に招き、良質な技術記事を量産する秘訣について語ってもらいます。

この講演を聞けば、あなたも明日からさくさくとアウトプットできるエンジニアになれる!・・・かもしれません。

ぜひご参加ください。

イベントの開催情報はこんな感じです。

開催日時
2023年2月3日(金)18:30〜
開催場所
オンライン(定員100名)
参加費
無料
参加申込み
https://n2i-engineer.connpass.com/event/271398/
ハッシュタグ
#MeetsPro

なんでこの講演テーマになったの?

上でも書いたとおり、このイベントは基本的に株式会社N2iさんに社内勉強会で、それを外部にも公開する、というスタンスです。
最初は「伊藤さんがどういうキャリアを歩んできたのかを知りたい」という講演リクエストでした。
ですが、ちょっと幅が広すぎる気がしたので、「もう少し具体的に知りたいことを社員のみなさんに聞いてみてほしいです」とお願いしたところ、次のようなリクエスト(聞いてみたいことリスト)が返ってきました。

  • アウトプットを始めたのはどういうきっかけだったのでしょうか?
  • なぜRubyやRSpecを主軸にアウトプットしているんでしょうか?
  • 技術ブログでは自分が書きたいこととPV数は必ずしも一致しませんが、自分の中でどう折り合いを付けていますか?
  • ベンチマークにしているソフトウェアエンジニアや技術ブログはありますか?
  • etc

なるほど、これらの質問を見る限り、みなさんの中では「伊藤さん=アウトプットしまくってるエンジニア」という認識っぽいです。
であれば今回の講演は、ずばりアウトプットに的を絞ってお話した方がN2iのみなさんのニーズに応えられそうですね、ということで、今回はこういう講演テーマになりました。

まとめ:ITエンジニアのアウトプットに興味を持っている方はぜひ!

このテーマはN2iの社員のみなさんに限らず、「伊藤さんってなんであんなにアウトプットできるんだろう?🤔」と不思議に思っている人であれば、全員何かしら参考になる講演内容なんじゃないかなーと思っています。

日本中どこからでも参加できるオンライン勉強会ですし、参加費も無料なので、興味がある人はぜひぜひ参加登録してもらえると嬉しいです!
みなさんよろしくお願いします〜😄

n2i-engineer.connpass.com

↑それにしても、すごくど派手なサムネイル画像ですね😅