109: (Default)
[personal profile] 109
сегодня обнаружил замечательный, классический баг.

есть счета, которые надо оплачивать, и есть чеки, которыми платится, причём один счёт можно оплатить несколькими чеками. ну и есть приложение, которое в определённом месте проверяет, сколько уже по этому счёту заплачено и, соответственно, не даёт переплатить. а делает оно это примерно так (псевдокод):

(double) остаток = (double) текущий_остаток - (real) сколько_платим;
if (остаток < 0.0)
    переплачивать_нельзя;
программистам уже всё должно быть понятно, а счастливчикам поясню, что разница двух разных типов с плавающей точкой часто будет равна не точно нулю, а чему-нибудь типа -3*10^-15.

особый цинизм данному коду придаёт решение программиста написать не if (остаток < 0), а if (остаток < 0.0), типа "пытался играть, но не угадал ни одной буквы".

приложение в продакшене уже лет пять, что возбуждает очевидный вопрос, а что же делает бухгалтерия, когда нужно заплатить сполна, а приложение не даёт? очень просто: бухгалтерия не доплачивает один цент. а получателю либо похеру, либо он добавляет недоплаченный цент к следующему счёту. но факт остаётся фактом: половина (по теории вероятности) счетов недоплачена на один цент. а потом евреи спрашивают, почему их не любят :-)

да, а как открылось-то: в бухгалтерии наняли нового человека, а эту деталь объяснить забыли. человек в аппсаппорт, аппсаппорт ко мне, я нахожу в чём причина и докладываю начальству.

и, наконец, самое интересное - финальная резолюция начальства: баг не фиксить, тикет закрыть с диагностикой "user training issue". копейка рубль бережёт!
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

109: (Default)
109

March 2019

S M T W T F S
     12
3456789
101112131415 16
17181920212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags