Исправлять ошибки или ждать, пока клиент их найдет?


35

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

Пример 1

 Customer customer = null;
 ...
 customer.Save();

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

Но также немыслимо исправление кода:

Customer customer = null;
...
customer = new Customer();
try
   ...
   customer.Save();
   ...
finally
   customer.Free();
end;

может ввести аварии; один не обнаружен в модульных тестах с полным охватом и ручным тестированием пользователя.

Пример 2

float speed = 0.5 * ((G * mass1 * mass2) / R) * Pow(time, 2);

Люди, знающие физику, поймут, что в знаменателе должен быть R 2 .

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

Но возможно также, что из-за переоценки скорости скрывается еще одна проблема: подушки безопасности не могут развернуться, пока челнок движется слишком быстро. Если мы вдруг исправим код:

float speed = 0.5 * ((G * mass1 * mass2) / Pow(R, 2)) * Pow(time, 2);

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

Пример 3

Вот пример, который я недавно имел, проверяя, содержит ли строка недопустимые символы:

if (StrPos(Address, "PO BOX") >= 0)
{
   //Do something
}

Что если окажется, что в Do somethingветке есть ошибка ? Исправление заведомо неверного кода:

if (StrPos("PO BOX", Address) >= 0)
{
   //Do something
}

Исправляет код, но вносит ошибку.


На мой взгляд, есть две возможности:

  • исправить код и обвинить в его нарушении
  • дождаться сбоя кода и обвинить в ошибке

Что ты политически делаешь?


Пример 4 - Сегодняшняя ошибка в реальном мире

Я создаю объект, но вызываю неправильный конструктор:

Customer customer = new Customer();

Оказывается, что конструктор «без параметров» на самом деле является параметризованным конструктором из глубины цепочки наследования:

public Customer(SomeObjectThatNobodyShouldBeUsingDirectly thingy = null)
public Customer(InjectedDependancy depends)

Называть его ошибкой, поскольку он обходит все последующие конструкторы.

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

Customer customer = new Customer(depends);

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

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

Я не могу поставить на это жизнь твоей жены.

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

Должен ли я:

  • Исправить код и получить вину за его нарушение? или
  • Оставить ошибку и получить вину, когда клиент ее обнаружит?

33
Если вы не хотите что-то менять, потому что это может что-то сломать, и вы считаете себя неквалифицированным, чтобы посмотреть, что может произойти в других частях кода, что вы здесь делаете? Вы парализованы на клавиатуре, потому что строка кода, которую вы собираетесь написать, может быть неправильной?
Дэвид Торнли

3
конечно хорошо
изученный

2
«Do Something» часто является вызовом других функций, которые вы написали, или функций из библиотек, в любом случае код должен был быть проверен модулем. Сама процедура также тестируется модулем, оставляя возможность появления новых ошибок, когда вы исправляете один очень низкий уровень ... Если я построю мост, я сначала протестирую его в меньшем масштабе, вместо того, чтобы позволить людям, которые идут по мосту, умереть , Если вы не проводите модульные тесты, когда беспокоитесь об ошибках, вы делаете это неправильно. В любом случае, если вы исправите это, вас обвиняют, поэтому вместо того, чтобы исправить это, вы можете предотвратить это и не быть обвиненным вообще.
Тамара Вийсман

2
«подожди, пока люди не умрут, прежде чем это исправить»! Святая корова, я серьезно надеюсь, что есть только один ответ на это ...
Крис Найт

3
В качестве комментария конкретно об одной вещи, которую вы сказали: вы не знаете, где-нибудь еще в коде, они полагаются на эзотерическое поведение: так? Если кто-то злоупотребляет явно неверным правилом видимости в качестве хака в своем коде, значит, этот код НЕПРАВИЛЬЕН. Хороший ООП предотвратил бы эту ошибку, но если вы не исправите ее, потому что они использовали плохую практику, это усугубит проблему, оставит ее открытой для дальнейшего злоупотребления и сделает систему более нестабильной во всех отношениях. Исправьте ошибку, надеюсь, что тестирование обнаружит любые проблемы, исправьте больше ошибок, если это не так. Долгосрочная стабильность продукта - жизненно важный показатель.
CodexArcanum

Ответы:


34

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

Если бы я дал общее руководство для определения того, что делать, я думаю, что это было бы примерно так:

  1. Зарегистрируйте дефект в системе отслеживания выбора. Обсудите с руководством / коллегами, если это необходимо.
  2. Если это дефект с потенциально тяжелыми последствиями (например, ваш пример №2), бегите, кричите, прыгайте вверх и вниз, пока кто-то с полномочиями не заметит, и определите соответствующий порядок действий, который уменьшит риски, связанные с исправлением ошибки. Это может отодвинуть дату выпуска, спасти жизни, помыть окна и т. Д.
  3. Если это неисправимый дефект или существует обходной путь, оцените, перевешивает ли риск его исправления выгоду от исправления. В некоторых ситуациях будет лучше подождать, пока клиент не сообщит об этом, поскольку вы знаете, что не тратите время на исправление / повторное тестирование, когда это не требуется на 100%.

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


Очень верно. Вот почему (в некоторых) компаниях есть технические менеджеры, сканеры ошибок и т. Д., Чтобы расставлять приоритеты. Я не говорю, не проявляйте инициативу - совсем нет - но вы должны использовать здравый смысл. Принятие неправильной инициативы в неподходящее время называется «бесполезной пушкой» и может убить компанию. Кроме того, важность конкретной ошибки варьируется от компании к компании. Для некоторых программ опечатка в диалоговом окне является косметической ошибкой с низким приоритетом, которая будет исправлена ​​в будущем выпуске, а в других - аварийной остановкой.
Боб Мерфи

6
+1 за лог дефект. Другие дефекты могут иметь приоритет ...
Шуг

35

Клиенты ВСЕГДА найдут ошибки . Там нет скрытых ошибок от клиентов, никогда. В конце концов, ошибки, которые вы вносите, всегда возвращаются к вам. Не исправлять их - это просто плохая профессиональная практика. Профессионалы не делают этого.

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


2
Это печальная правда. Нам пришлось доставить проект, который мы тестировали, как сумасшедший, и все же клиенту удалось разбить его в течение 3 минут.
Оливер Вейлер

4
Метод @Helper: Возможно, если бы вы проверили это как здравомыслящие люди, это было бы лучше.
Винко Врсалович

Метод @Helper: Хотя, если серьезно, если бы это было действительно три минуты, похоже, что тестеры не знали, каковы реальные варианты использования, ожидаемые клиентом.
Винко Врсалович

8
Метод @Helper: вовлечь клиента в тестирование (assumimng customer == client). Разработчики, пишущие и тестирующие код, являются проблемой. Разработчики не используют программное обеспечение одинаково. Разработчики нежные. Это их работа - их искусство: клиенты стучат по нему, как обезьяна в панике. По возможности, делитесь усилиями по тестированию, делите ответственность. Это не вписывается в каждую среду, но работая с заказчиками в команде, а не консультантами, можно добиться лучшего программного обеспечения.
Брайан Чэндли

Э, хуже? (наполнитель)
Hello71

24

Исправить ошибку

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

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

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


4
+1. Почини это. Если исправление ломает что-то еще, то это что-то еще было сломано в любом случае - исправьте это тоже. Если ваше тестирование не улавливает эти перерывы, значит, ваше тестирование не работает - исправьте и это. Вы не можете позволить себе бояться изменить код из-за страха что-то сломать - эта дорога ведет только к полной гибели.
Том Андерсон

21

Что скажет клиент?

Вот как я представляю себе эту игру:

Клиент: он падает, когда я делаю х.

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

Заказчик: [тянется к тупому предмету]

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

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


8

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

Я бы сказал, что это, вероятно, огромная ошибка, и, как пишет Бен Лори , не исправляйте ошибку, которую вы не понимаете . В этом знаменитом примере команда Debian взломала шифрование для OpenSSL для Debian и его производных, таких как Ubuntu, когда они следовали результатам анализа.

Если вы считаете, что есть дефект, просматривая код, убедитесь, что вы можете воспроизвести его так, чтобы клиент мог его увидеть. Если вы не можете, почему бы не тратить свои ресурсы на то, чтобы починить что-то другое


7

Начните отыгрывать свой технический долг, как только сможете .

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

В Примере 1, если Save()нет доступа к каким-либо данным экземпляра, какие данные клиента они точно сохраняют? Начните исправлять и тестировать это.

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

В примере 3 существует опасность возвращения мертвого кода к жизни. Должен ли этот код быть полностью исключен? Каково намерение логического условия под этим если? Чтобы убедиться, что строка не содержит недопустимых символов? Или убедиться, что в нем есть «PO BOX»? Чем раньше вы начнете отвечать на такие вопросы, тем лучше.

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


5

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

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

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

Решение этого двоякое:

  1. Сделайте код максимально структурированным.
  2. Когда код достаточно изолирован, чтобы вы знали, что больше ничего не сломается, исправьте это.

Создание хорошо структурированного кода не делается путем переписывания всего кода в новый архитектурный дизайн. Скорее, рефакторинг, руководствуясь тестами, ваш друг здесь. На этом этапе вы не меняете функциональность.

Вторым шагом является исправление ошибки.

Несколько моментов актуальны:

  1. Контроль версий абсолютно необходим для этого процесса.
  2. Этап рефакторинга и этап исправления ошибок лучше подходят для управления версиями в виде отдельных коммитов, поэтому каждый из них имеет четко определенные исторические функции.
  3. Не зацикливайтесь на возможности сделать еще одну ошибку, вы ничего не сделаете. Скорее подумайте о том, как сделать ваш код лучше. Другими словами, если вы не знаете, что вы увеличиваете количество ошибок, а не уменьшаете их, вы должны это сделать.
  4. В связи с последним пунктом: не пытайтесь предсказать будущее. Люди склонны думать, что они очень хороши в прогнозировании. На самом деле наши способности прогнозирования являются краткосрочными. Так что не беспокойтесь о неопределенной неопределенной будущей ошибке. Это также принцип ЯГНИ .
  5. Соответствующим инструментом для контроля версий в мире ошибок является средство отслеживания ошибок . Вам это тоже понадобится.
  6. Вам необходимо исправить ошибки по двум причинам: чтобы удовлетворить клиента; и для того, чтобы иметь возможность прогрессировать в своем развитии. Чтобы использовать пример 3 (физический): если программа удовлетворяет клиента таким нарушенным уравнением, то есть много других частей программного обеспечения, которые были неправильно разработаны для смягчения этой ошибки (например, развертывание подушки безопасности). Если для этого программного обеспечения требуется версия 2 (или 1.1), то вам будет все труднее разрабатывать правильный код на основе этого неисправного. Затем вы либо идете к большому переписыванию, либо к большому провалу. Оба из которых вы должны избегать.

Это уже больше, чем несколько пунктов, так что я думаю, что я остановлюсь здесь.


3

Сначала вы должны рассмотреть определение ошибки:

  1. Читаемый код не соответствует тому, что вы считаете правильным
  2. Программное обеспечение не выполняет свои задачи должным образом

Вы, кажется, сосредотачиваетесь на # 1, где # 2 - лучшее место, чтобы сидеть. Конечно, мы, программисты, хотим, чтобы наш код был правильным (# 1), но люди платят нам за его работу (# 2).

То, что вы можете или не можете делать с кодовой базой, которая может случайно привести к появлению новых ошибок, не имеет отношения к # 2 взгляду на текущее программное обеспечение. Тем не менее, № 1 имеет значение для вас или программиста обслуживания, который следует. Иногда это трудно решить, но когда конфликт № 2 и № 1, вы должны знать, что № 2 явно важнее.


2

Ни. Есть третий способ: найти способ доказать, что «проблемный код» действительно вызывает проблемы с точки зрения бизнеса. Подтвердите, что вы найдете с BA / QA или хотя бы вашим менеджером. Затем планируйте исправление, когда все знают о проблеме.

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

  1. Код, который вы просматриваете, является мертвым кодом. Возможно, потому что, как сказал есолик, клиенты всегда находят ошибки. Если они этого не сделали, возможно, код никогда не будет выполнен.
  2. Была ситуация WTF, где очевидная ошибка имела свое значение. (Мы говорим о производственном коде, все могло произойти, верно?)
  3. Бизнес / клиенты уже знали о проблеме, но не чувствуют необходимости исправления.
  4. Может быть, больше...

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


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

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

2

Должен ли я:

  • исправить код и получить вину за его нарушение? или
  • оставить ошибку и получить вину, когда клиент ее обнаружит?

Вы исправляете ошибку, запускаете модульные тесты , и когда они успешны, вы проверяете свое исправление.

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


1
Или, если вы используете закрытую регистрацию, настройте ее так, чтобы вы фактически не регистрировали неработающий код.
Адам Лир

3
Долгое время не освобождает от ответственности за ввод плохого кода.
Тоби

@Toby: Кто говорил об оправданиях? В настоящее время я работаю в небольшой команде, даже не полдюжины разработчиков. Модульные испытания по проекту занимают 1 час. Наша политика состоит в том, чтобы запускать тесты, которые кажутся связанными с тем, что вы делаете, а затем регистрироваться и позволить CI выяснить, не сломали ли вы что-то, что казалось бы не связанным. Это не сработает в большой команде, но в маленькой это экономит много времени.
ВОО

1

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

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

Обратите внимание, что в каждом крупном программном проекте в ReadMe есть раздел «Известные проблемы», в котором обычно указывается именно это: Известные ошибки.

Знать ошибки и НЕ сообщать о них ИМХО приемлемо только для действительно незначительных / косметических ошибок.


1

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

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


0

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

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


0

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

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

  • История : Используйте ваше программное обеспечение для контроля версий, чтобы ответить на вопросы: Кто коснулся кода? Что они изменили? И с какими сообщениями фиксации они проверяли это? Можете ли вы определить причину, по которой код выглядит так?

  • Использование : Какой код использует ошибочный код? И как? Код мертв? Есть ли другой код, который полагается на ошибочное поведение?

  • Автор . Если вы не можете быстро прийти к заключению, используя приведенную выше информацию, спросите автора кода (по крайней мере, если это возможно), почему код выглядит так, как он. Обычно вы получаете либо «Ой, это должно быть исправлено!» или "Нет! Не меняй это !!! Так нужно!" сразу.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.