$30 off During Our Annual Pro Sale. View Details »

誤配送の原因を作ったのは私です

 誤配送の原因を作ったのは私です

エンジニアの失敗学 LT会 - vol.2のLT資料になります

虎の穴ラボ株式会社

August 18, 2022
Tweet

More Decks by 虎の穴ラボ株式会社

Other Decks in Technology

Transcript

  1. 誤配送の原因を作ったのは私です 2022年8月17日 エンジニアの失敗学 LT会 - vol.2 浜田 拓実 1

  2. 自己紹介 現在の職業  とらのあなエンジニア  2022年6月から勤務 2 趣味  VRゲーム開発  バイクツーリング

  3. ご注意 今回紹介するやらかしは 「前職での」 やらかしになります。 3

  4. 目次 4 ・システム概要紹介 ・失敗した内容と案件の紹介 ・発生した障害内容 ・対策 ・まとめ

  5. システム概要紹介

  6. 前職で関わっていたシステム ・趣味の用品を扱うECサイトの運用、開発 ・年商100億円規模 ・一般会員、業者会員の大きく2種類の会員種別 ・会員種別で利用できる機能が異なるが  サイト自体は一つのプロジェクトで管理  →業者会員のみ「掛売」といった機能を利用可能  →if(業者会員)で利用できる機能を分離 6

  7. 失敗した内容と案件の紹介

  8. 失敗の内容 大量の誤配送が発生!その原因を作ったのは 8 私です

  9. 失敗の背景 業者会員向けに大掛かりな機能改修を実施 ・出荷のタイミングをお客様が選択できるようにする。 ・更に、明細単位で自由に出荷タイミングを選択できるようにする 9 今までは「注文単位で商品が揃ったら出荷」で動いていたが・・・ その概念が崩れる

  10. 失敗の背景 - 今まで 10 注文 明細1 明細2 明細3 明細4 出荷

  11. 失敗の背景 - 新機能 11 注文 明細1 明細2 明細3 明細4 明細2

    指示を待って出荷 明細3 送料無料金額で出荷 明細4 キャンセル 明細2 指定曜日に出荷 明細3 要件:  お客様が望むがまま  自由自在に出荷の単位を  変更することができるように!
  12. 失敗の背景 - 今まで 12 ご注文内容 お届け先住所 ・〇〇〇〇〇〇〇 お客様情報 ・〇〇〇〇〇〇〇 お支払い情報

    ・カード xxxx-xxxx-xxxx-xxxx ご注文明細 ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 決済確定 掛売を利用している会員 →お届け先住所変更不可 それ以外 →お届け先住所変更可能
  13. 失敗の背景 - 新機能 13 ご注文内容 お届け先住所 ・xxxxxxxx お客様情報 ・〇〇〇〇〇〇〇 お支払い情報

    ・カード xxxx-xxxx-xxxx-xxxx ご注文明細 ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 決済確定 掛売を利用している または 新機能を利用している会員 →お届け先住所変更不可 それ以外 →お届け先住所変更可能
  14. 失敗の背景 エンジニア:    4名 開発期間:     約4ヶ月(要件定義〜リリースまで) 結合テストパターン:約400〜500 14 なんとかリリース

  15. 失敗の背景 もともと規模の大きいプロジェクトだったため、 運用部門含め、テストはしっかりやっていた 15 リリース当日は すべての機能が正常に機能

  16. 発生した障害内容

  17. 発生した障害内容 - 大量の問い合わせ 「指定した住所に届かない」という問い合わせ多数 17 決済画面で登録したお届け先住所が 注文データに反映されていなかった 一般会員限定で・・・

  18. 18 ご注文内容 お届け先住所 ・〇〇〇〇〇〇〇 お客様情報 ・〇〇〇〇〇〇〇 お支払い情報 ・カード xxxx-xxxx-xxxx-xxxx ご注文明細

    ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 決済確定 変更したのに 反映されない
  19. 発生した障害内容 今回の機能を利用した場合、お届け先住所の 指定は不可 という要件を組み込む 19 if文に条件追加するだけだよね・・・ と思っていた ご注文内容 お届け先住所 ・xxxxxxxx お客様情報

    ・〇〇〇〇〇〇〇 お支払い情報 ・カード xxxx-xxxx-xxxx-xxx x ご注文明細 ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 決済確定 新機能を利用する場合、変更不可
  20. 発生した障害内容 - 既存のプログラム if(!掛売){  お届け先住所 = 決済画面の住所 } else {

     お届け先住所 = 会員登録時の住所 } 20
  21. 発生した障害内容 - 新仕様 if(!掛売 && 業者会員 && !新機能利用){  お届け先住所 =

    決済画面の住所 } else {  お届け先住所 = 会員登録時の住所 } 21
  22. 失敗の背景 - 仕様の比較 22 決済方法 新機能利用 通常 掛売 利用 未利用

    業者会員 変更可能 変更不可 変更不可 変更可能 一般会員 変更可能 - - - お届け先の指定 - 新機能の仕様
  23. 失敗の背景 - 仕様の比較 23 決済方法 新機能利用 通常 掛売 利用 未利用

    業者会員 変更可能 変更不可 変更不可 変更可能 一般会員 変更不可 - - - お届け先の指定 - 条件ミス
  24. 発生した障害内容 - 結果 一般会員について、お届け先住所の指定が不可に! 24 ・注文データを作るときの動き →会員登録時の住所で上書きされてしまった →決済画面の入力情報は保存してない  お客様が入力した情報の復旧が困難

  25. 発生した障害内容 - 行った対応 25 ・早急なバグ修正 & リリース ・出荷済みのお客様に謝罪メール ・配送業者と連携し、配送をストップ ・MySQLのバイナリログを解析し

     入力された住所をサルベージ ・未出荷データのお届け先修正
  26. 発生した障害内容 - 今回の敗因 if文の条件を1行変えるだけという油断から 丁寧なテストを行わなかった 26

  27. 対策

  28. 対策 以下2点の対策を実施 ・決済画面の入力内容を保存するテーブルを追加 ・Seleniumを利用した自動テストを導入 28

  29. 対策1:入力内容を保存するように 29 決済画面 ・xxxxxxxx ・xxxxxxxx ・xxxxxxxx 注文データ データ加工 入力データ 決済画面の入力内容を

    そのまま保存
  30. 対策1の効果 ・データ復旧が容易に行えるようになった →決済画面の入力内容をそのまま保存  データ不正があれば、入力内容から復旧 30

  31. 対策2:ブラウザ自動テストの導入 31 ・一般会員 全決済、全入力項目の自動テスト ・業者会員 全決済、全入力項目の自動テスト

  32. 対策2:ブラウザ自動テストの導入 32 + + Chrome Driver ・ECサイトがChromeの利用を推奨していたため  Chrome Driverを選択 ・Pythonは勉強のため選択

     (ツール類は開発言語を自由に選択できた)
  33. 対策2:ブラウザ自動テストの導入 33 ①テストユーザーで  ログイン ②商品画面で  カートに投入 ③決済画面で  項目を入力し、決済 上記の一連の操作をSeleniumで自動化 決済パターン分繰り返すことで、

    全ての決済方法が正常に動作することを確認
  34. 対策2:ブラウザ自動テストの導入 34 名前:xxxx xxxx お届け先:xxx-xxxx xxxx xxxx 合計金額:xxxx円 ポイント利用:xxx pt

    決済方法:xxxxxxxx その他:xxxxxxxx 入力データ 名前:xxxx xxxx お届け先:xxx-xxxx xxxx xxxx 合計金額:xxxx円 ポイント利用:xxx pt 決済方法:xxxxxxxx その他:xxxxxxxx 注文データ 決済後、入力データ、注文データの突き合わせを実施 決済画面で入力した内容で、注文データが生成されたことを確認
  35. 対策2の効果 ・決済画面の全パターンの動作確認を自動化 →全パターンでテストを行うため、  決済機能の破損に気付けるようになった →対策1で追加した入力データ保存のテーブルを  チェックし、入力内容の正当性チェックも自動化 35

  36. まとめ

  37. まとめ ・小さい改修でも必ずテストを →蔑ろにした結果、大きな障害につながった ・テストの自動化を検討する →サービスが大きくなると、 人力ですべてのパターンをチェックするのは難しい  37

  38. まとめ 今回の失敗で得られたこと →自動テストの導入を行うことができた。   38 今後も失敗を糧にして より良い仕組みを導入していきたい!