Bir kuni kodim boshqa odamning kartasidan pul yechib qo‘ygan

4 ko'rishlar


Bir safar production'da juda g‘alati muammo chiqdi. 🙂


A user ijaraga olgan tovarining to‘lovlarini yopgan. Hammasi joyida. Keyingi kuni B user ijara oldi. Lekin uning to‘lovlari vaqtida A userning kartasidan pul yechilib ketdi.


Buni ko‘rib, avvaliga: “Qanaqasiga?” dedim.


Keyin payment qismini kovlay boshladim. Oxiri sababini topdim.


To‘lov qiladigan qismga ikkita ma'lumot berilishi kerak edi:

qaysi to‘lovni amalga oshirish kerakligi va bu to‘lov kimga tegishli ekanligi.


Men esa ikkinchi ma'lumotni berishni unutganman.


Qizig‘i, dastur ham menga: “Muhammadali, user_id qani?” deb aytmagan. :))


Ya'ni tizimga: “Shu userning active kartasini ber” deyish o‘rniga, “Active kartalardan bittasini ber” degan holatga kelib qolgan. Va database'dagi birinchi mos karta olinib, to‘lov amalga oshirilgan. Shu tariqa B userning qarzi A userning kartasidan to‘langan.


Bugni topganimda birinchi hissiyotim: “Daxoman.” Chunki muammoni topdim, sababini tushundim, hammasi joyiga tushdi.


Keyin yana bir marta kodga qaradim. Va: “Voy, men ahmoq ekanmanku.” :))


Chunki muammo qandaydir juda murakkab architecture, concurrency yoki payment provider'dagi xatolik emas ekan. Oddiygina user_idni bir joyda berishni unutganman.


Eng kulgilisi, user_idni methodga argument qilib qo‘yganimning o‘zi ham “demak, menga kerak bo‘ladi” degan fikrdan kelib chiqqan. Aslida esa invoicening o‘zida user_id bor edi. Ya'ni men o‘zimga kerak bo‘lmagan narsani methodga argument qilib berib, keyin uni bir joyda berishni unutib, yana o‘sha undefined bilan ishlashga imkon berib qo‘yganman.


Shu voqeadan keyin bitta narsani yaxshi tushundim: Eng xavfli buglar har doim ham murakkab bo‘lmaydi. Ba'zida bitta optional parameter, bitta undefined va bitta yetishmayotgan filter yetarli.


Ayniqsa gap payment haqida ketayotgan bo‘lsa, bunday “mayda” xatolar unchalik mayda emas.