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 虎の穴ラボ株式会社
FreshとHonoでDeno KVを使い倒す
toranoana
1
41
サブカル業界Developers_実践_開発業務でのAIの活用
toranoana
1
270
「エンジニアリングマネージャーのしごと」勉強してみた
toranoana
2
250
【OSC2024 Online/Spring】とらのあなラボの Deno イベント開催の取り組み
toranoana
0
280
【toranoana.deno#15】WebGPUで遊ぼう
toranoana
0
310
App Router による Web 開発について
toranoana
0
92
Fresh(Deno)をプラグインで拡張しよう!
toranoana
0
210
Freshプラグインのテストもプラグインを使うと捗る!
toranoana
0
120
個人開発アプリにスキーマ 駆動開発を取り入れた話
toranoana
0
79
Other Decks in Technology
See All in Technology
Discord とビルダー&チャットボットの使い方 / How to use Discord and Builder & Chatbots
ks91
PRO
0
160
Compose Compiler Metricsを使った実践的なコードレビュー
tomorrowkey
1
210
現代CSSフレームワークの内部実装とその仕組み
poteboy
8
3.4k
Kernel MemoryでAzure OpenAI Serviceとお手軽データソース連携
mitsuzono
1
140
検証を通して見えてきたTiDBの性能特性
lycorptech_jp
PRO
6
3.7k
GraphQL 成熟度モデルの紹介と、プロダクトに当てはめた事例 / GraphQL maturity model
mh4gf
7
1.2k
Google Cloud Next '24でブログを10本書いた方法と勉強会を沸かせた方法
yasumuusan
0
220
アクセス制御にまつわる改善 / Improving access control
itkq
0
400
カオナビの利用実績をアウトカムへつなげる旅 / example-of-data-management-startup-in-kaonavi
kaonavi
0
130
マルチアカウント環境への発見的統制の導入
ch1aki
1
1.3k
Azure Container Apps + Bicep 〜 こんな感じで運用しています
kaz29
2
340
[PlatformCon 24] Platform Orchestrators: The Missing Middle of Internal Developer Platforms?
danielbryantuk
1
770
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
77
42k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
154
14k
Rebuilding a faster, lazier Slack
samanthasiow
72
8.2k
Into the Great Unknown - MozCon
thekraken
10
990
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
501
140k
Put a Button on it: Removing Barriers to Going Fast.
kastner
58
3k
Making the Leap to Tech Lead
cromwellryan
123
8.5k
How GitHub Uses GitHub to Build GitHub
holman
468
290k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
5
1.5k
Navigating Team Friction
lara
177
13k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
226
16k
Web development in the modern age
philhawksworth
202
10k
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 今後も失敗を糧にして より良い仕組みを導入していきたい!