Email immutability matters more in a world with AI
Fastmail подчеркивает важность человеческого подхода в мире, где ИИ всё чаще используется для создания контента. Основатель компании отмечает, что электронная почта остаётся неизменным цифровым архивом — в отличие от веб-страниц, которые могут редактироваться постфактум, письма сохраняют историческую точность. Это делает email надёжным источником памяти, защищённым от манипуляций.
Компания поддерживает осознанное использование ИИ как инструмента, но призывает сохранять критическое мышление. Сотрудники и клиенты Fastmail в основном с осторожностью относятся к автоматизированным решениям, предпочитая личное участие. Внутренняя политика компании требует строгого соблюдения конфиденциальности данных при использовании любых инструментов, включая ИИ, чтобы гарантировать защиту приватности пользователей.
Комментарии (90)
- Обсуждается ценность иммутабельности email в сравнении с другими формами коммуникации, где сообщения могут быть отредактированы или удалены.
- Поднимаются вопросы о реальной неизменности email, включая возможность модификации на стороне провайдера и использование динамического контента в HTML-письмах.
- Участники делятся техническими решениями для обеспечения подлинности и неизменности писем, такими как DKIM, GPG-подписи и локальное архивирование.
- Высказываются опасения по поводу использования AI провайдерами, включая Fastmail, и сильное желание сохранить традиционный email-сервис без AI-функций.
- Обсуждается роль AI в создании и распространении misinformation, а также потенциальные технические решения для аутентификации цифрового контента.
Clojure's Solutions to the Expression Problem
Clojure и «проблема выражений»
- Проблема: добавлять новые типы данных и новые операции без перекомпиляции всего кода и без нарушения существующих вызовов.
- ООП-языки решают лишь половину: легко новый класс, трудно новый метод.
- Функциональные языки наоборот: легко новая функция, трудно новый вариант данных.
Как Clojure объединяет лучшее
-
Протоколы
- Описывают набор методов без привязки к типу.
- Реализуются для любого существующего класса поздно, «извне».
- Компилируются в обычный Java-интерфейс, быстрый вызов.
-
Мультиметоды
- Выбор реализации по произвольной функции-диспетчеру (тип, значение, метаданные).
- Позволяют «разрезать» иерархию по другим осям, не только по классу.
-
Records и types
defrecordсоздает неизменяемую структуру с заранее известными полями и автоматическим доступом по ключам как к карте.deftypeдаёт полный контроль, поля хранятся примитивно, без лишних обёрток.
-
reify
- «Анонимный класс» на Clojure: создаёт объект, реализующий нужные протоколы/интерфейсы, без отдельного файла.
Практический итог
- Новый тип →
defrecord/deftype+ реализация нужных протоколов. - Новая операция → добавляем метод в протокол и реализуем для всех существующих типов.
- Старый клиентский код не трогается, компиляция не требуется.
Комментарии (16)
- Протоколы в Clojure теперь умеют диспатчиться по метаданным, а не только по типу.
- Участники скучают по временам, когда посты о продуктивности были про REPL, функциональность, композабельность и иммутабельность.
- Поделились ссылкой на демонстрацию решения «expression problem» в Clojure.
- Люди недооценивают готовые решения вроде Datomic и вместо этого пишут свои костыли.
- Один из участников вспомнил, как в 2013–15 писал тесты на Clojure и расширял фреймворк для Selenium.
I'm working on implementing a programming language all my own
Я пишу свой язык Baba Yaga — чисто из любви к эстетике кода. Рабочий интерпретатор есть, но полноценной среды пока нет; планирую браузерный «бесконечный холст» в духе Smalltalk.
Язык — эксперимент ради удовольствия: неизменяемость, функциональный стиль, минимальный синтаксис, базовые «батарейки». Это Toki Pona для Haskell.
Синтаксис и типы
Объявления переменных и функций одинаковы; скобки не нужны, каррирование бесплатно.
transport : "Chicken House"
add : x y -> x + y
add5 : add 5
Базовые неизменяемые типы: Int, Float, String, Bool, List, Table.
numbers : [1, 2, 3]
person : {name: "Lucy", age: 23}
Типы можно указать явно; без аннотаций всё проверяется только во время вызова.
Управление потоком
Единственный способ — when (pattern matching). Нет if/else или switch.
describe : x ->
when x is
0 then "Zero"
_ then "Something else"
processUser : user ->
when user is
{name: n, age: a, active: true} -> "Adult: " .. n
_ -> "Unknown"
Пример: жизнь Конвея уже работает.
Комментарии (36)
- Участники делятся опытом создания языков: @codr7 показал фреймворк Shi, @aldousd666 рассказал о своих интерпретаторах, начавшихся в 2006-м.
- Разгорелся спор о синтаксисе: одни хвалят «:» для присваивания, другие защищают «=» как уже устоявшийся символ.
- Кто-то предлагает отказаться от точек с запятой, кто-то считает их полезным разделителем.
- Обсуждаются математические корни обозначений: одни считают «=» сравнением, другие — утверждением.
- Предлагаются альтернативы: «:=», «<-», «=>», а также идея вызывать функции в порядке чтения.