сегодня обнаружил замечательный, классический баг.
есть счета, которые надо оплачивать, и есть чеки, которыми платится, причём один счёт можно оплатить несколькими чеками. ну и есть приложение, которое в определённом месте проверяет, сколько уже по этому счёту заплачено и, соответственно, не даёт переплатить. а делает оно это примерно так (псевдокод):
особый цинизм данному коду придаёт решение программиста написать не if (остаток < 0), а if (остаток < 0.0), типа "пытался играть, но не угадал ни одной буквы".
приложение в продакшене уже лет пять, что возбуждает очевидный вопрос, а что же делает бухгалтерия, когда нужно заплатить сполна, а приложение не даёт? очень просто: бухгалтерия не доплачивает один цент. а получателю либо похеру, либо он добавляет недоплаченный цент к следующему счёту. но факт остаётся фактом: половина (по теории вероятности) счетов недоплачена на один цент. а потом евреи спрашивают, почему их не любят :-)
да, а как открылось-то: в бухгалтерии наняли нового человека, а эту деталь объяснить забыли. человек в аппсаппорт, аппсаппорт ко мне, я нахожу в чём причина и докладываю начальству.
и, наконец, самое интересное - финальная резолюция начальства: баг не фиксить, тикет закрыть с диагностикой "user training issue". копейка рубль бережёт!
есть счета, которые надо оплачивать, и есть чеки, которыми платится, причём один счёт можно оплатить несколькими чеками. ну и есть приложение, которое в определённом месте проверяет, сколько уже по этому счёту заплачено и, соответственно, не даёт переплатить. а делает оно это примерно так (псевдокод):
(double) остаток = (double) текущий_остаток - (real) сколько_платим;
if (остаток < 0.0)
переплачивать_нельзя;программистам уже всё должно быть понятно, а счастливчикам поясню, что разница двух разных типов с плавающей точкой часто будет равна не точно нулю, а чему-нибудь типа -3*10^-15.особый цинизм данному коду придаёт решение программиста написать не if (остаток < 0), а if (остаток < 0.0), типа "пытался играть, но не угадал ни одной буквы".
приложение в продакшене уже лет пять, что возбуждает очевидный вопрос, а что же делает бухгалтерия, когда нужно заплатить сполна, а приложение не даёт? очень просто: бухгалтерия не доплачивает один цент. а получателю либо похеру, либо он добавляет недоплаченный цент к следующему счёту. но факт остаётся фактом: половина (по теории вероятности) счетов недоплачена на один цент. а потом евреи спрашивают, почему их не любят :-)
да, а как открылось-то: в бухгалтерии наняли нового человека, а эту деталь объяснить забыли. человек в аппсаппорт, аппсаппорт ко мне, я нахожу в чём причина и докладываю начальству.
и, наконец, самое интересное - финальная резолюция начальства: баг не фиксить, тикет закрыть с диагностикой "user training issue". копейка рубль бережёт!