Эссе о разработке игр, мышлении и книгах

Жизнь и работа с ошибками

Том не следил за накоплением ошибки и оказался в космосе.

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

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

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

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

Большинство же как будто живёт в параллельной вселенной с другими вероятностными законами.

Ладно бы всё ограничивалось элементарными ошибками в планировании, вроде: «потратили 100600 денег вместо 100500 или даже вместо 10500».

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

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

О природе ошибок и следствиях из неё я и хочу поговорить.

Статья получилась большая.

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

Я рекомендую читать всё — некоторые следствия могут быть не будут понятны без нюансов из первой части поста.

Немного формализмов и абстракций

Для начала убедимся, что говорим об одном и том же.

Что есть ошибка

Представим себе некоторое идеальное существо:

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

Вот это существо не совершает ошибок. Каждое его действие идеально.

Давайте теперь поставим нас и его в одну и ту же ситуацию:

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

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

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

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

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

Пространство решений Множество возможных ситуаций

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

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

Мы можем заглядывать глубже: на два шага вперёд, на три, на десять.

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

И это здорово: свобода воли, открытый путь к счастью, успеху и сдаче проекта вовремя, etc. etc. etc.

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

Отклонения в прогнозах

Мы не идеальны и в обозримом будущем не приблизимся к чему-то похожему (хотя Лем в Сумме Технологии предложил некоторые варианты).

Наши возможности ограничены:

  • Мы не можем делать долгосрочные прогнозы без потери точности.
  • Мы не можем знать абсолютно точное положение дел.

Как следствие, ограничены и наши возможности по планированию:

  • Мы не можем определить в точности чего хотим.
  • Мы не можем сделать идеальный выбор.

Рассмотрим эти проблемы подробнее.

Ограниченность прогнозов

Мы рассуждаем не мгновенно, поэтому не можем делать полные прогнозы на длительный срок.

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

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

Хорошо иллюстрирует подобный рост величин известная байка про зёрна на шахматной доске.

Бороться с этим можно разными способами:

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

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

Ограниченность информации

В большинстве случаев мы не знаем всей информации о решаемой проблеме.

В этом плане есть два важных источника неопределённости.

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

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

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

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

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

Ограниченность планирования

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

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

Сколько нужно денег для счастья? Миллион? Десять? Десять миллионов и 503 доллара? А если завтра война коронавирус?

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

Накопление и корректировка ошибки

Вышесказанное подводит нас к основному следствию существования ошибок — они накапливаются с каждым принятым и/или воплощённым решением.

Накопление

Гуляя по парковой дорожке, если вы закроете глаза, через сколько шагов врежетесь в дерево?

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

Я нахожу этот пример очень занимательным. Не надо ничего знать о человеке, о парке и расстоянии между деревьями в нём. Достаточно одного факта «человек закрыл глаза», чтобы предсказать событие почти со 100% вероятностью. Откуда взялась оговорка «почти», уже должно быть понятно.

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

С открытыми глазами мы после каждого шага оцениваем изменение нашего положения на дорожке и вводим корректировку в направление следующего шага. Тем самым мы остаёмся на нужной траектории.

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

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

Подобное явление и называется накоплением ошибки.

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

Корректировка

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

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

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

Это и есть доступные нам способы борьбы с ошибками:

  1. Синхронизация внутренней информации о текущем положении дел с реальной ситуацией — уточнение нашего положения в пространстве возможных ситуаций.
  2. Совершенствование внутренней модели реальности — улучшение возможности предсказывать эффекты наших (и ненаших) действий.

Красивый графичек

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

Поэтому, я решил заменить описание модели упрощённым графиком её поведения.

Зависимость величины накопленный ошибки (ось Y) от абстрактного времени (ось X) при разных стратегиях поведения

Зависимость величины накопленный ошибки (ось Y) от абстрактного времени (ось X) при разных стратегиях поведения

Чем выше уходит график, тем больше наш разрыв с реальностью и тем большие проблемы нас ожидают.

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

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

Следствия

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

Благодаря длительному вступлению, надеюсь, я смогу тезисно изложить самое интересное — следствия.

Статистика возникновения ошибок существеннее причин

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

Даже если причины ошибок разные, не связанные, объективные, а человек сам по себе хороший и умный.

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

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

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

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

Необходимо понимать и куда идём и откуда

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

Частные случаи:

  • Необходимо знать инструменты, которыми будешь работать.
  • Необходимо знать фундамент, на котором будешь строить.

Если вы не знаете где находитесь, то и не придёте куда надо.

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

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

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

Всегда делайте прогнозы на будущее

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

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

Не делайте так.

Посмотрите ещё раз на графики накопления ошибки при синхронизации с реальностью и при уточнении и синхронизации.

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

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

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

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

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

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

Обменивайтесь знаниями

Особенно с людьми смежных профессий. И книги тоже читайте.

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

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

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

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

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

Странно, что этот принцип редко используют организаторы конференций.

Устраняйте иерархию и налаживайте коммуникацию

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

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

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

Но.

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

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

Пять стадий принятия несовершенства мира

Вместо эпилога.

Утрируя, по отношению к ошибкам, по осознанию их логики, людей можно разделить по пяти стадиям принятия горя:

  • Отрицание — «я не ошибаюсь».
  • Злость — «в косяке виновата вселенная / коллеги / деканат, но я не ошибался».
  • Торг — «если я буду делать всё правильно, то всё правильно и получится».
  • Депрессия — «что не делай, получится как всегда».
  • Принятие — «надо действовать с учётом ошибок».

Первые две стадии свойственны, в основном, детям. Но все мы видали и застрявших на них взрослых.

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

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

Ага!

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

Стадию принятия для себя я разделил на два этапа:

  1. Осознанный контроль ошибок.
  2. Рефлекторный контроль ошибок.

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

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