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

Теперь подробнее. Как правило, если переменная среды не установлена, то попытка ее прочесть вернет пустую строку или null. Это неправильно. Должно выскочить исключение с примерно таким текстом:

System.getenv("DB_PASSWORD") =>
RuntimeException "env variable DB_PASSWORD is not set"

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

host = "api." + getenv("ENV_PREFIX") + ".acme.com"

Если ENV_PREFIX не задан, то получится api.null.acme.com. Из-за этого HTTP-клиент пойдет на левый хост и кинет непонятное исключение. То же самое с бакетом в S3: Амазон скажет, мол, нет такого бакета, а вы будете рвать волосы.

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

(dеfn env!
  ([varname]
   (or (System/getenv varname)
       (throw (new RuntimeError ...))))
  ([varname dеfault]
   (or (System/getenv varname)
       dеfault)))

Исключение не кидается, если передан дефолт.

Второе. Чтение переменной среды — это грязная операция. Формально никакого IO не происходит, потому что переменные уже в памяти программы. Но это сторонняя зависимость, которую ваш код не контролирует. По факту чтение переменной не отличается от чтения файла. Нет файла — программа сломается; нет переменной — тоже.

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

Приходилось работать в проекте, который писали одни чудики. Они прочитали The Twelve-Factor App и особенно прониклись пунктом насчет переменных среды. Результат можно описать одним словом: пи…ц. Представьте проект на 600 файлов, где на каждый чих читается переменная среды, да к тому же приводится к нужному типу. На старте ничего не проверяется: запустил код без переменной — узнал об этом в продакшене. Какой-то чел добавил глобальный кэш переменных и целый ворох связанных с ним проблем.

Чудики вынесли настройки в переменные среды, чтобы быть свободными от конфигурации. Так им сказали в The Twelve-Factor App. А потом написали ENV-файлы на три экрана. Было несколько ENV-файлов, которые загружались в особом порядке, переопределяя значения друг друга. Например, сначала базовый энв, потом энв текущего окружения (тест, прод, стейджинг), потому энв текущей машины. Удачной отладки.

Из этого вывод: много чего можно прочитать в интернете, но если нет своей головы, оно не поможет. Нужно делать так, чтобы было удобно, а не как написано в The Twelve-Factor App или на Хакер-Ньюз.