Как стать автором
Обновить
18
0
Арсений Жижелев @primetalk

Scala архитектор

Отправить сообщение

Scala: структура данных в пространстве типов — множество

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров1.9K

Система типов Scala 3 позволяет конструировать вторичные структуры данных в пространстве типов. Ярким примером таких структур может выступать HList, впоследствии ставший основой реализации кортежей. Кортежи в Scala 3 стали весьма гибким инструментом, позволяющим захватить в упорядоченном виде сведения о разнородных типах.


В настоящей заметке мы рассмотрим реализацию структуры "множество типов" на основе кортежей с использованием инструментов Scala 3.

Читать дальше →
Всего голосов 11: ↑11 и ↓0+11
Комментарии0

Применение алгебраических типов данных для моделирования ошибок и сообщений в журнале

Уровень сложностиСредний
Время на прочтение11 мин
Количество просмотров1.6K

В функциональном программировании широко используются так называемые алгебраические типы данных. Такие данные формируются из более простых типов с использованием всего двух операций — "суммы" и "произведения". Использование таких математических операций оказывается очень удобным с точки зрения последующей обработки с помощью сопоставления с образцом ("паттерн-матчинг"/pattern matching).


Помимо удобства при разработке, математичность получающихся структур данных позволяет делать более понятные, прозрачные и логичные конструкции, находящие применение в самых разных предметных областях.


В этой заметке посмотрим на примеры моделирования ошибок и сообщений логирования.

Читать дальше →
Всего голосов 7: ↑7 и ↓0+7
Комментарии1

Квитанции как способ отражения сделанной работы на уровне типов

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров2K

Функциональное программирование одной из целей ставит отражение логики программы в типах входных/выходных значений функций. Типы аргументов и результатов накладывают существенные ограничения на то, как может быть реализована функция. Тем самым, позволяют делать разумные выводы о работе функции, ориентируясь только на её сигнатуру. Такое явление называется "параметричность". Замечательным примером параметричности служит такая сигнатура:


val f: [A] => A => A

Эту сигнатуру можно прочитать так: для любого типа, получив значение этого типа, вернуть какое-то значение того же типа. Исходя из того, что тип может быть любым, и никаких операций над этим типом мы не определили, единственной продуктивно завершающейся реализацией является identity. Здесь и далее мы исключаем непродуктивные решения вида f(a) = f(a) (зависание/отсутствие завершения) или f(a) = throw Exception() (исключение).


Для представления эффектов часто используется конструкция IO[A]. Значение из этого объекта можно получить, только выполнив код, содержащийся внутри. Довольно часто можно столкнуться с ситуацией, когда само значение нам не настолько интересно, как факт выполнения определённой операции. Обычно используется тип возвращаемого значения IO[Unit]. В этой заметке предлагается воспользоваться параметричностью, чтобы получить определённые гарантии.

Читать дальше →
Всего голосов 9: ↑8 и ↓1+7
Комментарии13

Вывод оптимального алгоритма с помощью формализма Бёрда-Меертенса

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров3K

Некоторые оптимальные алгоритмы, оказывается, можно вывести из неоптимальных, пользуясь эквивалентными преобразованиями алгоритма. Бёрд и Меертенс разработали формализм, который устанавливает свойства функций высшего порядка map, fold, scan, позволяющие преобразовывать алгоритмы в эквивалентные. (См. также на Вики). Ниже представлен вольный перевод статьи Бёрда.


Рассмотрим задачу поиска максимальной суммы сегмента массива. Эту задачу можно переформулировать в виде математически точного ответа:


Для всех сегментов, которые можно получить из массива, необходимо посчитать сумму чисел, а затем среди всех таких сумм найти максимальную.
Читать дальше →
Всего голосов 11: ↑11 и ↓0+11
Комментарии0

Бестолковые тесты versus качественное ПО. Часть 3. Что получится?

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров802

В первой части мы рассмотрели примеры тестов, из которых не все одинаково полезны. Затем попытались определиться, что же такое качество ПО, и предложили "распрямлять" код и выводить программы из требований. Рассмотрели классификацию ошибок. Рассмотрели те задачи, в которых тесты хорошо себя проявляют.


Попробуем разобраться, что получится, если применить все эти соображения к тестам из первой части.

Читать дальше →
Всего голосов 4: ↑0 и ↓4-4
Комментарии1

Бестолковые тесты versus качественное ПО. Часть 2. Что делать? 5. Применимость юнит-тестов

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров768

В первой части мы рассмотрели примеры тестов, из которых не все одинаково полезны. Затем попытались определиться, что же такое качество ПО, и предложили "распрямлять" код и выводить программы из требований. Рассмотрели классификацию ошибок.


Видя необоснованные надежды, возлагаемые на юнит-тесты, хотелось бы понять, что в действительности можно ожидать от тестов.

Читать дальше →
Всего голосов 5: ↑0 и ↓5-5
Комментарии0

Бестолковые тесты versus качественное ПО. Часть 2. Что делать? 4. Эквивалентность функций

Уровень сложностиСложный
Время на прочтение14 мин
Количество просмотров678

В первой части мы рассмотрели примеры тестов, из которых не все одинаково полезны. Затем попытались определиться, что же такое качество ПО, и предложили "распрямлять" код. Рассмотрели классификацию ошибок.


Теперь рассмотрим, как использовать типы, чтобы реализуемая программа сразу гарантированно соответствовала предъявляемым требованиям.

Читать дальше →
Всего голосов 7: ↑3 и ↓4-1
Комментарии4

Бестолковые тесты versus качественное ПО. Часть 2. Что делать? 3. Ошибки

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров503

В первой части мы рассмотрели примеры тестов, из которых не все одинаково полезны. Затем попытались определиться, что же такое качество ПО, и предложили "распрямлять" код.


Теперь посмотрим, от каких ошибок защищают тесты, а от каких — другие инструменты из арсенала разработчика.

Читать дальше →
Всего голосов 4: ↑0 и ↓4-4
Комментарии0

Бестолковые тесты versus качественное ПО. Часть 2. Что делать? 2. «Распрямляем» код

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров752

В первой части мы рассмотрели примеры тестов, из которых не все одинаково полезны. Затем попытались определиться, что же такое качество ПО, и как подходить к вопросу тестирования с системной точки зрения.


Теперь рассмотрим один из аспектов разработки, позволяющий уменьшить необходимое количество тестов — "прямолинейность" кода (как понятие, противоположное цикломатической сложности).

Читать дальше →
Всего голосов 5: ↑1 и ↓4-3
Комментарии4

Бестолковые тесты versus качественное ПО. Часть 2. Что делать? 1. Определяемся с качеством

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров781

В первой части мы рассмотрели примеры тестов, из которых не все одинаково полезны. Здесь попробуем разобраться, что такое качество ПО и какую роль в обеспечении качества играют тесты.

Читать дальше →
Всего голосов 2: ↑0 и ↓2-2
Комментарии0

Бестолковые тесты versus качественное ПО. Часть 1. Бестолковые тесты

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров1.9K

Сталкивались с тестами, которые толком ничего не тестируют? А тесты, которые что-то тестируют, но при этом всё равно постоянно возникают баги? Может быть, тесты, которые приходится каждый раз исправлять?


Несложно построить тест, обеспечивающий 100% покрытие, но при этом ничего не проверяющий и не гарантирующий. (См., например).


Проблемы юнит-тестов уже затрагивались на Хабре ранее:



В заметке рассматривается несколько разновидностей бестолковых тестов, а также некоторые ограничения самой идеи тестирования. А затем (в следующих частях) предлагаются разумные, на взгляд автора, меры обеспечения качества программ, включающие как уменьшение количества малополезных тестов, так и применение тестов там, где они уместны.

Читать дальше →
Всего голосов 10: ↑6 и ↓4+2
Комментарии0

Решение задачи о 8 ферзях на трёх уровнях Scala — программа, типы, метапрограмма

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров2.1K

В заметке Ричарда Тауэрса (Richard Towers) Typescripting the technical interview (есть перевод на Хабре: Руны и лёд: техническое собеседование по TypeScript) по ходу повествования была решена классическая задача расстановки 8 ферзей на шахматной доске. Для решения использовалась система типов TypeScript. Мне захотелось посмотреть, как эта задача будет выглядеть на Scala. Т.к. Scala 3 помимо развитой системы типов предлагает превосходную поддержку метапрограммирования, то здесь мы рассмотрим не только решение на типах, но и мета-программное решение.

Читать дальше →
Всего голосов 13: ↑13 и ↓0+13
Комментарии4

Развёртывание программных систем в Kubernetes с помощью Jsonnet

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров4.2K

Kubernetes (k8s) является де-факто стандартом для развёртывания приложений. В терминах K8s приложение представляет собой набор сконфигурированных ресурсов нескольких типов — pod, service, deployment, secret, statefulset,… Конфигурация каждого ресурса задаётся унифицированно с помощью YAML (или JSON) манифеста. Kubernetes API и интерфейс командной строки позволяют манипулировать манифестами ресурсов, а сами ресурсы автоматически приводятся в состояние, соответствующее манифестам.


Для формирования согласованных конфигураций ресурсов используются дополнительные технологии. Например,


  • Helm — генерация манифестов на основе строковых шаблонов + "магазин" готовых компонентов (package manager).
  • Kustomize — ("Kubernetes cUSTOMIZation") — донастройка манифестов путём внесения исправлений в различные свойства.
  • Jsonnet — генерация манифестов с использованием легковесного функционального языка, предназначенного для генерации JSON.

Для синхронизации проектов, хранящихся в репозитории git, с фактическим состоянием инфраструктуры в каком-либо кластере может использоваться специальное приложение, работающее в рамках концепции GitOps, например ArgoCD. Причём поддерживаются как проекты, содержащие собственно манифесты, так и проекты, основанные на вышеперечисленных генераторах/модификаторах.


Эти генераторы широко применяются в различных приложениях и, в целом, позволяют решить задачи, связанные с развёртыванием инфраструктуры. Однако, имеются существенные отличия в подходах, что определяет возможности и потенциальный охват задач.


Рассмотрим, какие требования было бы разумно предъявить к языку описания инфраструктуры. (В этой заметке излагается взгляд автора, занимающегося разработкой программного обеспечения. Другие стороны, например, команды эксплуатации, могут иметь иной взгляд на этот вопрос.)

Читать дальше →
Всего голосов 4: ↑4 и ↓0+4
Комментарии5

Потоковая обработка данных в go

Время на прочтение5 мин
Количество просмотров7.5K

При использовании языка Go чувствуется нехватка хорошей библиотеки для работы с потоками данных. Имеющиеся библиотеки в основном написаны во времена до дженериков и имеют не очень удобный интерфейс.

С выходом Go 1.18 появилась возможность реализовать библиотеку потоковой обработки данных goio, вдохновлённую превосходными Scala-библиотеками cats-effect и fs2.

Читать далее
Всего голосов 17: ↑15 и ↓2+13
Комментарии4

Build (CI/CD) of non-JVM projects using gradle/kotlin

Время на прочтение11 мин
Количество просмотров1.3K

In some projects, the build script is playing the role of Cinderella. The team focuses its main effort on code development. And the build process itself could be handled by people who are far from development (for example, those responsible for operation or deployment). If the build script works somehow, then everyone prefers not to touch it, and noone ever is thinking about optimization. However, in large heterogeneous projects, the build process could be quite complex, and it is possible to approach it as an independent project. If however you treat the build script as a secondary unimportant project, then the result will be an indigestible imperative script, the support of which will be rather difficult.


In the previous post we looked at what criteria we used to choose the toolkit, and why we chose gradle/kotlin, and in this post we will take a look at how we use gradle/kotlin to automate the build of non-JVM projects. (There is also a Russian version.)


CI/CD (opensource.com)


Introduction


Gradle for JVM projects is a universally recognized tool and does not need additional recommendations. For projects outside of the JVM platform, it is also used. For instance, the official documentation describes usage scenarios for C++ and Swift projects. We use gradle to automate the build, test, and deployment of a heterogeneous project that includes modules in node.js, golang, terraform.

Read more →
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Сборка (CI/CD) не-JVM проектов с использованием gradle/kotlin

Время на прочтение11 мин
Количество просмотров2.8K

В некоторых проектах сборке отводится роль Золушки. Основные усилия команда сосредоточивает на разработке кода. А самой сборкой могут заниматься люди, далёкие от разработки (например, отвечающие за эксплуатацию, либо за развёртывание). Если сборка хоть как-то работает, то её предпочитают не трогать, и речь об оптимизации не заходит. Вместе с тем в больших гетерогенных проектах сборка оказывается достаточно сложной и к ней вполне можно подходить как к самостоятельному проекту. Если же относиться к сборке как к второстепенному проекту, то в результате будет получен неудобоваримый императивный скрипт, поддержка которого будет в значительной степени затруднена.


В предыдущей заметке мы рассмотрели, по каким критериям мы выбирали инструментарий, и почему остановились на gradle/kotlin, а в этой заметке рассмотрим, каким образом используем gradle/kotlin для автоматизации сборки не-JVM проектов. (Есть также перевод на английский.)


CI/CD (opensource.com)


Введение


Gradle для JVM-проектов является общепризнанным инструментом и не нуждается в дополнительных рекомендациях. Для проектов за пределами JVM он также используется. Например, в официальной документации описаны сценарии использования для C++ и Swift проектов. Мы используем gradle для автоматизации сборки, тестирования и развёртывания гетерогенного проекта, включающего модули на node.js, go, terraform.

Читать дальше →
Всего голосов 2: ↑1 и ↓10
Комментарии0

Building projects (CI/CD), instruments

Время на прочтение7 мин
Количество просмотров1.5K

In some projects, the build script is playing the role of Cinderella. The team focuses its main effort on code development. And the build process itself could be handled by people who are far from development (for example, those responsible for operation or deployment). If the build script works somehow, then everyone prefers not to touch it, and no one ever is thinking about optimization. However, in large heterogeneous projects, the build process could be quite complex, and it is possible to approach it as an independent project.If you treat the build script as a secondary unimportant project, then the result will be an indigestible imperative script, the support of which will be rather difficult.


In this note we will take look at the criteria by which we chose the toolkit, and in the next one — how we use this toolkit. (There is also a Russian version.)


CI/CD (opensource.com)

Read more →
Рейтинг0
Комментарии0

Сборка не JVM-проектов, инструменты

Время на прочтение8 мин
Количество просмотров2.6K

В некоторых проектах сборке отводится роль Золушки. Основные усилия команда сосредоточивает на разработке кода. А самой сборкой могут заниматься люди, далёкие от разработки (например, отвечающие за эксплуатацию, либо за развёртывание). Если сборка хоть как-то работает, то её предпочитают не трогать, и речь об оптимизации не заходит. Вместе с тем в больших гетерогенных проектах сборка оказывается достаточно сложной и к ней вполне можно подходить как к самостоятельному проекту. Если же относиться к сборке как к второстепенному проекту, то в результате будет получен неудобоваримый императивный скрипт, поддержка которого будет в значительной степени затруднена.


В этой заметке мы рассмотрим, по каким критериям мы выбирали инструментарий, а в следующей — каким образом этот инструментарий используем. (Есть также перевод на английский.)


CI/CD (opensource.com)

Читать дальше →
Всего голосов 2: ↑1 и ↓10
Комментарии0

Компилируемая конфигурация распределённой системы

Время на прочтение18 мин
Количество просмотров3K

Хотелось бы рассказать один интересный механизм работы с конфигурацией распределённой системы. Конфигурация представлена напрямую в компилируемом языке (Scala) с использованием безопасных типов. В этом посте разобран пример такой конфигурации и рассмотрены различные аспекты внедрения компилируемой конфигурации в общий процесс разработки.


Жизненный цикл конфигурации


(english)

Читать дальше →
Всего голосов 7: ↑7 и ↓0+7
Комментарии2

Compilable configuration of a distributed system

Время на прочтение17 мин
Количество просмотров1.4K

In this post we'd like to share an interesting way of dealing with configuration of a distributed system.
The configuration is represented directly in Scala language in a type safe manner. An example implementation is described in details. Various aspects of the proposal are discussed, including influence on the overall development process.


Overall configuration management process


(на русском)

Read more →
Всего голосов 6: ↑6 и ↓0+6
Комментарии0
1

Информация

В рейтинге
Не участвует
Откуда
Воронеж, Воронежская обл., Россия
Зарегистрирован
Активность

Специализация

Backend Developer, Software Architect
Lead
От 700 000 ₽
Git
Linux
Docker
PostgreSQL
Golang
Scala