Ошибки сопровождают нас с самого рождения — с их помощью мы учимся, познаём мир и получаем ценный жизненный опыт. Однако часто этот опыт и становится причиной множества ошибок. Похоже на замкнутый круг, выход из которого уже много лет пытаются найти психологи и философы.
В этой статье рассмотрим теорию, объясняющую механизм провалов, и разберёмся в методиках, которые помогут избежать новых ошибок.
Часто причины ошибок связаны с физиологическими факторами — недосып, головная боль — и организацией процесса: сжатые сроки и вынужденный кодинг по 36 часов подряд. По данным НАФИ, компании теряют миллиарды долларов в год из-за недосыпа сотрудников и тех ошибок, которые они совершают.
Но даже если организационных проблем нет, промахи всё равно случаются. Иногда это приводит к длительной работе над исправлением ситуации. И никто от этого не застрахован — даже самые дисциплинированные и ответственные специалисты.
Утечки данных, упавшие сервисы — всё это случается с завидной регулярностью. Не все ошибки глобальны, но иногда постоянные мелкие недочёты сигнализируют о некомпетентности или излишней самоуверенности кого-то из команды. Существуют хрестоматийные случаи провалов в IT, которые привели к серьёзным проблемам:
- Медицинский аппарат Therac из-за ошибки в коде выдал повышенную дозу облучения пациентам.
- Электронный стояночный тормоз с дефектом привёл к тому, что Toyota отозвала с рынка 84 тысячи автомобилей.
- Отключение электроэнергии в США, одной из причин которого стало отсутствие оповещения, обошлось в шесть миллиардов долларов.
Почему мы ошибаемся: прогнозирующее кодирование и шум
В непреднамеренных ошибках виновато наше мышление, а точнее — тот способ, которым мозг воспринимает информацию. Вопрос о работе мозга решают нейрофизиологи вместе с искусственным интеллектом — и всё больше влияния приобретает теория прогнозирующего кодирования. Её суть такова: наш мозг генерирует восприятие, а информация, поступающая от органов чувств, лишь корректирует его. В противном случае мозгу пришлось бы обрабатывать слишком много данных, а это нерационально.
Проще говоря, эволюция нашла для мозга обходной путь. Мы постоянно строим прогностическую модель окружающего мира и одновременно сравниваем, совпадает ли поступающая сенсорная информация с прогнозом. Если да — отлично, модель мира хороша. Если же нет — придётся менять одно из трёх:
- сам прогноз, то есть переделывать модель, что требует больших затрат энергии и потому редко случается;
- информацию, то есть корректировать данные благодаря подключению других органов чувств;
- свои представления.
Данные из внешнего мира поступают к нам через узкое окно восприятия и формируют убеждения. Но затем эти убеждения действуют подобно линзе: фокусируются на том, что нужно увидеть, а не на том, что есть в реальности.
В результате мы воспринимаем не действительность, а то, что хочет видеть наш мозг. Хорошим примером такой ошибки служат графические иллюзии, когда статичная картинка начинает двигаться.
В работе программиста это проявляется так: визуально практически невозможно найти ошибку в коде, потому что при чтении мозг дописывает строчку правильно. Именно из-за общего опыта и прогнозируемого кодирования целый отдел кибербезопасности может с лёгкостью прийти к единому неправильному решению.
Павел Комягин
Тимлид команды разработки внутренних продуктов Нетологии
Наверное, самая распространённая ошибка среди разработчиков, и та, от которой я регулярно сам страдаю, — слишком оптимистичная оценка времени, которое нужно для решения задачи.
В начале карьеры для тебя всё новое, ты никогда ещё не верстал вот такой блок, тебе ещё не приходилось писать эту логику. Поэтому ты думаешь, и что важно — говоришь руководителю, что справишься за день. Но в результате тратишь целую неделю. Со временем незнакомых задач становится меньше, но проблема до конца не уходит. Ты уже уверен в своих силах, но по-прежнему переоцениваешь себя.
Я пришёл к такой методике: сначала думаю о том, за сколько бы я сделал задачу интуитивно. Потом прибавляю к этой оценке процентов 50%, и вот это уже будет похоже на правду.
В нашей команде, как и во многих других, бывает так, что оценка не совпадает с затраченным временем. Мы стараемся относиться к этому философски, понимаем, что программирование — вещь порой непредсказуемая. Если работаешь не по чёткому ТЗ, то есть много неопределённостей, которые всплывают только при погружении в задачу и уже в процессе её решения. Поэтому стараемся закладывать сверху оценки ещё немного времени на форс-мажоры. Менеджеры относятся с пониманием: предсказуемость часто важнее скорости.
Помимо опыта, мозгу помогают дописывать код внешние факторы. И иногда — неправильно. Даниэль Канеман в книге «Шум. Несовершенство человеческих суждений» рассматривает, как меняются наши мысли и убеждения из-за двух вещей: шума — noise — и предубеждения — bias, которые мешают выносить верные решения.
На появление ошибок влияют:
- отличительные черты восприятия, памяти;
- общественная сторона оценки выбора и принятия решений;
- стереотипные ситуации.
Плохая новость: если верить этим двум теориям, полностью избежать ошибок никому не удастся.
Хорошая новость: можно свести повторение ошибок к минимуму, а случившуюся — исправить.
- Поймёте, как устроены мышление, поведение, характер, восприятие, сознание и эмоции
- Разберётесь со своими переживаниями без личных консультаций с психологом
- Проработаете свои проблемы и ограничивающие установки и повысите качество общения с другими
Как не допускать ошибок: старые добрые методы и протокол непосредственных оценок
Если изучить расследование и проанализировать причины описанных выше провалов, то окажется, что можно было снизить риски, привлекая сторонних экспертов для проверки продуктов и систем.
Таким образом, получаем первое и основное правило при написании кода или в целом при создании продукта: привлекать экспертов для тестирования. Второй важный момент — системный подход к анализу и проверке на качество.
Чтобы использовать эти правила для принятия решений, обратимся к Канеману и его «Протоколу опосредованных оценок», описанному в книге о несовершенстве суждений:
Выявляем самые важные составляющие для проверки кода: скорость написания, безопасность, быстродействие, надёжность. Стоит различать понятия «надёжность» и «качество». В сфере кибербезопасности, даже если ПО проработало несколько лет, это не говорит о его качестве. Всегда есть вариант новой угрозы.
Выбираем несколько составляющих, в которых вероятность ошибки наиболее высока. Следует разбить задачу на блоки и каждой поставить оценку по вероятности ошибки, а затем попросить экспертов также дать свой прогноз сбоев.
Ищем составляющие, в которых ошибка может принести наибольший урон.
Убеждаемся, что эксперты, которых привлекли для оценки, действительно независимы и обладают нужной компетенцией.
Не стоит быть слишком уверенными в программном обеспечении — если происходят инциденты, лучше всегда перепроверить самостоятельно, протестировать через другие системы, пригласить экспертов для анализа. При обнаружении масштабной катастрофы можно обратиться к коллегам, пережившим подобный опыт, чтобы узнать, в чём была проблема и как удалось её решить. После утечки данных Яндекс Еды произошла аналогичная ситуация в Delivery Club. Во втором случае компания приняла те же меры, что и руководители Яндекс Еды, а именно сократила количество лиц, которым доступна персональная информация.
Система стандартов применима не только к людям, но и к компаниям. Можно задать её самостоятельно, а можно — пользоваться тем, что уже есть. Кому-то будет проще изучить правила написания кода титанов IT-индустрии, а кому-то — создать собственные, а потом пропустить их через экспертов и протестировать несколько раз.
Система новых стандартов требует времени на разработку, и пока её нет, всегда можно использовать старые добрые методы профилактики ошибок:
- Метод утёнка. Работник ставит, хотя бы мысленно, на стол игрушечного утёнка. Когда у сотрудника возникает вопрос, на который трудно ответить, то он задаёт его игрушке, словно она действительно может вступить в диалог. Считается, что правильная формулировка вопроса содержит половину ответа. Метод также используют при отладке. Если код не работает, программист пытается объяснить утёнку, что делает каждая строка, и в процессе этого находит несоответствия.
- Мозговой штурм. Нужно обозначить сложившуюся проблему и попросить всех причастных придумать возможное решение, принимая во внимание даже самые безумные идеи и предложения.
- Рецензирование. Систематическая проверка исходного кода, которая помогает обнаружить и исправить ошибки, незамеченные в начальной фазе разработки.
- Парное программирование. Код создают пары программистов: один кодит и занимается деталями, другой просматривает результат и держит в голове всю задачу. Иногда они меняются ролями.
Резюмируем
Каждому человеку свойственно ошибаться. Чаще всего причины провалов связаны с физиологическими и организационными проблемами.
Существуют и биологические факторы, которые заставляют людей совершать ошибки. Так, согласно теории прогнозирующего кодирования, наш мозг генерирует восприятие, а информация от органов чувств только корректирует его. Поэтому мы воспринимаем именно то, что хочет видеть наш мозг, и, как следствие, ошибаемся.
Внешние факторы — шум и предубеждения — также влияют на наш мозг и мешают выносить верные решения.
Первое правило, которое поможет избежать ошибок при создании продукта, — нужно привлекать сторонних экспертов для проверки. Второе — важно системно подходить к анализу и проверке на качество.
Если нет времени на разработку системы стандартов, можно использовать методы профилактики ошибок: мозговой штурм, метод утёнка, рецензирование и парное программирование.
Хотите написать колонку для Нетологии? Читайте наши условия публикации. Чтобы быть в курсе всех новостей и читать новые статьи, присоединяйтесь к Телеграм-каналу Нетологии.