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
Сайт-напоминание разработчикам об ошибках округления чисел с плавающей точкой.

Просто таблица с результатами вычисления 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 день. Надо всего лишь...»
Раньше я думал, что меня сложно удивить, но тут человеку, отправившему pull request с исправлением опечатки, предлагается распечатать и подписать лицензионное соглашение.

При этом библиотека открытая и опубликована под лицензией Apache-2.0.

Само собой PR висит уже больше года, а опечатка как была в исходниках, так и осталась.
Написал небольшой пост про то, как я переписал foreach на while в своей скала-либе и получил прирост производительности почти в два раза.

TL;DR это действительно так работает, но бежать переписывать прод на циклы смысла нет
В интервью Кирилла Мокевнина с Романом Павлушко (бывший CTO Avito) услышал, что у них есть слак-бот, которому можно дать описание сервиса «голанг, два редиса, постгрес», и он автоматически создаст репозиторий с шаблоном проекта, докер образ, развернёт нужную инфраструктуру и позволит задеплоить это на прод в одно нажатие кнопки.

По этому поводу могу сказать только одно слово: ХОТЕТЬ
Forwarded from Crybaby ↜( ◣∀◢)ψ
Отличная заметка от Daniel Spiewak про использование тред-пулов в jvm.

1. Если задачи грузят преимущественно CPU (например, распараллеленные числодробилки), брать пул с фиксированным количеством тредов. Тредов столько же, сколько и ядер в процессоре: newFixedThreadPool(Runtime.getRuntime.availableProcessors)

2. Для блокирующего i/o нужен пул, который умеет плодить много потоков. cachedThreadPool с этим отлично справится.

3. Для асинхронных операций брать forkJoinPool и не забивать его никакими задачами, кроме, непосредственно управления исполнением программы.

От себя добавлю, что поверх этих тред-пулов должно исполняться исключительно моднейшее ZIO с тремя дырками!