о
Владимир Маяковский
«Вы любите розы?»
Вы любите розы? а я на них срал! стране нужны паровозы, нам нужен металл! товарищ! не охай, не ахай! не дёргай узду! коль выполнил план, посылай всех в п*зду
не выполнил — сам иди на
^ V
X и.
h = 1 H'
e = 1 e 1
11 = ' 1'
12 = •1'
0 = 1 0 1
comma _
новые фичи. Индусский проэкт с кучей говнокода, который надо исправить для меня был бы идеальным вариантом
исправьте пазязя. И ты начинаешь вырезать говнокод тонну за тонной....
А там...
В общем, все было просто переписано, поэтапно. И да, это приятно.
Если ты будешь вырезать говнокод тонну за тонной, то ты все равно будеш трогать такие фукции.
И в конечном итоге поэтапное переписывание хуже чем разработанное с нуля, ну например потому что нужно заботиться о поддержке интерфейсов между старыми и переписываемыми компонентами. То есть в конечном итоге как бы все переписано, но куски старого дизайна все равно остались.
. И да, это приятно.
С чем я с тобой согласен, это то, что проблема бабла/времени таки сводится к качеству кода. То есть практика показывает, что постоянно принимаемые решения в угоду времени и в ущерб кода неизбежно приводят к невозможности дальнейшего разширения продукта и потребности переписать все правильно.
Переписываение частями:
- проект продолжает работать, не нудо ждать N-лет до новой реализации
- пишем тест на фичу, пишем новую реализацию небольшого куска, проходим тесты, переключаемся на новый кусок. Старый кусок удаляем через пару месяцев.
- дизайн. Стараемся все дробить на маленкие компоненты/модули, уменьшаем зависимости между отдельными модулями, что б как в лего.
@
Вроде все работает, сейчас напоследок сниму диаграмму в реальном времени чтобы убедиться что все прям совсем четко.
@
Все разваливается нафиг.
@
Попытка повторить ничего не дает. Десятая, сотая.
@
Спустя несколько часов тестирования самыми разными способами и в разных условиях прихожу к выводу что то был артефакт вызванный какими-то внешними крайне маловероятными причинами.
@
Подходит начальник. Жалуюсь на неуловимый глюк и шучу про "эффект присутствия". Сбой повторяется три раза подряд.
@
Спустя 100500 часов и чашек кофе, обвешав все вокруг отладочным выводом, контрольными точками, логическими анализаторами/осциллографами и просмотрев гигабайт сетевых логов обнаруживаю причину сбоя. Одно из вычислений в другом модуле происходит в прерывании с высоким приоритетом на несколько сотен наносекунд дольше чем стоило бы, с исчезающе малой вероятностью попадает по времени именно туда куда НЕ нужно и разрушает временнУю диаграмму протокола. Голая вероятность такого попадания исчезающе мала, но при определенном стечении условий частоты с которыми выполняются разные блоки могут становиться "когерентными" и вероятность сильно повышается.
@
Изменил приоритеты прерываний.
@
Вроде все работает
При увеличении выборки входных чисел часть результатов вычислений обращается в ноль.
Копаю данные, выяснил, что проявляется на определённых числах.
Думаю, что нашёл баг делфы.
Копаю дальше. Оказалось, я проморгал переполнение (числа взял такие большие, что не помещаются в longint), поэтому круглые числа после обрезания старших разрядов превращаются в набор нулей и при умножении число обнуляет результат целиком.