
Определение
Вы можете спросить, какое отношение философия имеет к отладке. Общеизвестно, что философия стала актом разговора о природе вещей в целом и, в частности, о существовании и цели жизни. Это часть философии, с которой сталкивается большинство людей в тот или иной момент жизни.
Но есть еще одна большая часть философии, которая превосходит все науки. В ней говорится о принципах, методологиях, рассуждениях и понимании. Великими философами в истории человечества были одновременно и математики, и физики, и логики, и историки. Высшая образовательная степень, которую можно получить, это докторская степень, что означает доктор философских наук. По сути, это означает, что кто-то достиг уровня, на котором он или она может экстраполировать принципы и методы, применяемые к идеям, чтобы проводить новые исследования.
Я выработал философский подход к отладке, работая программистом более десяти лет, и изучая психологию человека, главным образом по отношению к себе. Я считаю, что это две области, где отладка является важной частью успеха. Теперь это большое слово. Ради точности, в этой статье я предполагаю, что успех состоит в понимании природы вещей как средства для реализации систем, которые производят желаемые эффекты.
Еще одно отличие, которое я хотел бы сделать с самого начала, связано с диагностикой. В медицинских науках, в авиации, в автомобилестроении, в частности, люди долгое время изучали, почему что-то не работает так, как должно, и внедряли системы, позволяющие легко определять, когда происходит сбой. Что отличает их от компьютерного программирования или психологии, так это то, что эти системы изменяются гораздо медленнее и имеют конечное число взаимодействий между компонентами. Полное описание всего в определенный момент и поддержание его во времени возможно.
В области компьютерных наук и психологии гораздо важнее изучать методы и принципы, поскольку факты будут сильно отличаться от человека к человеку и от группы к группе. Оба создают системы, которые быстро меняются во времени. То, что верно сегодня, может легко устареть через несколько недель.
С этой точки зрения я называю отладку набором принципов и методологий, которые мы можем использовать, чтобы понять конкретное поведение или состояние человека или системы, и описать его. Только после завершения отладочной работы решения и исправления могут быть согласованно рассмотрены и применены.
Нежелательное поведение
То, что запускает процесс отладки, является нежелательным поведением. Мы замечаем это вокруг и внутри нас. Иногда у нас есть системы, которые сообщают нам, что произошло нежелательное поведение. Подобное случилось с одним из наших сайтов в какой-то момент. Данный момент был проверен как программно, так и из личного опыта визуально: видно, что производительность сайта иногда была очень плохой. После нескольких месяцев попыток выяснить это, моя команда призвала меня помочь. Хотя прошло уже несколько лет с тех пор, универсальные принципы и методы отладки, которые я использовал, по-прежнему актуальны. Я вернусь к этому примеру, объясняя различные принципы и методы, которые я использую.
В погоне за истиной
Прежде чем идти дальше, давайте поговорим о мотивации. Отладка — это поиск истины. Я видел, как программисты произвольно применяли исправления, пока поведение не было исправлено и не остановилось там. Они не смогли найти правду. Существует побочный продукт процесса отладки, который так же важен, как и определение и описание первопричины. Это процесс постоянного совершенствования себя. Если мы не понимаем, в чем заключалась проблема и почему наши изменения устранили ее, мы ничего не узнали. Мы, вероятно, снова и снова будем повторять одно и то же неправильное поведение и исправлять его каждый раз. Это один из способов занять себя.
Я считаю поведение источником истины номер один. Читая код, литературу или слушая, что люди говорят, можно обмануться. Мы все подтверждаем, как мы будем действовать в данной ситуации, только чтобы понять, что мы действуем совершенно иначе, когда мы действительно сталкиваемся с соответствующей ситуацией. Хотя наше поведение является источником правды, это не правда. Чтобы найти его, мы должны начать отладку.
Гипотезы и предположения
Как только поведение будет признано нежелательным, люди начнут высказывать мнение о том, почему оно происходит. Это здоровая дискуссия, но нужно следить за тем, чтобы люди выражали свои личные убеждения как убеждения, без поддающихся проверке аргументов в их поддержку. Сейчас настало время уточнить, является ли мнение фактически гипотезой, основанной на предположениях, которые еще не были проверены. Это очень легко уточнить. Просто попросите аргументы и что их поддерживает.
Возвращаясь к примеру медленного веб-сайта, в моей команде было общее убеждение, что нам нужно увеличить количество процессоров на сервере. Когда я спросил почему, у них не было никаких поддающихся проверке аргументов. Увеличение процессоров могло бы решить последствия проблемы, по крайней мере, на некоторое время. Но поскольку нашим программным обеспечением пользуются тысячи компаний, я призвал команду выяснить, что является причиной такого поведения. В худшем случае мы нашли бы нечто, требующее больше ресурсов процессора, и в этом случае было бы полезно информировать клиентов.
Причинность
Итак, теперь у нас было два мнения:
- На сервере было мало ресурсов.
- В нашем программном обеспечении имеется дефект или ресурсоемкая функция.
Когда я высказал свое мнение таким образом, всем стало ясно, что 1, скорее всего, будет следствием 2, и что мы должны сначала уделить время исследованию программного обеспечения.
Установление причинно-следственной связи между различными гипотезами исключает затраты на исследование последствий и делает намного более ясным решение, с чего следует начинать процесс отладки.
Инструменты наблюдения
Как только начальная точка была решена, пришло время получить представление. Несмотря на все достижения общества, наблюдение остается одним из наиболее важных инструментов, которые мы можем использовать, чтобы понять, как все работает. Но в сложной системе наблюдать за всем не представляется возможным. Поэтому наблюдение работает как Google Maps. Сначала вы наблюдаете общую картину, а затем увеличиваете интересующую область для более конкретных наблюдений.
К счастью, существует множество инструментов, которые мы можем использовать, чтобы сделать процесс наблюдения намного более быстрым и точным. Когда я начал публичное выступление, я записывал видео о себе, а затем выявлял области, в которых я мог бы улучшить свою работу. Это простой пример. В реальной жизни немного сложнее установить инструменты для наблюдения за нашим личным поведением. Существуют различные устройства, которые помогают в некоторой степени. И всегда есть универсальный инструмент, который мы можем использовать, осознавая себя. Это навык, который можно практиковать с помощью медитации и других техник.
Подтверждение предположений
Возвращаясь к медленным инструментам веб-сайта, мы развернули универсальный инструмент на живом сайте, который записывал все, что происходило. Мы обнаружили, что ежедневно происходит около 3 миллионов запросов к базе данных. Это намного больше, чем мы ожидали. Тем не менее, теперь у нас была метрика, которая позже могла бы подтвердить другие предположения.
В процессе отладки мы найдем вещи, которые объективно верны. Возможно, у нас есть инструмент для точного измерения того, что непосредственно связано с поведением. Или, на психологическом уровне, это может быть внешняя оценка, например, запрос от наших партнеров по жизни, изменилось ли наше нежелательное поведение на прошлой неделе.
Затем мы можем использовать эти истины для проверки предположений. По мере того, как мы углубимся в процесс отладки, многое из того, что произойдет, возникнет. Затем мы можем изменить переменные и наблюдать, как они влияют на истины.
Задавайте правильные вопросы
Наблюдения собирают данные. Однако сами данные бесполезны без их понимания. Еще один замечательный принцип, который является общедоступным, — это подвергать сомнению данные. Существует очень популярный фреймворк под названием 5 Whys. Я считаю, что он работает как надо, но это не так просто, как кажется. Почему было 3 миллиона запросов к базе данных в день? Прежде чем мы сможем ответить на этот вопрос, мы должны ответить гораздо больше, например, что это за запросы и как мы их измеряем?
На нашем медленном веб-сайте поиск 3 миллионов запросов был невозможен. Поэтому мы вошли и развернули дополнительные инструменты, которые подсчитывали, сколько раз выполнялись разные запросы. Мы обнаружили, что большинство из них должны были храниться в памяти. Только теперь мы можем перейти к следующему, почему. Итак, почему иногда кеш не работает?
Но, просто для того, чтобы подчеркнуть, что последний вопрос основан на предположении, что проблема была в кеше. Это предположение еще не подтверждено. Итак, в рамках 5 Whys иногда можно работать над веткой Whys, основанной на предположениях. Если в какой-то момент предположение становится недействительным, нужно вернуться на один или несколько уровней к предыдущим значениям Whys и найти другие предположения.
Создайте свои собственные инструменты
Когда вы углубитесь в отладку, вам может понадобиться создать свои собственные инструменты для точного наблюдения или измерения компонента поведения. Эти инструменты не должны быть революционными. Фактически, люди обычно создают специальные инструменты из общих методов. Например, составьте анкету и попросите своих коллег заполнить ее. Или отметьте, сколько раз в день вы выполняете привычку, от которой хотите избавиться.
В моем медленном примере с веб-сайтом мы создали простой инструмент, который отображал все, что хранится в кэше.
Воспроизводимое поведение
Никогда не стоит недооценивать силу случайности. В процессе отладки может случиться так, что предположения просто не проверяются, потому что определенное условие не было выполнено во время эксперимента.
Поэтому, стремясь к истине, мы должны определить все компоненты, которые вызывают поведение. Только когда мы сможем воспроизвести это точно, мы можем многократно воздействовать на это, чтобы продвинуть наше понимание. В противном случае нам предоставляется возможность проверить или опровергнуть предположения. Это приводит к еще одному важному методу, который стал общедоступным со времен появления человечества, — эксперименту.
В нашем медленном примере с веб-сайтом было так трудно отследить то, что это произошло случайно. Мы не знали существенного условия, которое вызвало его. Что еще хуже, этого не произошло, когда мы попытались это воспроизвести на клоне веб-сайта. Поэтому мы решили использовать этот инструмент для непрерывной генерации отчетов, чтобы уловить моменты, когда это произошло, что увеличило наши шансы наблюдать ошибочное поведение с точки зрения кэширования.
При использовании пользовательских инструментов мы обнаружили два факта:
- Были некоторые кеши с именами, которых мы не ожидали.
- Кеш действительно кажется случайно очищенным.
Эти два факта подтвердили предположение, что это была проблема кеширования. Затем мы спросили себя, связаны ли эти два факта. Более конкретно, мы исследовали, что любой факт 2 является прямым следствием факта 1.
Уменьшение сложности
Как только нежелательное поведение воспроизводимо, можно удалить детали, пока не будет найдено минимальное количество компонентов, которые все еще вызывают проблему. Снижение сложности удаляет шум, который может помешать нашему исследованию или замедлить эксперименты. Я помню время, когда инструменты для компьютерной отладки были в зачаточном состоянии. В то время для разработчиков программного обеспечения было популярно удалять части кода, пока проблемы больше не воспроизводятся. Затем они знали, что проблема должна быть где-то в той части, которая была удалена последней.
Возвращаясь к медленному веб-сайту, факт 1 легче было рассмотреть. Итак, мы решили действовать в этом направлении, так как это исправит дефект и ответит на вопрос, связан ли факт 2. В итоге этого не было.
Отслеживание последних шагов
Недостающее существенное условие скрывается в том, что произошло до того, как поведение было замечено через его последствия. Пожалуй, самый популярный пример — забыть, где я положил ключи. Закончив осматривать все места, где я ожидал их увидеть, я пытаюсь вспомнить и даже воспроизвести последние шаги, которые я предпринял после входа в дом в тот же день, только чтобы вспомнить, что я спешил в ванную. Итак, я нахожу их на раковине.
В компьютерном программировании последние шаги называются Stack Trace. Поэтому мы создали еще один небольшой инструмент, который будет отслеживать кэш и собирать трассировку стека в тот момент, когда это произойдет. Возвращаясь к этапам, мы наконец нашли причину. Этот веб-сайт фактически содержал 3 веб-сайта. Два других были для нас внутренними. Только когда кто-то получает доступ к внутренним веб-сайтам, переписчик URL-адресов ошибочно просматривает кэш основного веб-сайта. Поскольку он не соответствовал ожидаемому, средство перезаписи URL очистило бы кэш для всех 3 веб-сайтов. Это полностью объясняет случайность поведения, поскольку внутренние веб-сайты использовались несколько раз в день.
Начало отклеивания
Некоторые нежелательные действия вырвут ваши волосы, пытаясь добраться до сути. Временами вы можете застревать без других предположений для проверки. Не отчаивайся. То, что я нашел для работы, — это заставить кого-то помочь и положить все на стол. Отладка также включает в себя большой мозговой штурм, создание логических аргументов и творческое мышление о подходе к поведению с других точек зрения.
Одна вещь, которую я обнаружил, это то, что обычно мелкие вещи вызывают поведение, которое трудно отладить. И это имеет смысл. Если бы это было что-то большое, было бы намного проще сделать предположение и проверить его.
Подтвержденные Знания
Как только вы добрались до сути нежелательного поведения, вы можете перейти к его решению. Это также может быть серьезным усилием, но оно выходит за рамки этой статьи. Здесь я хотел бы подчеркнуть побочный продукт процесса отладки, который представляет собой новые методы и инструменты, которые вы можете использовать в будущем, чтобы приблизиться к аналогичной ситуации. И это не то, о чем вы читали в книге, а то, чем вы жили из первых рук. Вы отправились на поиски истины и нашли ее. Это создает эмоции и уверенность.
Этот вид знаний, подтвержденный собственным опытом, переписывает связи в мозге. Это развивает нашу интуицию и делает нас лучше при отладке.