Блог им. Replikant_mih

Ненавижу дебажить код.

Ненавижу дебажить код.

Код стратегий, код чего угодно. По типу задачи (задача найти баг или оценить код на предмет: есть ли баги) – задача моя – т.е. я такое люблю – найди то, не зная что, так не зная как. Но блин – итак много задач, эти задачи они как бы не входили в твои планы, это как бы внеплановые задачи. Задача найти баги – плановая – но каждый конкретный новый баг – это внеплановая фигня – поэтому она напрягает. Это не задача, двигающая вперед, а задача, решение которой тебя возвращает в текущую точку развития после откидывания назад. Когда возникнет такая возможность, в первую очередь делегирую QA. 

Больше меня напрягает искать баги когда нет формальных свидетельств их наличия. Код компилируется, трейды совершаются, но ты, блин, очень не уверен, что в таком объёме кода нет ни одного бага)). Приходится планомерно проверять корректность. Пожалуй я начинаю переходить именно к такому подходу: планомерно всё проверять, а не на финальном этапе вдруг выяснить, что «похоже, что-то работает не так как надо». Думаю, с опытом процесс будет всё системней, а как следствие данную систему можно оптимизировать и она будет протекать всё легче, всё менее затратней, всё приятней в конце концов. 

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

★3
38 комментариев
Искать баги — полбеды.
Хуже, когда багов нет, а в логике алгоритма косяк, причем там где не ожидаешь.
avatar
Николай Скриган, Ну, можно сказать, что я это включил в понятие дебажить в данном случае). Или нет. В общем всё сложно).

Николай, подскажите, у вас с опытом кол-во багов и вот таких косяков в логике становится меньше? И какие вообще приемы, способы, методы используете чтобы избегать и чтобы легче находить?
avatar
Николай Скриган, косяк в логике тоже к багам  
нет формальных свидетельств их наличия
что-то работает не так как надо
avatar
SuperMegaTrader, 
косяк в логике тоже к багам  

Забавно, что слово «баг» пошло от застрявшего жучка в контактах реле допотопного компа, а теперь его трактуют весьма вольно:)
avatar
sortarray sortarray,  автор отнес. Я к этому. 
Вольная трактовка от геймеров пошла, видимо.
 По мне, так я вообще это слово стараюсь не использовать.
 Вместо этого использую словосочетание «какая-то куйня».  Я не проф-программер, мне можно)   

avatar
SuperMegaTrader, я тоже не проф. кодер, могу вообще никак не называть — просто тихо материться))
avatar
Ошибка ваша в том, что исправление бага возвращает назад. Исправление бага придвигает вас к правильно работающей программе. Это как движение к идеалу, который, может быть недостижим, но ведь двигаться к нему все равно надо !
Меня мотивирует вести журнал багов. Как только случилось что-то нехорошее, или даже то, что кажется подозрительным, записать это в систему баг-трекинга (но когда один работаешь, то проще в какую-нибудь табличку; мне самому в итоге лучше всего писать это в Mindjet). Критические баги надо исправлять сразу, остальные могут и подождать. Периодически в эту табличку нужно заглядывать и брать один из багов на ликвидацию.
Еще хороший прием -  тотальное логгирование. Пусть роботы пишут по несколько ГБ текстовых логов в день, какая проблема, ужмете их раром и перенесете в папочку на будущее. Но когда ошибка случается, чаще всего вся информация, нужная для ликвидации бага уже там содержится.
Иногда информации для ликвидации багов в текстовых логах недостаточно и понять, что к нему привело невозможно. В таком случае можно сделать еще сообщений в логах и при следующем появлении этого бага уже станет понятнее.
Когда исправляешь баг — переносишь его из своего списка в другой список «выполнено». Периодически заглядывать нужно и туда. Баг казался неисправимым, проявлялся непредсказуемо, целый год мешал жить, а потом смотришь — он в разделе «устранено». Это дополнительная мотивация.
Ну и, конечно, программы надо стараться писать так, чтобы баги было проще исправлять. Это и архитектура, и комментарии в коде и различные проверки того, что «не должно было случиться никогда».
Еще прием — исправлять один серьезный баг и тут же один мелкий. И хоть все системы тайм-менеджмента учат сначала заниматься срочными и важными делами, потом важными, а потом уже всеми остальными, но если мелкие баги накапливаются, то они начинают мешать жить с невероятной силой и мешать отлавливать более крупные. 
avatar
Jame Bonds, Спасибо, интересные мысли, фишки). Правда я больше сейчас про тестирование стратегий — тут я логирую налету), надо проверить конкретное место — вывожу нужную инфу — анализирую, оцениваю всё ли норм, двигаюсь дальше.
avatar
Если код «трейдерский», логически выстроенный, то и баги легко находить — глазом видно, что сделки не соответствуют логике ТС.
А вот если система «математическая», тут не знаю… Беда.
avatar
VladMih, не всегда можно увидеть на глаз, если заявок тьма то анализ сделок занимает очень много времени. в общем сложно всё. с другой стороны это наш хлеб.
avatar
Алексей, время требуется, конечно, как на любую работу,
но обычно такие ошибки находятся достаточно легко. 
Рекомендую ТСЛаб — тут вообще всё на полуавтомате.
avatar
VladMih, У меня просто обычно много условий для открытия сделки. Поэтому относительно сложно понять, в каком именно условии баг — надо раскладывать на атомарные условия и каждое проверять.
avatar
Сначала тесты пишем со всевозможными параметрами потом реализующий код, когда тесты прошли программный код готов.
Внес очередное изменение, напиши(поправь) на него тест, остальные тесты пробежали ок значит нет регрессии.
Часто написать хороший тест сложнее чем реализовать функционал.

Это дешевле чем картина когда кто то фиксит 1 баг порождая вагон и тележеку новых.

Ну и логи логи и еще раз логи, если ты вынужден дебажить значит твой код требуется более тщательно логировать на нужном для этого уровне.



Удобно когда каждый коммит в репозиторий запускает сборку проекта и автотесты+интеграционные(на отдельной машине) с результатом по мылу всей команде, сразу видно кто всю малину…
avatar
Иван Иванов, Я пока больше про тестирование стратегий, там это не очень актуально. А дальше да — все эти вещи станут более актуальными.
avatar
Иван Иванов, зашел сюда написать этот пост :)
Добавлю одну мысль: Написание теста перед написанием основного кода очень структурирует в голове основную задачу.
avatar
А я в таких случаях представляю себя охотником. Ведь этот процесс аналогичен тому, чем занимались наши предки и он у нас в крови. И все становится на свои места.

avatar
ivanovr, Ну да, я правда не охотником представляю, мне как аналитику по натуре такой вызов естественен, просто напрягает массовость вызовов)) и тот факт, который я в посте описал как незапланированный челлендж).
avatar
Replikant_mih, все зависим от ожиданий. Отбрось иллюзию что пишешь без багов. И тогда единственное что будет тебе досаждать, это мысль «а как же оно работало уже пол-года»!?
avatar
ivanovr, Ну да, наверно в образ процесса надо заложить более реалистичные объемы багов)), тогда это будет восприниматься легче).
avatar
ivanovr, или иногда «три года»
avatar
Посмотрите на TDD. В крупных проектах написание тестов занимает большую часть разработки, возникшие баги — как дополнительные кейсы для тестов. По мне только с таким подходом появляется больше уверенности в правильности работы программы.
avatar
ilijaz, спасибо, ознакомлюсь)
avatar
опыт наверное всё-таки не приводит к уменьшению ошибок.
в конце концов иной раз можно целый день гоняться за каким-нибудь "<" вместо ">" и т.п.
просто на самом деле начинаешь проверять всё. сделал кусочек, проверил, сделал другой — проверил. собрал вместе — снова ещё пяток раз проверил. ну, если не лень, конечно.

настраиваю себя как рекомендовал Рей Далио: что каждая ошибка, это паззл, который в случае отгадки даёт награду.
проще говоря — только исправляя ошибки можно сделать жизнь лучше.

почитал комменты. я тоже веду журнальчик. если замечу с роботом что-то странное, сразу записываю. сейчас висящих задач вроде как нет.
avatar
ПBМ, Может приду к этому — при написании сразу атомарные элементы тестить, перепроверять.
avatar
тестить надо на этапе написания кода… а не после...
вообще… есть норма… 20 строк отлаженного кода в день… 
avatar
ves2010, Да, возможно. Может тоже приду к тому, чтобы тестировать на этапе написания.
avatar
ves2010, 20 — многовато в день. По нормам, если 14 строк в день отлажено (качественно), то день не зря прожит.
avatar
это оч мало имхо, если только совсем тема незнакомая и плаваешь с языком
avatar
А вы баги ищете на бэктестах или на реальных торгах?
avatar
vladkot, на бэктесте. Пока речь о таких багах.
avatar
Replikant_mih, вообще то бэктест это что-то приближенное к реальности. Много ошибок, много нереальных сделок. Баги нужно искать в реальной торговле. Форвард-тест 1 контрактом даст больше информации, чем куча бэктестов. Мое имхо.
avatar
vladkot, Не, ну это плюбому тоже нужно. Просто всему свое время и место). Что-то проще и дешевле выявить на этапе бэктестинга, что-то только в реальной торговле.
avatar
есть отдельная должность такая — юнит тестировщик. Вот нужно по такому принципу действовать. Отлаживать код кусками и модулями на этапе создания
avatar
Андрей К, Ага, знаю, сам в IT компании работаю. Но никогда не вникал, как конкретно они работают. Надо, действительно, в теорию вопроса углубиться — по-любому много интересного найду.
avatar
TDD и стандартные модульные тесты, видимо, крутая вещь, но, возможно, геморрная, когда сам работаешь. Но, видимо, если речь идет о сверх большом проекте, без нее не обойтись. Вопрос только в том, как такое осилить в одиночку...
У меня проект уже достаточно большой и я его тестирую, часто дублируя функции, написанные разными способами. На выходе имеются два текстовых файла, которые должны в точности совпадать, сравниваются в WinMerge. Выглядит это так:

Видимо, это тоже какая-то форма TDD.
avatar
tranquility, Похоже, каждый алготрейдер доходит до каких-то своих вариантов-аналогов общепринятых среди разработчиков вещей)
avatar
в Луа под квик никаких юнит тестов нет, отлаживаюсь финально (так то конечно каждую ф-цию тестишь на работоспособность в момент написания) на живом рынке, просто одним конем и ставишь цены на исполнение такие, чтобы лимитки повисали без исполнения (на ранней стадии отладки) и в совсем боевом, с исполнением, но маленьким сайзом на фьюче сбера например (подешевле маленько). Когда отладился и запустился, первое время надо не лениться все руками проверять/пересчитывать, бывает что-то вылезает
avatar

теги блога Replikant_mih

....все тэги



UPDONW
Новый дизайн