今回はコラボ企画「Qiitaでは、エンジニア転職「Findy」を提供するファインディ株式会社とのコラボ企画として、「自分のエンジニアとしてのキャリアを振り返ろう!」を開催しています。」で、自身の苦い経験から新人レビュアー向けのメッセージを書いてます。
レビュアーへのメッセージ「レビューアは 期待値を持ち 結果を見て!」
例えば、diffの結果をレビューする際、差分がない行は目立たないため、見落としがちです。
差分がある行も、レビュイーの言葉に従ってただ結果を追認していませんか?
- 差分がない:本当は差分があるべきだった可能性があります。
- 差分がある:本当は差分がないべきかもしれません。意図した差分が正しくない可能性があります(AがBという結果だったが、意図したのはAがCである)。
レビュアーの心得
レビュアーは、期待値と結果を照らし合わせることが重要です。
期待値を持たずに、
- レビュイーが提示するテストに合格したという多数のチェックマークが付いた資料
- 問題なしというコメントばかりの資料
を先に見せられると、その結果に引きずられて、結果を追認してしまう傾向があります。
そのため、結果を見る前に、期待値を用意すること、期待値がなければ作成してから結果を見るようにしましょう。
この投稿の背景
上記のメッセージは、私のレビューアとしての苦い経験が背景になっています。
ある日、私(レビューア)とレビュイーとでデータパッチの結果(Excel資料)をレビューしていました。
私は、パッチ結果(Excel資料)の上から順に差分のある行を確認し、全行にOKの印がついていたため、念のため差分のある行の理由をレビュイーに確認しながら、問題ないと判断しました。その後、お客様にデータパッチが完了したことを報告しました。
翌日、お客様からの電話で「データパッチしてほしかったレコードがパッチされていない」との指摘を受けました。私は謝罪し、至急確認することを約束しました。
レビュイーと私は、お客様からのデータパッチ依頼内容と、その依頼を元に作成したSQLを比較する中で、意図しないSQLを発見しました。
- それは、更新すべき行を更新せず、関係ない行を更新していました。
- さらに、このSQLは更新後の値が元の値と同じだったため、diffの結果に差分が出ない状況でした。
差分が出ないため、目立たず、気づけませんでした。。。その後は推して知るべしです。。。
どうすればよかったのかということで、「レビュアーは 期待値を持ち 結果を見て!」というメッセージに至りました。
次の章は少し趣を変えて、実際にお客様からのデータパッチ依頼から期待値の表を作成し、それとパッチ後の表を比較する例を紹介するなかで、レビュアーが力を入れるポイントを示します。
データパッチの確認はExcelで行うことが多いため、PowerQueryとLAMBDA関数を使用します。
データパッチのレビュー例
お客様からの依頼内容から期待値の表を作成する(レビュアーが力を入れるポイント1)
これがレビュイーとレビュアーが力を入れるべきポイントです。
手作業でしかできず、間違いやすいため、ここを間違えると後の全てが誤りになります。
データパッチを当てた後からこれを行うのは本末転倒です。最初にこれを行うことが非常に重要です。
レビュイーは細心の注意を払って期待値の表を作成し、レビュアーは依頼内容と期待値の表を注意深く確認します。
そして、この期待値の表が完成すれば、SQL文を作成するのはExcel関数を組み合わせるだけで可能です。
お客様の依頼内容:
キーがa-1は31に変更、b-2は37に、d-1の55は追加、b-1は削除してください。
依頼に基づき次の表を作成しました。
PowerQueryで2つの表を完全外部結合する
完全外部結合するのが大事で、結果のイメージはdiff -y before.txt after.txt
をやるイメージです。
~$ diff -y b.txt a.txt
1,1 1,1
2,2 | 2,22
3,3 <
4,4 4,4
5,5 | 5,55
> 6,6
期待値の表とパッチ後の表を完全外部結合すると、次の3つが対象になります。
- 結合できた行:期待値通りのパッチが当てられているか確認する対象
- 期待値表のみに行がある:期待値通り行が消えたか確認する対象
- パッチ後表のみに行がある:パッチが当てられていない行であることを確認する対象
完全外部結合の具体的な方法は @mosugiさんの「ExcelでPowerQueryを使ってデータを結合して出力する #Excel - Qiita」が、スクリーンショットが豊富で大変参考になります。
LAMBDA関数で行ごとに期待値行とパッチ後の行を比較
=LAMBDA(_before, _after,
BYROW(
EXACT(_before, _after),
LAMBDA(_row, AND(_row))
)
)(期待値セル範囲,パッチ当て後セル範囲)
EXACT(_before, _after),
EXACT関数で2つのセル範囲(配列)を比較します。EXACT関数は2次元配列を第一引数と第二引数に渡したとき、互いの配列の該当する添字同士を比較して、TRUE/FALSEの2次元配列を返します。
BYROW(
EXACT(_before, _after),
LAMBDA(_row, AND(_row))
)
EXACT関数が返すTRUE/FALSEの2次元配列をBYROW関数の第一引数に渡すと、 BYROW関数はその2次元配列から行ごとにデータを取り出し、第二引数のLAMBDA関数に渡しますLAMBDA(_row
の部分。
そのLAMBDA関数でAND関数をAND(_row)
で呼び出しています。
比較結果の評価(レビュアーが力を入れるポイント2)
期待値をしっかり作っていれば、そんなに力まなくてもよいのですが、レビューアが結果を見る際のポイントは、あらかじめ定めた期待値に対して、結果がどうなっているか?という観点で比較結果を見ることです。
FALSEの行は2種類の解釈が必要で注意が必要です。
- FALSEの行で右側のみの行:パッチ当て指示していない行。
- FALSEの行で左側のみの行:期待値で削除を指示している行。指示が「削除」か確認します。
おまけ
パッチ当前の表とパッチ当て後の表で完全外部結合して先のLAMBDA関数で比較結果を見たときの見え方。
差分はFALSEででてくるけれど、そらが意図したものかはわからないのです。