Software essays that shaped me
Автор делится программными эссе, которые повлияли на его мышление за 20 лет карьеры. Среди них — «Тест Джоэла» Джоэла Спольски, который предлагает 12 вопросов для оценки качества работы команды, подчеркивая уважение к разработчикам и их времени. Эссе Алексис Кинг «Парси, а не валидируй» показывает, как использование типов данных повышает безопасность, превращая сырые строки в проверенные структуры. Фред Брукс в «No Silver Bullet» утверждает, что не существует волшебного решения сложности ПО, поскольку её корни — в сущностных, а не случайных проблемах.
Практические выводы включают выбор работодателей, ценящих разработчиков, применение строгих типов для данных и принятие неизбежной сложности инженерии. Эти идеи формируют подход к надёжности, безопасности и человеческому фактору в разработке.
Комментарии (31)
- Обсуждаются влиятельные эссе и статьи о разработке ПО, включая "Parse, don't validate", "Choose Boring Technology" и анализ инцидентов с Therac-25.
- Поднимаются вопросы о качестве тестового кода: спор о допустимости логики в тестах и важности их простоты для избежания ложных срабатываний.
- Обсуждается влияние ИИ на классическую теорию Brooks'а об отсутствии "серебряной пули" и его способность снижать essential complexity.
- Упоминаются ключевые работы, повлиявшие на мышление разработчиков, такие как "Grug Brained Developer", "Code Complete" и "Don't Call Yourself A Programmer".
- Затрагивается проблема цифровой идентификации и доступа к аккаунтам в сравнении с аналоговым миром, где проще доказать свою личность.
Evolving the OCaml Programming Language (2025) [pdf]
- Эволюция OCaml – Ashoka Univ, сент 2025 [pdf][key]
- Авто-проверка реплиц. типов – NUS, авг 2025 [pdf][key]
- AI-инструменты для исследований – IIT Madras, июль 2025 [pdf][key]
- Параллельный рантайм OCaml – Chalmers, май 2025 [pdf][key]
- Авто-проверка реплиц. типов – WG 2.8, май 2025 [pdf][key]
- Параллельный OCaml 5 – Bloomberg, мар 2025 [pdf][key]
- Параллельный OCaml 5 – IIT Gandhinagar, мар 2025 [pdf][key]
- Параллельный OCaml 5 (ч.1) – PACE Lab, фев 2025 [pdf][key]
- Безопасность памяти и ЯП – Schaeffler @ IITM, фев 2025 [pdf][key]
- Мини-ОС через Unikernels – Daekin–IITM, янв 2025 [pdf][key]
- Безопасные Unikernels с аппаратной поддержкой – CAIR DRDO, ноя 2024 [pdf][key]
- Параллельный OCaml 5 – Meta London, сен 2024 [pdf][key]
- Зачем OCaml? – Rezilyens, авг 2024 [pdf][key]
- Эффекты и конкурентность – Chalmers, май 2024 [pdf][key]
- Безопасность функциональных программ – WG 2.8, апр 2024 [pdf][key]
- Композиция библиотек конкурентности – EHOP, июл 2023 [pdf][key]
- Сливаемые реплиц. типы – Collège de France, апр 2023 [pdf][key][видео]
- OCaml 5.0 – OCaml Workshop, сен 2022 [pdf][key]
- Ретрофит конкурентности – ICFP keynote, сен 2022 [pdf][key][видео]
- Сертифицированные сливаемые типы – PLDI, июн 2022 [pdf][key][видео]
- Сертифицированные сливаемые типы – Nomadic Labs, апр 2022 [pdf][key][видео]
- Параллелизм в OCaml – Marigold, дек 2021
- Эффекты в OCaml 5 – Huawei STW, окт 2021 [pdf][key]
- Эффекты в OCaml – SimCorp, сен 2021 [pdf][key]
- Параллелизм в OCaml – SimCorp, сен 2021 [pdf][key]
- ParaFuzz: фаззинг многопоточных программ – Dagstuhl, 2021
Комментарии (30)
- Доклад — субъективный взгляд на 10-летнюю эволюцию OCaml; цель — убрать мистику вокруг разработки компилятора и заманить новых контрибьюторов.
- Главный бытовой pain-point: в стандартной библиотеке исключения — часть API, и они не типизированы, что подрывает «безопасность» языка.
- Выход — использовать Jane Street Core/Base (функции либо возвращают Result, либо помечены _exn), но большинство проектов всё ещё живёт на обычной Stdlib.
- «Большие» альтернативы Stdlib (Core, Base) существуют, но их значение часто преувеличено; официальная библиотека за последние годы всё-таки подросла полезными функциями.
- Новичкам в компиляторщине советуют начинать с мелких багов и мини-Pull Request’ов, а не пытаться сразу «съесть слона».
Optimising for maintainability – Gleam in production at Strand
Задача
Лондонское агентство Strand ведёт сотни маркетинг-проектов в год. Финансовый учёт раньше велся вручную через таблицы. В 2020 г. команда из трёх разработчиков запустила прототип финансовой системы; он быстро стал критически важным, и потребовалось обеспечить надёжность и простоту поддержки при минимальных ресурсах.
Решение
Strand выбрал язык Gleam на платформе BEAM:
- Безопасность: чистый код не падает; сбои внешних сервисов изолируются лёгкими процессами.
- Практичность: язык мал, однозначен, осваивается за день; доступны 40 лет библиотек Erlang/Elixir.
- Опыт разработки: единый пакет с форматтером, автодополнением и понятными ошибками; сборка мгновенная.
Система обрабатывает курсы валют, синхронизирует данные с внешним ПО и продолжает расти без роста технического долга.
Комментарии (20)
- Вероятно, языки вроде Gleam выиграют у ИИ благодаря строгой типизации и быстрой обратной связи.
- Некоторые новички застревают в «абстракционном аду» и советуют сначала освоить Erlang/Elixir.
- Производственные истории успеха Gleam на BEAM вдохновляют.
- Однофайловые исполняемые файлы можно собрать через компиляцию в JavaScript + Node SEA или Burrito, но полноценный VM-free релиз пока нет.
- Качество примеров и стабильность языка становятся важнее их количества для LLM.
- Чистые, референциально прозрачные языки удобны ИИ для параллельного тестирования блоков кода.
Go is still not good 🔥 Горячее 💬 Длинная дискуссия
Go всё ещё плох
Кратко: автор 10+ лет критикует Go за архитектурные ошибки, которые легко было избежать.
1. Ошибки: неверная область видимости
bar, err := foo()
if err != nil { … }
if err = foo2(); err != nil { … }
// err висит до конца функции, хотя нужен только в двух строках
Читателю приходится тратить время, выясняя, где err ещё используется.
2. Два вида nil
var i interface{}
var s *S
fmt.Println(s == nil, i == nil, s == i) // true, true, false
i = s
fmt.Println(s == nil, i == nil, s == i) // true, false, true
Один «billion-dollar mistake» не хватило — сделали два.
3. Непереносимость
Условная компиляция через комментарии в начале файла — «аристотелевский» подход: теория без практики. Реальные проекты страдают.
4. append без чёткого владения
a := []string{"hello", "world", "!"}
foo(a[:1]) // внутри append
fmt.Println(a) // результат зависит от капасити слайса
Поведение неочевидно и требует знания внутренностей.
5. defer вместо RAII
В Java и Python ресурс закрывается автоматически при выходе из блока.
В Go приходится вручную писать defer foo.Close() и гадать, какие ресурсы вообще требуют закрытия.
Комментарии (591)
- Go хвалят за простоту, быструю компиляцию, встроенные инструменты и удобную конкурентность.
- Критикуют «двойной nil», слабую систему типов, проблемы GC, неинтуитивный defer и скудные абстракции.
- Многие считают его «достаточно хорошим» для бэкендов и CLI-утилит, особенно при скорости разработки.
- Крупные проекты жалуются на «смерть тысячей порезов» и трудности отладки из-за строгости компилятора.
- Часть сообщества видит в Go компромисс между Node/Python и Rust, другие — устаревший язык без современных фич.
Typechecker Zoo
Проект «Zoo» — мини-реализации самых влиятельных статических систем типов последних 50 лет. Начнём с простых и дойдём до зависимых типов. Всё пишем на Rust — просто потому что удобно и забавно строить чисто функциональные языки на не-функциональном.
Это не учебник, а выходные развлечение. За теорией и доказательствами смотрите TAPL, ATTAPL, PFPL и оригинальные статьи (ссылки в приложении). Здесь же — грязные детали реализации: структуры данных, AST, логика, всё, что можно осилить за уик-энд.
Код — идиоматичный Rust с полноценным парсером и тестами (lalrpop, logos, ariadne). Примеры урезаны, но понятнее продакшен-реализаций. Парсинг и MLIR считаем решёнными задачами, поэтому не фокусируемся на них.
Четыре «зверька»:
- Algorithm W (775 строк) — классический Hindley–Milner, полиморфный λ-исчисление.
- System F (1090 строк) — второе λ-исчисление, параметрический полиморфизм, Mini-OCaml.
- System F-ω (3196 строк) — высшие рода, паттерн-матчинг, дататипы, Haskell-lite.
- Calculus of Constructions (6000 строк) — иерархия универсумов, индуктивные типы, крошечный Lean.
MIT-лицензия, хобби-проект. Нашли опечатку — присылайте pull-request.
Комментарии (24)
- Пользователи хвалят Elaboration Zoo как полезный ресурс для изучения нормализации по вычислению и вывода неявных переменных.
- Просят аналогичный «зоопарк» для линейных типов и предлагают добавить быстрый вариант Hindley–Milner из OCaml.
- Автору советуют включить тёмную тему для блоков кода и рассмотреть простой однонаправленный type-checker в духе Featherweight Java.
- Уточняют, что присутствие индуктивных типов делает реализацию ближе к CIC, но Lean всё же сильнее за счёт аксиомы выбора.
- Картинки с животными вызывают путаницу; большинство считают их просто AI-орнаментом без смысловой нагрузки.