Почему одни ошибки настолько распространены и что мы можем сделать, чтобы их предотвратить?

20

Кажется, что отдельные ошибки - одна из самых (если не самая большая) распространенная ошибка программирования (см. Https://softwareengineering.stackexchange.com/questions/109/what-are-common-mistakes-in-coding и общепринятая мудрость).

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

Malfist
источник
8
Они обычные? Я создаю свою справедливую долю ошибок, но ошибки редко встречаются среди них. Возможно, потому что я в основном использую Python, то есть использую итераторы вместо манипулирования индексами? (И: Что это говорит нам?;))
Чем меньше нужно думать, тем продуктивнее ты?
Malfist
@delnan: я согласен. Непостоянные ошибки, как правило, становятся первыми, когда я пишу код (прежде чем перейти к официальной «фазе тестирования»).
FrustratedWithFormsDesigner
7
Я почти ответил на предыдущий вопрос по ошибке ...
DevSolo
> Что мы можем сделать, чтобы не стать жертвой одних ошибок? Используйте итератор .
Джим Г.

Ответы:

18

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

Вероятно, лучший способ избежать ошибочных ошибок - это инкапсуляция. Например, вместо использования цикла for, который выполняет итерацию коллекции по индексу (от 0 до count - 1), используйте цикл для каждого стиля со всей логикой остановки в встроенном в перечислитель. Таким образом, вам нужно получить правильные границы только один раз при написании перечислителя, а не каждый раз, когда вы перебираете коллекцию.

Мейсон Уилер
источник
6
+1 для инкапсуляции. Наихудшие ошибки, которые я когда-либо видел, это когда часть программы основана на 1, а часть - на 0, и для каждой используемой функции вы должны помнить, какая это была, и нужно ли вам делать преобразование или нет и в каком направлении идти. Пару месяцев назад мне пришлось отследить сложную ошибку off- 2, потому что плохая инкапсуляция означала, что кто-то допустил ошибки off-by-1 в двух разных местах компоновки. Повсюду были конверсии, за которыми было невозможно следить, и я смог свести их к одной конверсии в одном методе.
Карл Билефельдт
2
Я хотел бы узнать больше о науке об этом, если у кого-то есть больше информации. Я также думаю, что именно поэтому программные стили, такие как CSS, так расстраивают, когда все вокруг ...
Компания Laser
7

Есть что-то особенное в том, как мозг обрабатывает границы и края.

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

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


источник
4

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

ChaosPandion
источник
2
И еще есть забавное переключение между языками программирования, которые имеют индекс, начинающийся с 1 (например, PL / SQL).
FrustratedWithFormsDesigner
3
+1 за это. 1-индексная нумерация отвечает на вопрос «сколько их?», Которая четко соответствует большинству задач реального мира. Индекс 0 указывает на то, «в какой позиции находится каждый элемент?», Что менее полезно в мясном пространстве.
Дэн Рэй