![]() |
Простейшие ошибки, отнявшие много времени
Расскажите про особые (см. далее) ошибки в коде, которые вы допускали. Ошибка должна отвечать двум качествам: она проста*, но трудноуловима**.
* - т.е. её возникновение не результат неоднозначного портирования, не следствие артефактов уровня аппаратного интерфейса, не результат ошибок в упрощении громоздких условий или вычислении констант, не итог запутывания в простыне кода, который в принципе невозможно удержать в голове. Ошибка вовсе не кажется таковой, т.к. в некотором смысле действительно описывает реализацию алгоритма, и, если тот не был, заранее продуман, то прочтённый ошибочный код увлекает, затуманив восприятие своей простотой. ** - в силу вышесказанного, ошибка раз за разом ускользает при чтении, отводя подозрения от своего простого окружения на более сложные конструкции. Давно хотел создать этот тред, и поместить в нём старенький участок кода: Код:
Dim DataTable$(0,0) //старожилы помнят, что я как-то уже упоминал об этой ловушке прим: команда dim от n выделит память под (n+1) элемент массива, и позволяет индексировать их как с нуля, так и с единицы (как будет принято в соглашении). Так что - ошибка не в индексах. |
Ответ: Простейшие ошибки, отнявшие много времени
Импер, как актуально.
Unity, С#. Четвёртая ночь без сна. Портирую относительно здоровенный проект с серверной частью на Flash (не то, чтоб я некрофил - это причуды заказчика). Пофиксить compile/post processing errors в связи со switch'ем на другую платформу, понатыкать platform define'ов и разных специфических для платформы workaround'ов (в т.ч. переписать половину "не поддерживаемых" во Flash .NET фич) - это, как оказалось, всего 20% работы/времени. Остальные 80% - это лютый, неистовый, бессмысленный и беспощадный дебаг в самописную "консоль" в виде текстового поля в canvas'е (только хардкор!). В голове крутилось ехидливое "Build once, run everywhere" (ога, если бы...). Дело в том, что понять, что что-то сломалось можно только в runtime непосредственно в билде. При этом "отваливаются" совершенно рандомные, базоыве/простые методы без каких либо признаков (ни error'а, ни exception'а). Например, я совсем не ожидал такого предательства от ToString(): ToString() - работает, ToString("N0") - ВСЁ, код дальше не выполняется. Просто не выполняется и всё тут. То есть Flash как бы говорит мне: "Счастливого дебага, сука!" Или вот сегодняшняя ночь: Перепробовать все JSON парсеры для C# @ Узнать, что ни один не совместим с Flash'ом @ Полностью переписать тот, который уже используется в проекте (сохранив интерфейс так, чтобы не переписывать все обращения к нему) @ Сбилдить @ Охренеть от результата (вкратце, строка "a" == "5755", а строка "e" == "115101115115105111110671111111107105101") @ Долго ломать голову что это за кодировка/шифр и экспериментировать, в итоге обломавшись @ Отрефакторить всё так, чтобы избежать использования перегрузки операторов и неявных преобразований, т.е. сделать отдельную обработку для каждого типа данных @ Снова получить неведомые шифры, но уже разглядеть в них ASCII коды вместо символов @ Реплейснуть 7 строк вызовом нового метода в одну строку (char to string) @ Осознать, что всё бы работало и так если бы я догадался сделать последний шаг в САМОМ НАЧАЛЕ @ Улететь в космос от мощности, сопоставимой со взрывом атомной бомбы, создавшейся в результате взрыва чуть ниже пояса Ну и таких кейсов овер9000. Если выживу (читать: высплюсь), может напишу статейку. *Ушёл портировать дальше.* |
Ответ: Простейшие ошибки, отнявшие много времени
Раз уж вспомнили про флеш.
(Хитро щурясь, засмаливая папироску и поглаживая окладистую бороду) Дело-то было в бородатые времена, когда я работал ещё в X, Internet Explorer 6 ещё был куда как в моде, и никакого интересного интерфейсу на ём сделать было решительно нельзя: куда ему там до современного CSS3, он даже с блочной моделью был не в ладах: чуть пёрднешь, и всё развалится. В то же время просмотр сайтов с мобилок в моду ещё не вошёл, а потому можно было себе это позволить. В-общем, промышляли мы тогда тем, что делали кое-какие элементы интерфейса на флеше. Запомнился мне случай: стояла задача сделать на флеше некоторое подобие меню, чтобы флеш подгружал xml'ину из сети (в отличие от JSON на XML во флеше есть родной парсер), в которой была информация о пунктах меню, парсил её и формировал, собственно, элементы меню. Сделал я тогда заголовку элемента меню на отдельном символе (по-современному это бы назвали "префаб"), а там шрифт использовался модный. Но нет проблем, выбираем его в списке медии и в свойствах указываем, дескать, ембеддить его в swf'ку с потрохами. Сделал — работает — показуем заказчику — заказчик говорит что шрифт не такой какой он хотел. Да мать-перемать в чём же дело? Меню создаётся? Да. Шрифт элементам указывается? Да. (иначе бы он другой был очевидно). УМВРЧЯДНТ? Ну, УМВР-то потому что шрифт ентот у меня в Винде установлен. Удаляю шрифт из Винды — вот оно, шрифт получился Times New Roman, который там совсем не в тему. Ну, если шрифта не хватает, вместо него TNR ставится. А что ж не так? Вытаскиваю префаб на первый кадр, сую его в рандомное место и пишу в нём "Lorem ipsum". Запускаю. Алилуйя! Вновь создаваемые пункты меню уже имели соответствующий шрифт! Убираю префаб — нет шрифта. Оставляю его, но оставляю все надписи пустыми строками в нём — снова нет шрифта. Пришлось его оставить с надписями, но за пределами кадра, чтобы до него было не добраться. Для верности ещё opacity 0.01 поставить (при 0 снова пропадают шрифты!). Так и пошло в продакшн. А произошло по моим предположениям вот что: несмотря на то, что шрифту была дана команда эмбеддиться во флешку (на это было указано пальцем и ещё перепроверено), флеш решил побыть умнее меня и рассудил так: раз на кадре надписей этим шрифтом не встречается, значит эмбеддить не будем. Конечно, ему же было невдомёк, что они появятся только после прогрузки XML, вот он мне и проблем доставил изрядно: сначала я не заметил проблему (как ни странно на работе коллеги, работавшие над проектом тоже, потому что у них тоже в системах тот шрифт стоит), и получилось фиаско перед заказчиком, пришлось жопа-в-мыле исправлять. Потом пришлось думать "да что же не так-то мать вашу?!". А потом искать "некостыльный" способ решения проблемы, понять, что его нет да так и запустить в продакшн с костылём (в виде надписи, которую никто никогда не увидит, но которая нужна во имя всевышнего маразма). И таких случаев было миллион за всё время, пока я работал с флешем. И крупные гадости он устраивал, да и на мелочи тоже не скупился. Например, ту же XML'ину он намертво загонял в кэш, и когда на сервере её содержимое менялось, флеш на это не реагировал (беря ту, что у него в кеше), не помогали ни перезагрузки страниц, ни очистка кеша самого браузера. Ну естественно, ведь флешка на странице — это, строго говоря, и не часть её. У неё там своё государство. Может, если ещё случаев вспомню, то расскажу, давно это было. Как только появилась возможность отказаться от поддержки IE6, Флеш был послан далеко и надолго вслед за ним. Настолько вот паршиво он реализован. Никогда больше к нему не вернусь, никаких денег у заказчиков на это не хватит :-D Да здравствует jQuery, да здравствует HTML5 и CSS3 ! До сих пор когда вижу где-то на каком-то сайте флеш-части, мне становится противно. Как же хорошо, что iPhone (хоть что-то он полезное сделал) встал рогом и отказался эту гадость поддерживать, в результате Флеш на веб-страницах уже практически сошёл на нет. |
Ответ: Простейшие ошибки, отнявшие много времени
Делал одно приложение на java, с гуём на swing. Производит некоторые вычисления и выдает результат. Запускаю на тестовых данных, где ответ должен быть ноль. Вижу что-то вроде 2.474257. Другой пример, так же жду ноль, получаю опять 8.757633. Как в итоге оказалось - в текстовом поле не поместилось E-9.
|
Ответ: Простейшие ошибки, отнявшие много времени
Писал обвязку под МК геодезической установки, которая просто температуру с 2 датчиков снимает, пишет в EEROM и можно UART потом слить их, не в том суть.
Нужно было отправить установку времни: T \r\n HH:MM:SS \r\n Y \r\n , где HH:MM:SS берется из TextBox (WinForm C#), долго искал что не так: PHP код:
Код:
лалала commadText(TextField), value: "ТЕКСТ" |
Ответ: Простейшие ошибки, отнявшие много времени
|
Часовой пояс GMT +4, время: 17:49. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot