Чистый код – чистая планета: Практики энергоэффективной разработки
Всем привет! Сегодня хочу поднять вопрос энергоэффективности наших приложений. В эпоху экспоненциального роста вычислительных мощностей все больше внимания уделяется вопросам энергопотребления и снижения воздействия на окружающую среду. В этом контексте энергоэффективность и энергосбережение превращаются в ключевой и стратегический приоритет для IT-компаний.
Все мы знаем примеры, когда компании оптимизируют свои затраты на электроэнергию за счет оптимизации IT-инфраструктуры:
- Внедрение виртуализации - уменьшение числа физических серверов, что значительно повышает коэффициент использования оборудования.
- Приобретение энергоэффективного оборудования (например, замена HDD на SSD или покупка блоков питания с высоким коэффициентом энергоэффективности). Использование современных технологий позволяет уменьшить счета за электроэнергию.
- Оптимизация систем охлаждения и внедрение рециркуляции тепла, вырабатываемого дата-центрами.
- Перенос части вычислений в публичные облака - крупные провайдеры обычно используют более энергоэффективные дата-центры с оптимизированными системами охлаждения и высоким коэффициентом использования оборудования.
Но что, если внедрение определенных архитектурных практик и подходов к разработке также позволит нам увеличить энергоэффективность разрабатываемых нами программных систем?
На просторах сети очень мало информации о том, какие подходы позволяют снижать энергозатраты на вычисления. Также очень мало исследований и расчетов экономического эффекта от внедрения практик энергоэффективного программирования (возможно, это связано с тем, что выделить вклад таких практик очень тяжело, либо их вклад менее заметен на фоне оптимизации инфраструктуры).
Практики и подходы энергоэффективного программирования
Какие же подходы и практики позволят нам сделать наш код энергоэффективным?
Первый ответ, который приходит на ум - практики энергоэффективности, которые применяют разработчики программного обеспечения для мобильных устройств и встраиваемого ПО (IoT):
- Lazy Loading (Ленивая загрузка) - загрузка компонентов и библиотек только тогда, когда они нужны.
- Кэширование - уменьшение количества вызовов к энергозатратной памяти (HDD) за счет использования более дешевой памяти.
- Open Only When Necessary - открытие ресурсов (сетевые соединения, файловые дескрипторы, потоки) только тогда, когда они необходимы.
- Оптимизация сетевых запросов - уменьшение и оптимизация сетевых запросов (как REST HTTP, так и запросов к базам данных) и снижение объема запрашиваемых данных снижает нагрузку на серверы и сетевое оборудование.
- Batch обработка - группировка мелких операций в одну крупную для снижения накладных расходов.
- Асинхронная обработка - использование асинхронной и событийно-ориентированной архитектуры позволит заменить постоянные опросы серверов на асинхронные веб-хуки и push-уведомления.
- Эффективные алгоритмы - использование алгоритмов с меньшей вычислительной сложностью.
- Ограничение фоновой активности.
Если рассуждать на уровне архитектуры систем, то можно попробовать сформулировать следующие принципы, которые позволят сделать системы энергоэффективными:
- Внедрение serverless-архитектуры - запускаем приложения тогда, когда они нужны.
- Настройка динамического масштабирования - увеличиваем количество экземпляров приложения тогда, когда это нужно.
- Внедрение эффективных и оптимизированных фреймворков - используем низкоуровневые языки программирования и отказываемся от фреймворков, что позволит уменьшить время обработки и нагрузку на сервера (тут, конечно, палка о двух концах).
Вообще, на мой взгляд, простой, хорошо структурированный и легко читаемый код будет более энергоэффективным, чем спагетти-код. Ведь код с высокой сложностью не только трудно поддерживать, но и, вероятнее всего, он содержит скрытые неэффективности, требует больше процессорного времени для выполнения.
Чистый код - чистое небо!
А вы задумывались на счет энергоэффективности кода и приложения (если, конечно, не работаете над встраиваемым ПО)?
Сталкивались ли с практиками энергоэффективного программирования? Может, у вас в компании есть какие-то KPI/OKR на этот счет?
Немного ссылок с интересными исследованиями:
Мой telegram-канал