Я сталкиваюсь последнее время с проблемой в клоуже когда смотрю сторонние проекты. Когда например функция принимает Мапу чуток трансформирует и передаёт дальше. Так вот после третей четвертой функции не понять как должна выглядеть мапа. Если нет тестов или спеки
Не смешивай несколько уровней программы в один.
На верхнем уровне представляй свою программу как последовательность функций, которые обрабатывают некий запрос. Например:
(-> init-request
parse-params
validate-params
security-check
transform-request
enrich-data
save-db
make-response)
Это верхнеуровневый флоу твоей программы. Тут важно понимать из названия, что происходит в целом с изначальным запросом. Детали реализации каждой функции не важны. Важно описание изначального запроса в виде спеки.
Теперь спускаемся в детали реализации каждой функции.
Функция делает строго одно бизнесовое действие. Она принимает на вход мапу с запросом и должна выдать некую мапу с ответом (либо трансформированный входной запрос либо новый ответ).
Что хорошо в функциях, так это то, что при реализации деталей тебе вообще не важно, что есть в остальной системе. Ты работаешь над конкретной функцией и все что нужно определеяется входными параметрами этой функции, а также выходом, который ты хочешь получить. Вход и выход ты можешь фиксировать в виде: докстрингов, pre-post условий, тестами, спекой, комменты (все эти инструменты описания логики, входа и выхода можно использовать в любой комбинации).
Поэтому ты четко видешь, что на входе в функе и что на выходе.
Получается, что в репле или отладочном println ты можешь видеть флоу всего процесса, а также входы и выходы из каждой функции. И у тебя не будет проблем, что после 3 функи ты не понимаешь что на входе или выходе.