Lil Functor – Telegram
Lil Functor
797 subscribers
57 photos
1 file
183 links
Pure functional and composable channel

Чат: https://news.1rj.ru/str/+L-xb_m_4lnY3Y2Fi
Download Telegram
Эксплуатация микросервисов

Замечательный доклад с митапа Highload++ и его краткая расшифровка о проблемах, порождаемых микросервисной архитектурой.

Основные тезисы:
1. Независимость деплоя и разработки микросервисов иллюзорна. В реальности тесные связи между плохо спроектированными сервисами будут требовать одновременной выкатки (или разработки) сразу нескольких кусков системы.

2. Передачу сообщений между отдельными сервисами будет требовать накладных расходов на сетевой трафик. Скорее всего, придётся поддерживать ещё и несколько шин сообщений. А сделать консистентный бэкап будет ой как трудно.

3. То, что архитектура называется «микросервисной», не значит, что надо вводить ограничения на размер кодовой базы отдельного сервиса. Сервисы должны быть просто меньше монолита.

4. Чтобы избежать проблем с микросервисами, надо начинать разработку с монолита, который потом, при наличии веских оснований, будет разбит на куски (или вовсе не будет).

5. Только после накопления очень большой внутренней сложности проект сможет получить пользу от разделения на независимые части.

6. Сливать уже существующие микросервисы в монолит не постыдное, а вполне уважаемое занятие.
Concurrency with Cats Effect

Слайды из доклада Michael Pilquist с конференции Scale By The Bay. Доклад посвящён нюансам работы с cats-effect — библиотеке для асинхронного программирования в функциональном стиле.

Приводятся примеры неинтуитивного поведения примитивов для конкурентных вычислений (Fiber) и частых ошибок при работе с структурами для безопасного доступа к изменяемому состоянию (Ref, Deffered).

Кроме того, приводится реализация безопасной очереди с многопоточным доступом к состоянию. Реализация, само собой, на примитивах из котоэффектов и влезает на слайд.

Доклад крайне полезен как тем, кто использует котоэффекты в своих проектах, так и тем, кто хочет посмотреть, как выглядит асинхронное программирование с манатками.
Есть такая библиотека для «продвинутого» функционального программирования на скале — scalaz. По сути, это расширение стандартной библиотеки в сторону ФП.

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

Потому что в исходниках Scalaz джедаи дерутся на световых мечах, а мало-мальски подробной документации никто не написал.

Моя любимая функция выглядит так:
def liftLiskov[F[_], G[_]](ev: ∀[λ[α => F[α] <~< G[α]]])(implicit F: IsCovariant[F]): Fix[F] <~< Fix[G] = As.unsafeForce

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

Просто таблица с результатами вычисления 0.1 + 0.2 в разных языках программирования. И да, обычно получается не 0.3
В новый год с новыми годными ссылочками:

* 12factor — манифест команды Heroku о разработке SaaS. Очень приятное чтиво в стиле Мартина Фаулера.

* Чеклист от Хекслета по хорошим инженерным практикам в софтварных компаниях —
https://guides.hexlet.io/check-list-of-engineering-practices/

* Интерактивное введение в матстат и теорию вероятности (очень красивое и очень интерактивное) — https://seeing-theory.brown.edu

* Очередная подборка хороших практик в программировании на Scala. Качественная, но явно не полная — https://nrinaudo.github.io/scala-best-practices/

#ссылки
Вышло видео недавнего доклада John A De Goes о том, как правильно программировать на скале.

Из интересного:

* Светоч сравнил джавистов со змием-искусителем, соблазнившем программистов писать громоздкие иерархии наследования

* Подметил старую истину о том, что «лучшие практики» в ООП пересказывают принципы функционального программирования

* Ни одна скала-конференция не обходится без доклада о полезности чистых тотальных функций и описания сайд-эффектов, как значений. К счастью, Дегуз посвятил этому несколько минут и перешёл к другим важным вещам: блокированию потоков, прерываниям, легковесным потокам, утечкам ресурсов. Представил проблемы из реальной практики программистов и предложил решения в духе ФП. Спасибо.

* Само собой, в примерах использовалась библиотека самого Джона. Но при этом они написаны так, что легко перекладываются на другие либы. Ещё раз спасибо, Джон!
И вы только посмотрите на логотип его библиотеки! Пока это самый крутой логотип программистских инструментов, который я видел.
Написал маленькую заметку о том, как настроить отправку писем с обновлениями RSS-каналов себе на почту. Бесплатно, без смс и сторонних сервисов.
Только недавно обнаружил удобный способ объединить последние коммиты в гите.

После долгой работы в локальной ветке возникает последовательность коммитов вида:

f6e1600 - фикс опечатки
f5e6e43 - исправление компиляции
dade538 - исправление таймаута
2465e49 - форматирование
903f37d - реализована [название большой задачи]

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

Сплющивание делается элементарной командой
git reset --soft HEAD~X
X — количество мусорных коммитов. После этого делаем git commit и прописываем нормальное сообщение. Этот способ гораздо более удобный и идиоматичный, чем git rebase -i, который я использовал раньше.
Решил поиграться с dotty (прототип Scala 3) и выразил монадные трансформеры через opaque types. Это такие алиасы для типа, которые работают как алиасы только в скоупе своего определения, а в других местах компилятор воспринимает их как полноценный самостоятельный тип. А ещё поговаривают, что их завезут уже в 2.13!

Трансформеры на них выглядит классно, но боюсь, что в рантайме создаются лишние объекты из-за implicit class, не наследующего AnyVal.

Само собой, побенчмаркал сравнение с классической на данной момент реализацией через case class. EitherT c Try работает примерно на 15% быстрее классической реализации, а OptionT — на 30. Если использовать Future, то разницы практически нет. (мои замеры кривые и им нельзя доверять)

Говнокод тут
Жирное обсуждение на реддите о том, что в Haskell удобнее, чем в Scala.

В тред ворвались мастодонты обоих сообществ: Edward Kmett и Sam Halliday со стороны Haskell и Alexandru Nedelcu с Wojtek Pituła на защите скалы 🍿
Написал в бложик про создание пакетов для Arch Linux, медленный запуск программ на скале и причём тут GraalVM.

TL;DR делать пакеты для арча весело и стильно, а вовсе не сложно
Бинго для доклада на конференции по ФП:

> pure functions
> immutable data structures
> avoid impurity
> aaaaaaand... it's composable!
> monad
> side effects
> state
> *показывает hello world в репле*
Только сейчас наткнулся на пакет errors для голанга, который добавляет в язык почти эксепшены. Только с маааааленьким нюансом: стэктрэйс составляет не рантайм языка, а программист. Элегантное решение!
Давно подслушал и недавно осмыслил простое, но полезное правило использования тайпклассов в Scala.

Допустим, вы пишите полиморфное хранилище ключ-значение и хотите иметь возможность получить все значения в отсортированном виде:

abstract class KeyValueStorage[T: Order] {
def get(id: String): T
def put(entity: T): Unit
def delete(id: String): Unit
def sorted(): List[T]
}

Для того, чтобы значения типа T могли быть отсортированы, на него накладывается требование Order. Но фактически это требование нужно для реализации только одного метода из четырёх — sorted. Поэтому его можно локализовать:

trait KeyValueStorage[T] {
def get(id: String): T
def put(entity: T): Unit
def delete(id: String): Unit
def sorted()(implicit O: Order): List[T]
}

Теперь пользователи могут использовать реализации этого хранилища для объектов, которые нельзя сравнивать. Компилятор не позволит им вызвать метод sorted, но остальные методы будут доступны.

Благодаря гранулярности требований достигается универсальность интерфейса.
Градация программистов здорового человека от Basecamp:

* до 2 лет опыта — Junior Programmer
* 2-5 лет — Programmer
* 5-8 лет — Senior Programmer
* 8-12 лет — Lead Programmer
* 12+ лет — Principal Programmer

И откуда-то со дна стучит СНГ-шное айти:

«Здравствуйте))) Нам очень понравилось ваше резюме на полгода опыта, хотим предложить вам позицию сеньор биг дата архитектора 💅👨🏻‍💻 в перспективной компании...»

«Team Lead в 19 лет: невероятная история программ...»

«С нуля до старшего разработчика за 21 день. Надо всего лишь...»