$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
誤配送の原因を作ったのは私です
Search
虎の穴ラボ株式会社
August 18, 2022
Technology
1
120
誤配送の原因を作ったのは私です
エンジニアの失敗学 LT会 - vol.2のLT資料になります
虎の穴ラボ株式会社
August 18, 2022
Tweet
Share
More Decks by 虎の穴ラボ株式会社
See All by 虎の穴ラボ株式会社
Tailwind CSSとAtomic Designで実現する効率的な Web 開発の事例
toranoana
1
560
Denoについて、同人誌記事を出しました+update
toranoana
0
190
【虎の穴ラボ Tech Talk #2】プロンプトエンジニアリング
toranoana
0
120
20241121_[TechTalk#2]虎の穴ラボでのLLMについて取り組み紹介
toranoana
0
110
社内チャットへRAG導入した話(Tech Talk #2)
toranoana
0
190
Deno Deploy で Web Cache API を 使えるようになったので試した知見
toranoana
1
590
【虎の穴ラボ Tech Talk】虎の穴ラボTech Talk説明資料
toranoana
0
420
虎の穴ラボ Tech Talk_CDKでFargate環境構築
toranoana
1
460
虎の穴ラボスキルアップ支援制度の利用例
toranoana
0
8.7k
Other Decks in Technology
See All in Technology
ActiveJobUpdates
igaiga
1
140
MySQLとPostgreSQLのコレーション / Collation of MySQL and PostgreSQL
tmtms
1
1k
AI駆動開発における設計思想 認知負荷を下げるフロントエンドアーキテクチャ/ 20251211 Teppei Hanai
shift_evolve
PRO
2
430
Bedrock AgentCore Memoryの新機能 (Episode) を試してみた / try Bedrock AgentCore Memory Episodic functionarity
hoshi7_n
0
280
mairuでつくるクレデンシャルレス開発環境 / Credential-less development environment using Mailru
mirakui
5
550
Fashion×AI「似合う」を届けるためのWEARのAI戦略
zozotech
PRO
2
860
IAMユーザーゼロの運用は果たして可能なのか
yama3133
2
490
2025年 開発生産「可能」性向上報告 サイロ解消からチームが能動性を獲得するまで/ 20251216 Naoki Takahashi
shift_evolve
PRO
2
200
re:Invent2025 3つの Frontier Agents を紹介 / introducing-3-frontier-agents
tomoki10
0
250
【U/day Tokyo 2025】Cygames流 最新スマートフォンゲームの技術設計 〜『Shadowverse: Worlds Beyond』におけるアーキテクチャ再設計の挑戦~
cygames
PRO
2
750
[デモです] NotebookLM で作ったスライドの例
kongmingstrap
0
160
寫了幾年 Code,然後呢?軟體工程師必須重新認識的 DevOps
cheng_wei_chen
1
1.5k
Featured
See All Featured
A Tale of Four Properties
chriscoyier
162
23k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.3k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.3k
Being A Developer After 40
akosma
91
590k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
Optimising Largest Contentful Paint
csswizardry
37
3.5k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
63
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.6k
We Are The Robots
honzajavorek
0
110
Code Review Best Practice
trishagee
74
19k
Chasing Engaging Ingredients in Design
codingconduct
0
71
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
60
37k
Transcript
誤配送の原因を作ったのは私です 2022年8月17日 エンジニアの失敗学 LT会 - vol.2 浜田 拓実 1
自己紹介 現在の職業 とらのあなエンジニア 2022年6月から勤務 2 趣味 VRゲーム開発 バイクツーリング
ご注意 今回紹介するやらかしは 「前職での」 やらかしになります。 3
目次 4 ・システム概要紹介 ・失敗した内容と案件の紹介 ・発生した障害内容 ・対策 ・まとめ
システム概要紹介
前職で関わっていたシステム ・趣味の用品を扱うECサイトの運用、開発 ・年商100億円規模 ・一般会員、業者会員の大きく2種類の会員種別 ・会員種別で利用できる機能が異なるが サイト自体は一つのプロジェクトで管理 →業者会員のみ「掛売」といった機能を利用可能 →if(業者会員)で利用できる機能を分離 6
失敗した内容と案件の紹介
失敗の内容 大量の誤配送が発生!その原因を作ったのは 8 私です
失敗の背景 業者会員向けに大掛かりな機能改修を実施 ・出荷のタイミングをお客様が選択できるようにする。 ・更に、明細単位で自由に出荷タイミングを選択できるようにする 9 今までは「注文単位で商品が揃ったら出荷」で動いていたが・・・ その概念が崩れる
失敗の背景 - 今まで 10 注文 明細1 明細2 明細3 明細4 出荷
失敗の背景 - 新機能 11 注文 明細1 明細2 明細3 明細4 明細2
指示を待って出荷 明細3 送料無料金額で出荷 明細4 キャンセル 明細2 指定曜日に出荷 明細3 要件: お客様が望むがまま 自由自在に出荷の単位を 変更することができるように!
失敗の背景 - 今まで 12 ご注文内容 お届け先住所 ・〇〇〇〇〇〇〇 お客様情報 ・〇〇〇〇〇〇〇 お支払い情報
・カード xxxx-xxxx-xxxx-xxxx ご注文明細 ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 決済確定 掛売を利用している会員 →お届け先住所変更不可 それ以外 →お届け先住所変更可能
失敗の背景 - 新機能 13 ご注文内容 お届け先住所 ・xxxxxxxx お客様情報 ・〇〇〇〇〇〇〇 お支払い情報
・カード xxxx-xxxx-xxxx-xxxx ご注文明細 ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 決済確定 掛売を利用している または 新機能を利用している会員 →お届け先住所変更不可 それ以外 →お届け先住所変更可能
失敗の背景 エンジニア: 4名 開発期間: 約4ヶ月(要件定義〜リリースまで) 結合テストパターン:約400〜500 14 なんとかリリース
失敗の背景 もともと規模の大きいプロジェクトだったため、 運用部門含め、テストはしっかりやっていた 15 リリース当日は すべての機能が正常に機能
発生した障害内容
発生した障害内容 - 大量の問い合わせ 「指定した住所に届かない」という問い合わせ多数 17 決済画面で登録したお届け先住所が 注文データに反映されていなかった 一般会員限定で・・・
18 ご注文内容 お届け先住所 ・〇〇〇〇〇〇〇 お客様情報 ・〇〇〇〇〇〇〇 お支払い情報 ・カード xxxx-xxxx-xxxx-xxxx ご注文明細
・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 決済確定 変更したのに 反映されない
発生した障害内容 今回の機能を利用した場合、お届け先住所の 指定は不可 という要件を組み込む 19 if文に条件追加するだけだよね・・・ と思っていた ご注文内容 お届け先住所 ・xxxxxxxx お客様情報
・〇〇〇〇〇〇〇 お支払い情報 ・カード xxxx-xxxx-xxxx-xxx x ご注文明細 ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ・xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 決済確定 新機能を利用する場合、変更不可
発生した障害内容 - 既存のプログラム if(!掛売){ お届け先住所 = 決済画面の住所 } else {
お届け先住所 = 会員登録時の住所 } 20
発生した障害内容 - 新仕様 if(!掛売 && 業者会員 && !新機能利用){ お届け先住所 =
決済画面の住所 } else { お届け先住所 = 会員登録時の住所 } 21
失敗の背景 - 仕様の比較 22 決済方法 新機能利用 通常 掛売 利用 未利用
業者会員 変更可能 変更不可 変更不可 変更可能 一般会員 変更可能 - - - お届け先の指定 - 新機能の仕様
失敗の背景 - 仕様の比較 23 決済方法 新機能利用 通常 掛売 利用 未利用
業者会員 変更可能 変更不可 変更不可 変更可能 一般会員 変更不可 - - - お届け先の指定 - 条件ミス
発生した障害内容 - 結果 一般会員について、お届け先住所の指定が不可に! 24 ・注文データを作るときの動き →会員登録時の住所で上書きされてしまった →決済画面の入力情報は保存してない お客様が入力した情報の復旧が困難
発生した障害内容 - 行った対応 25 ・早急なバグ修正 & リリース ・出荷済みのお客様に謝罪メール ・配送業者と連携し、配送をストップ ・MySQLのバイナリログを解析し
入力された住所をサルベージ ・未出荷データのお届け先修正
発生した障害内容 - 今回の敗因 if文の条件を1行変えるだけという油断から 丁寧なテストを行わなかった 26
対策
対策 以下2点の対策を実施 ・決済画面の入力内容を保存するテーブルを追加 ・Seleniumを利用した自動テストを導入 28
対策1:入力内容を保存するように 29 決済画面 ・xxxxxxxx ・xxxxxxxx ・xxxxxxxx 注文データ データ加工 入力データ 決済画面の入力内容を
そのまま保存
対策1の効果 ・データ復旧が容易に行えるようになった →決済画面の入力内容をそのまま保存 データ不正があれば、入力内容から復旧 30
対策2:ブラウザ自動テストの導入 31 ・一般会員 全決済、全入力項目の自動テスト ・業者会員 全決済、全入力項目の自動テスト
対策2:ブラウザ自動テストの導入 32 + + Chrome Driver ・ECサイトがChromeの利用を推奨していたため Chrome Driverを選択 ・Pythonは勉強のため選択
(ツール類は開発言語を自由に選択できた)
対策2:ブラウザ自動テストの導入 33 ①テストユーザーで ログイン ②商品画面で カートに投入 ③決済画面で 項目を入力し、決済 上記の一連の操作をSeleniumで自動化 決済パターン分繰り返すことで、
全ての決済方法が正常に動作することを確認
対策2:ブラウザ自動テストの導入 34 名前:xxxx xxxx お届け先:xxx-xxxx xxxx xxxx 合計金額:xxxx円 ポイント利用:xxx pt
決済方法:xxxxxxxx その他:xxxxxxxx 入力データ 名前:xxxx xxxx お届け先:xxx-xxxx xxxx xxxx 合計金額:xxxx円 ポイント利用:xxx pt 決済方法:xxxxxxxx その他:xxxxxxxx 注文データ 決済後、入力データ、注文データの突き合わせを実施 決済画面で入力した内容で、注文データが生成されたことを確認
対策2の効果 ・決済画面の全パターンの動作確認を自動化 →全パターンでテストを行うため、 決済機能の破損に気付けるようになった →対策1で追加した入力データ保存のテーブルを チェックし、入力内容の正当性チェックも自動化 35
まとめ
まとめ ・小さい改修でも必ずテストを →蔑ろにした結果、大きな障害につながった ・テストの自動化を検討する →サービスが大きくなると、 人力ですべてのパターンをチェックするのは難しい 37
まとめ 今回の失敗で得られたこと →自動テストの導入を行うことができた。 38 今後も失敗を糧にして より良い仕組みを導入していきたい!