Рубрики
Uncategorized

Черные лебедей

Как знал бывший министр обороны США Дональд Рамсфельд, известные известные, известные не знают … Теги с производительностью, codequality, DevOps.

Как бывший министр обороны США Дональд Рамсфельд, как известно, отмечен Есть известные известные, известные неизвестные и неизвестные неизвестные. Это печальная часть человеческой природы, которую мы игнорируем неизвестными неизвестными, когда планируем курс действий. Разработчики, будучи людьми, тоже виновны в этом.

В частности, я говорю о таких вещах, как:

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

За исключением, конечно, в течение двухмесячного периода прошлого года, когда null был разрешено, и теперь ни один из этих клиентов не загрузил в кэш

или же

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

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

Нассим Николас Талеб Называется подобные ситуации Черные лебедей После того, что европейцы думали, что все лебеди были белыми, пока они не столкнулись с черным в Австралии. В частности, он говорит о том, как эти неожиданные события оказывают огромное влияние. Это, безусловно, верно в кодировании: наиболее разрушительные дефекты часто вызваны тем, о чем вы не знали, а не то, что вы упустили из виду.

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

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

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

Избегайте поведения по умолчанию

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

    public static boolean isPositive(Integer i) {
        if (i != null && i > 0) {
            return true;
        }
        return false;
    }

Лучшим способом был бы

    public static boolean isPositive(Integer i) {
        if (i != null && i > 0) {
            return true;
        }
        if (i != null && i <= 0) {
            return false;
        }
        throw new IllegalArgumentException(i + " is not a valid value");
    }

` Теперь я знаю, что в приведенном выше примере вы можете сначала поместить нулевую проверку, и на практике это то, что я делаю. Тем не менее, цель второго примера состояла в том, чтобы продемонстрировать, как мы должны явно проверить, что значение находится в одном из заданных числа опций — в данном случае положительный, отрицательный или нулевой — и повышение исключения, если это не так. Причина, по которой мы можем сначала поставить нулевую проверку, заключается в том, что Java гарантирует, что ввод может только Будьте нулевыми, положительными, отрицательными или нулевыми, но в целом наш язык не сможет обеспечить это для нас. Это особенно верно при определении состояния требуется несколько полей.

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

Обзор кода

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

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

Запустите запросы в Prod заранее

Если вы сделали предположения в своем тестировании, подтвердите их в производственной среде, запустив некоторые запросы (например, SQL, Splunk).

Лесозаготовки и настойчивость государства

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

Тень бег или воспроизведение

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

Переключатели

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

Пойдите только для подмножества

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

Есть запросы, готовые пойти на проживание

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

DataFixes в Prod

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

Исправить вперед

Это более рискованный двоюродный брат просто отключения выключателя. Для меня это сводится к тому, сколько веры у вас в процессе CI. Я полагаю, что это вписывается в старый менталитет «работать быстро и нарушать вещи». Определенно способность сделать это предлагает вам гораздо большую гибкость, так что это (пока) другая причина улучшить ваш CI и возможности тестирования

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

С нетерпением жду ваших мыслей и предложений. Что вы делаете, чтобы справиться с неизвестными неизвестными?

Оригинал: «https://dev.to/marcmacgonagle/black-swans-39k3»