Тема: compatibility
-
musl versus glibc on Alpine: why some prebuilt binaries, Python wheels and DNS behaviour differ
Alpine's musl libc is not binary-compatible with glibc, has a different (parallel, non-search-falling-back) DNS resolver, defaults to the C.UTF-8 locale rather than a full locale database, and does not support lazy symbol binding — differences that explain glibc-linked binaries failing to run, manylinux Python wheels being rejected, and some legacy DNS configurations behaving differently. gcompat can run some unmodified glibc binaries but cannot be used to build software that itself requires glibc headers.
-
Protocol Buffers: номера полей, неизвестные поля и правила изменения сообщений
В Protocol Buffers поле в передаваемых данных определяется номером, а не именем, поэтому номера нельзя менять или использовать повторно. Добавление полей безопасно для двоичного формата; удаление безопасно, лишь если номер больше не используется, что обеспечивает reserved. Старые читатели сохраняют неизвестные поля, а расширение int32 до int64 безопасно только при условиях. У ProtoJSON свои правила.
-
Diffing the OpenAPI document in CI catches breaking changes that code review misses
Hypothesis: a CI step that compares the OpenAPI document of each change against the released one with a breaking-change classifier such as oasdiff flags removed fields, narrowed types and new required parameters that human review of the code diff misses, so fewer unintended breaking changes reach a release.
-
Deprecating a function in a library: warn, document the replacement, remove on schedule
A library deprecation has four parts: a replacement that exists first, a runtime warning plus a documentation note naming the version and the replacement, a changelog entry, and a removal release fixed in advance by policy. PEP 387 requires a deprecation period of at least two years under Python's annual cadence and describes a documentation-only soft deprecation; Django removes shims no earlier than two feature releases after the warning.
-
Schema evolution with Avro and Parquet: reader and writer schemas, merged files and compatibility modes
Avro resolves a writer's schema against a reader's schema field by field, filling missing fields from reader defaults and ignoring unknown ones; Parquet files with different but compatible schemas can be merged by the reading engine at a cost; a schema registry enforces backward, forward or full compatibility. Adding optional fields with defaults is the safe move, renaming and type changes are not.
-
Вывод конечной точки API из употребления с заголовками Deprecation и Sunset
Сообщайте о завершении поддержки прямо в ответах: заголовок Deprecation (RFC 9745) помечает ресурс как устаревший, Sunset (RFC 8594) указывает, когда он перестанет работать, а Link на документацию объясняет замену. Дополните их журналированием оставшихся вызывающих клиентов.
-
Перечисления Protocol Buffers: обрабатывайте неизвестные числовые значения согласно поведению среды выполнения
Планируйте совместимую с будущими версиями обработку перечислений с учётом выбранного режима схемы и языковой реализации.
-
Поддержка нескольких линий выпусков: какие исправления куда попадают
Политика поддержки — это таблица линий выпусков со статусом каждой (развитие функций, исправления ошибок, только безопасность, конец поддержки) и правило переноса классов исправлений в соответствующие линии. Python поддерживает серию выпусками с исправлениями ошибок два года, а затем ещё три года — выпусками только с исправлениями безопасности; Django переносит критические исправления в последний функциональный выпуск, а исправления безопасности и потери данных — в два последних и линии долгосрочной поддержки; Rust поддерживает только последнюю стабильную версию. Небольшому проекту следует публиковать таблицу и по умолчанию давать самое узкое обещание, которое он способен выполнить.
-
Соотносите утверждения с версиями, к которым они относятся
Явно указывайте область применимости по версиям и не переносите утверждение из текущей документации на установку неизвестной или несовместимой версии.
Машиночитаемо: JSON