Беру на себя бэкенды и расчётные инструменты для финансов и данных на языке F# на платформе .NET. Функциональный стиль здесь не самоцель, а способ получить программу, которая ведёт себя предсказуемо: я описываю правила вашей области типами, и компилятор отказывается собирать проект, если где-то нарушена логика. Благодаря размеченным объединениям и исчерпывающему сопоставлению с образцом невозможные по смыслу ситуации становятся невозможными и в коде — это убирает целый пласт ошибок, которые в динамических языках всплывают только в проде. Такой код короче обычного, читается почти как описание задачи и не разваливается при доработках.
Я делал системы, где считаются деньги, тарифы, начисления и отчёты, и там цена одной опечатки высока. Поэтому опираюсь на неизменяемые данные, чистые функции и строгое разделение ядра и внешних эффектов: базы, очередей, сети. Ядро покрываю тестами на свойствах и на примерах, а обращения к внешнему миру держу на границах, где их удобно подменять и проверять. Производительность не выдумываю: замеряю профайлером и ускоряю ровно те участки, что этого стоят.
Если нужен устойчивый сервис по HTTP или через очередь, расчётный движок, конвейер обработки данных или компактная финансовая утилита, я сделаю задачу целиком и передам аккуратный документированный код, понятный вашим инженерам. Настрою интеграцию с SQL и брокерами сообщений, соберу контейнер и подниму непрерывную интеграцию, чтобы выкладки проходили без сюрпризов.
— Проектирование модели домена типами, а не соглашениями
— Сервисы, расчётные движки и конвейеры обработки данных
— Тесты на свойствах и понятная передача проекта команде
Я делал системы, где считаются деньги, тарифы, начисления и отчёты, и там цена одной опечатки высока. Поэтому опираюсь на неизменяемые данные, чистые функции и строгое разделение ядра и внешних эффектов: базы, очередей, сети. Ядро покрываю тестами на свойствах и на примерах, а обращения к внешнему миру держу на границах, где их удобно подменять и проверять. Производительность не выдумываю: замеряю профайлером и ускоряю ровно те участки, что этого стоят.
Если нужен устойчивый сервис по HTTP или через очередь, расчётный движок, конвейер обработки данных или компактная финансовая утилита, я сделаю задачу целиком и передам аккуратный документированный код, понятный вашим инженерам. Настрою интеграцию с SQL и брокерами сообщений, соберу контейнер и подниму непрерывную интеграцию, чтобы выкладки проходили без сюрпризов.
— Проектирование модели домена типами, а не соглашениями
— Сервисы, расчётные движки и конвейеры обработки данных
— Тесты на свойствах и понятная передача проекта команде