レビュアーは 期待値を持ち 結果を見て！

今回はコラボ企画「[Qiitaでは、エンジニア転職「Findy」を提供するファインディ株式会社とのコラボ企画として、「自分のエンジニアとしてのキャリアを振り返ろう！」を開催しています。](https://qiita.com/official-events/72b44470c9c08f6f080b)」で、自身の苦い経験から新人レビュアー向けのメッセージを書いてます。

# レビュアーへのメッセージ「レビューアは 期待値を持ち 結果を見て！」
例えば、diffの結果をレビューする際、差分がない行は目立たないため、見落としがちです。
差分がある行も、レビュイーの言葉に従ってただ結果を追認していませんか？

- 差分がない：本当は差分があるべきだった可能性があります。
- 差分がある：本当は差分がないべきかもしれません。意図した差分が正しくない可能性があります(AがBという結果だったが、意図したのはAがCである)。

# レビュアーの心得
レビュアーは、**期待値と結果を照らし合わせること**が重要です。

期待値を持たずに、

- レビュイーが提示するテストに合格したという多数のチェックマークが付いた資料
- 問題なしというコメントばかりの資料

を**先に見せられると**、その結果に引きずられて、結果を追認してしまう傾向があります。

そのため、結果を見る前に、**期待値を用意する**こと、**期待値がなければ作成してから**結果を見るようにしましょう。

# この投稿の背景
上記のメッセージは、私のレビューアとしての苦い経験が背景になっています。

ある日、私(レビューア)とレビュイーとでデータパッチの結果(Excel資料)をレビューしていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76786/1ba6f841-f9f9-efa1-2573-e76862fde4dd.png)

私は、パッチ結果(Excel資料)の上から順に差分のある行を確認し、全行にOKの印がついていたため、念のため差分のある行の理由をレビュイーに確認しながら、問題ないと判断しました。その後、お客様にデータパッチが完了したことを報告しました。

翌日、お客様からの電話で「データパッチしてほしかったレコードがパッチされていない」との指摘を受けました。私は謝罪し、至急確認することを約束しました。

レビュイーと私は、お客様からのデータパッチ依頼内容と、その依頼を元に作成したSQLを比較する中で、意図しないSQLを発見しました。
- それは、更新すべき行を更新せず、**関係ない行を更新**していました。
- さらに、このSQLは**更新後の値が元の値と同じだったため**、diffの結果に**差分が出ない**状況でした。

こんな状況でした：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76786/ee2e668a-fbba-5f03-450a-87b2c7d71e77.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76786/34104b68-d6df-c353-df26-07fcbaf6c184.png)

**差分が出ない**ため、目立たず、気づけませんでした。。。その後は推して知るべしです。。。

どうすればよかったのかということで、「**レビュアーは 期待値を持ち 結果を見て!**」というメッセージに至りました。


次の章は少し趣を変えて、実際にお客様からのデータパッチ依頼から期待値の表を作成し、それとパッチ後の表を比較する例を紹介するなかで、レビュアーが力を入れるポイントを示します。
データパッチの確認はExcelで行うことが多いため、PowerQueryとLAMBDA関数を使用します。

# データパッチのレビュー例

## お客様からの依頼内容から期待値の表を作成する(レビュアーが力を入れるポイント1)
これがレビュイーとレビュアーが力を入れるべきポイントです。
手作業でしかできず、間違いやすいため、ここを間違えると後の全てが誤りになります。
データパッチを当てた後からこれを行うのは本末転倒です。最初にこれを行うことが非常に重要です。

レビュイーは細心の注意を払って期待値の表を作成し、レビュアーは依頼内容と期待値の表を注意深く確認します。
そして、この期待値の表が完成すれば、SQL文を作成するのはExcel関数を組み合わせるだけで可能です。

**お客様の依頼内容：**
``キーがa-1は31に変更、b-2は37に、d-1の55は追加、b-1は削除してください。``

依頼に基づき次の表を作成しました。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76786/da733f8c-8f0c-054b-51ee-b6d352fe1ee6.png)

## PowerQueryで2つの表を完全外部結合する

完全外部結合するのが大事で、結果のイメージは``diff -y before.txt after.txt``をやるイメージです。

```bash:
~$ 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](https://qiita.com/mosugi/items/b252aa9c9188e2ab2bde)」が、スクリーンショットが豊富で大変参考になります。


## LAMBDA関数で行ごとに期待値行とパッチ後の行を比較

```Lisp:
=LAMBDA(_before, _after,
  BYROW(
    EXACT(_before, _after),
    LAMBDA(_row, AND(_row))
  )
)(期待値セル範囲,パッチ当て後セル範囲)
```

```Lisp:
    EXACT(_before, _after),
```
EXACT関数で2つのセル範囲(配列)を比較します。EXACT関数は2次元配列を第一引数と第二引数に渡したとき、互いの配列の該当する添字同士を比較して、TRUE/FALSEの2次元配列を返します。

```Lisp:
  BYROW(
    EXACT(_before, _after),
    LAMBDA(_row, AND(_row))
  )
```
EXACT関数が返すTRUE/FALSEの2次元配列をBYROW関数の第一引数に渡すと、 BYROW関数はその2次元配列から行ごとにデータを取り出し、第二引数のLAMBDA関数に渡します``LAMBDA(_row``の部分。
そのLAMBDA関数でAND関数を``AND(_row)``で呼び出しています。

## 比較結果の評価(レビュアーが力を入れるポイント2)
期待値をしっかり作っていれば、そんなに力まなくてもよいのですが、レビューアが結果を見る際のポイントは、**あらかじめ定めた期待値**に対して、結果がどうなっているか？という観点で比較結果を見ることです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76786/02f69349-e5a9-03d3-ef9d-e5cf950c4379.png)

FALSEの行は2種類の解釈が必要で注意が必要です。
- FALSEの行で右側のみの行:パッチ当て指示していない行。
- FALSEの行で左側のみの行:期待値で削除を指示している行。指示が「削除」か確認します。


# おまけ
パッチ当前の表とパッチ当て後の表で完全外部結合して先のLAMBDA関数で比較結果を見たときの見え方。
差分はFALSEででてくるけれど、そらが意図したものかはわからないのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76786/b28e85d5-da7b-8ae4-f58f-151f8f43cce5.png)