Egor Merkushev

Podlodka Podcast #395

Как писать библиотеки | Проектирование API, обратная совместимость

Ссылка на выпуск

Основные темы:

Ключевые моменты:

Заключение:

Yandex GPT

https://300.ya.ru/v_yW8gmDY6/

00:00:00 Введение

• Обсуждение выбора между сохранением обратной совместимости и ломанием стандарта. • Представление ведущих подкаста: Егор Толстой и Катя Петрова. • Введение гостя: Сев Толстопят, главный за библиотеки в команде Kotlin.

00:01:47 История функции fun

• Сев рассказывает о создании функции fun. • Обсуждение её популярности и восприятия среди программистов. • История о том, как функция стала популярной и почему.

00:02:42 Карьера Сева

• Сев рассказывает о своём пути в Kotlin. • Описание его работы над библиотеками и фреймворками. • Принципы и подходы к разработке библиотек.

00:04:40 Цели выпуска

• Цель выпуска: помочь разработчикам библиотек. • Обсуждение границ и подходов к дизайну библиотек. • Переход к теоретической части выпуска.

00:05:55 История библиотек

• История создания библиотек Моррисом Вилкисом. • Описание первых библиотек и их функций. • Важность обратной совместимости и абстракций.

00:09:17 Абстракции и их значение

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

00:11:31 История появления стандартов

• В прошлом было много разных вендоров, каждый из которых предлагал свои расширения и функции. • Это создавало неудобства, так как пользователи были привязаны к конкретным производителям и операционным системам. • Американская военка решила проблему, создав стандарт POSIX, который стал обязательным для всех вендоров.

00:12:31 Проблемы человеческой природы

• Большие вендоры могли полностью соответствовать стандарту, но не имели способа удержать клиентов. • Разработчики, такие как создатели C, осознали необходимость общего языка для общения с операционной системой. • Это привело к созданию Lisp, который стал важным инструментом для разработчиков.

00:13:55 Обратная совместимость

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

00:16:46 Проблемы с наследием

• Наследие старых систем может создавать проблемы для новых разработчиков. • Пример с функцией rm в Unix показывает, как старые ограничения могут мешать новым разработкам. • Обратная совместимость требует осторожного подхода, чтобы не создавать новых проблем.

00:19:39 Примеры успешного решения

• Apple иногда ломает обратную совместимость, чтобы улучшить экосистему. • Некоторые языки программирования и фреймворки выпускают новые версии, решая старые проблемы. • Однако, по-настоящему успешно избавиться от наследия старых систем практически невозможно.

00:20:55 Выбор между сохранением и ломанием

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

00:22:48 Исторические особенности и дизайн библиотек

• Пример с библиотекой OpenCV, которая использует RGB вместо HBR для работы с пикселями. • История с оператором scan в Kotlin, который был переименован после критики пользователей. • Проблема с поиском авторов, ответственных за название оператора.

00:26:16 Сложности дизайна и разработки

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

00:28:22 Технический долг и его последствия

• Технический долг как полезная концепция, если он приносит больше пользы, чем затрат. • Проблемы с быстрым программированием и выкатыванием новых функций. • Инкрементальная сложность и невозможность переписать или заменить ипя.

00:30:08 Концепция semantic versioning

• Идея semantic versioning для управления совместимостью илом. • Разделение версий на маленькие, средние и большие, чтобы минимизировать разрушения при изменениях.

00:30:40 Проблемы семантического версионирования

• Семантическое версионирование включает три компонента: патч-версии, минорные версии и мажорные версии. • Мажорные версии могут ломать, что вызывает недовольство пользователей. • Примеры: переход на Python 3 и Scala 2.11.

00:31:37 Примеры и последствия

• Мажорные версии могут ломать экосистему, построенную поверх языка программирования. • Переход на Python 3 занял около десяти лет и значительные ресурсы. • Любое семантическое изменение может быть ломающим.

00:32:28 Проблемы зависимости и документации

• Программисты часто зависят от недокументированных свойств системы. • Пример: изменение поведения клавиши пробела в Windows. • Даже мелкие изменения могут вызвать проблемы у пользователей.

00:34:19 Примеры из практики

• Пример из Google: ускорение сортировки в C++. • Даже незначительные изменения могут вызвать зависимости, которые сложно изменить. • Программирование требует творческого подхода и внимания к деталям.

00:35:18 Альтернативные подходы

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

00:36:11 Проблемы с гарантиями

• В реальном мире производители заменяют сломанные продукты по гарантии. • В программировании пользователи должны быть ответственны за свои зависимости. • Разработчики должны использовать документированные контракты.

00:38:57 Сложности оценки маловероятных событий

• Программисты плохо оценивают вероятность маловероятных событий. • Пример: изменение времени на сервере может вызвать проблемы в программе. • Важно учитывать все возможные сценарии.

00:40:03 Проблемы с языком и дизайном

• Человеческий язык сложен и неоднозначен, что влияет на программирование. • Пример: парсинг чисел из строки в Unicode. • Важно четко формулировать требования и ожидания.

00:41:31 Критерии хорошего дизайна

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

00:42:08 Искусство и мозг

• Люди по-разному реагируют на искусство, активируя разные участки мозга. • Хорошее искусство вызывает желание съесть, а не убежать. • Хороший продукт, как и хорошее искусство, должен быть интуитивно понятным и легко используемым.

00:43:27 Проблемы реального мира

• Люди являются главной проблемой в программировании. • Пример с раскрашиванием контурных карт на экране, где возникли вопросы о статусе Тайваня как страны. • Разные вендоры по-разному работают с флагами стран, что создает сложности.

00:44:26 Примеры из реального мира

• Пример с тайм-зоной в Египте, где политические события изменили переход на летнее время. • Пример с Японией, где смена императора потребовала обновления программного обеспечения.

00:46:16 Создание хорошего API

• Создание хорошего API требует компромиссов и может привести к недовольству через годы. • Важно определить абстракцию и избегать иллюзий. • Пример с NFS, который оказался неэффективным из-за проблем с частичными отказами.

00:50:07 Проблемы абстракций

• Пример с Linux, где все данные хранятся в файлах, что создает проблемы с чтением и записью. • Важно учитывать, что данные могут меняться, и это влияет на корректность чтения. • Абстракции должны быть выбраны с учетом их удобства и применимости для различных случаев.

00:54:46 Определение целей библиотеки

• Важно определить, какие пользовательские проблемы будет решать библиотека. • Библиотека должна абстрагировать нетривиальную функциональность. • Примеры: удобные хелперы для строк или программный интерфейс для работы с датой и временем.

00:55:43 Примеры удачных абстракций

• Пример хорошей абстракции: библиотека Time в Kotlin. • Важно учитывать обратную совместимость и давать пользователям понятные пути миграции.

00:57:14 Проектирование абстракций

• Общие советы: внимательно изучить домен и задачи, которые решает библиотека. • Конкретные советы: начать с документации и спецификации, писать нетривиальные программы для выявления проблем.

01:00:49 Важность документации

• Документация должна быть понятной и не перегруженной информацией. • Пользователи часто не читают документацию, но она важна для понимания библиотеки.

01:01:56 Специализация абстракций

• Каждая абстракция должна делать одну вещь хорошо. • Пример: класс File в Java, который выполняет много задач, что усложняет его использование.

01:02:53 Эволюция библиотек

• Если текущая библиотека не удовлетворяет требованиям, лучше создать новую. • Важно учитывать обратную совместимость и существующие ответы на Stack Overflow.

01:03:31 Экосистема и консистентность

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

01:05:09 Выбор названий

• Выбор правильных названий для API и функций – сложная задача. • Важно не расстраиваться, если не удается сразу найти идеальное название.

01:05:39 Важность названия и документации

• Название должно отражать суть абстракции. • Важно писать документацию, чтобы пользователи понимали, что это за штука. • Не стоит придумывать новые названия, лучше использовать общепринятые.

01:06:35 Использование опыта других языков

• Важно использовать опыт соседних языков программирования. • Операторы сравнения и проверки типов могут быть реализованы по-разному в разных языках. • Важно понимать, почему и как реализованы функции в других языках.

01:08:04 Эволюция библиотек и дизайн

• Важно спрашивать пользователей о их потребностях и игнорировать их ответы. • Начинать дизайн с понимания конечных задач пользователей. • Обозревать существующие решения и писать дизайн-документы.

01:11:13 Имплементация и оптимизация

• Имплементация может быть менее важной на ранних этапах. • В некоторых случаях можно игнорировать имплементацию для быстрого принятия решений. • В других случаях производительность зависит от имплементации, и её нельзя изменить после релиза.

01:13:14 Экспериментальные версии библиотек

• Экспериментальные версии помогают собирать фидбек и исправлять ошибки. • Важно поддерживать обратную совместимость, особенно на поздних этапах. • Ломающие изменения должны быть агрегированы и сопровождаться миграционными путями.

01:15:45 Миграционные гайды

• Миграционные гайды важны для нетривиальных миграций. • Документация не всегда помогает, поэтому гайды необходимы для понимания, что делать дальше. • Чем больше контроля над миграциями, тем лучше.

01:16:47 Влияние генерации кода на дизайн и документацию

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

01:18:43 Советы для разработчиков библиотек

• Обязательно пишите документацию для всех аспектов библиотеки. • Убедитесь, что код соответствует экосистеме и общепринятым практикам. • Проверяйте, что функции выполняют заявленные действия и задокументированы все ошибки.

01:20:06 Детали реализации в документации

• Описывайте детали реализации, если это важно для пользователей. • Если библиотека хранит настройки в мобильных приложениях, опишите формат хранения.

01:20:59 Деприкетинг библиотек

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

01:23:45 Работа с уязвимостями в библиотеках

• Если обнаружена уязвимость, проконсультируйтесь с безопасниками и следуйте их рекомендациям. • Не публикуйте уязвимости без консультации, чтобы избежать юридических проблем. • В крупных проектах есть правила работы с уязвимостями, которые нужно соблюдать.

01:25:49 Ответственность авторов библиотек

• Авторы библиотек должны следовать правилам безопасности и лицензиям. • Используйте существующие политики безопасности и лицензии компании. • Не придумывайте свои правила, если это не предусмотрено компанией.

01:26:50 Ошибки в дизайне библиотек

• Обсуждение ошибок в именовании функций в стандартной библиотеке Kotlin. • Пример функции “фест”, которая возвращает элемент или исключение. • Ошибка в именовании “рекогнишин” вместо “прикол” привела к длительным исправлениям и проблемам для пользователей.

01:28:41 Проблемы с контекстами в Kotlin

• Трудности с иерархией контекстов в Kotlin. • Решение проблемы через лексические скопы, предложенное Нейтаном. • Ошибка в названии сущности “контекст”, что вызывает путаницу у пользователей.

01:30:27 Заключение и советы

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

01:33:20 Благодарности и прощание

• Благодарность слушателям за участие и поддержку. • Призыв делиться подкастом и оставлять отзывы. • Важность просмотра выпусков на YouTube для увеличения охвата и вовлеченности.