Отладка - дурной запах - как их уговорить?

Я работал над проектом, который больше нельзя назвать «маленьким» (40+ месяцев), с командой, которую больше нельзя назвать «маленькой» (~ 30 человек). Мы все время использовали практики Agile / Scrum (1) и здоровую дозу TDD.

Я не уверен, взял ли я это из Agile или TDD, скорее всего, из комбинации этих двух, но теперь я явно нахожусь в лагере людей, которые смотрят на отладку как на дурной запах. Под «отладкой» я имею в виду не более абстрактную концепцию выяснения того, что может быть не так с системой, а конкретную деятельность по запуску системы в режиме отладки, пошаговое выполнение кода для выяснения деталей, которые иначе непостижимы.

Поскольку я совершенно убежден, этот вопрос не в том, дурно пахнет отладка. Скорее, я хотел бы знать, как я могу убедить своих товарищей по команде в этом.

Люди, которые считают, что режим отладки является «стандартным» режимом, обычно пишут код, который можно понять только путем отладки через него, что приводит к потере много времени, поскольку каждый раз, когда вы работаете над элементом кода, разработанного кем-то другим, вы нужно сначала потратить значительное количество времени на его отладку (и, поскольку здесь нет ошибки ... этот термин становится все более и более нелепым), а затем возникают разрозненные хранилища. Так что я хотел бы убедить некоторых из моих товарищей по команде, что избегать режима отладки - это хорошо (2). Однако, поскольку они привыкли жить в режиме отладки, они, похоже, не видят проблемы; для них нормой является тратить часы на отладку чужого кода еще до того, как они начнут делать что-либо, связанное с их новым элементом; они не видят в этом ничего плохого. Кроме того, поскольку они тратят время на «выяснение этого», они знают, что в конечном итоге разработчик, который работал в этой области, станет доступным, и предмет будет передан им (что приведет к еще одному бункеру).

Помогите мне придумать план, как отвратить их от Темной стороны!

Заранее спасибо.

(1) Также называется SCRUM (все заглавные буквы). Помимо аргументов в пользу использования заглавных букв, я думаю, что следует использовать звездочку после этого термина, поскольку - неудивительно - наша организация «доработала» процессы Agile и Scrum, чтобы они соответствовали предполагаемым потребностям всех заинтересованных сторон. Так что, честно говоря, я не буду притворяться, что это было 100% в соответствии с теорией, но это не относится к моему вопросу.

(2) Да, всегда будут моменты, когда мы должны перейти в режим отладки, я не пытаюсь полностью этого избежать, просто ... пытаюсь минимизировать количество раз, когда мы погрузиться в это.


person FOR    schedule 01.11.2008    source источник


Ответы (13)


Если вы хотите убедить своих коллег в том, что ваши методы программирования лучше, сначала продемонстрируйте своей продуктивностью, что вы более эффективны, чем они, по крайней мере, для некоторых задач. Тогда они поверят вам, когда вы объясните, как вы так много делаете.

Также иногда легче сосредоточиться на чем-то конкретном. Ваши коллеги вообще говорят о «запахе кода»? Возможно, вы могли бы сосредоточиться на таких деталях, как «Когда модуль ABC выходит из строя, на его отладку уходит вечность; гораздо быстрее использовать технику XYZ. Здесь позвольте мне продемонстрировать». Затем вы можете упомянуть свой основной принцип: да, отладчик - полезный инструмент, но обычно есть и другие, более полезные.

person lacker    schedule 01.11.2008
comment
+1: спасибо за предложение; к сожалению, похоже, что разработчики не заинтересованы в повышении производительности (им все равно платят одинаково). - person FOR; 02.11.2008

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

Отладка ухудшает качество кода, который мы производим, потому что это позволяет нам обойтись более низким уровнем подготовки и меньшей психологической дисциплиной. Я узнал об этом из случайного контролируемого эксперимента в начале 2000 года, о котором сейчас рассказываю:

Я получил контракт в качестве кодировщика Delphi, и первой поставленной задачей было написать механизм шаблонов, концептуально похожий на механизм отчетов - с использованием Java, языка, с которым я был незнаком.

Как ни странно, работодатель был вполне счастлив заплатить мне контрактные ставки, чтобы я потратил месяцы на изучение нового языка, но не стал платить за книги или отладчики. Мне посоветовали скачать компилятор и учиться на онлайн-ресурсах (Java Trails были довольно хороши).

Золотое правило искусств и наук состоит в том, что тот, у кого есть золото, устанавливает правила, поэтому я действовал в соответствии с инструкциями. Я настроил свои макросы редактора, чтобы я мог запустить компилятор Java в текущем буфере редактирования одним нажатием клавиши, я нашел определения синтаксической раскраски для своего редактора и использовал регулярные выражения для анализа вывода компилятора и поместил курсор в указанное место ошибок компиляции. Когда пыль улеглась, у меня была небольшая IDE со всем, кроме отладчика.

Чтобы отследить свой код, я использовал старый добрый метод вставки записей в консоль, которые регистрировали позицию в коде и состояние любых переменных, которые я хотел проверить. Он был грубым, занимал много времени, его нужно было вытаскивать после того, как код заработал, и иногда у него были сбивающие с толку побочные эффекты (например, принудительная инициализация раньше, чем это могло бы произойти в противном случае, в результате код, который работает только при наличии трассировки ).

В этих условиях методы моего класса становились короче и все более и более четко определяемыми, пока, как правило, они не выполняли ровно одну очень четко определенную операцию. Они также, как правило, были специально разработаны для легкого тестирования, с простым и полностью детерминированным выводом, чтобы я мог тестировать их независимо.

Короче и короче: когда отладка более болезненна, чем проектирование, путь наименьшего сопротивления - лучший дизайн.

То, что превратило это наблюдение в уверенность, - это успех проекта. Внезапно появился бюджет, и у меня появилась «правильная» IDE со встроенным отладчиком. В течение следующих двух недель я заметил возврат к прежним привычкам, когда «набросок» кода заставил работать итеративным уточнением в отладчике.

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

Не поймите меня неправильно: есть место и для отладчиков. Лично я считаю, что это место в руках руководителя группы, который должен быть вызван во время острой необходимости разгадать тайну, а затем снова отнят, прежде чем люди потеряют дисциплину.

Люди не захотят просить об этом, потому что это было бы признанием своей слабости перед их коллегами, а акт объяснения потребности и окружающего контекста вполне может побудить коллег к пониманию, которое решит проблему - или даже лучшему дизайну, свободному от проблема.

Итак, ЗА, я не только согласен с вашей позицией, у меня есть реальные данные контролируемого эксперимента, подтверждающие ее. Однако это довольно небольшая выборка. Прежде чем мои выводы будут подтверждены, требуются более сложные тесты.

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

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

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

Это вызывает отток талантливых людей, потому что они обычно используют этот талант для редких и драгоценных вещей, чтобы получать хорошую зарплату, не работая слишком много, а рынок не хочет платить за превосходство, потому что он не может достаточно хорошо различать таланты, чтобы знаю, когда оплата оправдана.


Другая мысль: недавняя работа с проблемами на производственных серверах, где невозможно было установить отладчик, показала важность наличия базы кода, обслуживание которой не зависит от доступности отладчика. Код, который вырос без отладчиков, доставляет гораздо меньше хлопот. Выбирайте не использовать их, когда вы можете передумать, а затем, когда вы не можете передумать, все будет не так ужасно.

person Peter Wone    schedule 02.11.2008
comment
Ах ... прямой, практический, конкретный опыт решения рассматриваемой проблемы - спасибо, что поделились; такие вещи могут помочь мне и моей команде! - person FOR; 02.11.2008
comment
Если бы я мог, я бы дал вам дополнительный +1 за то, что вы вспомнили эту тему через 4 года :) Спасибо за добавленную информацию. Сценарий «Невозможно использовать отладчик» очень интригует. - person FOR; 28.06.2012

Поскольку я совершенно убежден, этот вопрос не о том, дурно пахнет отладка.

Что ж, тогда ваша местная церковь могла бы быть более подходящим местом для вашего вопроса.

Кроме того, убедите их аргументами. Однако вы можете пересмотреть свою фундаменталистскую позицию, потому что это полная противоположность убеждению. Одна вещь, которую вы, возможно, захотите сделать, - это отказаться от термина «отладка» во всем своем обсуждении и заменить его «пошаговым выполнением кода» или тому подобным, подчеркнув, что вы выступаете против неуместной практики догадок / лоскутного шитья по проверке, которую вы осуждаете, а не информированное размышление о коде.

(Я все равно не согласен с вами, но это не относится к делу, поскольку вы не хотели обсуждения.)

person Konrad Rudolph    schedule 01.11.2008
comment
Вы имеете в виду, что верующие не желают участвовать в реальных дискуссиях? Возможно, я неверно истолковываю ваш комментарий о Церкви, но он кажется ненужным, если вы имеете в виду то, что я думаю. (Есть много атеистов, которые твердо убеждены и не хотят слушать дискуссии ...) - person Jon Skeet; 01.11.2008
comment
@ Джон, это не было ехидным замечанием по поводу церквей. Я думаю, что большинство людей согласны с тем, что твердые убеждения обычны / необходимы в церкви, но гораздо менее полезны в техническом контексте, где абсолюты встречаются редко. Так что нет, я на самом деле не имею в виду то, что вы думаете. - person Konrad Rudolph; 01.11.2008
comment
Гудо - не стесняйтесь удалять этот комментарий, мой оригинальный, а потом и ваш :) - person Jon Skeet; 01.11.2008
comment
Я уважаю разные мнения, но хотел получить ответ на свой вопрос. Извините, если это прозвучало недальновидно. - person FOR; 02.11.2008
comment
1. Он сказал, что убежден, и мне нравится думать о людях лучше всех (что его убеждает разум, а не догмы); 2. он не сказал, что никогда не будет обсуждать это; просто он намеревается, что это будет другое обсуждение. Трудно поставить вопрос на противоречивой предпосылке. Люди не могут сопротивляться. - person Alan Hensel; 02.11.2008

Я думаю, настоящая проблема здесь в

Люди, которые считают, что режим отладки является «стандартным», обычно пишут код, который можно понять, только пройдя через него.

Если это правда, то это должно быть самоочевидно неправильным, и нет необходимости обсуждать это. Если это не очевидно, то потому, что они не видят, как можно улучшить плохо написанный код. Покажите им, сделайте обзоры кода, где вы покажете, как этот код можно реорганизовать таким образом, чтобы это было понятно, не проходя через него.

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

person Vinko Vrsalovic    schedule 01.11.2008
comment
Винко Я думал об этом десятилетиями. Все, что вы говорите, правда, но я думаю, что это хороший способ отделить тех, кто может подойти к делу, от тех, кто не может. Тогда вы могли либо сократить штат, либо изменить иерархию. - person Peter Wone; 11.05.2012

Здесь что-то не так, но это сложно понять. Возможно, настоящая проблема в том, что у кода есть другие запахи, которые затрудняют понимание. Я согласен с тем, что с TDD следует использовать отладчик меньше, чем больше, поскольку вы будете разрабатывать код небольшими приращениями. Но если вы не можете взглянуть на код и понять его, возможно, это связано с тем, что дизайн слишком взаимосвязан - для работы требуется слишком много взаимосвязанных классов.

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

Я знаю, что для меня переход от традиционной разработки, ориентированной на код, к разработке, ориентированной на тестирование, привел к сокращению времени, затрачиваемого на отладку ... и это не то, чего я скучаю. Обычно я задействую отладчик только тогда, когда неочевидно, почему код, который я только что написал для прохождения теста, не прошел.

person tvanfosson    schedule 01.11.2008

Это будет звучать как аргумент, который вы сказали, что не хотите иметь, но я думаю, что если вы хотите убедить своих товарищей по команде, вам придется привести более веские доводы. Я не понимаю вашего возражения. Я часто просматриваю код, который пытаюсь понять с помощью отладчика. Это отличный способ увидеть, что происходит. Вы не подтвердили свое утверждение о том, что люди, использующие отладчик таким образом, склонны писать код, который иначе трудно понять. Единственный убедительный способ сделать это - провести какое-то исследование случай / контроль, в котором пытались измерить и сравнить читабельность кода, написанного людьми с различными подходами к отладчику. И вы даже не рассказали правдоподобную историю, объясняющую, почему вы думаете, что использование инструмента для понимания выполнения кода имеет тенденцию приводить к неаккуратному построению кода. Для меня это полное non sequitur.

person Alex Coventry    schedule 01.11.2008
comment
Извините, я полагаю, что не стал приводить аргументы в пользу строки, потому что меня интересовал аспект убеждения. Пожалуйста, прочтите мой вопрос как гипотетический: «Предполагая, что отладка - дурной запах, как бы вы убедили своих товарищей по команде?» Тем не менее, ваша точка зрения хорошо понята. - person FOR; 02.11.2008

«План», чтобы убедить их в преимуществах другого подхода, заключается в установлении показателей связано с количеством раз, когда вы отлаживаете одну и ту же функцию для разных ошибок.

Анализируя тенденцию этого показателя, вы можете убедить их, что нерегрессионные тесты более полезны для написания и помогут им для более эффективной отладки.

Таким образом, вы не откажетесь полностью от привычки «отлаживать», но вы убедите их создать надежный набор тестов, позволяющий при необходимости сосредоточиться на действительно полезном сеансе отладки.

Если вы рассматриваете этот план действий (метрики), вы должны знать, что его реализация включает в себя всю иерархию (заинтересованное лицо, менеджер проекта, архитектор, разработчики). Все они должны быть вовлечены в эти показатели, чтобы действовать в соответствии с ними.

Что касается разработчиков, вы можете попробовать предложить:

  • некоторые новые способы закрытия случая ошибки (закрывайте его только с помощью тестового сценария, воспроизведенного для воспроизведения этой ошибки, что означает, что им нужен независимый тест, чтобы, при необходимости, запустить свой сеанс отладки)
  • четкая взаимосвязь между этими метриками и их оценкой со стороны руководства (было бы плохой практикой отлаживать снова и снова одну и ту же функцию)
  • более широкое участие в принятии архитектурных решений: иногда знание некоторых функциональных или прикладных функций, а не только классов и кода, может побудить разработчика думать больше в терминах теста черного ящика, а не белого ящика (что может легче привести к сеансу отладки)
  • участие в процессе «операционной архитектуры» (где вам нужно развернуть приложение и провести полный тест интеграции от начала до конца). Опять же, более широкая картина всей системы может помочь разработчику больше интересоваться функциями, а не «строками кода».
person VonC    schedule 01.11.2008
comment
+1: спасибо за предложение; теперь .. как убедить их, что установление такой метрики было бы полезно? Я имею дело с интересной группой людей здесь, вы можете сказать? - person FOR; 02.11.2008
comment
Спасибо за добавленные идеи. В частности, более активное участие в архитектурных решениях может относиться к нашей команде и привести к хорошему самоанализу. Спасибо! - person FOR; 02.11.2008

Я думаю, что лучше сформулировать этот вопрос: «Не является ли не-TDD запахом кода?» TDD, кажется, приводит к тому, что в отладчике тратится меньше времени из-за того, что больше времени тратится на написание / провал / прохождение тестов. Без TDD вы с большей вероятностью будете проводить время в отладчике для диагностики ошибок.

По крайней мере, в Visual Studio использование отладчика не так болезненно, поэтому вам будет сложно объяснить своим товарищам по команде, как TDD сделает их разработку более увлекательной, продуктивной и успешной. Просто отказ от отладчика, вероятно, не достаточная причина для того, чтобы команда сменила методологию разработки.

person Peter M    schedule 01.11.2008

Прямо на дороге воин. проблема не в отладке, это плохо прокомментированный и / или документированный код и плохая архитектура. Я работаю в небольшой команде, но когда ошибка обнаруживается, я все-таки просматриваю код. часто это очень небольшая работа, потому что приложение хорошо спланировано, а документация по коду ясна.

Тем не менее, давайте перейдем к моей точке зрения. Хочу, чтобы команда не отлаживала ... комментируйте, комментируйте, комментируйте. Ничто не сравнится с желанием отладить быстрее. Конечно, они все равно будут это делать, но с большей вероятностью они перешагнут хорошо документированный код.

Да, и хотя это само собой разумеется, я все равно сделаю это. в вашем коде нет ошибок. :)

person baash05    schedule 02.11.2008

Я согласен с теми, кто выше выразил относительную неактуальность этой «проблемы отладчика».

ИМО, две самые важные цели разработчика:

1) Заставьте программу делать то, что она должна делать.

2) Напишите код так, чтобы разработчик обслуживания через 2 года имел опыт изменения существующих или добавления новых функций.

person Tim Tonnesen    schedule 02.11.2008

Прежде чем составлять план, вы должны решить, насколько важно для вас это изменение. Хотя я согласен с тем, что отладка - это запах, это также очень хорошо принятая и укоренившаяся практика для разработчиков, поэтому убедить их, что они должны прекратить это делать, будет нелегко или быстро - и по уважительным причинам. Сколько энергии вы хотите вложить в эту тему?

Во-вторых, зачем вам вообще их уговаривать? Если ваша мотивация - помочь им, действительно ли это их первоочередная проблема? Когда вы помогаете людям так, как они хотят, чтобы им помогали, изменить стало легко.

После того, как вы решили, что хотите продолжить свою инициативу по изменениям, вам необходимо принять во внимание, что разных людей убеждают разные вещи. Некоторые люди уже убедятся, попробовав что-то новое и интересное. Некоторых убедят цифры (метрики). Некоторым рассказывают об этом, когда они едят их любимое печенье (серьезно!), Некоторым - слышат об этом от своего любимого гуру. Некоторые, прочитав об этом в журналах. Некоторые видят, что «все остальные тоже так делают». И т. Д.

На InfoQ есть содержательное интервью с Линдой Райзинг: http://www.infoq.com/interviews/Linda-Rising-Fearless-Change. Она может сказать это намного лучше меня. Книга тоже неплохая.

Что бы вы ни делали, не нажимайте слишком сильно, но и не сдавайтесь. Изменения могут произойти, особенно если вы воспользуетесь сопротивлением как ресурсом, и иногда это происходит в неожиданные моменты. , поэтому всегда сохраняйте чувство удивления.

person Ilja Preuß    schedule 02.11.2008
comment
Проблема в том, что после длительного периода работы над мусорным кодом люди переключаются из режима крафта в режим друджа. Поскольку они не заботятся о качестве, они переключаются на получение оплаты. - person Peter Wone; 02.11.2008
comment
Это может быть проблемой, но я не думаю, что это проблема. Есть много других причин думать, что отладка - это нормально. - person Ilja Preuß; 02.11.2008

@FOR: У вас тоже есть вторая проблема, вот она:

к сожалению, похоже, что разработчики не заинтересованы в повышении производительности (им все равно платят одинаково)

Как вы собираетесь заставить их хотеть быть более продуктивными, когда им (видимым) нечего получить?

person Andrei Rînea    schedule 04.11.2008
comment
Хороший момент - я намеревался обойти эту проблему, поскольку считаю, что я не могу заставить их работать более продуктивно. Но, может быть, я смогу убедить их делать то, что облегчит их жизнь (например, разработать систему, не требующую пошагового выполнения кода). - person FOR; 04.11.2008

Разработка программного обеспечения путем отладки - это хорошая практика.

Число сред, поддерживающих этот способ разработки, очень невелико: самая известная - это Smalltalk. В Smalltalk вы можете написать тест, описывающий протокол ваших объектов, без реализованных методов. После этого запуск этого теста запустит отладчик, и вы можете добавить метод к нужному классу в отладчике и продолжить пошаговое выполнение кода, пока не будут реализованы все функции и тест не станет зеленым.

Для этого нужен компилятор, доступный во время выполнения, и первоклассные вызовы. Он предлагает очень короткий цикл обратной связи и является одной из основных причин продуктивности Smalltalks.

person Stephan Eggermont    schedule 08.04.2016