Описание услуги
Я Clojure-разработчик и создаю функциональные бэкенд-сервисы и приложения для обработки данных, работающие на JVM. В основе моей работы лежат неизменяемые структуры данных, чистые функции и композиционный стиль, когда программа собирается из маленьких, понятно названных кусочков, о которых действительно можно рассуждать. Поскольку Clojure — это Lisp, мой главный инструмент это REPL: я выращиваю программу интерактивно, вычисляю выражения прямо на живых данных и уточняю дизайн по ходу, а не угадываю всё заранее, чтобы потом отлаживать. Это отдельная дисциплина, не похожая на работу с Java, Scala или Elixir, и я отношусь к ней как к самостоятельному ремеслу, а не как к Java со скобками.
В вопросах многопоточности использую честно те инструменты, что даёт язык: atoms, refs, agents и каналы core.async — по задаче, а не для моды. Я делал REST и потоковые HTTP-сервисы на Ring и reitit, описывал данные через spec и Malli, работал с Postgres через next.jdbc и HoneySQL, обрабатывал большие объёмы трансдьюсерами и ленивыми последовательностями так, чтобы память оставалась ровной. Мне важна аккуратная связка с окружающей экосистемой JVM, вменяемая обработка ошибок и скучные в хорошем смысле деплои. Если код уже расползся в спутанное состояние, я привожу его обратно к чистому ядру и тонким краям с эффектами.
Если у вас есть сервис, который должен быть корректным под нагрузкой, конвейер данных, который обязан оставаться поддерживаемым, или проект на Clojure, застрявший на полпути, я подхвачу его и двину дальше. Пишу тесты, фиксирующие поведение, документирую сложные места и оставляю здоровый REPL-процесс, чтобы следующий человек был продуктивен с первого дня.
— Бэкенд-сервисы на Clojure и ClojureScript для JVM
— REST и потоковые API на Ring, reitit и core.async
— Моделирование и валидация данных через clojure.spec и Malli
— Работа с Postgres через next.jdbc, HoneySQL и пул соединений
— Многопоточность на atoms, refs, agents и каналах
— Трансдьюсеры, ленивые последовательности, обработка больших объёмов
— Разработка через REPL, тесты и рефакторинг к чистым функциям
В вопросах многопоточности использую честно те инструменты, что даёт язык: atoms, refs, agents и каналы core.async — по задаче, а не для моды. Я делал REST и потоковые HTTP-сервисы на Ring и reitit, описывал данные через spec и Malli, работал с Postgres через next.jdbc и HoneySQL, обрабатывал большие объёмы трансдьюсерами и ленивыми последовательностями так, чтобы память оставалась ровной. Мне важна аккуратная связка с окружающей экосистемой JVM, вменяемая обработка ошибок и скучные в хорошем смысле деплои. Если код уже расползся в спутанное состояние, я привожу его обратно к чистому ядру и тонким краям с эффектами.
Если у вас есть сервис, который должен быть корректным под нагрузкой, конвейер данных, который обязан оставаться поддерживаемым, или проект на Clojure, застрявший на полпути, я подхвачу его и двину дальше. Пишу тесты, фиксирующие поведение, документирую сложные места и оставляю здоровый REPL-процесс, чтобы следующий человек был продуктивен с первого дня.
— Бэкенд-сервисы на Clojure и ClojureScript для JVM
— REST и потоковые API на Ring, reitit и core.async
— Моделирование и валидация данных через clojure.spec и Malli
— Работа с Postgres через next.jdbc, HoneySQL и пул соединений
— Многопоточность на atoms, refs, agents и каналах
— Трансдьюсеры, ленивые последовательности, обработка больших объёмов
— Разработка через REPL, тесты и рефакторинг к чистым функциям