Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
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
480
Denoについて、同人誌記事を出しました+update
toranoana
0
160
【虎の穴ラボ Tech Talk #2】プロンプトエンジニアリング
toranoana
0
93
20241121_[TechTalk#2]虎の穴ラボでのLLMについて取り組み紹介
toranoana
0
85
社内チャットへRAG導入した話(Tech Talk #2)
toranoana
0
150
Deno Deploy で Web Cache API を 使えるようになったので試した知見
toranoana
1
510
【虎の穴ラボ Tech Talk】虎の穴ラボTech Talk説明資料
toranoana
0
360
虎の穴ラボ Tech Talk_CDKでFargate環境構築
toranoana
1
380
虎の穴ラボスキルアップ支援制度の利用例
toranoana
0
6.6k
Other Decks in Technology
See All in Technology
AI時代の開発生産性を加速させるアーキテクチャ設計
plaidtech
PRO
3
160
データグループにおけるフロントエンド開発
lycorptech_jp
PRO
1
100
生成AI活用の組織格差を解消する 〜ビジネス職のCursor導入が開発効率に与えた好循環〜 / Closing the Organizational Gap in AI Adoption
upamune
7
5.3k
開発生産性を測る前にやるべきこと - 組織改善の実践 / Before Measuring Dev Productivity
kaonavi
10
4.6k
怖くない!はじめてのClaude Code
shinya337
0
400
Reach American Airlines®️ Instantly: 19 Calling Methods for Fast Support in the USA
flyamerican
1
170
成長し続けるアプリのためのテストと設計の関係、そして意思決定の記録。
sansantech
PRO
0
120
SaaS型なのに自由度の高い本格CMSでサイト構築と運用のコスパ&タイパUP! MovableType.net の便利機能とユーザー事例のご紹介
masakah
0
110
Geminiとv0による高速プロトタイピング
shinya337
1
270
React開発にStorybookとCopilotを導入して、爆速でUIを編集・確認する方法
yu_kod
1
280
生まれ変わった AWS Security Hub (Preview) を紹介 #reInforce_osaka / reInforce New Security Hub
masahirokawahara
0
470
タイミーのデータモデリング事例と今後のチャレンジ
ttccddtoki
6
2.4k
Featured
See All Featured
Building Adaptive Systems
keathley
43
2.7k
Adopting Sorbet at Scale
ufuk
77
9.5k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.4k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
35
2.4k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
Writing Fast Ruby
sferik
628
62k
Done Done
chrislema
184
16k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Thoughts on Productivity
jonyablonski
69
4.7k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
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 今後も失敗を糧にして より良い仕組みを導入していきたい!