Комментарии 84
Отсутствие интересных задач. Иногда везет, и ты разрабатываешь какой-то хитрый плагин или модуль, или оптимизируешь какое-то место в системе, что приводит к ускорению алгоритма в несколько раз.
Но когда доходит до: «сдвинь кнопочку на три пикселя вправо, добавьте то, добавьте это» — когда требуются чисто технические навыки без фактического размышления и оригинальности — подобные задачи просто выматывают за несколько часов.
Слияние двух веток от одного ствола — это еще терпимо. Гораздо хуже, когда есть две главные ветки проекта. Скажем, 1.х и 2.х. И временами надо добавлять изменения из версии 2.x в 1.х или наоборот. Скажем, патчи безопасности. И это всегда боль и страдание.
Самое худшее в моей жизни это патч 3.х кодом из 8.х. За пять лет там ВООБЩЕ ВСЕ поменялось. И вместо мержа пришлось переписывать код с тем же фиксом.
Еще более страшный случай делал мой коллега — патч 2.х из 8.х. Там были разные системы управления кодом.
Почти всегда когда что-то получается через боль и страдание стоит задуматься — может быть я что-то делаю не так?
Почти всегда когда что-то получается через боль и страдание стоит задуматься — может быть я что-то делаю не так?
Не автор, но no problem, let's go:
->патч 3.х
«Был молод и не опытен»/«технологическая эпоха была иной»
->из 8.х.
«уже все делается как надо»
может быть я что-то делаю не так?
Не смог продать клиенту v8 в силу различных причин?
Резюме — вовсе не обязательно, что человек делает что-то не так. Наоборот, пример, разбираемый выше, — это случай, когда даже древние системы пытаются патчить от текущих уязвимостей и/или ошибок.
Что-то не так вы мержите… Что может быть неприятного?
Попробуйте мёржить хромиум. В каком-нибудь своём браузере (производном от хромиума).
Раз в полтора месяца приходится дорабатывать свой замечательный, отлаженный код, просто чтобы он снова начал собираться. Потому что гугл взял и в очередной раз напрочь отрефакторил какой-нибудь кусок хромиума, который у вас используется.
В статье написано, что иногда причина бага ищется даже дольше О_о
У кого-то такое было?
P.S. Ник у вас хороший…
P.P.S. Есть намного более страшный сон программиста — когда надо делать мерж между двумя разными системами управления исходным кодом (и не спрашивайте меня, зачем компании понадобилось использовать две разных системы внутри одного проекта)
У всех, кто пренебрегает unit test-ами может легко и непринуждённо возникнуть баг вида «неожиданные входные данные».
Это зависит не только от наличия юнит-тестов, но и от их качества. Да и не всё возможно покрыть автоматическими тестами, хотя таких случаев относительно мало.
И да: вряд ли невозможно покрыть тестами то, что должно проверять входные данные; здесь больше вопрос к качеству таких тестов.
Как-то вылез косяк — непонятно почему пропадал ВЧ сигнал на выходе. После переинициализации всё заводилось, но осадочек оставался, тем более у нас не та техника, в которой допустимо оставлять косяки. Пока это было не критично — этим не занимались. На протяжении пары месяцев заметили, что это вроде бы обычно в первой половине дня происходит. Последовательность команд, приводившая к ситуации могла быть любой. Когда занялся вплотную — неделя убилась на ловлю глюка. Он мог в один день пару раз проявиться, а мог 3-4 дня не проявляться. Я уже в отладчик вывел почти все сигналы управления — хрен знает, что делать, но что-то делать надо. Хотел свалить всё на аппаратчиков — какого фига что-то происходит, если мы ничем не управляем! Но нашёл) Девайс с утра стоял и грелся. Грелся и грелся… Когда прогревался до определённой температуры, в процессоре срабатывал алгоритм динамической подстройки выходной мощности, программа в процессоре крутилась по кругу и если после срабатывания алгоритма передать определённую команду в «неудачное» время, то кратковременно выдавалась команда на отключение. Понятно почему и проявлялось это исключительно до обеда — если эта ситуация «проскальзывала», то потом всё работало вполне себе спокойно)
Как-то разбирались почему после отправки команды на волшебный адрес вешалась вся система. Вот вообще вся. И всё бы ничего, но по телеметрии всё работало без нареканий и хоть каких-то намёков. Тут вот ушло только два дня. Один день ушёл на осознание и офигевание «как такое может быть»? А второй — уже более спокойно я выяснял какой и где интерфейс подвис. По финалу дня оказалось что на низком уровне система работает — телеметрия не врёт. «Чё за хрень»? Решилось аналитически, опять же надо было очень хорошо понимать низкий уровень. Один девайс отправляет другому пакет. Второй девайс должен его передать дальше, но в нём была старая прошивка с нескорректированной маршрутизацией и он этот пакет в соотвествии со своей таблицей маршрутизации заворачивал на первый девайс, переставляя адреса абонентов. Первый девай получал пакет, ну что делать — раз пришло, надо обрабатывать, системе управления типа виднее и в соответствии со своей таблицей маршрутизации происходила передача в блок обработки, который идентифицировал, что пакет мол не мой, переставлял адреса абонентов в пакете и выдавал обратно. Опять пакет улетал второму устройству и так далее. В результате одна команда передачи данных запускала в систему пакет, который там летал по петле на сумашедших скоростях, не давая отбиться таймаутам в интерфейсах. Ситуация красивая в том плане, что, когда набралось понимание по низкому уровню пришлось реально головой подумать и пофантазировать, а во-вторых — это не баг и не косяк, это кто-то, возможно даже я, не обновил везде прошивку на актуальную, но соль ситуации такова, что уже всем было на это пофиг если это починилось )))
Я думаю у каждого разработчика есть таких случаев в кармане тележечка. А если уж с железом плотно работаешь — и того подавно.
Самое смешное, что когда натыкаешься на такие баги, то через некоторое время поиска причины, то тебе начинает казаться, что причина во фреймворке, ос, драйверах, но не в твоем коде.
Я в прошлом году потратил три дня на поиска проблемы которая проявлялась в том что сообщения между двумя частями в browser extension переставали приходить после примерно 2-3 сообщений. С учётом того что из-за особенностей платформы (Firefox WebExtensions который на тот момент ещё не зарелизился) единственным доступным мне способом отладки была запись в логи — это было "весело", к третьему дню я реально начал сомневаться — а не сошёл ли я, случаем, с ума?
В итоге причину я всё-таки нашёл и она, как и почти всегда в подобных случаях, была тривиальной, но неожиданной:
Для передачи сообщений между частями browser extension используется отсылка сообщений через порт. Для передачи / получения сообщений открывается порт и в обработчике события открытия порта на него вешается обработчик для получения сообщений. Всё было настроено и работало, но я не учёл что во внешней библиотеке, которую я использовал, открывался аналогичный порт, но позже чем мой порт (как раз я за время пока второй порт не открылся успевал передать те 2-3 сообщения которые проходили). В момент открытия порта мой обработчик события открытия порта вызывался, сохранял ссылку на новый порт и вешал на него свои обработчики. Но поскольку порт был уже другим — я начинал получать не свои сообщения, а сообщения внешней библиотеки которые мне были не нужны.
В общем всё решилось банальной проверкой корректности имени порта (1 условие), но нервов на эту строчку ушло очень много :) В коде приложения до сих пор стоит подробный комментарий с припиской: "Takes me 3 days of debugging to figure it out, valuable information :) "
«Обнаружение трудновоспроизводимого или, что хуже всего, проявляющегося на интеграционном тесте бага, который случайно проходит или сбоит на одном и том же куске кода!!! Потом создаётся ощущение, что ты никогда не сможешь найти эти проклятые таинственные баги, прячущиеся где-то в коде. Фу!» Emmanuel Ngwane
Особенно весело бывает, когда причина сбоя обнаруживается на совсем другом куске кода, а не на том, на котором сбоит.
Был пару лет назад случай. Прилетает задача, срочно бросай все и срочно делай. Делаю, реализую, передаю, а заказчик ушел в декрет. И как спустя еще неделю переписки выяснилось, никому кроме заказчика эта фича не была нужна.
Но что самое веселое. Месяца 3 назад, задача прилетает обратно, заказчик вышел из декрета.
Хорошо не потерял свои наработки еще за 2 года.
но один из «мистических багов» искался недели 2-3, возникал где-то каждые 2-3 часа при 10 000 активных ТСР соединений, в одном их них… после бесконечных крешдампов, килограмов логов была обнаружена ошибка: в каком-то одном забитом месте вместо int надо было поставить unsigned int )))))
В этом жеж проекте было особенно весело находить баги и дыры в безопасности в самом протоколе, и в тех-жеж проектах которые мы «реверс-инжинирили»)))
Нашел я как-то неуловимый тупой баг в легаси коде, который периодически появлялся у одного пользователя из десяти. Пофиксил, отправил на тест, так тестеры не смогли воспроизвести этот баг и закрыли проблему с комментами, что бага нет.
- Работать с легаси где весь нейминг (переменные, класс, бд) и комментарии на голландском :)
При этом я заметил, что дома на выходном я могу провести за компьютером и 14 часов. Проанализировав свои действия, пришёл к выводу, что дома, не задумываясь об этом, регулярно встаю, могу просто ходить кругами, обдумывая код, могу лечь на пол (какой же это кайф — лежать на твёрдой поверхности) и смотреть в потолок, могу встать и приняться ритмично отбивать ритм барабанными палочками по тренировочному пэду, тоже при этом размышляя.
Это всё такие мелочи, копеечные, но обидно, что они отделяют продуктивную деятельность от непродуктивных мучений. И ни работодатель, никто об этом не знает, я мучаюсь просто зазря и конца этому не видно.
Помогает регулярное наливание новой чашки чая — дойти до стола с чайником, наклониться, поднять чайник, держа чайник на весу, налить воду в чайник, наклониться, поставить чайник. Наклрниться за пакетиком чая, затем за сахаром. Держа на весу чашку с кипятком, дойти до своего стола и поставить чашку на блюдце, не пролив чай на стол. Если пролил — вернуться к общему столу, поднять рулон бумажных полотенец, оторвать, вернуться к своему столу. А если в чайнике нет воды — то надо сходить с ним до кулера. И так до 4-5 раз за рабочий день.
А на обед можно и в дальнее кафе сходить — 10 минут туда, 10 обратно.
А Вы — неподвижно сидеть! Просто не надо держать пиво в холодильнике у компа. :-)
И ни работодатель, никто об этом не знает, я мучаюсь просто зазря и конца этому не видно.
Так может вы культурно донесёте работодателю свою проблему? Сейчас же уже официально есть в ТК понятие «дистанционная работа», когда сотрудник делает всё то же самое, что и в офисе, только дома. И оформляется это, судя по тому что я читал в обзорах ТК, без особого головняка и для сотрудника и для предприятия.
Причём порой ощущение, что чем тщательней и ответственней ты подходишь к её разработке, тем больше вероятность, что от неё скоропостижно избавятся, и наоборот — код написанный на коленке для галочки будет жить вечно.
0. Отсутствие четкого ТЗ по задачам
Нужно «чё-то вот такое» сделать
Которые выливаются в нечто типа «Мы не должны тратить много времени на брэйнсторм и планирование (Боже упаси, это Waterfall), но дайте нам четкий список того, что будет сделано к следующему релизу (или тоже самое с другого конца: „когда будет завершена эта фича?“).
Другой вопрос, насколько глубоко нужно вникать. А «огорчение» — это когда вникать приходится самостоятельно, а не с помощью специалиста указанной области.
Я бы добавил работу со старым (legacy) кодом на старых технологиях.
10 главных огорчений программистов