Вот 10 принципов, которые можно применить к вашему коду, чтобы обеспечить его качество, надежность и масштабируемость:

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

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

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

  • Функции, предназначенные для одной задачи. Функции — это важные строительные блоки конвейеров и системы, а также небольшие участки кода, которые используются для выполнения определенных задач. Цель функций — избежать повторения команд и обеспечить повторное использование кода. Они могут легко стать сложным набором команд для облегчения задач. Для читаемого и многократно используемого кода более эффективно иметь одну функцию, предназначенную для одной задачи, а не для нескольких задач. Лучше иметь несколько функций, чем одну длинную и сложную функцию.
  • Структурирование. Функции, классы и операторы должны быть структурированы в удобочитаемой, модульной и лаконичной форме. Никто не хочет видеть такую ​​ошибку, как Error 300. Структурирование блоков кода и попытка ограничить максимальные уровни отступов для функций и классов могут улучшить читабельность кода.
  • Чистый код. Если вам приходится объяснять код, это не так уж и хорошо. Чистый код говорит сам за себя. Основное внимание уделяется высокой удобочитаемости, оптимальной модульности, возможности повторного использования, неповторяемости и оптимальной производительности. Чистый код снижает затраты на обслуживание и обновление конвейеров машинного обучения. Это позволяет команде работать эффективно и может быть распространено на других разработчиков.
  • Тестирование. Крайне важно обеспечить надежность системы, и тестирование играет в этом важную роль. В общем, тестирование распространяется на модульное тестирование и приемочное тестирование. Модульное тестирование — это метод, с помощью которого компоненты исходного кода проверяются на надежность с принудительными данными и методами использования, чтобы определить, подходит ли компонент для производственной системы. Приемочные испытания проводятся для проверки всей системы, чтобы убедиться, что система реализует требования пользователя; сквозные бизнес-потоки проверяются в сценариях реального времени. Тестирование жизненно важно для обеспечения эффективной работы кода: «если он не протестирован, он сломан».
  • Контроль версий (код, данные и модели). Управление версиями данных необходимо для систем машинного обучения, поскольку оно помогает нам отслеживать, какие данные использовались для конкретной версии кода для создания модели. Данные управления версиями могут обеспечить воспроизведение моделей и соблюдение требований бизнеса и законов. Мы всегда можем вернуться назад и увидеть причину тех или иных действий системы машинного обучения. Точно так же управление версиями моделей (артефактов) важно для отслеживания того, какая версия модели сгенерировала определенные результаты или действия для системы ML. Мы также можем отслеживать или регистрировать параметры, используемые для обучения определенной версии модели. Таким образом, мы можем обеспечить сквозную прослеживаемость для артефактов модели, данных и кода. Контроль версий кода, данных и моделей может улучшить систему машинного обучения с большей прозрачностью и эффективностью для людей, разрабатывающих и поддерживающих ее.
  • Ведение журнала. В рабочей среде журнал полезен, так как позволяет отслеживать и идентифицировать важную информацию. Операторы печати хороши для тестирования и отладки, но не идеальны для производства. Регистратор содержит информацию, особенно информацию о системе, предупреждения и ошибки, которая весьма полезна при мониторинге производственных систем.
  • Обработка ошибок. Обработка ошибок жизненно важна для обработки крайних случаев, особенно тех, которые трудно предвидеть. Рекомендуется перехватывать и обрабатывать исключения, даже если вы считаете, что в этом нет необходимости, поскольку профилактика лучше лечения. Ведение журнала в сочетании с обработкой исключений может быть эффективным способом борьбы с пограничными случаями.
  • Читаемость. Читабельность кода обеспечивает передачу информации, эффективность кода и его ремонтопригодность. Этого можно достичь, следуя таким принципам, как следование стандартным практикам кодирования, таким как PEP-8 (https://www.python.org/dev/peps/pep-0008/) или стандартному стилю JavaScript (в зависимости от используемый вами язык). Удобочитаемость также повышается за счет использования строк документации. Строка документации — это текст, который пишется в начале, например, функции, описывая, что она делает и, возможно, что принимает в качестве входных данных.
  • Комментирование и документирование. Комментирование и документирование жизненно важны для поддержания устойчивого кода. Не всегда можно понятно объяснить код. Комментарии могут быть полезны в таких случаях, чтобы предотвратить путаницу и пояснить код. Комментарии могут передавать такую ​​информацию, как информация об авторских правах, намерения, уточнение кода, возможные предупреждения и уточнение кода. Подробная документация по системе и модулям может позволить команде работать эффективно, а код и активы могут быть распространены на других разработчиков. Для документации доступны инструменты с открытым исходным кодом для документирования API, такие как Swagger (https://swagger.io) и Read the Docs (https://readthedocs.org). Использование правильных инструментов для документирования может повысить эффективность и стандартизировать знания для разработчиков.